A Rotten Tomatoes-style aggregation hub for board games โ critic consensus scores, community reviews, personalized taste matching, and discovery, all in one place.
| Feature | Description |
|---|---|
| ๐ Landing Page | Hero section, trending games, latest critic reviews, rising games, awards tracker, and newsletter signup |
| ๐ฎ Game Pages | Dual GamePulse scores (critics + community), consensus badge, full critic breakdown, community reviews, price comparison, and similar games |
| ๐ Browse & Discover | Filter by category, player count, and complexity. Sort by score, trending, newest, or most reviewed. Search autocomplete with keyboard navigation |
| ๐ค Critic Profiles | Taste profile radar charts, review history, taste match percentage, and follow/unfollow actions |
| ๐ User Dashboard | Your ratings, watchlist, wishlist, matched critics, taste profile visualization, and personalized score predictions |
| ๐ฐ Content Feed | Personalized feed with filters (reviews, news, deals, videos), release calendar, and weekly newsletter preview |
| ๐งฎ Taste Matching | Cosine similarity + Pearson correlation across 6 taste dimensions to match users with aligned critics |
| ๐พ Local Persistence | All interactions (ratings, reviews, watchlist, follows, newsletter signups) persist in SQLite |
# 1. Clone and install
git clone <your-repo-url>
cd 10-gamepulse
npm install
# 2. Start the development server
npm run dev
# 3. Open in your browser
open http://localhost:3000The database seeds automatically on first run with 60+ board games, 14 named critic profiles, 50+ community users, 200+ critic reviews, rich watchlists/wishlists, awards, and release-calendar data. No extra setup is required in local development.
| Script | Description |
|---|---|
npm run dev |
Start the Next.js development server |
npm run build |
Create an optimized production build |
npm run start |
Serve the production build |
npm run lint |
Run ESLint checks |
npm run type-check |
Run TypeScript compiler checks (no emit) |
npm run check |
Run type-check โ lint โ build (CI gate) |
npm run clean |
Remove build artifacts and database |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Next.js App Router โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ / โ โ /browse โ โ /feed โ โ /critics โ โ
โ โ /games โ โ /me โ โ โ โ โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโฌโโโโโ โโโโโโฌโโโโโโ โ
โ โโโโโโโโโโโโโโโดโโโโโโโโโโโโดโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ lib/queries/ (Data Layer) โ โ
โ โ games.ts ยท critics.ts ยท feed.ts ยท dashboard.tsโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ lib/scoring.ts + lib/taste.ts โ โ
โ โ Cosine similarity ยท Pearson correlation โ โ
โ โ Consensus badges ยท Personalized predictions โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ lib/db/ (SQLite via better-sqlite3) โ โ
โ โ connection.ts ยท schema.ts ยท seed.ts ยท seeds/ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
10-gamepulse/
โโโ app/ # Next.js App Router pages
โ โโโ page.tsx # Landing page
โ โโโ api/health/ # Health check endpoint
โ โโโ browse/ # Browse & discover with filters
โ โโโ critics/ # Critic directory + [slug] profiles
โ โโโ feed/ # Personalized content feed
โ โโโ games/[slug]/ # Individual game pages
โ โโโ me/ # User dashboard
โ โโโ newsletter/manage/ # Self-serve newsletter removal page
โ โโโ robots.ts # SEO robots.txt generation
โ โโโ sitemap.ts # SEO sitemap generation
โโโ components/ # React components
โ โโโ gamepulse-ui.tsx # Shared UI: cards, badges, sections
โ โโโ search-autocomplete.tsx # Header search combobox
โ โโโ client-widgets.tsx # Client chart widgets
โ โโโ action-forms.tsx # Form components with server actions
โ โโโ submit-button.tsx # Pending-state submit button
โ โโโ toast.tsx # Toast notification system
โโโ lib/ # Business logic & data access
โ โโโ db/ # Database connection, schema, seeds
โ โโโ queries/ # Per-domain query modules
โ โโโ actions.ts # Server Actions (review, follow, etc.)
โ โโโ config.ts # Centralized configuration constants
โ โโโ scoring.ts # Score algorithms & consensus logic
โ โโโ taste.ts # Taste dimension types
โ โโโ gamepulse.ts # Barrel re-exports
โโโ data/ # SQLite database (auto-generated)
โโโ docs/ # Project documentation
โ โโโ PRD.md # Product Requirements Document
โ โโโ CODE_REVIEW.md # Code quality audit
โ โโโ UX_REVIEW.md # UX & accessibility audit
โ โโโ IMPROVEMENTS.md # Improvement roadmap
โโโ .github/ # GitHub templates and CI
โ โโโ workflows/ci.yml # CI pipeline
โ โโโ ISSUE_TEMPLATE/ # Bug report & feature request forms
โ โโโ pull_request_template.md
โโโ public/ # Static assets
GamePulse uses a multi-signal scoring system:
- Critics Score โ Weighted average of critic reviews (0โ100 scale)
- Community Score โ Average of user ratings (1โ10 scale, displayed as 0โ100)
- Consensus Badge โ Derived from score spread and momentum:
- ๐ Critically Acclaimed โ Critics โฅ86 AND Community โฅ80
- โค๏ธ Community Favorite โ Community โฅ88
- ๐ Hidden Gem โ Community โฅ80, Critics โฅ74, Rising โฅ60
- ๐ฅ On the Rise โ Default for active games
- โก Divisive โ |Critics โ Community| โฅ15
- Personalized Predictions โ Weighted by taste-matched critic correlation (cosine similarity + Pearson)
- The database lives at
data/gamepulse.dband is auto-created on first run - The seed catalog currently includes 60+ games, 14 critics, 50+ users, 200+ critic reviews, 100+ community reviews, awards, release-calendar entries, follow relationships, and saved-list activity
- Seeds are deterministic and transactional: the seeding pass clears and rebuilds reference data in a single SQLite transaction, resets autoincrement sequences, and stamps
app_meta.seed_version - Edge cases are intentionally included, including one-review games, hidden gems, and divisive titles with strong critic / weak community splits
- In production, automatic reseeds are blocked when reference data already exists unless
GAMEPULSE_ENABLE_PRODUCTION_RESEED=1is set - To force a fresh local dataset, run
npm run cleanand then start the app or runnpm run build - The current user is a hardcoded mock user ("alex") โ see CONTRIBUTING.md for auth notes
# Build the container
docker build -t gamepulse .
# Run it
docker run -p 3000:3000 gamepulseThe SQLite database is created inside the container at /app/data/gamepulse.db. Mount a volume to persist data across restarts:
docker run -p 3000:3000 -v gamepulse-data:/app/data gamepulseCopy .env.example to .env.local to customize settings:
cp .env.example .env.local| Variable | Default | Description |
|---|---|---|
NEXT_PUBLIC_BASE_URL |
https://gamepulse.example.com |
Public URL for sitemap, OG tags, canonical links |
NODE_ENV |
development |
Node.js environment |
| Layer | Technology | Why |
|---|---|---|
| Framework | Next.js 16 (App Router) | Server components, server actions, streaming |
| UI | React 19 | Latest concurrent features, useActionState |
| Styling | Tailwind CSS 4 | Utility-first, zero-config with PostCSS |
| Charts | Recharts | Composable radar charts for taste profiles |
| Icons | Lucide React | Tree-shakeable icon library |
| Database | better-sqlite3 | Synchronous SQLite for server components |
| Language | TypeScript 5 | Strict mode enabled |
See CONTRIBUTING.md for setup instructions, coding conventions, and the PR process.
MIT