Skip to content

v1.0.0

Choose a tag to compare

@HeartBtz HeartBtz released this 19 Feb 11:40
· 27 commits to main since this release

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 via ffmpeg).
  • 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.sh for one-shot provisioning (nvm/Node, MariaDB, ffmpeg, PM2).
  • Comprehensive README.md and improved .gitignore + .gitkeep to track data/thumbs directory.

Changed / Optimized

  • Database access optimized: batch inserts, appropriate indexes for fast sorting/filters.
  • random_cover_id stored per performer to avoid ORDER BY RAND() at runtime.
  • Selective gzip compression (skip media & SSE) to avoid double compression.
  • Frontend improvements: global IntersectionObserver for thumbnails, client-side retry/backoff for thumbnail requests.

Fixed

  • Thumbnail generation flood fixed: server-side semaphore limits concurrent ffmpeg/sharp jobs (max 3), with dedup and fast-fail 503 when saturated to keep browser connections free.
  • Replaced an aggressive inline onerror strategy 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 (bcryptjs used in code for portability).
  • Secrets & credentials live in .envchange JWT_SECRET and 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-essential for sharp native build.
  • After cloning: copy .env.example.env, set at least MEDIA_DIR, DB_PASS, JWT_SECRET.
  • Run bash install.sh for automatic provisioning, or follow manual install steps in README.md.
  • Run an initial scan: node cli.js scan or trigger from Admin → Scan.