← Back to projects

Fun builds

Built for the joy of it. Engineered like it matters.

Side projects from things I care about — rallying, cars, Dubai and the world around us. No AI in these; just data, algorithms and careful engineering.

WRC Analyzer

PythonMonte Carlo simulationGitHub ActionsCloudflare Pages + D1

A World Rally Championship site with live timing, team news, a weekly newsletter and race predictions — rebuilt and published automatically every hour, and posted to X and Reddit when something new happens.

ModelPipeline
Pull inlive timing, news & press releases, car photos
→
Restore memorystate carried between hourly runs
→
Ratings + simulation10,000 simulated rallies per surface
→
Build static sitepages, share images, sitemap
→
Sharenew events to X and Reddit
→
Publish if changedCloudflare Pages
  • Driver ratings learned from dataEach crew's pace is its average deficit to the fastest car in seconds per kilometre, per surface — learned from every stage of past rallies, with recent form weighted most.
  • Monte Carlo predictionsEach simulated run draws every crew's pace, adds stage-to-stage noise that grows with the distance left, and sprinkles in punctures and retirements — then ranks the finishers.
  • Static, but aliveAn hourly GitHub Action rebuilds the whole site; only the prediction game runs server-side, on Cloudflare Functions with a D1 database.
  • Frugal by designIf nothing visible changed, the deploy is skipped — staying well inside the free hosting plan's build limits.

ModLab

ReactTypeScriptThree.jsNode

A car-modification planner for enthusiasts: pick from 101 cars, set a goal and a budget, and get the best combination of parts — with 3D views, landed prices, delivery dates and install guides.

AlgorithmFeature
Pick a car101 models, full specs
→
Set goal + budgetpower, track, daily, sound…
→
Optimiserbest parts within budget
→
Live pricesGoogle Shopping + eBay
→
Shipping timelineduties and arrival windows
→
Install guidePDF, generated in the browser
  • An exact optimiser, not a guessA depth-first search with budget pruning picks at most one part per slot, respecting which parts require or conflict with others — small enough per car (~25 parts) to search exhaustively.
  • Honest numbersCosts include shipping and import duties; mods that add no performance say so plainly, and estimated prices are labelled as estimates.
  • Keys stay privateLive prices come through a small Node server that holds the API keys and caches each search for an hour to keep costs down.
  • 3D partsRotatable Three.js renders of each part, using properly licensed models where available.

What's On Dubai

Next.jsTypeScriptWeb scrapingGitHub Actions

A guide to everything happening in Dubai — concerts, festivals, family days out, sport and food — showing where to book, how prices compare across sellers, and what people say.

Data qualityPipeline
Fetch politelyrobots.txt, rate limits, retries
→
Extractstructured event data from each page
→
De-duplicatesame event across sites
→
Merge + priceoffers, history, market price
→
Next.js siteevents, deals, my plan, calendar
  • A polite scraperRespects robots.txt, rate-limits per site and retries carefully, reading the structured event data most ticketing pages already publish.
  • One event, many sellersTitle similarity matches the same event across sites, merges their offers and keeps a daily price history.
  • Deals you can trust"You save" is measured against the median market price, and prices older than 48 hours are never shown as current.
  • Refreshed every morningA scheduled GitHub Action re-scrapes daily at 06:00 Dubai time and commits the fresh data.

God's Eye

JavaScriptLeafletPythonCloudflare Worker

Situational awareness from public data: a single live world map of aircraft, satellites, earthquakes, disasters, natural events, weather and space weather — using only free, open feeds with no API keys.

SafeguardData path
Public feedsflights, satellites, USGS, GDACS, NASA, weather
→
Allowlisted fetchfixed sources only, cached per feed
→
Layerseach with its own refresh rate
→
Live mapLeaflet, satellite and street basemaps
  • Satellites computed in the browserOrbits are propagated from public orbital data every two seconds; click one to see its ground track.
  • Two ways to runA tiny Python server fetches every feed with caching; or it runs as a static site where the browser fetches directly, with a small Cloudflare Worker for sources that block browsers.
  • Can't be abused as a proxyOnly a fixed allowlist of sources is ever fetched, and the Worker only answers the site's own origins.
  • Works offline tooA demo mode generates realistic sample data, so it runs anywhere without a network.

Like what you see?

The AI builds go deeper — or let's just talk.