A Letterboxd-style tracker for video games.
Search for a game, log it (backlog, playing, completed, dropped or wishlist), rate it out of 10, follow other players and see their activity on your home feed.
Personal, non-commercial project. Free, no ads, open source. Live at quested.cc.
- Search any game — imported automatically from IGDB and RAWG the first time someone looks it up, no manual catalog entry. Filters by genre, platform and release year.
- Log it — backlog, playing, completed, dropped or wishlist, with a rating out of 10 (decimals allowed, e.g. 7.4) and a written review.
- Community ratings — every game page shows the average rating, a rating histogram and the most-liked reviews.
- Public profiles — your games by status, a chronological diary, your reviews and likes, custom lists (clonable by others), 4 pinned favorite games, bio and badges.
- Social — follow players, see their activity in your home feed, get game recommendations based on your tastes, like reviews, compare yourself on a leaderboard (games completed, average rating, reviews published) and see a taste-compatibility score on other profiles.
- Notifications — in-app bell, plus optional email and Web Push, for new followers, likes on your reviews and wishlisted games that just released.
- Works like an app — installable as a PWA, with a mobile bottom tab bar instead of a burger menu.
- Your account, your data — sign in with Google or Discord, export everything, or delete the account entirely.
- French and English — French by default, English at
/en. - Changelog —
/changelogshows what shipped, pulled live from GitHub Releases.
No manual catalog entry: the first person to search for a game imports it for everyone.
flowchart LR
U([You search a game]) --> S[Search]
S -->|already known| DB[(Postgres)]
S -->|not found| IGDB[IGDB API]
S -->|not found| RAWG[RAWG API]
IGDB --> D{Dedupe by title + year}
RAWG --> D
D --> DB
DB --> T[tRPC] --> N[Next.js pages]
- Next.js (App Router) + TypeScript
- Prisma + Postgres (Neon in production, Docker locally)
- tRPC for the API layer
- Auth.js (Google + Discord)
- next-intl for French/English
- Tailwind CSS
- Vercel Blob for avatars, hosted on Vercel
- Upstash Redis for rate limiting
- IGDB and RAWG as game data sources
You need Node.js 24+ and Docker installed. Then:
# 1. Clone and install
git clone https://github.com/itsarnaud/quested.git
cd quested
npm install
# 2. Start a local Postgres database
docker run -d --name quested-db \
-e POSTGRES_USER=quested \
-e POSTGRES_PASSWORD=quested \
-e POSTGRES_DB=quested \
-p 5433:5432 \
postgres:16-alpine
# 3. Configure the environment (see the table below)
cp .env.example .env
# 4. Create the database tables and start
npx prisma migrate dev
npm run devThe site runs at http://localhost:3000.
To get a working site you only need the first four rows — the rest can stay empty and the matching feature is simply disabled.
| Variable | What it's for | Where to get it |
|---|---|---|
DATABASE_URL |
Postgres connection | postgresql://quested:quested@localhost:5433/quested if you used the Docker command above |
AUTH_SECRET |
Session encryption | Any random value: openssl rand -base64 33 |
IGDB_CLIENT_ID / IGDB_CLIENT_SECRET |
Game data | Twitch developer account at dev.twitch.tv/console |
RAWG_API_KEY |
Game data (2nd source) | Free key at rawg.io/apidocs |
AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET |
Google sign-in | Google Cloud Console, redirect URI http://localhost:3000/api/auth/callback/google |
AUTH_DISCORD_ID / AUTH_DISCORD_SECRET |
Discord sign-in | Discord Developer Portal, redirect URI http://localhost:3000/api/auth/callback/discord |
AUTH_STEAM_SECRET |
Linking a Steam account | Steam Web API key at steamcommunity.com/dev/apikey — not OAuth, Steam uses OpenID |
BLOB_STORE_ID / BLOB_READ_WRITE_TOKEN |
Avatar uploads | Vercel Blob store in Public mode (Storage → Create Database → Blob) |
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN |
Rate limiting | Free database at upstash.com |
SMTP_* / ALERT_EMAIL_TO |
Error alert emails in production | Any SMTP provider (see src/instrumentation.ts) |
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT |
Web Push notifications | Generate a pair with npx web-push generate-vapid-keys |
You need at least one of the two sign-in providers (Google or Discord) to be able to log in. Steam can be linked afterwards from account settings, to import your library later on — it's not a sign-in method itself.
The project is built for Vercel + Neon:
- The Vercel function region should match the Neon database region (Paris/Frankfurt in this case), otherwise every DB request makes an unnecessary transatlantic round trip.
- Migrations don't run automatically at build time (Vercel's network to Neon proved unreliable for this) — after any schema change, run
npx prisma migrate deploymanually against the production database. - A daily Vercel Cron job (
vercel.json) hits/api/cron/game-releasesto notify users with wishlisted games that just released — set aCRON_SECRETenv var on the project, Vercel sends it automatically as a Bearer token.