# k-tv Self-hosted linear TV channel orchestration. Turns a personal media library into broadcast-style channels. ## Stack - **Backend** — Rust (Axum), SQLite/PostgreSQL, Jellyfin - **Frontend** — Next.js 16, React 19, TanStack Query, Tailwind v4, shadcn/ui --- ## Docker Registry: `registry.gabrielkaszewski.dev` ### Build `NEXT_PUBLIC_API_URL` is baked into the frontend bundle at build time — always pass it explicitly. ```bash # Backend docker build -t registry.gabrielkaszewski.dev/k-tv-backend:latest ./k-tv-backend # Frontend — NEXT_PUBLIC_API_URL required docker build \ --build-arg NEXT_PUBLIC_API_URL=https://tv-api.gabrielkaszewski.dev/api/v1 \ -t registry.gabrielkaszewski.dev/k-tv-frontend:latest \ ./k-tv-frontend ``` ### Push ```bash docker push registry.gabrielkaszewski.dev/k-tv-backend:latest docker push registry.gabrielkaszewski.dev/k-tv-frontend:latest ``` ### Build + push (one-liner) ```bash docker build -t registry.gabrielkaszewski.dev/k-tv-backend:latest ./k-tv-backend && \ docker push registry.gabrielkaszewski.dev/k-tv-backend:latest && \ docker build \ --build-arg NEXT_PUBLIC_API_URL=https://tv-api.gabrielkaszewski.dev/api/v1 \ -t registry.gabrielkaszewski.dev/k-tv-frontend:latest \ ./k-tv-frontend && \ docker push registry.gabrielkaszewski.dev/k-tv-frontend:latest ``` ### Deploy (on server) ```bash docker compose -f compose.yml -f compose.traefik.yml pull docker compose -f compose.yml -f compose.traefik.yml up -d ``` --- ## Ports | Service | Port | |----------|------| | Backend | 3000 | | Frontend | 3001 | ## Env vars | Var | Where | Note | |-----|-------|------| | `NEXT_PUBLIC_API_URL` | frontend build arg | Baked in at build time — must point to the public backend URL | | `API_URL` | frontend runtime env | Server-side only (Next.js API routes). Set in compose. | | `DATABASE_URL` | backend | `sqlite:///app/data/k-tv.db` or postgres DSN | | `JWT_SECRET` | backend | JWT signing key — change in production (min 32 chars) | | `COOKIE_SECRET` | backend | OIDC state cookie encryption key — change in production (min 64 chars) |