Skip to content

Commit 5c90ec1

Browse files
committed
feat: add side-by-side photo layouts and refine gallery captions
- Add collectors-at-work photo inline after Problem section with side-by-side layout (text left, photo right) - Add 2am debugging photo with alternating side-by-side layout (photo left, text right) to create visual rhythm - Add team-gathering-outdoor photo to Behind the Scenes gallery - Refine photo captions to be more concise with scale context (collector counts, timeline markers) - Optimize all new images (WebP + JPEG versions)
1 parent b0150d9 commit 5c90ec1

File tree

2 files changed

+77
-87
lines changed

2 files changed

+77
-87
lines changed

src/data/statsbomb-photos.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"type": "image",
44
"src": "/images/statsbomb/IMG_20180326_132547.jpg",
55
"alt": "Omar Negm resting during early days of building Statsbomb collection tools",
6-
"caption": "2018: Omar Negm during Week One, transitioning from aerospace engineering to building tools collectors would thank us for",
6+
"caption": "2018: Omar Negm during Week One, transitioning from aerospace engineering to building tools collectors would thank us for (~100 collectors, offline collection)",
77
"width": 1200,
88
"height": 1603
99
},
@@ -57,7 +57,7 @@
5757
"type": "image",
5858
"src": "/images/statsbomb/collection-leadership-night.jpg",
5959
"alt": "Collection leadership team Hegazy, Ramadan, and Adham Nasser during night shift",
60-
"caption": "2020: Collection leadership team—Hegazy, Ramadan, and Adham Nasser—during night shift discussions about ambitions and scaling collector operations to 1000+",
60+
"caption": "2020: Collection leadership—Hegazy, Ramadan, and Adham Nasser—as live collection launched (1000 collectors)",
6161
"width": 1240,
6262
"height": 1654
6363
},
@@ -66,7 +66,7 @@
6666
"type": "image",
6767
"src": "/images/statsbomb/IMG_0570.jpg",
6868
"alt": "Abdallah, Saad, and Hesham planning live collection architecture",
69-
"caption": "2020: Planning live collection with Abdallah and Hesham—exploring how real-time architecture would scale American football from offline to concurrent collection",
69+
"caption": "2020: Planning live collection architecture with Hesham, our head of operations (launched later that year)",
7070
"width": 1200,
7171
"height": 1327
7272
},
@@ -101,8 +101,8 @@
101101
{
102102
"type": "image",
103103
"src": "/images/statsbomb/IMG_5078.jpg",
104-
"alt": "Product, tech, and ops leadership teams during Ramadan Iftar 2023",
105-
"caption": "2023: Ramadan Iftar with product, tech, and ops leadership teams—now supporting collectors together",
104+
"alt": "Product, tech, and ops leadership teams during Ramadan Iftar 2021",
105+
"caption": "2021: Ramadan Iftar with product, tech, and ops leadership teams—now supporting collectors together",
106106
"width": 1200,
107107
"height": 900
108108
},
@@ -147,7 +147,7 @@
147147
"type": "image",
148148
"src": "/images/statsbomb/statsbomb-amateur-league-poster.jpg",
149149
"alt": "Statsbomb amateur league team playing match in Egypt using collection tools built for elite clubs",
150-
"caption": "2024: Statsbomb team's amateur league squad in Egypt—collectors analyzing their own matches with the tools they built for clubs like Liverpool",
150+
"caption": "2024: Statsbomb team's amateur league squad—collectors analyzing own matches with tools they built for Liverpool (5000+ collectors by acquisition)",
151151
"width": 720,
152152
"height": 1280
153153
}

src/pages/portfolio/statsbomb.mdx

Lines changed: 71 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ import { MoveRight } from "@lucide/astro";
5959
<CaseStudyTLDR>
6060
{/* Hook - human story + validation */}
6161
<Body size="lg" as="p" class="my-6 text-text font-medium leading-relaxed">Built real-time sports data collection with Ali from week one sketches to 5000+ collectors across multiple sports. When Hudl acquired Statsbomb in 2024, they bought the collection infrastructure—the system that made concurrent data capture possible at broadcaster scale. What started as "my hand doesn't cramp anymore" feedback became the foundation for industry-standard tooling.</Body>
62-
63-
6462
</CaseStudyTLDR>
6563

6664
</Section>
@@ -286,12 +284,11 @@ The merge tax scaled linearly with collectors. At 100 collectors, two product ma
286284

287285
<div class="grid md:grid-cols-2 gap-8 items-center my-8">
288286
<div>
289-
<Body size="base" as="p" class="text-text leading-relaxed">
290-
What collectors needed: prevention during collection, not reconciliation after. We architected the tool to make ambiguous interpretations structurally impossible—if you can't express it in the UI, you can't collect it wrong.
291-
</Body>
287+
<Body size="base" as="p" class="text-text leading-relaxed">What collectors needed: prevention during collection, not reconciliation after. We architected the tool to make ambiguous interpretations structurally impossible—if you can't express it in the UI, you can't collect it wrong.</Body>
292288
</div>
293289

294290
<Figure
291+
class="my-0 md:mt-3"
295292
src="/images/statsbomb/collectors-at-work.jpg"
296293
alt="Collectors processing live matches with dual monitors in Cairo collection center"
297294
caption="Collectors processing live matches with dual monitors—soccer field footage on one screen, collection tool on the other"
@@ -314,24 +311,21 @@ I'd start at 10am, leave at 3am. Not grinding for grinding's sake—I needed to
314311

315312
Ali stayed nights for company. Not to supervise—he wasn't debugging TypeScript with me. But he understood the stakes. Broadcasters needed real-time commentary data. Collectors needed tools that didn't break at 2am when fatigue set in.
316313

317-
That's when we'd debug together: Adham tracing the Kafka lag, me testing state machine transitions with a tired collector who just wanted to finish the match and go home.
318-
319314
</Section>
320315

321316
{/* Visual proof: 2am debugging */}
322317

323318
<div class="grid md:grid-cols-2 gap-8 items-center my-8">
324319
<Figure
320+
class="my-0"
325321
src="/images/statsbomb/df52f41a-686e-4989-8f34-08b1487920b6.jpg"
326322
alt="Late night debugging session with Adham and Waheed"
327323
caption="Late night, Cairo (2019): Debugging real-time collection with Adham and Waheed"
328324
aspectRatio="16/9"
329325
/>
330326

331327
<div>
332-
<Body size="base" as="p" class="text-text leading-relaxed">
333-
That's when we'd debug together: Adham tracing the Kafka lag, me testing state machine transitions.
334-
</Body>
328+
<Body size="base" as="p" class="leading-relaxed">That's when we'd debug together: Adham tracing the Kafka lag, me testing state machine transitions, Waheed debugging the metadata, with a tired collector who just wanted to finish the match and go home.</Body>
335329
</div>
336330
</div>
337331

@@ -534,82 +528,80 @@ The patterns Ali and I sketched in notepad during week one became valuable enoug
534528
<Body size="sm">"Design for the 80% case"—The Pragmatic Programmer. That principle shaped most decisions: DSL for standard sequences, state machines for common flows, metadata for typical events. When 95% of matches follow patterns, build for patterns.</Body>
535529
</Callout>
536530

537-
{/* Timeline: Scale Progression */}
538-
<Timeline>
539-
<TimelineItem
540-
date="2018"
541-
title="Soccer, Offline Collection"
542-
description="~100 collectors, offline tagging"
543-
/>
544-
<TimelineItem
545-
date="2020"
546-
title="Live Collection Breakthrough"
547-
description="Live collection, 1000 collectors"
548-
/>
549-
<TimelineItem
550-
date="2021"
551-
title="American Football Expansion"
552-
description="American football expansion"
553-
/>
554-
<TimelineItem
555-
date="Post-2022"
556-
title="Scale Beyond Departure"
557-
description="5000+ by acquisition"
558-
isLast={true}
559-
/>
560-
</Timeline>
561-
562-
<Heading level={4} as="h4" class="mb-4 mt-6">What Made This Possible</Heading>
563-
564-
<div class="mb-6">
565-
<Accordion
566-
size="inline"
567-
variant="default"
568-
summary="Non-linear leverage"
569-
defaultOpen={false}
570-
>
571-
<Body size="sm" as="p">Non-linear scaling without proportional staffing increases. The 5-person metadata team (Muhanad led ops context) queried pending conflicts, resolved once via claims interface, and the system cascaded updates to all affected events.</Body>
572-
</Accordion>
573-
574-
<Accordion
575-
size="inline"
576-
variant="default"
577-
summary="Minimal engineering bottleneck"
578-
defaultOpen={false}
579-
>
580-
<Body size="sm" as="p">When we expanded to American football in 2020, product managers wrote new dataspecs and grouping rules. Engineering only intervened for state machine edge cases (e.g., possession turnover during penalty review—an NFL-specific complexity).</Body>
581-
</Accordion>
582-
583-
<Accordion
584-
size="inline"
585-
variant="default"
586-
summary="Collector experience transformation"
587-
defaultOpen={false}
588-
>
589-
<Body size="sm" as="p">Keyboard flows built muscle memory. Contextual mappings reduced cognitive load (press 'P' for pass, but context changes based on phase). Computer vision assisted bounding box input, reducing manual pixel-perfect clicking.</Body>
590-
</Accordion>
591-
592-
<Accordion
593-
size="inline"
594-
variant="default"
595-
summary="Client customization through configuration"
596-
defaultOpen={false}
597-
>
598-
<Body size="sm" as="p">Different granularity requirements—basic event tracking or advanced positioning data with x/y coordinates—handled through dataspec configuration, not separate codebases.</Body>
599-
</Accordion>
531+
<div class="grid md:grid-cols-2 gap-2 mb-8">
532+
<Timeline>
533+
<TimelineItem
534+
date="2018"
535+
title="Soccer, Offline Collection"
536+
description="~100 collectors, offline tagging"
537+
/>
538+
<TimelineItem
539+
date="2020"
540+
title="Live Collection Breakthrough"
541+
description="Live collection, 1000 collectors"
542+
/>
543+
<TimelineItem
544+
date="2021"
545+
title="American Football Expansion"
546+
description="American football expansion"
547+
/>
548+
<TimelineItem
549+
date="Post-2022"
550+
title="Scale Beyond Departure"
551+
description="5000+ by acquisition"
552+
isLast={true}
553+
/>
554+
</Timeline>
555+
<div>
556+
<Heading level={4} as="h4" class="mb-4 mt-6">What Made This Possible</Heading>
557+
<div class="mb-6">
558+
<Accordion
559+
size="inline"
560+
variant="default"
561+
summary="Non-linear leverage"
562+
defaultOpen={false}
563+
>
564+
<Body size="sm" as="p">Non-linear scaling without proportional staffing increases. The 5-person metadata team (Muhanad led ops context) queried pending conflicts, resolved once via claims interface, and the system cascaded updates to all affected events.</Body>
565+
</Accordion>
566+
567+
<Accordion
568+
size="inline"
569+
variant="default"
570+
summary="Minimal engineering bottleneck"
571+
defaultOpen={false}
572+
>
573+
<Body size="sm" as="p">When we expanded to American football in 2020, product managers wrote new dataspecs and grouping rules. Engineering only intervened for state machine edge cases (e.g., possession turnover during penalty review—an NFL-specific complexity).</Body>
574+
</Accordion>
575+
576+
<Accordion
577+
size="inline"
578+
variant="default"
579+
summary="Collector experience transformation"
580+
defaultOpen={false}
581+
>
582+
<Body size="sm" as="p">Keyboard flows built muscle memory. Contextual mappings reduced cognitive load (press 'P' for pass, but context changes based on phase). Computer vision assisted bounding box input, reducing manual pixel-perfect clicking.</Body>
583+
</Accordion>
584+
585+
<Accordion
586+
size="inline"
587+
variant="default"
588+
summary="Client customization through configuration"
589+
defaultOpen={false}
590+
>
591+
<Body size="sm" as="p">Different granularity requirements—basic event tracking or advanced positioning data with x/y coordinates—handled through dataspec configuration, not separate codebases.</Body>
592+
</Accordion>
593+
</div>
594+
595+
<EditorialNote>From 100 to 5000+ collectors, product managers shipped new dataspecs without proportional engineering investment, though complex state transitions occasionally required technical collaboration.</EditorialNote>
596+
597+
</div>
600598
</div>
601599

602-
<EditorialNote>From 100 to 5000+ collectors, product managers shipped new dataspecs without proportional engineering investment, though complex state transitions occasionally required technical collaboration.</EditorialNote>
603-
604600
</div>
605601
</details>
606602

607-
{" "}
608-
609603
<SectionDivider spacing="major" class="mt-2" />
610604

611-
{/* Lessons Section */}
612-
613605
<Section spacing="default" id="lessons" titleLevel={3} title="Lessons: What Transfers? What Only Worked Here?">
614606

615607
<EditorialNote>
@@ -658,8 +650,6 @@ These aren't universal truths—they worked because of specific conditions:
658650
<Body size="sm" as="p">During peak live match time, the system processes 100,000+ atomic events per minute—touches, passes, tackles, runs—streaming through arbitrary validation layers in real-time. With 100 collectors, manual coordination could absorb this velocity. At 1000+ collectors, 2 product managers couldn't handle 50+ daily dataspec questions while the spec evolved. Today at 5000+ collectors processing live matches simultaneously, architectural separation isn't optimization—it's the only way to handle this streaming intensity without engineering bottlenecks.</Body>
659651
</Accordion>
660652

661-
{" "}
662-
663653
<Accordion
664654
size="inline"
665655
variant="default"

0 commit comments

Comments
 (0)