Kickgeist
PROBLEMThe date does not move.
Tippster Media was a social betting platform for the Bundesliga, the European Championship and the NFL. I was its CTO from 2014 to 2017. Kickgeist is a social prediction game for the 2026 World Cup: the same problem, twelve years later.
Kickgeist takes no money from players and pays nothing out. That is what separates the two products, and it is a legal position rather than a preference. It also decides the revenue model: advertising, or nothing.
A tournament product has one deadline and it belongs to somebody else. The tournament ran from 11 June to 19 July 2026, scheduled years before the first commit. A feature that lands after the final is a feature that was never built.
The load follows the fixtures. It concentrates at kickoff and again at the final whistle, when every prediction settles at once. Between matches the system is close to idle.
Scoring is public arithmetic. A player who is scored wrong can verify it and say so publicly.
APPROACHOne codebase, no API tier.
Kickgeist runs on iOS, Android and web from one Flutter codebase. It is localised, and it exposes an MCP server for agents. The first release, v25.12.3, shipped on 30 December 2025; the stores went global on 1 March 2026. First commit to global launch took about ten weeks.
An agent pipeline built it.
Kickgeist was built through an agent pipeline rather than by hand. The pipeline drafts, reviews and tests. Intent and the final ruling stay human, and the gates decide what ships. This is the factory the offer describes, and this product is where it was proven.
The shape is recent. Reasoning models became reliable enough to hold a codebase in view and argue about a change before making it. What that buys is measured in the result below.
The cost is not speed and it is worth naming. Review moves from writing code to deciding what is true. A pipeline that is wrong is wrong quickly and at volume, so the gates matter more.
The first database was wrong.
The first releases ran on Cloudflare D1. D1 is SQLite underneath, and SQLite takes one writer. The two-minute fixture sync batched over a hundred statements behind a single lock, held for two to five seconds. Signups and predictions arriving in that window failed with a connection error. D1 was migrated to Postgres in one move, in January 2026, before the stores went global. The migration deleted more code than it added; the custom auth layer and the API tier went with it.
There is no API tier at all. The app talks to Postgres directly, and row-level security is the authorisation boundary. The schema carries 25 tables, 51 database functions and 48 policies. Scoring, referrals and challenge settlement run inside the database, so a tampered client cannot bypass them. The cost is a failure mode that says nothing. A new table needs an explicit grant beside its policy; a policy alone returns a silent 403.
Store review is the risk.
Two of the three clients ship through a store review queue that nobody on the project controls. That queue sits between a finished build and a player, and it does not care about the fixture list. Each client adds a release path and its own platform behaviour to test. The web client is the only one of the three with no queue in front of it. Fastlane covers both store paths: 15 lanes for iOS and 17 for Android, from certificates to phased rollout.
Localisation does not retrofit.
Retrofitting a string catalogue into a shipped view layer means editing every screen. Doing it first costs something smaller: no string can be written directly into a view, ever. Doing it later costs the same edit, with the tournament already running. Kickgeist ships 29 languages across 35 locale files; the store listings and screenshots move with them.
The standard is local, not translated. Every language that distinguishes register uses the informal one. Each carries its own terminology table, and Brazilian Portuguese is rewritten rather than inherited from European Portuguese. Which locale shipped when was a business decision. Indonesian and Brazilian Portuguese went first, scored on smartphone reach, football engagement and regional ad rates.
The agent runs elsewhere.
An MCP server is an integration point: an agent client connects to it and calls the tools it exposes. The game owns its data and its rules; the client does the reasoning. Nothing about that path depends on a model shipped inside the app. The server exposes seven tools behind OAuth 2.1 and static API keys. Agent calls mint a per-user token and run under the same row-level policies as a human player. The cost is a second public interface to specify, version and secure.
RESULTThe groups did not compound.
Three things missed. The group-first architecture produced groups. It did not produce growth. Multi-member groups held 52.9% of players, 278 groups reached eleven or more members, and one reached 152.
The invitation loop did not close. The viral coefficient measured 0.013 against a 0.4 benchmark. Monthly actives fell 60% to 80% within thirty days of the final. The oldest pre-tournament cohorts retain about 4.2%.
The third miss is the revenue model. The assumed rate per thousand ad impressions was roughly eight times the rate it actually earned. Advertising is the only revenue line, so that assumption was the business model. The absolute rates are not published here; the ratio is the part that transfers.
The plan had been to build once, operate one tournament and wind down. The three misses replaced it. One ranked, localised listing goes quiet between tournaments and wakes for the next one. A new listing would need a new audience.
All three clients shipped, localised, with the MCP server in place. Beevelop built Kickgeist and operated it live through the tournament. 32,252 players submitted 863,000 predictions across 14,880 groups. 45% of that base arrived in the week of 8 June 2026.
92 releases shipped, 18 of them in January 2026 alone. Those releases carry 417 merged pull requests, gated by 2,032 automated tests and 231 golden images. The crash pipeline auto-filed 1,450 reports and deduplicated them by stack frame; one fix closed 185 at once.
The figures in this debrief were measured on 5 August 2026.
Install it from the App Store or Google Play, open it on the web, and switch the locale. Those three are settled without asking Beevelop anything.
