Skip to content
AJ Stefely
← All work

GameAtlas

Live

An AI advisor that checks a real catalogue before it recommends a game to you

Role

Solo — product, frontend, backend, infrastructure

Timeline

2025 — present

Built with

Next.js 15, TypeScript, Supabase, Vercel AI SDK, TanStack Query, shadcn/ui, Playwright, Stripe
The GameAtlas advisor answering: a search count, the reasoning behind the picks, the assumptions it made, and three dials for adjusting them.
“1 search · 5 games considered” is the catalogue check, stated rather than implied. Underneath it the advisor lists what it assumed about you — playing solo, enjoys puzzles, no combat — and every one of those is removable.

The problem

A language model will name games confidently, including ones that do not exist, are not on PC, or shipped after its training data ended. On a recommender that is not a cosmetic bug — a wrong game name looks exactly like a right one, and the entire value of the product is that its advice can be trusted.

The second problem arrived with the first users: every reply costs money, and a conversational app backed by a paid model has no natural ceiling.

What I built

Two ways in — quick picks from a couple of games you already love, or a longer conversation that builds the recommendations around your answers — plus a third for the games already sitting unplayed in a library you own.

Either way the advisor searches a real catalogue before it recommends, and tells you that it did. A reply carries how many searches it ran and how many games it weighed, and it lists what it assumed about you so any of it can be struck out and the picks rebuilt.

Around that sits the part that makes a recommendation actionable rather than merely interesting: live prices across storefronts, a hardware check that accepts your specs three ways ranked by how far each can be trusted, and a watchlist for the games that have not shipped yet.

What it will not do is fill a gap. The profile says how many of its nine signals it actually holds; a price it could not fetch says so rather than showing a stale one.

Three recommended games as cards, each with a match score, genre tags, a star rating and a live price.
Every pick carries a live price from the storefronts rather than a number typed in once — “lowest ever”, “near its low”, and “price unavailable” when the check fails, which is the same refusal to guess that governs the recommendations.
A profile completeness bar reading two of nine signals at 22 percent, chips for the signals still missing, and a connected Steam library below with its details redacted.
“Anything left blank is not guessed at — it is simply not considered when picking games.” The advisor says how much it actually knows about you instead of behaving as though it knows enough. The bar over the Steam line is a redaction: that account’s handle and play history are real.
Three ways to add PC specifications: upload a DxDiag file, auto-detect in the browser, or enter them manually.
Hardware arrives three ways, ranked by how much each can be trusted. A DxDiag file is exact, browser detection is a guess at the GPU, and typing it yourself is whatever you believe. The ranking is the honest part.
The GameAtlas home screen: quick match, deep dive and backlog modes, with example prompts such as relaxing games I can pause anytime.
Two ways in, and a third for the games you already own. The line under the prompt box — that responses are AI-generated and the catalogue comes from IGDB and RAWG — is deliberate rather than boilerplate.

What it changed

Each figure below was read out of the repository, not estimated.

3
test layers — unit, end-to-end, and model evalsVitest, Playwright, evals suite
4
external APIs integrated — IGDB, RAWG, CheapShark, Twitch authadvisor tool layer
573
commitsgit rev-list --count HEAD, Aj6650/game-genie main, 2026-09-08

Decisions worth explaining

01

An unverified recommendation is the whole product failing quietly

A language model will name games confidently, including ones that do not exist, are not on PC, or shipped after its training data ended. So the advisor searches IGDB before it recommends, and when those credentials are absent the tool list comes back empty and the app says outright that recommendations are unverified rather than pretending otherwise. Degrading loudly was the point: a wrong game name looks exactly like a right one.

02

Every reply costs money, so something has to bound it

A conversational app backed by a paid model has no natural ceiling — one user, one loop, and the bill is unbounded. The most recent work on this project is entirely about that: capping how many catalogue calls a single reply may make and how long it may run, pinning cheaper models to the jobs that do not need a good one, backing off when IGDB rate-limits instead of failing the search, and recording what a reply actually costs so that the question of what would reduce it has an answer other than a guess.

03

Taking the ads back out

I added AdSense, then removed it from every layer it had reached and replaced it with a support ask that appears on earned attention rather than on arrival. It was the right call on a product whose entire value is trustworthy recommendations — an advisor carrying ads invites exactly the question you least want asked about its advice.

What’s next

Cutting the first-run walkthrough down to the few steps that actually matter, and putting the AI behind an account so the cost of a reply is attached to someone.

See it for yourself

Every screenshot above is the running product rather than a mockup, and the fastest way to judge any of this is to go and ask the advisor for a game.

Built with

  • Next.js 15·
  • TypeScript·
  • Supabase·
  • Vercel AI SDK·
  • TanStack Query·
  • shadcn/ui·
  • Playwright·
  • Stripe