Skip to content

Commit 2bac204

Browse files
committed
Remove phone number and redundant contact section
Privacy: Remove phone number (+447428240774) from resume page and markdown draft. Remove "Find Me Online" section - GitHub/LinkedIn links already in header. Additional refinements: - Apply Link component to contact links across pages - Adjust spacing consistency (mb-12 → mb-16) - Refine Button/Badge padding for visual balance
1 parent fa796b7 commit 2bac204

File tree

11 files changed

+55
-67
lines changed

11 files changed

+55
-67
lines changed

resume-draft.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
**Principal Software Engineer**
44

5-
📧 dev.saad.shahd@gmail.com | 🐙 github.com/saadshahd | 💼 linkedin.com/in/saadshahd | 📍 London, United Kingdom | 📞 +447428240774
5+
📧 dev.saad.shahd@gmail.com | 🐙 github.com/saadshahd | 💼 linkedin.com/in/saadshahd | 📍 London, United Kingdom
66

77
---
88

@@ -103,8 +103,3 @@ Core team member building tools for mobile developers to ship better apps—cras
103103
**Proficient**: Vue, Angular, Redux, xstate, RxJS, D3, Electron
104104

105105
---
106-
107-
## Find Me Online
108-
109-
**GitHub**: https://github.com/saadshahd
110-
**LinkedIn**: https://linkedin.com/in/saadshahd

src/components/Badge.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
33
import { clsx } from 'clsx';
44
55
const badge = cva(
6-
'inline-flex items-center px-3 py-1 rounded-full text-sm font-medium border',
6+
'inline-flex items-center px-4 py-1 rounded-full text-sm font-medium border',
77
{
88
variants: {
99
variant: {

src/components/Button.astro

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ const button = cva(
1313
secondary: 'bg-transparent text-text border-2 border-text-light hover:bg-text hover:text-surface hover:scale-[1.02] active:scale-[0.98]',
1414
},
1515
size: {
16-
sm: 'px-3 py-1.5 text-xs md:px-4 md:py-2 md:text-sm rounded-md',
17-
md: 'px-4 py-2 text-sm md:px-5 md:py-2.5 md:text-base rounded-md',
18-
lg: 'px-5 py-2.5 text-sm md:px-7 md:py-3 md:text-base rounded-lg',
16+
sm: 'px-2 py-1 text-xs md:px-4 md:py-2 md:text-sm rounded-md',
17+
md: 'px-4 py-2 text-sm md:px-6 md:py-2 md:text-base rounded-md',
18+
lg: 'px-4 py-2 text-sm md:px-6 md:py-4 md:text-base rounded-lg',
1919
},
2020
},
2121
defaultVariants: {

src/components/typography/Body.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
import { cva, type VariantProps } from 'class-variance-authority';
33
4-
const bodyVariants = cva('text-text-lighter text-balance', {
4+
const bodyVariants = cva('text-text-lighter', {
55
variants: {
66
size: {
77
sm: 'text-sm leading-normal', // 14px → 16.8px after scaling

src/pages/about.astro

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
---
22
import Layout from '../layouts/Layout.astro';
3+
import Container from '../components/Container.astro';
34
import Button from '../components/Button.astro';
45
import Heading from '../components/typography/Heading.astro';
56
import Body from '../components/typography/Body.astro';
67
import { FileText } from '@lucide/astro';
78
---
89

910
<Layout title="About - Saad Shahd">
10-
<div class="max-w-4xl mx-auto px-4 md:px-6 py-20">
11-
<Heading level={1} as="h1" class="mb-12"><span>About</span></Heading>
11+
<Container width="narrow">
12+
<Heading level={1} as="h1" class="mb-16"><span>About</span></Heading>
1213

13-
<div class="prose prose-lg max-w-none">
14+
<div>
1415
<Body size="lg" as="p" class="text-neutral mb-8 leading-normal">
15-
I build systems for a reason—I chase the 'why' without fixating on the 'how.' Over 15 years, I developed a philosophy that makes the 'how' obvious.
16+
Over 15 years, a pattern revealed itself: systems fail when we optimize for 'how' before understanding 'why.' When teams chase the right questions first, architecture emerges from constraints.
1617
</Body>
1718

1819
<Body size="base" as="p" class="mb-6 leading-relaxed">
19-
At Wise, I solve content collaboration at scale. Currently building editorial infrastructure that enables 20 teams to work on wise.com without friction, inconsistency, or incorrectness. The challenge isn't just technical—it's solving global→local fintech at scale: regulations differ by market, offerings vary by country, and cultural nuances matter.
20+
At Wise, we're solving content collaboration for 20 teams at scale. Building editorial infrastructure that handles global→local fintech tension—regulations collide with cultural nuances, offerings vary by market. The problem space is architectural: how do we maintain coherence and developer experience when constraints multiply?
2021
</Body>
2122

2223
<Body size="base" as="p" class="mb-6 leading-relaxed">
23-
My approach is rooted in functional programming principles I learned the hard way—through production bugs in high-velocity startup environments at Instabug, Statsbomb, and Wise. Traditional thinking says you trade velocity for technical debt. I learned that functional thinking eliminates that trade-off entirely. When you separate behavior from state and make illegal states unrepresentable, you move fast <em>and</em> stay confident.
24+
Functional programming principles emerged through production bugs at Instabug, Statsbomb, and Wise. Traditional thinking treats velocity and correctness as opposing forces. Working in high-velocity environments revealed they're complementary: when you separate behavior from state and make illegal states unrepresentable, both increase together. Still learning what's possible when architecture constrains failure.
2425
</Body>
2526

2627
<Body size="base" as="p" class="mb-6 leading-relaxed">
@@ -32,14 +33,14 @@ import { FileText } from '@lucide/astro';
3233
</Body>
3334

3435
<Body size="base" as="p" class="text-lg font-medium text-accent">
35-
I optimize for the "why" first. The right question makes implementation obvious.
36+
Curious about the 'why' first—it often reveals the 'how.'
3637
</Body>
3738

3839
<!-- Resume CTA -->
39-
<div class="mt-10 mb-12">
40+
<div class="mt-10 mb-16">
4041
<Button href="/resume" variant="primary" size="md" class="gap-2">
4142
<FileText size={20} />
42-
View Full Resume
43+
Full Background
4344
</Button>
4445
</div>
4546

@@ -55,5 +56,5 @@ import { FileText } from '@lucide/astro';
5556
<li>LLM-augmented development patterns</li>
5657
</Body>
5758
</div>
58-
</div>
59+
</Container>
5960
</Layout>

src/pages/blog.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Body from '../components/typography/Body.astro';
66

77
<Layout title="Blog - Saad Shahd">
88
<div class="max-w-6xl mx-auto px-6 py-20">
9-
<Heading level={1} as="h1" class="mb-12"><span>Blog</span></Heading>
9+
<Heading level={1} as="h1" class="mb-16"><span>Blog</span></Heading>
1010
<Body size="xl" as="p" class="text-neutral mb-16">
1111
Technical articles on systems, architecture, and engineering practices
1212
</Body>

src/pages/contact.astro

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,36 @@
22
import Layout from '../layouts/Layout.astro';
33
import Heading from '../components/typography/Heading.astro';
44
import Body from '../components/typography/Body.astro';
5+
import Link from '../components/Link.astro';
56
---
67

78
<Layout title="Contact - Saad Shahd">
89
<div class="max-w-4xl mx-auto px-4 md:px-6 py-20">
9-
<Heading level={1} as="h1" class="mb-12"><span>Get in Touch</span></Heading>
10+
<Heading level={1} as="h1" class="mb-16"><span>Get in Touch</span></Heading>
1011
<Body size="lg" as="p" class="text-neutral mb-16 leading-normal">
1112
Looking to collaborate on realtime systems, discuss functional thinking, or explore how to eliminate complexity before it exists? Let's talk.
1213
</Body>
1314

1415
<div class="space-y-8">
1516
<div>
1617
<Heading level={2} as="h2" class="mb-2 text-accent"><span>Email</span></Heading>
17-
<a href="mailto:dev.saad.shahd@gmail.com" class="text-secondary hover:underline text-lg">
18+
<Link href="mailto:dev.saad.shahd@gmail.com" variant="inline" class="text-lg">
1819
dev.saad.shahd@gmail.com
19-
</a>
20+
</Link>
2021
</div>
2122

2223
<div>
2324
<Heading level={2} as="h2" class="mb-2 text-accent"><span>LinkedIn</span></Heading>
24-
<a href="https://linkedin.com/in/saadshahd" target="_blank" rel="noopener noreferrer" class="text-secondary hover:underline text-lg">
25+
<Link href="https://linkedin.com/in/saadshahd" variant="external" external class="text-lg">
2526
linkedin.com/in/saadshahd
26-
</a>
27+
</Link>
2728
</div>
2829

2930
<div>
3031
<Heading level={2} as="h2" class="mb-2 text-accent"><span>GitHub</span></Heading>
31-
<a href="https://github.com/saadshahd" target="_blank" rel="noopener noreferrer" class="text-secondary hover:underline text-lg">
32+
<Link href="https://github.com/saadshahd" variant="external" external class="text-lg">
3233
github.com/saadshahd
33-
</a>
34+
</Link>
3435
</div>
3536
</div>
3637
</div>

src/pages/index.astro

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,18 @@ import Body from '../components/typography/Body.astro';
1313
<Display level={1} as="h1" class="hero-name mb-6 leading-tight opacity-0 max-w-150 md:max-w-170">
1414
Saad Shahd
1515
</Display>
16-
<Body size="lg" as="p" class="hero-title text-text mb-6 opacity-0 max-w-150 md:max-w-170">
17-
Building realtime systems through functional architecture
16+
<Body size="lg" as="p" class="hero-title text-text mb-6 opacity-0 max-w-150 md:max-w-170 text-balance">
17+
What if systems couldn't break by design?
1818
</Body>
19-
<Body size="base" as="p" class="hero-value text-neutral mb-12 leading-relaxed opacity-0 max-w-150 md:max-w-170 lg:text-lg">
20-
I design systems where illegal states can't exist.
21-
When you separate behavior from state, reliability isn't a feature—it's inevitable.
22-
That's functional architecture in production.
19+
<Body size="base" as="p" class="hero-value text-neutral mb-16 leading-relaxed opacity-0 max-w-150 md:max-w-170 lg:text-lg text-balance">
20+
Over 15 years, patterns emerged from production systems: when you separate behavior from state and make illegal states unrepresentable, reliability stops being aspirational—it becomes structural. Exploring what's possible when architecture shapes correctness.
2321
</Body>
2422
<div class="hero-ctas flex gap-4 justify-center opacity-0">
2523
<Button variant="primary" size="lg" href="/portfolio">
26-
View Work
24+
Explore My Work
2725
</Button>
2826
<Button variant="secondary" size="lg" href="/contact">
29-
Get in Touch
27+
Start a Conversation
3028
</Button>
3129
</div>
3230
</section>

src/pages/portfolio.astro

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import Body from '../components/typography/Body.astro';
1212
<Heading level={1} as="h1" class="mb-2"><span>Portfolio</span></Heading>
1313
<Body size="lg" as="p" class="text-neutral mb-8">Selected case studies showcasing technical depth and impact</Body>
1414

15-
<div class="grid gap-8 md:gap-12">
15+
<div class="grid gap-8 md:gap-16">
1616
<!-- Statsbomb Case Study -->
1717
<Card variant="case-study" href="/portfolio/statsbomb">
1818
<div class="p-8">
19-
<Heading level={3} as="h2" class="mb-3"><span>Statsbomb Real Time Data Collection System</span></Heading>
19+
<Heading level={3} as="h2" class="mb-4"><span>Statsbomb Real Time Data Collection System</span></Heading>
2020
<Body size="base" as="p" class="text-neutral mb-6 leading-relaxed">
21-
Designed a distributed system that reduced 90-minute match collection from 16 man-hours to 4 concurrent collectors.
22-
Built a dataspec and DSL enabling PMs to define sport collection rules without engineering involvement.
23-
Why did it scale? The architecture separated collection rules from execution logic. New sports became configuration, not code.
24-
We never had to choose between velocity and correctness.
21+
How do you collect 90-minute matches without choosing between velocity and correctness?
22+
We reduced collection from 16 man-hours to 4 concurrent collectors by building a DSL that let PMs define sports rules without engineering involvement.
23+
The architecture separated collection rules from execution logic—new sports became configuration, not code.
24+
Lesson learned: architectural separation eliminates trade-offs that feel inevitable.
2525
</Body>
2626
<div class="flex flex-wrap gap-2 mb-4">
2727
<Badge variant="skill">JavaScript</Badge>
@@ -38,10 +38,12 @@ import Body from '../components/typography/Body.astro';
3838
<!-- Future Case Study Placeholder 1 -->
3939
<Card variant="case-study">
4040
<div class="p-8 opacity-50">
41-
<Heading level={3} as="h2" class="mb-3"><span>Wise Editorial Platform</span></Heading>
41+
<Heading level={3} as="h2" class="mb-4"><span>Wise Editorial Platform</span></Heading>
4242
<Body size="base" as="p" class="text-neutral mb-6 leading-relaxed">
43-
Comprehensive content system enabling 20 teams to collaborate on wise.com.
44-
Global→local fintech content at scale with maintained developer experience.
43+
How do 20 teams collaborate on wise.com without friction or incorrectness?
44+
Building editorial infrastructure that handles global→local fintech complexity—regulations differ by market, offerings vary by country, cultural nuances matter.
45+
The challenge is architectural: coherence at scale while preserving developer experience.
46+
Still exploring what content collaboration looks like at 16M+ customer scale.
4547
</Body>
4648
<div class="flex flex-wrap gap-2 mb-4">
4749
<Badge variant="skill">TypeScript</Badge>

src/pages/portfolio/statsbomb.astro

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Body from '../../components/typography/Body.astro';
99
<Layout title="Statsbomb Real Time Data Collection - Saad Shahd">
1010
<div class="max-w-4xl mx-auto px-4 md:px-6 py-20">
1111
<!-- Hero Section -->
12-
<div class="mb-12">
12+
<div class="mb-16">
1313
<Button variant="secondary" href="/portfolio" class="mb-8">
1414
← Back to Portfolio
1515
</Button>
@@ -32,7 +32,7 @@ import Body from '../../components/typography/Body.astro';
3232
</Body>
3333
</div>
3434

35-
<hr class="border-neutral-light my-12" />
35+
<hr class="border-neutral-light my-16" />
3636

3737
<!-- Problem Section -->
3838
<section class="mb-16">
@@ -90,7 +90,7 @@ import Body from '../../components/typography/Body.astro';
9090
</div>
9191
</section>
9292

93-
<hr class="border-neutral-light my-12" />
93+
<hr class="border-neutral-light my-16" />
9494

9595
<!-- Footer Navigation -->
9696
<div class="flex justify-between items-center">

0 commit comments

Comments
 (0)