The idea
A personal web app that syncs your Steam library, displays each game's achievement completion rate, and lets you mark titles as "want to play," "in progress," or "abandoned." A weekly digest email lists the three games closest to 100% completion and the three you've spent no time on yet. No social feed, no Discord integration — just a personal inventory and a gentle weekly prompt.
Why build this
Steam libraries balloon over years of sales. The average library holds 80–90 games; the average player has launched fewer than half. Achievement completion rates are a natural progress metric, but Steam's default UI doesn't surface them across your entire library at once. Third-party sites like HowLongToBeat track expected completion time, and Steam's own achievement pages exist per-game, but nothing combines your actual hours, personal priority labels, and a recurring nudge in one lightweight, self-hosted package.
The Steam Web API is free and well-documented. Unlike PlayStation or Xbox, Steam exposes a public API that returns library contents, hours played, and per-game achievement percentages without requiring an OAuth flow — just an API key and a public profile. The technical barrier is low; the gap is assembly.
Stack sketch
- Backend: Python, FastAPI, APScheduler for weekly digest jobs
- Steam integration: direct calls to
ISteamUserStats/GetPlayerAchievements/v1andIPlayerService/GetOwnedGames/v1; no unofficial client libraries needed - Cover art and metadata: IGDB API (free tier, requires Twitch OAuth client credentials) for game covers and genre tags
- Storage: SQLite via SQLAlchemy — one table for games, one for achievement snapshots keyed by sync timestamp so you can see completion progress over time
- Frontend: HTMX + Jinja2 templates — server-rendered pages with partial updates for filtering and label changes, no JS build step
- Email digest: Resend or plain smtplib with a minimal HTML template
- Auth: single-user token in a signed cookie; no account system needed for a personal tool
Scope for v1
- Connect a Steam account by entering an API key and Steam ID in settings; validate the profile is public on save
- On-demand sync that fetches the full library and achievement percentages; results cached in SQLite
- Game list view: title, cover art, hours played, achievement completion percentage, personal status label (backlog / in progress / abandoned / completed)
- Filter by status label; sort by completion percentage, hours played, or title
- Free-text note field per game ("started chapter 3, found combat tedious")
- Weekly email digest: three games nearest 100% completion, three with zero hours played
- Single Docker container with a mounted volume for the SQLite file
Out of scope for v1: PlayStation or Xbox sync, multi-user support, social sharing, friend comparisons, LLM-based recommendations.
Where it could go
The most common follow-on request for tools like this is multi-platform support. PlayStation Network trophy data is accessible through unofficial community libraries, and Xbox has a documented achievements API. Unifying three libraries into one view — "you have 430 games across three platforms, here's your real backlog" — is a level of honesty most players avoid but a meaningful minority actively want.
A second direction is LLM-powered prioritization. Given a user's genre preferences (inferred from most-played titles) and an estimate of available hours per week, Claude could rank the backlog by a blend of likely enjoyment and completion probability. This shifts the tool from passive tracker to active recommendation engine, which is harder to get right but makes it meaningfully different from a spreadsheet. Pair it with HowLongToBeat completion time data and you can answer "what can I realistically finish before the end of the month?"
Watch out for
Steam profiles must be set to public for the API to return library and achievement data — a private profile returns an empty response with no error code. Make this failure mode explicit: detect the empty response, check the profile privacy setting via ISteamUser/GetPlayerSummaries/v2, and surface a clear message rather than silently showing an empty library.