Open-source backlog manager for gamers.
Positioning: help players decide what to play and finish more games (not just catalog titles).
openbacklog.app is a web platform (with mobile expansion in mind) inspired by Backloggd, but differentiated by:
- Real backlog productivity (planning, prioritization, completion focus)
- Practical AI features (smart recommendations and habit insights)
- Better UX and lower manual friction
- Lightweight social layer to support engagement
- Game tracking and personal library (Backlog-style)
- Ratings and reviews (Steam-like model)
- Time-to-beat tracking (HTLB-style integration)
- Friends + activity feed
- Completion streaks and goals
- Monthly release calendar + reminders
- "What should I play today?" assistant
- Dynamic backlog prioritization
- Estimated total time to clear backlog
- Abandonment-risk signals ("likely to drop")
- Smart recommendations for Premium users
- Minimal-friction import (Steam first)
- Next.js (App Router, Server Components)
- TypeScript
- Tailwind CSS + shadcn/ui
- next-intl for localization (
en,esfirst)
Start with Next.js backend in the same app to move faster in the MVP:
- Route Handlers + server-side services in
src - Type-safe domain modules under
src/server/* - Better Auth for authentication
- Keep clear service boundaries to allow future extraction into a dedicated API app later
- Turso (libSQL/SQLite) as primary relational store
- Drizzle ORM + Drizzle Kit migrations
- Redis (cache, queues, rate limiting, feed fan-out)
- Object storage for user media (screenshots/avatars)
- Background workers for sync/import/recommendations/reminders
- IGDB API (game metadata)
- Steam import (phase 1 external sync)
- Single Next.js app repository (no workspaces)
- One codebase for UI + backend endpoints during MVP
- Keep modules organized by domain under
src/*
- Header extracted to
src/components/landing/header.tsx. - Layout contract:
- Left: site title.
- Center: links to landing sections (
#hero,#capabilities,#testimonials,#join). - Right: register CTA, GitHub repository link with stars counter, and language dropdown.
- Language selector uses
shadcndropdown-menufor locale switching (en,es). - GitHub stars are served from
GET /api/github/starsand auto-refresh on client every minute. - Optional
GITHUB_TOKENcan be configured in.envto avoid low unauthenticated GitHub API limits.
- This app serves UI and backend endpoints.
- Domain logic lives in reusable server modules (not in UI components).
- Background jobs can move to a worker service when needed (imports, reminders, analytics).
redisdecouples write-heavy and time-based operations.tursostores canonical relational data.
- CI and quality gates (
lint,typecheck,test) - Auth, user profile, i18n foundation (
en/es) - IGDB ingestion pipeline (core entities)
- Library states (
planned,playing,completed,dropped,on_hold) - Ratings and short reviews
- Search/filter/sort library
- Basic public profile pages (SEO-ready)
- Friends + activity feed
- Profiles and social interactions (follow/friend, reactions)
- Streaks/goals v1
- "What to play next" scoring v1 (rule-based)
- Backlog total hours estimation
- Backlog prioritization signals
- Smart recommendations (Premium, AI later phase)
- Ad system for free users
- Reminder calendar for upcoming releases
- Steam import hardening and onboarding funnels
- Server-rendered public pages for games, profiles, reviews, lists
- Structured metadata (Open Graph, Twitter, JSON-LD)
- Programmatic SEO pages for genres/platforms/release windows
- Localized URLs and
hreflang(/en/...,/es/...) - Sitemap segmentation + canonical rules
- Performance budgets (Core Web Vitals in CI)
- UI copy and metadata in English and Spanish from day one
- Locale-aware slugs where possible
- Translation keys live in
src/lib/i18n - All new UI changes require both locales before merge
- Free tier with ads (Google AdSense at launch)
- Direct sponsorship placements if inbound advertiser demand appears
- Premium subscription:
- Ad-free experience
- Advanced AI recommendations
- Future premium analytics and personalization modules
- Contributor-first docs and predictable architecture boundaries
- Public roadmap and RFC process for major changes
- Strong automated checks to keep quality consistent
pnpm install
pnpm devExpected scripts once scaffolded:
pnpm lintpnpm typecheckpnpm testpnpm buildpnpm email:launch
Initial scope for launch landing: one preregistration table only.
Table: pre_registrations
id: auto-increment primary keyemail: unique and requiredregistered_at: registration timestamp (unix epoch seconds)notification_sent: boolean flag (falseby default)
Setup flow:
# 1) Create database in Turso (if not created yet)
turso db create openbacklog
# 2) Get connection values
turso db show openbacklog --url
turso db tokens create openbacklog
# 3) Put them into .env
# TURSO_DATABASE_URL=libsql://...
# TURSO_AUTH_TOKEN=...
# RESEND_API_KEY=re_...
# RESEND_FROM_EMAIL=OpenBacklog <hello@updates.openbacklog.app>
# WAITLIST_ADMIN_EMAIL=admin@openbacklog.app
# 4) Generate and run migrations
pnpm db:generate
pnpm db:migrateLanding waitlist flow now includes:
- Save registration in Turso (
pre_registrations) - Send confirmation email to the user (Resend + React Email template)
- Send admin notification email for each new registration
- Send roadmap suggestion notifications (
/{locale}/roadmap) to admin + user confirmation
Required env vars:
RESEND_API_KEYRESEND_FROM_EMAILWAITLIST_ADMIN_EMAILROADMAP_SUGGESTIONS_ADMIN_EMAIL(optional, falls back toWAITLIST_ADMIN_EMAIL)NEXT_PUBLIC_GA_MEASUREMENT_ID(optional, enables GA4)GOOGLE_SITE_VERIFICATION(optional, enables GSC verification meta tag)
Launch day mass email command (sends only users with notification_sent = false and marks them as sent):
pnpm email:launchThe app is already wired for both integrations:
- GA4 script auto-loads if
NEXT_PUBLIC_GA_MEASUREMENT_IDis set. - Search Console verification meta tag is added if
GOOGLE_SITE_VERIFICATIONis set. robots.txtandsitemap.xmlare available for indexing.
Once you share the IDs/tokens, just set them in environment variables and redeploy.
The changelog page reads markdown files from:
content/changelog/en/*.md(primary source)content/changelog/es/*.md(optional)
If a locale has no markdown entries (for example /es), the page automatically falls back to English content.
Recommended frontmatter:
---
version: 0.0.2
date: 2026-04-09
title: "v0.0.2 - Short release title"
summary: "One-line summary for cards and previews."
---Files are sorted by date (desc) and then version (desc).
This repository is currently in project bootstrap stage.
Licensed under Apache-2.0. See LICENSE.
Please read CONTRIBUTING.md before opening pull requests.
Please read CODE_OF_CONDUCT.md.