Building a GeoGuessr AI: The Hard Parts, the Dead Ends, and What It Costs to Run
This is not a piece about how the prediction works. That one is already written: how ATLAS predicts a location covers the cues, the framing and why data coverage matters more than anything clever. If that is what you came for, start there.
This is the other half. What was actually difficult, which approaches got built and then thrown away, what the thing costs to keep running, and what a year of doing it changed about the product. It started as a nerdy question rather than a market opportunity, and most of the interesting decisions were not technical ones.
The part I thought would be hard
Naming a country from a photograph. That is the part everybody asks about, and it is the part that turned out to be the well trodden road. Enough people have worked on single image geolocation that the shape of the problem is understood, and the honest summary is that it works about as well as the data lets it work.
Where it landed: the country is right about 81 percent of the time, measured across more than 1,600 real ranked rounds in July 2026, over 111 countries, off 5.3 million street level training images. That is a live play number, not a curated test set, which is exactly why it is not in the high nineties like the figures you see quoted around this category.
One round in five it names the wrong country. I spent a long time being unhappy about that and eventually understood it as the interesting part rather than the embarrassing part.
The part that actually was hard
A duel is timed. That single fact shaped almost every decision that followed, and I did not see it coming when I started.
An answer that arrives after you have already placed your pin is worth exactly nothing. Not less, nothing. So the real requirement was never accuracy on its own, it was accuracy that lands inside about 3 seconds from the moment the panorama is on screen, on an ordinary desktop machine, without a graphics card that costs more than the game does. Every time there was a choice between a bit more accuracy and staying inside that budget, the budget won, because a slow correct answer and a fast wrong one score the same.
That constraint also killed things that would otherwise have been obvious. It is the reason the product looks the way it does more than any other single decision.
What got thrown away
Three things got built far enough to judge, and then cut. All three were cut for reasons a user can check against the shipped product, which is why they are worth writing down.
A version that ran inside the browser. It was easier to install and it demoed beautifully. It also meant putting code inside the page that runs the game, which is the behaviour most likely to cost somebody their account. The tool would have been carrying a risk and the user would have been paying it. Cut. What shipped instead is a separate application that reads the screen and never touches the game session, which is slower to set up and much easier to defend.
A version that did the thinking on a server. Cheaper hardware for the user, one place to update, all the usual arguments. It also meant a continuous stream of screenshots of somebody's machine leaving their machine. I could not find a framing of that I was willing to put on a pricing page. Cut. The desktop app does the work locally, which costs more in support and gains a sentence I can say without flinching.
A confidence percentage in the interface. This one I was attached to. It turns out a number like 94 percent next to a wrong answer is worse than no number at all, because people believe it, place the pin without looking, and then feel lied to. Confidence is genuinely hard to calibrate on the rounds where it matters most, which are exactly the ambiguous ones. Cut, and replaced with something that reads as a suggestion rather than a verdict.
What it costs to run
Not what people expect. Because the prediction happens on the user's own machine, there is no per request bill that grows with usage. That was a deliberate choice and it is the reason the pricing on the plans page looks the way it does rather than being metered.
The real costs are the unglamorous ones. Support, which is a person answering a Discord message about a driver. Refunds, which happen and should. And time, most of which goes not into the model but into the eleven different places the thing has to run, each of which breaks in its own way. The engine is the small part of the work. It stopped being the bottleneck a long time ago.
What surprised me
Three things, in order of how wrong I was.
The hands free mode became the headline. I built the unattended bot as a side capability for people who wanted to grind, and assumed the assist mode would be the product. It is the other way around for a large share of users. Around 4,000 points a round, unattended, turned out to be a more compelling promise than a good suggestion you still have to act on. The best round I have on record is Tokyo, 11 km off, 4,987 out of 5,000, and it is the one people quote back at me, even though it is a ceiling and not an average.
Being upfront about the failures sold better than hiding them. This category is full of confident claims, and my honest instinct was that publishing an 81 percent figure next to competitors claiming 99 would lose. It did the opposite. A number with a method attached is checkable, and the people who check are the people who buy. Every comparison page on this site now has a section arguing for the alternative, for the same reason.
The misspelled searches are real people. There is a long tail of people typing the game's name wrong, and for a while I treated that as noise. It is not noise, it is a meaningful share of everyone looking for this, and ignoring it meant being invisible to them.
What I would tell someone starting this
- Find the constraint before you optimise anything. Mine was 3 seconds and I found it late. Everything I built before I understood it had to be reconsidered afterwards.
- Decide early whose risk it is. The browser version and the server version were both cut on this question alone, and both times it was the right call for reasons that had nothing to do with performance.
- Publish the number you actually measured. It will be lower than the competition's and it will age far better, because it is the only one that survives somebody checking it.
- The model is the easy part. Distribution, support and the eleven places it has to run are the product. I would tell my past self to spend the first month on that instead of the last six.
See what came out of it
7 free rounds in the browser extension, no account needed. Judge the 81 percent for yourself, including the round in five where it misses.
Get Started