Back to works
PlateI

Gol Kralı — Offline Football Game

Gol Kralı is an offline football game for Windows and macOS, with a Turkish-only interface and the real 2025–26 Süper Lig clubs on the team sheet, plus a set of European and national sides.

Role

I directed this project rather than coding it. I set the requirements, chief among them that it had to feel like football to a kid holding a controller, chose the visual direction, and played every build by hand. AI coding agents, Claude and Codex, wrote the code across several iterations; I sent back the ones that didn't feel right and decided what shipped.

Stack

TypeScriptElectronCanvas 2DViteVitestPlaywrightelectron-builder
Gol Kralı — Offline Football Game

Windows portable .exe and zip, and a macOS (Apple Silicon) zip. The builds aren't code-signed, so Windows may show a SmartScreen prompt and macOS may need a right-click → Open the first time.

Overview

Gol Kralı is an offline football game for Windows and macOS, with a Turkish-only interface and the real 2025–26 Süper Lig clubs on the team sheet, plus a set of European and national sides. You pick a team, then play a quick match, a penalty shootout, or a three-round cup, with a gamepad or a keyboard alone; a mouse works in the menus. It runs entirely on the local machine: no account, no internet connection, no telemetry. I built it as a gift for a child in Türkiye, so every decision came back to one question: does it feel like football to a kid holding a controller?

What it does

  • IThree modes: quick match, penalty shootout, and a three-round cup with a bracket
  • II18 Süper Lig rosters checked player by player against official TFF registration records
  • IIIKeyboard-alone and gamepad-alone control in every mode, with remappable bindings that persist
  • IVZero network code, and the app blocks every outside request itself
  • VAn instant replay after every goal, letterboxed like a broadcast

Screens

Title screen, CRT arcade glow
Title screen, CRT arcade glow
Main menu, mode selection
Main menu, mode selection
Team select, the Süper Lig grid
Team select, the Süper Lig grid
Lineup intro, both starting elevens
Lineup intro, both starting elevens
A match in progress
A match in progress
Goal, confetti and banner
Goal, confetti and banner
Instant replay, letterboxed
Instant replay, letterboxed
Physics overlay on a keeper dive
Physics overlay on a keeper dive
Penalty aim, night stadium
Penalty aim, night stadium
Cup bracket
Cup bracket
Evening match
Evening match

Technical notes

  • IThe whole match runs as one ordered, fixed-step commit per tick, with every random outcome coming from a single seeded generator, so identical inputs replay byte for byte. That determinism is what makes a 38-entry counterexample corpus possible: 24 of those are proven to fail on the commit before their fix, not just tests that were written and always passed.
  • IIA separate tool deliberately reintroduces a known defect into a detached copy of the code and requires the matching check to go red: right now it produces 253 violations on the mutated tree and 0 on the honest one. A check that has never been seen catching the bug it was built for isn't proof of anything.
  • IIIPresentation is never allowed to author an outcome. The penalty shootout draws the keeper and the ball from the stepped physical attempt rather than a preselected animation, and a keeper's glove volume appears on screen only because the simulation's own save state says a save is live.

What I learned

Three earlier iterations came back with every automated check green and a game that still didn't play like football; one of them had the ball passing straight through players, and that bug survived 174 passing tests. So the checks themselves became the work: instruments built to be able to fail, and a rule that no report may claim more than its evidence shows.