Inspiration
You have two free hours. You open the library, scroll it, feel vaguely bad about the 80-hour RPG you bought in a sale, and play the same live service game you have played for a year. Forty minutes of the two hours are gone.
That is the problem. The cost is not that you are missing out on a good game. It is that the evening was the scarce thing and you spent it on the menu.
Here is what I could actually put numbers on.

The best evidence that a big library makes you act less is not from gaming at all. Iyengar and Lepper ran the study everyone half-remembers, and the real numbers are sharper than the folk version. A supermarket tasting booth with 24 jams pulled a bigger crowd than one with 6, 60 percent of passers-by against 40 percent. Then almost nobody bought anything. 3 percent of the people who saw 24 jams made a purchase, against nearly 30 percent of the people who saw 6. Their second study did the same thing with homework: 74 percent of students offered 6 essay topics handed the essay in, against 60 percent offered 24. (Iyengar and Lepper, Journal of Personality and Social Psychology, 2000, PDF.) A game library is a jam booth you paid for, and it gets one row longer every sale.
The population it happens to is not small. The Entertainment Software Association puts 212.3 million Americans playing video games as part of their regular weekly routine, and the US industry at $95.8 billion in total economic impact. (ESA, Essential Facts About the U.S. Video Game Industry and the 2026 Economic Impact Report, theesa.com.) A small slice of those people losing forty minutes a week to a menu is still an enormous number of evenings.
[NEEDS: three figures I wanted and could not verify, so none of them appear above. (1) The money sitting in never-played libraries. The number everyone quotes is roughly $19 billion of never-played games across sampled Steam accounts, credited to SteamIDFinder and written up by PC Gamer in 2024. (2) An average game completion rate, or the share of bought games never installed. (3) Minutes spent choosing what to watch or play per session, which Nielsen and Deloitte's Digital Media Trends have both published versions of. Every search engine reachable from this machine served a bot challenge instead of results, steamidfinder.com returned 403, and the Wayback CDX API did not surface the article's URL, so no figure, sample size or method could be confirmed for any of the three. If you want them in, open a browser, check each against the publisher's own page, and add the publisher, year and link. Otherwise delete this bracket and ship the section as it stands. It works without them.]
Then there are the posts. I read 299 of them from r/gaming, r/patientgamers, r/NintendoSwitch and r/AndroidGaming, posted between September 2024 and September 2026, carrying 33,585 upvotes and 21,744 comments between them. Three clusters stood out, and they are all the same evening.
58 posts, with 7,772 upvotes and comments, were people asking what to play. Not what is good. What to play tonight, out of the pile they already own. 20 posts, carrying 5,746, were about guilt and never finishing anything. 19 more, with 5,161, were about having two hours and spending forty minutes of it deciding. Across the whole set, 65 of the 299 mention money or what they paid, and 42 use the words guilt, shame, anxiety or overwhelmed.
Existing trackers make this worse. They are catalogues, and a catalogue is the thing you are already failing to choose from. Adding a better catalogue to a jam booth does not help you pick a jam.
What it does
Couch Quest is a bucket list with an opinion.
Save a game the second you find it. Share a Steam page or a YouTube trailer into the app, or type the title. Every game lands on a shelf: Up next, Playing, Paused, Someday, Done or Dropped. A game is always on exactly one shelf, so the shelf is the app's only real state.
When the evening comes, tap "What should I play tonight?" and answer three questions. How long you have. How much energy is left. What mood you are in. None of them asks what is good. It deals three games off your own pile and says in one line why the top one fits. Swipe one away to skip it, or deal again.
The rule that matters is the one that holds games back. Time and energy are hard limits, not hints. A tired forty-five minutes cannot surface a sixty-hour game, so the big one you are saving for a good night stays out of the deal until you have the night for it. That single constraint is the reason the picker exists. Everything else is bookkeeping.
Finish something and it rolls credits: how long it sat on the shelf before you started, the hours you played, the day you finished, your rating and the one moment you want to remember. The credits save as an image, so you can send it to whoever you told about the game a year ago.
Dropping a game rolls credits too, with a reason and no guilt. Deciding not to finish something is a decision. It should look like an ending, not a hole in a list.
The picker is fixed rules, not a model. Same pile, same three answers, same three games, and Settings says so plainly and tells you how it decides. There is no account, nothing leaves the phone, it works with the plane mode on, and one screen exports or deletes the lot.
How I built it
Kotlin and Jetpack Compose, one activity, one navigation graph, no server of my own.
The share sheet is where the design lives. The moment you decide you want a game is never the moment you are sitting in a game tracker. It is a Steam tab open at work or a trailer someone sent you last night. So the app registers as an ACTION_SEND target for plain text, and ShareParser turns a Steam store URL or a YouTube link into a title and a shelf choice. A YouTube link goes through the public oEmbed endpoint for the video's title, and TrailerTitleCleaner strips the "Official Launch Trailer | 4K" tail off it.
Layout is Material 3 with androidx.window and the material3.adaptive libraries. DenLayout holds the breakpoints as plain functions over a width in dp, which means the foldable behaviour is unit-testable without a foldable. AdaptiveDen reads the measured width and either runs the phone layout or splits into a cover wall beside a side pane.
Storage is a JSON file in the app's private directory. Android's app backup is off, so the pile is not copied into a cloud backup you did not ask for.
26 commits, 188 tests, offline throughout. Robolectric and Roborazzi cover the picker's full scoring and hard-filter table, the Compose screens, and the foldable layouts against the real androidx.window testing fakes.
How Couch Quest uses RevenueCat
RevenueCat's Android SDK (10.21.1) runs the paywall and the pro entitlement. The release build configures it with GalaxyConfiguration from purchases-store-galaxy, so purchases go through Samsung's in-app billing. Debug builds use a Test Store key, which is how anyone can run the repo and see the paywall without a Galaxy account.
Free covers unlimited games and shelves, the picker every night, credits, ratings, drops, the standard share card, and export and import. Nothing in the core loop is limited, because a backlog app that caps your backlog is a joke.
Pro adds custom shelves, four extra share card styles and Year in credits, a look back at everything you actually finished. One purchase, or a yearly plan that starts with a seven day free trial.
Pro is deliberately made of things you want after the app has already worked for you. You reach for Year in credits because you finished six games, not because something was blocked. The paywall reads each package's title and price from the store, so nothing about it is hard-coded.
Challenges I ran into
Making the picker feel like it knows you without pretending to. Early versions were close to random, and people spot that in one deal. The fix was demoting time and energy from scoring hints to hard filters, which is a smaller change than it sounds and the only one that mattered. A random shuffle that happens to exclude the wrong games reads as random. A filter that visibly refuses to offer you the sixty-hour RPG at 11pm reads as an opinion.
The Fold layout took longer than expected. Two panes is easy. Two panes worth having is not, because the question is what belongs on the right when nothing is selected. The answer turned out to be tonight's deal, which means an unfolded Fold shows you your pile and your evening's decision at the same time, and tapping a cover swaps the deal for that game.
Contrast forced a real decision. The cartridge pink accent on the ultramarine ground measures 2.91:1, which fails WCAG for text. Rather than change the accent, pink became a fill colour only, and it is used as text only on the near-black credits ground where it passes.
And there was the machine problem: parallel Gradle builds filled 30 GB of RAM and swap and took my desktop down twice. One build at a time, daemons capped.
Accomplishments that I'm proud of
Drops roll credits. I went back and forth on that, and it is the part I would keep if I could keep one thing. The guilt posts say the app should make quitting a game feel like an ending rather than a shameful gap in a list, and an app that only celebrates finishing would have made the problem worse.
Second is the restraint on the picker. It would have been a day's work to call a model and generate a paragraph about why you should play Hades tonight. Instead it is a scoring table you can read in Settings, it is deterministic, and it runs on a plane. The one-line reason is assembled from the same facts the filter used, so it can never say something the picker did not actually do.
It shipped on 9 August 2026 and has 322 downloads.
What I learned
The value is not in cataloguing. Every tracker already catalogues, and a catalogue is the thing you are failing to choose from. The value is in the thirty seconds after you sit down and before you give up and open the same live service game again. Everything else in the app exists to make those thirty seconds work.
I also learned that the honest version of a foldable feature is smaller than the marketing version, and worth more. The two-pane layout ships and is tested. Tabletop posture detection is written and tested but does not drive a screen yet, so I am not claiming it.
What's next
Reading the installed library so the pile starts full instead of empty, which is the single biggest drop-off in the flow.
A "we both have tonight free" mode for two people picking a couch co-op game. It came up often in the posts and it needs more thought than a shared list, because the filter has to satisfy two sets of answers at once.
Wiring the tabletop posture detector into the picker, so a half-folded Fold puts the dealt card above the hinge and the three questions below it.
Built With
- androidx-window
- jetpack-compose
- kotlin
- material3
- revenuecat
Log in or sign up for Devpost to join the conversation.