Back to selected work
Timeline
Independent Product Engineer·Since 2026
A comparative timeline: organisations run as rows against a shared quarterly axis, so reading down a column shows who shipped what in the same three months. The first dataset is the AI race.
The problem
A chronology of one company is a Wikipedia article. The question nobody can answer in a single view is the comparative one — when GPT-4 shipped, what did Anthropic have in market, and how long did the others take to respond?
What I owned
- Product concept, data model and implementation end to end
- A zod-backed content schema where each category is its own JSON file, free to extend a shared minimal contract
- The race grid: CSS Grid against a quarterly axis, with weighted events and empty stretches folded into a labelled break
- Editor-style pan and zoom — wheel, drag, pinch and keyboard — written directly rather than taken from a library
- A separate phone view, because eight columns of quarters cannot be compared on a 360px screen
- Researching, dating and sourcing every event, and the script that verifies the citations still resolve
Technical challenges
- Event density: the field produced more in 2023–2025 than in the twenty years before, so a year-per-row axis collapses into an unreadable pile
- Making a horizontally scrolling grid usable with a mouse, where a wheel does nothing and the scrollbar is the only way across
- Keeping a pinned column pinned — padding on the scrolling content silently unsticks it, because it pins to the scrollport rather than the padded box
Engineering decisions
- Organisations as rows rather than columns: eight columns put five on screen, which defeats the comparison the product exists for
- Quarters rather than years, with a weight on every event so the default view carries the significant ones and a control reveals the rest
- A source URL required on every event by the schema, day-precise dates even though the view groups by quarter, and tests for dangling references, duplicate ids and future dates
- No pan-and-zoom library — the carousel ones fight a free-scrolling grid and the gesture ones were more than one handler needed
Technology
Next.jsReactTypeScriptTailwind CSSzodVitestPlaywrightCSS GridGitHub Actions
Built to hold more than one dataset — the category switcher appears when a second one exists, so a single tab never reads as an unfinished feature.