Steam-first library and media intelligence.
Games dashboard, wishlist and cost analytics, friends and multiplayer planning.
Plus optional music, movies/TV, and manga/reading modules.
- 🎮 Steam Intelligence: Comprehensive library insights, cost analytics, and dynamic wishlists.
- 👥 Multiplayer Planning: See what friends are playing and organize gaming sessions seamlessly.
- 🎧 Music & Media (Optional): Ingest and analyze music via ListenBrainz, movies/TV via Trakt/TMDB, and reading via AniList.
- ⚡ Modern Stack: Built for speed and scale with Next.js 16 App Router, NestJS, and Prisma.
- 🛠️ Flexible Deployment: Run locally with SQLite or scale up with Postgres + Redis via Docker Compose.
| Domain | Technologies |
|---|---|
| Web | Next.js 16, Tailwind CSS 4, Recharts, Framer Motion |
| API | NestJS, Prisma, BullMQ (with Redis); optional in-process cron |
| Music | ListenBrainz ingest + analytics (/v1/music/*); shared DB (via multi-scrobbler) |
| Watch | Movie/TV ingest + analytics (/v1/watch/*, /webhooks/*); shared DB |
| Read | Manga/novel ingest + analytics (/v1/read/*); shared DB |
| Data | SQLite or PostgreSQL (Environment selected) |
| Cache/Queues | In-memory or Redis (Environment selected) |
💡 Tip: Music, Watch, and Read features are soft-gated and optional in the UI.
- Node.js 20+
- pnpm 10+
- Steam Web API key
- Docker (for self-hosted or production stacks)
Choose the setup that best fits your needs:
| Mode | Command | Database | Redis | Typical Use |
|---|---|---|---|---|
| Local | pnpm setup → pnpm dev |
SQLite | Off | Development |
| Self-hosted (lite) | pnpm docker:selfhosted |
SQLite volume | Off | Minimal home server |
| Self-hosted (full) | pnpm docker:selfhosted-full |
Postgres | On | Durable self-host |
| Production | pnpm docker:prod |
Postgres | On | Public HTTPS / multi-user |
Copy the relevant environment template and edit your secrets:
cp .env.local.example .env
# Set SESSION_SECRET and STEAM_API_KEY
# Optional: ALLOWED_STEAM_IDS=76561198...,76561198...Note:
APP_MODEdrives boot checks (local|selfhosted|selfhosted-full|production).
See docs/self-hosting.md for detailed configuration options.
cp .env.local.example .env
# Set STEAM_API_KEY (SESSION_SECRET can stay weak locally)
pnpm setup
pnpm dev- Web: http://localhost:3000
- API: http://localhost:4000 — Handles Steam, optional media modules, and in-process cron.
- Optional Features: Set
NEXT_PUBLIC_ENABLE_MUSIC=true,NEXT_PUBLIC_ENABLE_WATCH=true, orNEXT_PUBLIC_ENABLE_READ=truein your environment (nav links appear when the API/healthendpoint reports them as enabled).
Want Docker-based infra during local dev? Run pnpm docker:infra to spin up Postgres and Redis, then update DATABASE_URL and REDIS_URL to point to localhost.
For self-hosting setups, copy the respective .env template and set your SESSION_SECRET, STEAM_API_KEY, and optionally ALLOWED_STEAM_IDS.
# Lite setup (SQLite)
pnpm docker:selfhosted
# Full setup (Postgres + Redis)
pnpm docker:selfhosted-full # (Alias: pnpm docker:up)Pro-Tip: Prefer building from source using
-- --build. Compose may pull prebuilt images when configured.
cp .env.production.example .env
# Set strong SESSION_SECRET, STEAM_API_KEY
# Set public HTTPS for STEAM_*, WEB_ORIGIN, and NEXT_PUBLIC_API_URL
# Set ADMIN_EMAILS=you@example.com for the first admin
pnpm docker:prod
⚠️ Warning: Production boots will fail if secrets are placeholders or URLs remain as localhost. Signups remain open until at least one admin exists, after which it can be toggled in Admin settings.
Click to view all core environment variables
| Variable | Purpose |
|---|---|
APP_MODE |
local, selfhosted, selfhosted-full, or production |
DATABASE_PROVIDER |
sqlite or postgresql |
DATABASE_URL |
Connection string for DB (file:... or postgresql://...) |
REDIS_URL |
Cache/BullMQ. Leave empty for in-memory sync. |
USE_INLINE_SYNC |
Set to true to force inline sync even when Redis is set. |
SESSION_SECRET |
Cookie signing secret |
STEAM_API_KEY |
Mandatory API Key from Steam |
STEAM_REALM / RETURN_URL |
OpenID configuration (Must match API origin) |
WEB_ORIGIN |
Browser app origin (for CORS + redirects) |
NEXT_PUBLIC_API_URL |
Web client's connection point to the API |
ALLOWED_STEAM_IDS |
Comma-separated allowlist of Steam IDs for auth (empty = any) |
ADMIN_EMAILS |
Emails granted admin status upon signup/login |
CRON_ENABLED |
Toggle internal cron jobs (true / false / 0) |
Prisma cannot take provider from env at runtime, so pnpm db:schema generates schema.prisma from schema.template.prisma before dev/build hooks.
| Command | Description |
|---|---|
pnpm setup |
Install, build shared packages, generate Prisma provider, push schema |
pnpm dev |
Start Web + API servers |
pnpm test |
Run Vitest across packages that define tests |
pnpm db:schema |
Generate schema.prisma for the active DB provider |
pnpm db:push |
Apply Prisma schema changes to the DB |
pnpm docker:* |
Compose aliases (up, down, build, selfhosted, prod, etc.) |
CI runs automatically on pull requests to main (Vitest and Playwright for web).
apps/web Next.js 16 App Router UI
apps/api NestJS API (Steam + music + watch + in-process cron)
packages/db Shared Prisma schema template + client
packages/shared Shared Zod schemas, session/oauth helpers
docs/ Documentation (self-hosting, testing)
docker-compose.yml Compose deployment profiles
- Friends lists, wishlists, and robust library parsing require public Steam privacy settings.
- Sync jobs are designed to degrade gracefully if user data is kept private.
This project is source-available and distributed under the PolyForm Noncommercial 1.0.0 License. See LICENSE for details.
- Noncommercial Use: Personal and noncommercial self-hosting is allowed.
- Commercial Use: Not granted by this license — contact the copyright holder.
- Required Notice: Copyright Questory Labs (https://github.com/Questory-Labs/Questory)
Never relicense as MIT/Apache, strip notices, or imply commercial rights under this license.