Inspiration

I follow way too many gaming channels. Every week some video convinces me I need to play something, I think "I'll remember that," and I never do. Meanwhile my actual backlog sits across Steam wishlists, a notes app, and pure vibes. QuestLog is my fix: a place where a game goes in the moment I hear about it, and a way to actually pick something on a free evening instead of scrolling storefronts for 40 minutes and going to bed.

What it does

QuestLog is a game backlog tracker. You search any of 500,000+ games (IGDB), save it in two taps, and sort your pile into Wishlist / Playing / Beaten / Dropped. The fun part is closing the loop:

  • Backlog roulette — fling a wheel and let it pick tonight's game. Filter by mood or by how long a game takes to beat, so a work night doesn't hand you an 80-hour RPG.
  • Pile of shame — a live counter of your unplayed hours. Mine says 395. It hurts.
  • Rate what you beat, write a one-line verdict, and share generated cards (beat-it card, top 10, year wrapped).
  • Browse trailers, screenshots and similar games without leaving the app.

Free up to 15 games; QuestLog Plus (annual with 7-day free trial, monthly, or lifetime via RevenueCat) unlocks unlimited library, full stats, all share templates and roulette filters.

How I built it

Kotlin Multiplatform + Compose Multiplatform, one shared codebase for iOS and Android — same UI, same SQLDelight database, same Koin graph. IGDB (via Twitch OAuth) powers search, covers, time-to-beat and the Discover shelves. RevenueCat (purchases-kmp) handles the paywall on both stores. The app ships in 17 languages.

Challenges

  • My original games API died mid-build. Not slowed down, died — DNS to nowhere. Swapped the whole data layer to IGDB in a day, which the repository seam made survivable.
  • Embedded YouTube trailers are cursed. A raw iframe renders a black void in a WebView; the IFrame Player API finally worked, and some publishers disable embedding entirely, so there's an escape hatch to the YouTube app.
  • Compose Multiplatform renders Android-style \' escapes literally. Found that one on a device screenshot that proudly said "Tonight\'s quest."
  • Getting the spin physics right: fling velocity, exponential decay, a tick per segment. Way more tuning than expected for a wheel.

What I learned

That a shared Kotlin codebase can genuinely ship a polished app on both stores, and that the last 10% (store metadata in 17 locales, IAP setup, RTL layouts) is its own project.

What's next

Steam import, HowLongToBeat-style community times, and wrapped cards for end-of-year. Also actually beating Elden Ring instead of tracking it.

Built With

  • android
  • coil
  • compose-multiplatform
  • fastlane
  • igdb-api
  • ios
  • koin
  • kotlin
  • kotlin-multiplatform
  • ktor
  • revenuecat
  • sqldelight
  • swift
  • xcode
Share this project:

Updates

Submission history