Zacai deployment changes, based on LibreTV v2.21.1 (AGPL-3.0-or-later).

Set PUBLIC_ACCESS=true explicitly to enable password-free access.
Without that option, the upstream password and session guards still apply.
Build with Node.js 22: npm ci; DOCKER_BUILD=1 npm run build.
Copy public and .next/static into .next/standalone, then run server.js with
HOSTNAME, PORT, PUBLIC_ACCESS and DEFAULT_SOURCES configured for the deployment.

The homepage is rendered on the server so the initial HTML includes its search UI.
Settings, history and detail panels are imported when opened; MP4 transmuxing is
imported only for an MP4 download. Navigation no longer prefetches other pages.
The header uses a small inline SVG mark; no image or font fetch is required.
First-use video prefetch defaults to off; explicit browser preferences persist.

Nginx serves precompressed static assets with immutable caching and rate-limits
API requests. No CDN subscription or other paid service is required.
Tests: npm test -- src/lib/auth.test.ts src/lib/public-access.test.ts src/lib/m3u8-downloader.test.ts

2026-10-28 cinema redesign:
Warm charcoal/amber theme, responsive poster browser, compact mobile layout.
Five catalog sections and 27 subcategories, fetched by /api/catalog from configured
sources on jszyapi.com, api.guangsuapi.com and www.mdzyapi.com in that order.
Each provider's category IDs are resolved from its own class list. Adult and
unrelated classes are excluded. Pages are cached for five minutes, concurrent
requests coalesced, with provider fallback on failure. No video library is stored.
Catalog filters and page number use c/g/p URL parameters for reload/back support.
The separate charts tab preserves the upstream recommendation sources/settings.
Tests: npm test -- src/lib/catalog.test.ts src/lib/public-access.test.ts

2026-10-28 personal library:
Homepage continuation uses history plus per-episode progress; switching episodes
no longer reuses the previous episode's time. Late progress callbacks cannot
change the history entry for a different episode. Completed final episodes leave
the continuation strip, while completed earlier episodes link to the next one.
Watchlist bookmarks are stored in a separate browser IndexedDB database
libretv-library (watchlist table); the existing libretv schema stays at v3 so
older tabs and rollback releases can continue opening their history database.
Manual update checks fetch metadata with two concurrent requests and preserve
last-known information on source failure. No scheduled jobs or accounts are added.
Settings export/import now includes favorites and per-episode progress, handles
both current and legacy history formats, and merges records by timestamp.
Tests: npm test -- src/lib/library-model.test.ts src/lib/catalog.test.ts src/lib/public-access.test.ts
