Projects · 3 built, 2 written up
Things I’ve built.When life allows.
Side projects, each with a write-up I’ve done myself. Some show how I’d ship a real product. Others were just for learning and fun.
- GGaffer IQFantasy Premier League analysisFixture difficulty scored as a pairing, not a property of one team.
- FCFC26 Feel CalculatorEA FC 26 player modelWhat a player actually feels like on the pitch, past the card numbers.
- F1F1 LiveF1 race replayAny race or sprint from 2023 on, replayed from the public OpenF1 API.
Gaffer IQ
A Fantasy Premier League tool that stops treating fixture difficulty as a property of a team, and starts treating it as a property of a pairing.
FPL’s official 1–5 difficulty rating is blunt. Gaffer IQ replaces it with a weighted composite of five sub-metrics, covering form, home and away splits, style clashes and position-based counter-matchups, scored against the opponent so a fixture’s two ratings always sum to 100.
Five views, one scoring engine
- Matchups
- Fixtures
- Ranker
- Dashboard
- Planner
- Role
- Design, engine, code
- Stack
- Vanilla JS, ES modules
- Backend
- One Vercel function
- Status
- Live, iterating
How it’s built: Every score comes from pure functions running in the browser. The only server code is a Vercel function that proxies the FPL API to get round its CORS restrictions.
FC26 Feel Calculator
The card says 87 pace. The player doesn’t feel like 87 pace. This works out the difference.
It models chemistry, PlayStyles and the curves the game runs under the hood. The formulas went through several rounds of tuning against in-game testing, and the interface was rebuilt in Tailwind once the maths stopped moving.
Two layouts
- Focused mobile read
- Desktop comparison
- Role
- Design, formulas, code
- Stack
- HTML, JS, Tailwind
- Size
- ~2,500 lines, one file
- Status
- Live, iterating
What it taught me: More about state management in plain JavaScript than any framework tutorial has. It exists because I wanted the version of this calculator I couldn’t find.
F1 Live
Any F1 race or sprint from 2023 on, replayed in the browser at anything from 0.1× to 256×.
Cars move on the track map with DRS zones, and the track colour follows safety cars, VSCs and red flags. Insight tabs show telemetry, lap-time and position charts, sector times and tyre stints, limited to what has happened so far in the replay.
In the replay
- Track map
- Leaderboard
- Telemetry
- Lap charts
- Tyre stints
- Standings
- Role
- Design, code
- Stack
- Vite, React, TypeScript
- Data
- OpenF1, no backend
- Status
- Live
Where it came from: A web port of the race view from f1-race-replay, an open-source desktop Python app. This version reads OpenF1 straight from the browser and caches sessions so races reopen instantly.