ideas.
May 25, 2026 3 min read webconsumergaming

Game backlog and achievement tracker

A self-hosted web app that pulls your Steam library via API, tracks completion percentages, and sends weekly nudges about games you own but never play.

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/v1 and IPlayerService/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.