Josh BaileyIT Desktop Analyst
GProject 01

Fantasy Premier League analysis

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.

FCProject 02

EA FC 26 player model

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.

F1Project 03

F1 race replay

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.

Launch app ↗Write-up in progress
Back on the main pageWork historyFour roles, 2017 to now.
→
© Josh Bailey · jayjaybee.comSet in Geist.