Stop wasting hours deciding what to watch. A cinema-themed personal watchlist tracker — a self-hostable alternative to TV Time.
A bilingual (EN/FR), installable PWA to track movies and TV shows episode-by-episode, rate and review them, build playlists, and follow friends — powered by TMDB, with Supabase auth/DB and per-section privacy controls.
| Feature | Description | |
|---|---|---|
| 🎞️ | Personal tracking | Complete history of your movies, shows, and episodes across every season |
| 📺 | Episode-level tracking | Track every episode — never ask "did we watch this one?" again |
| 🔍 | Smart exploration | Browse 700k+ titles from the TMDB catalog with intelligent regional filtering |
| ⭐ | Ratings & reviews | Rate on a 1–10 scale and write reviews visible on your public profile |
| 📁 | Playlists | Create themed collections and share them publicly |
| 👥 | Friends & community | Send friend requests, follow friends' watchlists and reviews |
| 🎭 | Crew profiles | Full filmographies, biographies, and credits for every crew member |
| 📱 | Installable PWA | Works on iPhone, Android, Mac, Windows, and Linux — no app store required |
| 🌍 | Native bilingualism | Instant EN/FR switching with server-side language detection |
| 🔒 | Privacy controls | Per-section visibility: public, friends only, or private |
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router) + React 19 |
| Language | TypeScript 6 (strict) |
| Styling | Tailwind CSS 4 (CSS-first, token-based design system) |
| Auth & DB | Supabase (PostgreSQL + Row-Level Security) |
| Media data | TMDB API |
| Streaming | Watchmode API |
| PWA | Serwist (Service Worker + precaching) |
| Errors | Sentry SDK → self-hosted Bugsink |
| UI | Radix UI · shadcn/ui · lucide-react · sonner |
| Tests | Vitest (unit) · Playwright (E2E) |
| Package mgr | pnpm 11 |
- Node.js 22.13+ and pnpm 11+
- A TMDB Read Access Token
- A Supabase project
- A Watchmode API key
git clone https://github.com/TheSawkit/ReelMark.git
cd ReelMark
pnpm install
cp .env.example .env.local # then fill in the values (see Configuration)
pnpm dev # http://localhost:3000Database: the schema lives on the Supabase project (12 tables, RLS everywhere). To recreate it from scratch, follow docs/DATA-MODEL.md in the Supabase SQL Editor.
All variables live in .env.local (see .env.example). NEXT_PUBLIC_* are exposed to the browser; the rest are server-only.
| Variable | Scope | Description |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
public | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
public | Supabase anon/publishable key |
SUPABASE_SERVICE_ROLE_KEY |
server | Supabase admin key —never exposed client |
TMDB_READ_ACCESS_TOKEN |
server | TMDB API v4 read access token |
WATCHMODE_API_KEY |
server | Watchmode API key (streaming providers) |
NEXT_PUBLIC_BASE_URL |
public | Site base URL (e.g.https://reelmark.silexio.be) |
NEXT_PUBLIC_SENTRY_DSN |
public | Bugsink DSN (browser) —must be https |
SENTRY_DSN |
server | Bugsink DSN (server) |
TEST_USER_EMAIL / TEST_USER_PASSWORD |
test | Credentials for authenticated E2E tests |
| Command | Description |
|---|---|
pnpm dev |
Start the dev server |
pnpm build |
Production build (next build --webpack — required by Serwist) |
pnpm start |
Start the production server |
pnpm lint |
Run ESLint |
pnpm format |
Format with Prettier |
pnpm test |
Unit tests (Vitest) |
pnpm test:watch |
Unit tests in watch mode |
pnpm test:e2e |
E2E tests (Playwright) |
pnpm test:e2e:ui |
E2E tests with the Playwright UI |
Build note: the build must use webpack (
next build --webpack).@serwist/nextdoes not support Turbopack — a Turbopack build produces nosw.jsand no service-worker registration.
ReelMark/
├── app/ # Next.js App Router (Server Components by default)
│ ├── [lang]/ # Localized routes (fr/en): movie, tv, crew, explorer, dashboard, settings…
│ ├── actions/ # Server Actions — all mutations (watchlist, reviews, friends…)
│ ├── api/ # Route handlers (search, health)
│ ├── auth/ # OAuth callback / email confirm
│ ├── service-worker.ts # Serwist service worker
│ └── globals.css # Design tokens (@theme inline)
├── components/ # media/ · profile/ · settings/ · navigation/ · ui/ (shadcn) · effects/
├── lib/ # tmdb/ · supabase/ · i18n/ · search/ · validators.ts · metadata.ts …
├── hooks/ # Reusable client hooks
├── types/ # Shared TypeScript types (database.ts, tmdb.ts, profile.ts)
├── k8s/ # Kubernetes manifests (deployment, service, ingress, HPA)
├── docs/ # Developer documentation (architecture, setup, data model, debugging)
├── Dockerfile # Multi-stage production image (output: standalone)
└── tests/ # unit/ (Vitest) · e2e/ (Playwright)
Production runs on Infomaniak Public Cloud (managed Kubernetes) behind Cloudflare (TLS · CDN · WAF). The container image lives on ghcr.io; CI/CD is handled by GitHub Actions.
Full step-by-step runbook → DEPLOYMENT.md.
Dockerfile— multi-stage,output: standalone. Build staysnext build --webpack.k8s/—app.yaml(deployment · service · HPA),ingress.yaml,secret.example.yaml..github/workflows/deploy.yml— push tomain→ build → push to ghcr.io → rollout.⚠️ Cluster bootstrap: Infomaniak provides only the control plane. You must install Cilium (CNI) + OpenStack CCM first (DEPLOYMENT.md § 2), otherwise nodes stayNotReadyand nothing schedules.
- docs/ — developer documentation: architecture · setup from scratch · data model · debugging
- DEPLOYMENT.md — Infomaniak Kubernetes deployment runbook
- SECURITY.md — security policy · CONTRIBUTING.md — contribution guide
- Branch from
dev; open PRs againstmain. - Conventional Commits (
feat,fix,chore,refactor,docs). - Before a PR:
pnpm lint && pnpm test && pnpm test:e2e.
No open-source license — all rights reserved © SAWKIT. Contact the author for reuse.
PWA installable et bilingue (FR/EN) pour suivre films et séries épisode par épisode, les noter et critiquer, créer des playlists et suivre ses amis — propulsée par TMDB, avec auth/BDD Supabase et contrôle de confidentialité par section. Une alternative auto-hébergeable à TV Time.
| Fonctionnalité | Description | |
|---|---|---|
| 🎞️ | Suivi personnel | Historique complet de tes films, séries et épisodes, saison par saison |
| 📺 | Suivi par épisode | Suis ta progression réelle — plus jamais "on en était où ?" |
| 🔍 | Exploration intelligente | 700k+ titres du catalogue TMDB avec filtrage régional pertinent |
| ⭐ | Notes et avis | Note de 1 à 10 et écris des critiques visibles sur ton profil public |
| 📁 | Playlists | Crée des collections thématiques et partage-les |
| 👥 | Amis & communauté | Envoie des demandes d'amis, suis les listes et critiques de tes amis |
| 🎭 | Profils d'équipe | Filmographies complètes, biographies et crédits pour chaque intervenant |
| 📱 | PWA installable | Fonctionne sur iPhone, Android, Mac, Windows et Linux — aucun store requis |
| 🌍 | Bilingue natif | Bascule EN/FR instantanée avec détection de langue côté serveur |
| 🔒 | Contrôle de confidentialité | Visibilité par section : public, amis uniquement, ou privé |
| Couche | Technologie |
|---|---|
| Frontend | Next.js 16 (App Router) + React 19 |
| Langage | TypeScript 6 (strict) |
| Styles | Tailwind CSS 4 (CSS-first, système de tokens) |
| Auth & BDD | Supabase (PostgreSQL + RLS) |
| Données média | TMDB API |
| Streaming | Watchmode API |
| PWA | Serwist (Service Worker + précaching) |
| Erreurs | SDK Sentry → Bugsink auto-hébergé |
| Tests | Vitest (unitaires) · Playwright (E2E) |
- Node.js 22.13+ et pnpm 11+
- Un token TMDB, un projet Supabase, une clé Watchmode
git clone https://github.com/TheSawkit/ReelMark.git
cd ReelMark
pnpm install
cp .env.example .env.local # puis remplis les valeurs (voir Configuration en anglais)
pnpm dev # http://localhost:3000BDD : le schéma vit sur le projet Supabase (12 tables, RLS partout). Pour le recréer : docs/DATA-MODEL.md.
Voir le tableau Available Scripts dans la section anglaise. Note : le build doit utiliser webpack (next build --webpack) — Serwist ne supporte pas Turbopack.
Production sur Infomaniak Public Cloud (Kubernetes managé) derrière Cloudflare (TLS · CDN · WAF), image sur ghcr.io, CI/CD via GitHub Actions. Runbook complet → DEPLOYMENT.md.
⚠️ Infomaniak ne fournit que le control plane : il faut installer Cilium (CNI) + CCM OpenStack soi-même (voirDEPLOYMENT.md§ 2), sinon les nodes restentNotReady.
- Docs :
docs/(architecture · setup · data model · debugging) ·DEPLOYMENT.md·SECURITY.md - Contribution : branche depuis
dev, PR versmain, commits conventionnels,pnpm lint && pnpm test && pnpm test:e2eavant toute PR.
Aucune licence open-source — tous droits réservés © SAWKIT.
Built with 🍿 by SAWKIT