The problem QuestLog solves is not “I don’t know which games exist”. It’s the opposite. Trailers, Discord messages, Reddit threads and the Steam sale generate a list far longer than any adult with a job will ever finish, and on Friday night the hour you had to play gets spent scrolling that list deciding.
I wanted two things: a place where a game goes in two taps so it stops slipping away, and something that makes the decision for me when I can’t. The first is a database. The second is a roulette wheel.
Table of contents
Open Table of contents
Save in two taps, and the field that matters
Search, tap the game, tap the status. Wishlist, Playing, Beaten, Abandoned — four statuses that match real life, with custom lists on top for couch co-op night or spooky season. On Android you can share a link from TikTok, YouTube or Reddit straight into the app and it resolves the game.
Every game arrives with a time-to-beat estimate from the community data behind IGDB, and this turned out to be the most important field in the app. “What should I play” is really “what can I finish in the time I have”, and a wishlist that doesn’t know a game is 90 hours long is a list of guilt.
The wheel
Fling it. It picks a game from your backlog. Filter the spin by mood, and by length — under ten hours on a work night, anything on a long weekend — and the wheel is no longer a gimmick but a constraint solver with a good animation. The stats screen then rubs it in: total hours of unplayed games, counted live, plus what you actually finished this year and a streak for finishing something every week.
The API died in August
QuestLog was built on RAWG, the open games database a lot of hobby projects use. In August 2026, midway through development, RAWG’s API went dark — the origin dead behind Cloudflare, no announcement, no migration window. A backlog tracker with no game data is a text editor.
The replacement is IGDB, the database Twitch runs: 500,000+ titles, covers, trailers, screenshots, genres, similar games and game_time_to_beats. It’s a better dataset with a worse onboarding — you need a Twitch developer app, a client ID and a secret, and OAuth tokens. The seam that saved the project was that game search sat behind a GamesApi interface from the start, so the swap was one new implementation and a week of re-mapping fields, not a rewrite.
The secret-in-binary shortcut that got the app to the store is being replaced by a Supabase edge-function proxy; a mobile binary is not a place to keep an API secret, even a Twitch one.
One Kotlin codebase, two stores
QuestLog is Kotlin Multiplatform with Compose Multiplatform: shared UI, shared data (SQLDelight), shared networking (Ktor), Koin for wiring, RevenueCat for purchases. This is the kind of app KMP is good for — data-heavy, list-heavy, and no platform feature that fights the shared UI. The Android version is on Google Play; an iOS build from the same repository is written but not on the App Store.
Two Compose bugs cost more than the API migration did:
Reading StateFlow.value inside a composable never recomposes. The wheel result screen read vm.result.value and rendered stale data forever, because Compose has no subscription to a raw property read. The fix is the pattern the whole app now follows: the view model mirrors its flows into mutableStateOf, and composables read only those. (collectAsState works too — but only if the returned state is actually read, which is its own trap.)
Google Fonts variable TTFs render wrong in Compose. Space Grotesk and Manrope as variable fonts rendered every weight as Light. The fix was fetching static per-weight TTFs instead. The same class of bug exists on the web side: instancing a variable font with fontTools can silently leave it variable, so you check that fvar is gone and usWeightClass is right before you trust the weight you see.
The share cards
Rate a game you beat, drop a one-line verdict, and the app renders a card — the beat-it card, your top-10 grid, your year wrapped — as a PNG through an expect fun encodePng(bitmap) with per-platform actuals. It’s the part of the app people show other people, which for a backlog tracker is the only marketing that works.
Built in public, for a deadline
QuestLog was built for RevenueCat’s Shipaton, which set the schedule: the app in store review by the start of September. A deadline is a good editor. Features that didn’t make the cut — real partner backlogs, Steam import — are still in the design doc, and the app is better for having shipped without them.
QuestLog is on Google Play. Your first fifteen games are free, which is roughly one Steam sale.