v1.0.0
Changelog
All notable changes to this project will be documented in this file.
v1.0.0 — First stable release
Release date: 2026-02-19
Summary
First stable release of XFlix — a self-hosted media browser for local video and photo collections with a Netflix-like UI, admin panel, and CLI tools.
Added
- Performer-based browsing (one folder = one performer).
- Video streaming with HTTP Range requests (seek, pause/resume).
- Photo lightbox with full-screen view and keyboard navigation.
- Asynchronous, incremental file scanner (non-blocking, batch DB inserts).
- Automatic thumbnail generation (photos via
sharp, videos viaffmpeg). - Video metadata enrichment (duration extraction via
ffprobe). - Public REST API for performers, media, search, stats and discovery.
- JWT authentication: register / login / profile / password reset flows.
- Per-media comments and like/dislike reactions.
- Personal favourites (per-user) and global favourites (admin-set).
- Admin panel: scan (SSE), batch thumbnail generation (SSE), duplicate detection, cleanup tools, purge short videos, user management, SMTP settings.
- CLI utilities:
node cli.js scan,node cli.js clear. install.shfor one-shot provisioning (nvm/Node, MariaDB, ffmpeg, PM2).- Comprehensive
README.mdand improved.gitignore+.gitkeepto trackdata/thumbsdirectory.
Changed / Optimized
- Database access optimized: batch inserts, appropriate indexes for fast sorting/filters.
random_cover_idstored per performer to avoidORDER BY RAND()at runtime.- Selective gzip compression (skip media & SSE) to avoid double compression.
- Frontend improvements: global
IntersectionObserverfor thumbnails, client-side retry/backoff for thumbnail requests.
Fixed
- Thumbnail generation flood fixed: server-side semaphore limits concurrent
ffmpeg/sharpjobs (max 3), with dedup and fast-fail 503 when saturated to keep browser connections free. - Replaced an aggressive inline
onerrorstrategy that opened too many video streams and caused "Failed to fetch" errors. - Various admin & scanner fixes to handle deep directories and large collections reliably.
Performance
- Scanner designed to handle very large libraries (50k+ files) without blocking the event loop.
- Background enrichment/generation runs with bounded concurrency to avoid resource exhaustion.
Security & Configuration
- Password hashing via
bcrypt(bcryptjsused in code for portability). - Secrets & credentials live in
.env— changeJWT_SECRETand DB passwords before exposing publicly. - Recommended to run behind a reverse proxy (nginx/Caddy) with HTTPS.
Migration / Post-install notes
- Requirements: Node >= 18, MariaDB (or MySQL compatible),
ffmpeg,build-essentialforsharpnative build. - After cloning: copy
.env.example→.env, set at leastMEDIA_DIR,DB_PASS,JWT_SECRET. - Run
bash install.shfor automatic provisioning, or follow manual install steps inREADME.md. - Run an initial scan:
node cli.js scanor trigger from Admin → Scan.