Inspiration
I have played more than 800 games over 10 years of gaming on Steam, Xbox and Epic. More than 300 of them I played for less than 3 hours and then dropped, and some of those were bangers. I didn't know any of these numbers until I built Shelf. I had been trying to organize my games for years and it never worked. I wanted one place to keep every game from every platform, see my achievements sync in real time, find new games that fit my taste, and sort them however I want. No app did all of this together. So I built one.
What it does
Shelf is a gaming bucket list that fills itself in. It lets gamers:
- Discover games from our catalogue of 400K+ titles (the largest of any game tracker we know of) by swiping through a full-screen feed with trailers and screenshots
- Get recommendations based on their own taste from our recommendation engine
- Import and sync their library in one tap from 5 platforms: Steam, PlayStation, Xbox, Epic Games and GOG
- Track achievements, trophies, XP, badges and playtime from every platform in real time, all in one place
- Save a game the moment they see it on Instagram, TikTok, YouTube or X, straight from the share sheet into Shelf
- Organize games on real-looking shelves (Playing, Play next, Backlog, Wishlist, Completed, Dropped, plus custom shelves) and drag the game cases around, to bring back the 2000s feeling of owning physical games
- Complete and rate games. Finishing a game gets its own moment, and Shelf asks how it was while it's still fresh
- Share their shelves through a public profile, or export their whole library
- Get pulled back in by notifications about their own games, not generic "we miss you" pings
How we built it
Shelf's main feature, the 400K game catalogue, took a lot of research: where to get the data and, more importantly, how to merge data from different sources into one game entity. We pulled data from first-party APIs like IGDB and Steam, combined it with platform-specific data from PlayStation and Xbox, then cleaned and enriched it so search is fast and accurate. About 90% of this was done programmatically, with LLM calls for judgment and a human in the loop to check the flow.
Apart from the data work, most of the software was led by AI, from the auth flow and UI screens to harder parts like the Steam, Xbox and PlayStation integrations and real-time syncs. We used Claude Code, Codex and Cursor with clear guidance and strict coding rules, and most features landed in one prompt. The speed of iteration surprised us: apps that are years old have fewer features and are less stable than Shelf is today.
Notifications (OneSignal). We treated push as part of the product, not a marketing channel:
- Wishlist release: when a game on your Wishlist comes out, you get a push with its cover art.
- Almost there: when you have 80–99% of a game's achievements, we tell you how many are left ("4 left.").
- Still on Playing: if a game sits on Playing for 14 days with no session on any connected store, we nudge you once.
- Yesterday's recap: hours played and achievements unlocked across all stores, in one message.
- Profile went private: if your Steam, PSN or Xbox profile goes private, sync stops, so we tell you why.
- Plus games similar to your favourites, new catalogue additions, Steam level-ups, and a short series for day 2 and after 4, 7 and 15 days away. That series names the game you left on Playing instead of saying "come back".
The rules matter as much as the messages. A user gets at most one push every 5 hours. Nothing is sent during quite hours. Each type has its own cooldown (a wishlist release once in 90 days, a recap once a week). When several pushes are ready, the most personal and useful one wins. The copy is written to be read on a lock screen with custom images when hold.
Design. We wanted Shelf to feel like something you hold, not a spreadsheet. Games sit as cases on shelves. You long-press to pick one up and drag it to another shelf, and the others slide over to make room. The discover feed is a full-screen deck where trailers are loaded ahead of time, so they start as soon as you swipe. Each shelf has its own colour and icon, and activity heatmaps and playtime charts show your year in games. The motion is built with Reanimated, Gesture Handler, Expo Haptics and Expo Blur.
The code is all TypeScript, with React Native (Expo) on the frontend and Fastify on the backend. We used Better Auth for authentication, Zod for schema validation, TanStack Query for data fetching, and Expo modules for native features like Sign in with Apple, the file system and the share extension. Kysely handles the database layer and migrations, and OneSignal handles push.
The backend runs on an AWS EC2 instance, the app builds go through expo.dev, and the database is on AWS RDS in the same VPC to keep latency low.
Challenges we ran into
The biggest challenge was merging the data. There is no reliable way to know whether a game on Steam and a game on PlayStation are the same game. They share no common ID, and name matching breaks easily. We had to combine several sources and add multiple layers of checks to make sure two games really match. Retro and older games were another problem: platforms like PlayStation drop data for their old games, so we no longer had anything to match against.
Another big challenge was rate limits. When many users synced their Steam, PlayStation and Xbox accounts at once, syncs started failing and users complained. We couldn't just scale our servers, because the limits are set by the platforms themselves. We had to queue and pace syncs so they stay within those limits without making users wait.
Accomplishments that we're proud of
We are proud that Shelf has the largest game database we know of among game trackers. It is one of the few apps that syncs 5 platforms, and the only one where you discover new games by swiping through a feed. We are also proud that every notification Shelf sends is about a game the user actually owns, wants or is playing. And we are proud of the small moments, like dragging a case across your shelves or finishing a game, which feel good without getting in the way.
We are also proud of the fact that we have acquired 100+ users organically via word of mouth, Discord/Reddit communities and cold DMs.
What we learned
At first we thought getting users would be easy: post in Discord, Reddit and X in gaming and competitor communities, and people would come. The reality was very different. We had some success, but much less than we expected. That was our biggest lesson, and we are still learning it.
What's next for Shelf
We are not adding more features any time soon. We are focusing on marketing to get as many installs as possible: UGC content, posting on Discord, Reddit and X, and paid Meta ads once a content strategy is proven. We will also use OneSignal Journeys to test the timing of the day 2 and dormant messages. Our next goal is 10,000 installs.
Built With
- expo.io
- fastify
- postgresql
- typescript
Log in or sign up for Devpost to join the conversation.