Current Projects

Built, shipped,
and running in production.

Live software, not mockups — full applications taken from data model to deployed product, each one running today with real users, real data, and the release discipline to keep it that way.

Probability-over-time chart for Germany versus Curacao, with flags marking each goal and live win, tie and loss percentages alongside
Replaying a finished match — the model re-prices at every goal.
World Cup 2026 fixture table showing kickoff times, groups, scores, win probability bars with fair odds, and venues
The full schedule with win / draw / loss bars and venue-aware home advantage.
01 Live

FutbolRanks

Soccer match probability engine

A match probability calculator driven by World Football Elo ratings, covering 244 national teams. Pick any two sides — or browse the full 2026 World Cup fixture list — and get win, draw, and loss probabilities with fair odds, adjusted for venue and host-nation home advantage.

Behind the front end sits a serverless layer that keeps itself current. A live in-play feed polls the upstream match provider through our own function, so the API token never reaches the browser, and results are cached and served stale-on-failure rather than hanging. Finished match data is owned by the app in a blob store with stale-while-revalidate refresh — no commits, no redeploys, no cron babysitting.

  • Elo-based probability model with draw weighting and fair-odds output
  • Serverless live feed — token held server-side, cached, never hangs
  • Self-maintaining match store with stale-while-revalidate refresh
  • Swappable provider adapters — new data source, zero front-end change
  • Per-team static pages, sitemap, and SEO-clean routing
  • Vanilla JS
  • Vercel Functions
  • Vercel Blob
  • Cron
  • Static generation
DartSolver scoreboard showing 97 remaining from 501, the three darts thrown that round, and the best ranked checkout of T19 into D20
Checkouts ranked by probability, recalculated after every dart.
Heatmap of logged dart throws on a board outline, showing clusters around the treble 20 and treble 19
Every throw plotted — clusters reveal tendencies you can't see in the moment.
02 Live

DartSolver

Scoring, strategy, and stats for darts

A full darts companion built around an interactive SVG dartboard. Score a match by tapping the board, and the app handles the rest — checkout suggestions, bust detection, and turn tracking across eight game formats including X01, Cricket, Around the World, Baseball, Killer, Shanghai, and Halve It.

Every throw is recorded, which turns scoring into data: accuracy heatmaps showing where darts actually land, aim analysis, per-player averages, and match history. Accounts, friends, and multiplayer run on a managed Postgres backend with row-level security, and subscriptions are handled through a webhook-driven billing flow.

  • Interactive SVG dartboard with segment-accurate hit detection
  • Checkout solver and bust handling across eight game formats
  • Throw heatmaps, aim analysis, and per-player statistics
  • Accounts, friends, and multiplayer with row-level security
  • Subscription billing via webhook-driven checkout
  • Installable PWA — works on the wall next to the board
  • React 19
  • TypeScript
  • Tailwind
  • Supabase
  • Stripe
  • PWA
Blackjack trainer showing a pair of eights against a dealer ten, the played move rejected and the correct play named as Split
Every decision is graded against the chart before it is allowed to play.
Progress dashboard showing practice streak, seven-day and all-time accuracy, an accuracy-by-day line chart, hands played per day, and a per-week table
Daily and weekly trends, so a few minutes a day becomes measurable.
03 Live

Blackjack Trainer

Basic strategy and card counting, drilled

A real shoe dealt under real table rules — deck count, penetration, soft-17, double-after-split, surrender and payout are all configurable — that grades every decision against correct basic strategy before it is allowed to happen. A wrong move does not play; it names the right one and the reason for it.

Nine counting systems run alongside the game, hidden by default so the count is practised rather than read, with configurable true-count conversion and a quiz at every shuffle. Progress is kept per day, so improvement shows up as a trend line instead of a feeling.

  • Correctness proven rather than asserted — 48,000 test assertions, and simulated perfect play reproduces published house edges within two standard errors
  • Nine counting systems; every balanced one verified to return to zero across a full shoe, every unbalanced one to land on its published pivot
  • Illustrious 18 and Fab 4 index play, graded against the running count
  • One shared logic package drives both the web app and a React Native build
  • Storage that merges instead of overwriting, so a second open tab cannot erase a session
  • No dependencies and no build step — the whole app is static files
  • Vanilla JS
  • Zero dependencies
  • Web Audio
  • Inline SVG
  • React Native

Timberlane & Co

The same approach, applied to your project.

These are built the way client work gets built here — engineered to run unattended, released deliberately, and maintained after launch.

Explore services