This site tracks the results of a weekly Golf With Your Friends game between a small group of friends. The tradition started during the COVID-19 lockdowns as a way to stay in touch, and the group has kept it going ever since. Every Sunday night our steam gaming sessions concludes with a round of "Forest", and this site records the outcome: scores, standings and a link back to the original in-game leaderboard photo for every game played.

Built and maintained by Alistair Swanson as an exercise in AI coding. Contact: gwyf@swansonconsulting.it.

Golf With Your Friends is a multiplayer minigolf video game by Blacklight Interactive, available on Steam. This is an independent personal stats project and is not affiliated with or endorsed by the game's developer or publisher.

How this site was created

A photo habit with no plan

For years, for no particular reason, I took a photo of the in-game leaderboard after every Sunday-night round - the same screenshots you can still open from every row on the Game Log today. I didn't have a use for them. I just had a vague sense that the data might be worth something someday, and photos were the only record that existed - the game itself keeps no history once the lobby closes.

Three false starts at reading them

Turning a folder of screenshots into structured data turned out to be a much harder problem than it looked. I tried three times before it stuck:

  • Early 2025 - uploading photos to general-purpose AI chatbots and asking them to read the scores off. They hallucinated badly: confident, plausible, wrong numbers, with no way to tell which ones without checking every photo by hand anyway.
  • Autumn 2025 - running OCR locally. Technically workable, but the setup and tuning effort was well out of proportion to a hobby project.
  • Spring 2026 - going back to a hosted AI, this time with a much more heavily engineered prompt and context payload per image. Better, but still a lot of fiddly per-photo effort for what should have been a mechanical task.

The idea sat there, unsolved, for over a year.

The Codex bug

What actually broke the deadlock wasn't minigolf - it was ice hockey. I was growing frustrated on ice hockey forums at clearly inaccurate statistics, generated by hallucinating AIs, being used as 'evidence' to support arguments. To answer my own complex questions I was going to need my own accurate data, so I collated it from multiple sources and generated the graphs and tables I was looking for. That itch (see the result: EIHL league tables) is what got me properly hooked on agentic coding tools. Once I had them working well on a real problem, the GWYF photo pile was the obvious next target.

Around the same time I set up the infrastructure to actually do this properly: a new ASUS Zenbook 14 running Fedora, a personal AWS account, GitHub, and a domain I'd been sitting on for years with no good reason to use it. That grew into a small template repository of standards and guardrails for starting new AI-assisted projects - deliberately scoped to deterministic coding work, not to anything that leans on an AI model at runtime (and its ongoing token cost).

Three days, start to finish

  • Thursday 23 July 2026 - taming the OCR Pointed the pipeline at RapidOCR (bundled PP-OCR/ONNX models, the open-source engine behind the "Baidu OCR" tip-off that finally got this unstuck) instead of Tesseract. The difference wasn't subtle: on the same 10-photo sample, Tesseract's full-image pass found the leaderboard's anchor text on just 1 photo and took up to 51 seconds each; RapidOCR found it on 9 of 10, in 1-3 seconds each. Table geometry was then derived per photo from RapidOCR's own text detections rather than a fixed crop, and photos that needed it got manually straightened in GIMP (Shift+P for a perspective skew, then crop). A data-quality-check harness flagged anything uncertain for review as results came in - by the end of the day, about three-quarters of the photo library had been read to a 90%+ confidence level fully automatically.
  • Friday 24 July 2026 - a place to put it Finished OCR-ing the remaining photos, then handed Claude Code the project's own standards template and asked it to build a public stats site from scratch. It shipped the same day, wired to GitHub Actions so a version tag ships straight to production and a push to a prototype branch deploys an instant, unlisted preview.
  • Saturday 25 July 2026 - filling it out Spent the day brainstorming analysis ideas with both Claude Code and Codex and building out whichever ones stuck - awards, hall-of-shame pages, streak trackers, a par-relative birdie tracker, and more. Codex took over the visual side and built the "GWYF Forest" course-themed look you're looking at right now, banner included. The two tools then added live functionality: submitting scores hole-by-hole during a round and watching the Victory Odds page update in real time, including projected score ranges for the hole not yet played. A fancier version of this - capturing scores directly from the game, by network traffic or a screen-reading OCR loop - got seriously considered and shelved in favour of a small command-line tool for typing scores in by hand. (A real GWYF API would be nice, though.) By the end of the day the site was ready for the group's next scheduled round, likely 2nd August.

Claude vs. Codex

Across the whole project, Codex and Claude Code turned out to be extremely close in capability. My own take, for what it's worth:

Codex appears to be quicker, but I hit my "5-hour token threshold" with it sooner. For images and styling - despite Claude's reputation for front-end work - Codex was the clear winner for image generation; see the banner. And the heavier Codex reasoning mode was probably overkill here: the lighter one did the job just as well.