171 pull requests since v0.15.0, across four betas and nineteen days. This release took a little longer to prepare for personal reasons, but has spent extensive time in testing and is very stable. The headline addition is the player's experimental third-party server integration (Infuse-style unified browsing for Plex, Jellyfin, and Stash) alongside multi-server Mydia support. This release also introduces S3-compatible cloud storage for libraries, WebAuthn passkeys and TOTP two-factor authentication, granular age ratings and content access restrictions, official community plugin store support, and standalone Linux AppImage packaging.
Read the upgrade notes before pulling this. There are 16 migrations (additive schema changes, access restriction tables, and Plex migration to a bundled plugin), S3 storage backend support, and the player now requires Mydia server 0.15.0 or newer.
Player
- Third-party media servers (Beta): Direct support for Plex (PIN linking), Jellyfin (Quick Connect / credentials), and Stash (API key) with library browsing, native hubs, Continue Watching rails, transcode fallback, and progress syncing (#1011, #1014, #1018, #1019, #1020, #1021)
- All servers unified view (Beta): Default view when 2+ servers are connected, merging Continue Watching, Recently Added, Favorites, and library rows across Mydia, Plex, Jellyfin, and Stash with duplicate elimination via TMDB, TVDB, and IMDb IDs (#1040, #1043, #1067)
- Multiple Mydia servers (Beta): Connect multiple Mydia servers side by side, each with independent authentication, cached navigation, playback, casting, and watch progress (#1037, #1041, #1046, #1050, #1052, #1053, #1055)
- Universal server features: Single download manager across all sources, casting third-party sources to Chromecast and DLNA, intro and credits skipping on Mydia guests, and offline screen caching (#1036, #1038, #1044, #1045, #1047, #1048)
- Server privacy & switching: Lock or hide individual servers behind Face ID or PIN, switch Plex Home user profiles, and clean single-row sidebar server switcher (#1023, #1024, #1035)
- Linux desktop integrations: Standalone AppImage packaging with in-place self-updates, native MPRIS media session controls, window framing, title bar fixes, and persistent window size and aspect ratio (#916, #930, #932, #933, #952)
- Windows & macOS integrations: Immersive window chrome with Windows 11 Snap Layouts integration (HTMAXBUTTON) and fullscreen exit fixes, native macOS menu bar and Dock actions, and polished window styling (#911, #915, #922, #941, #942)
- Playback & streaming controls: Fit/Fill video scaling toggle, accurate HLS resume seeking without stalls, startup playback performance, detached cast bar with persistent playback, remote control bar symmetry, remote resume state synchronization, and closing cast bar dismisses without stopping playback (#907, #908, #929, #931, #934, #993, #996, #998, #1071)
- Subtitles & audio timing: Subtitles render above the OSD without overlap, and start timing synchronizes with audio and video track selection (#912, #914)
- Artwork & Web player: Bounded artwork decode sizes, WebGL black poster fallback on Safari/Firefox, mobile touch density controls, and next episode advance fixes (#926, #936, #940, #995)
- Diagnostics & updates: Remote player log capture, local rolling logs, diagnostics upload to relay, and channel branding badges (Beta, Dev) on app icons, title bars, and settings (#900, #935)
- Architecture & unification fixes: Unified
PlaybackSessioncontroller, strict Dart analysis, legacy GraphQL fallback removal requiring server 0.15.0+, restored iOS back navigation, and browse chrome and detail data alignment (#1013, #1017, #1033, #1049, #1064, #1065, #1066)
Storage, libraries and media
- S3-compatible object storage: Libraries can live in S3-compatible buckets (MinIO, Ceph, AWS, Cloudflare R2) with read/write support: scan, match, analyze, stream, import, rename, and delete directly with 4-way parallel multipart uploads (#1077, #1081, #1087)
- Import resilience: Usenet and debrid downloads move into library folders rather than copying when no seeding is needed, and imports retry gracefully on SMB, NFS, and FUSE mounts refusing chmod (#1088, #1095)
- Disk file management: Empty item folders removed from disk upon media deletion, selective file renaming by season or episode, and stricter import matching to prevent misfiling (#897, #939, #958, #959)
- Metadata corrections & stream links: Correct matched metadata directly from the media page after accepting, and external player stream links (VLC, Infuse) with action menus on every file row (#1070, #1072, #1075)
- Jellyfin watch sync & language upgrade: Watched state synchronizes across every Jellyfin copy of a movie, and the nightly language upgrade sweep stops re-grabbing releases already present on disk (#1083, #1090)
- Catalog customization & navigation: Custom display names for library paths via UI or environment variable, smooth library grid scrolling with URL filters and restored back-navigation, catalog export as CSV or JSON, and library filter dropdown (#919, #921, #1015, #1078)
- Library search ranking: Search matches in titles rank ahead of description and overview matches (#1042)
Accounts and security
- Granular per-user access controls: Restrict user accounts by content categories and maximum age ratings (
content_rating_age), enforced end-to-end across Discover, search, recommendations, franchise rows, import matching, and streaming (#565, #1004, #1006) - Two-factor authentication (TOTP): Account security with QR code setup, encrypted secrets, replay guards, and single-use recovery codes (#923)
- WebAuthn passkeys: Passwordless biometric sign-in and security key authentication for user accounts (#928)
- Access scope enforcement & token revocation: Request access dialog enforces age ratings upfront, media tokens are revoked immediately on permission changes, and active playback sessions terminate when access is reduced (#1010)
- User management: Validation error highlighting and reliable password resets on user creation forms (#1009)
Plugins and extensions
- Host Contract 1.5 & 1.6 with bundled Plex plugin: Multi-instance plugin architecture, instance-scoped KV storage with size quotas, signed custom plugin sources, and native Plex servers migrated to a bundled multi-instance plugin with automated token migration (#972, #1025)
- Official community store: Community plugin store and catalog browsing modal with install, update, and replace workflows (#961, #971, #1016, #1031)
- Plugin management & configuration: Plugin sideloading via CLI (
mydia-cli plugin install), configuration via environment variables (PLUGIN_<SLUG>_SETTINGS), standing surface write grants, and responsive settings dialogs (#966, #970, #975, #1026, #1032) - Home shelves & experimental assistant: Typed WIT 1.6 shelf capabilities powering the "Picked for you" Home rail, demonstrated with an optional experimental assistant plugin (#974, #976, #977, #978, #986, #987, #999, #1022)
- Plugin documentation: Complete Diátaxis plugin documentation rewrite covering contract 1.6, tutorials, and operator guides (#1034)
Search, downloads and indexers
- Quality profile grab delay: Optional delay (0 to 168 hours) allowing higher-quality releases to arrive before auto-grabbing, while manual searches and cutoff meets grab immediately (#1005)
- Infohash blacklist tracking: Release blacklist records torrent infohashes, banning broken releases across all indexers listing the same torrent (#896)
- Strict release identity: Rejects mismatched releases using alternate titles or non-Latin aliases without loose string distance matching, and resolution precedence clarification (#899, #913, #945)
- Quality profiles & indexer recovery: Hard limits for maximum file size, resolution, and HDR requirements, form toggle fixes in admin settings, and surfacing Prowlarr indexers paused with manual retest action (#946, #1003, #1098)
- Manual search enhancements: Elimination of cold-start timeouts, on-disk file presence indicator, and dedicated Source and Codec filters (#1076)
Web UI and discover
- Discover enhancements: Infinite scrolling on Discover, regional streaming availability, and home country filtering (#960, #962, #968, #1094)
- Poster display & badges: Configurable poster fields, 3D hover popout effect, TV status and certification badges, and configure poster retention from More Like This (#924, #925, #964, #1069, #1082)
- Web app & mobile navigation: Installable Progressive Web App (PWA) support on iOS and iPadOS, mobile drawer auto-close on navigate, and movie action row spacing (#965, #967, #997)
- Admin UI standardization: Shared component conventions across admin hubs, and transcode cancellation crash fix on dashboard (#951, #1084, #1086)
- Library issue fixes: Form layout fixes, cast button scaling, and action row spacing (#992, #994)
Under the hood
- Prometheus metrics: Dedicated
/metricsendpoint exposing runtime application and queue metrics (#920) - Metadata relay v0.16.0–v0.20.0: Cloudflare edge caching for client configs and metadata lookups, proxy rate limiting charged on cache misses only, TVDB title reclamation, and player log ingestion endpoints (#892, #895, #901, #902, #963)
- Startup latency & background jobs: P2P peer dialing and GraphQL startup latency optimizations, and Oban job status tracker flicker prevention on short tasks (#909, #910, #948, #979)
- Freshness & build tooling: Deterministic npmDeps.hash verification, Windows one-line installer, dev Flatpak publish scripts, and ranking newest player dev builds highest (#906, #927, #955, #969, #1029)
- Reliability & test suite: Mitigations for test flakes, E2E plugin setup modal stability, HLS user session lookup, and CRLF channel fix (#893, #943, #953, #1007, #1030)
- Documentation badges: Repowise wiki and code health badges in README (#990, #991)
- Dependency updates: Monthly Dependabot dependency bumps across Elixir, Rust, npm, Flutter, and GitHub Actions (#903, #904, #905, #956, #981, #982, #983, #984, #985, #988, #989, #1056, #1057, #1059, #1060, #1061, #1062, #1063)
Upgrade notes
Back up first. Sixteen migrations: fifteen schema changes (all additive or column additions) and one Plex data migration to a bundled plugin.
- Third-party media servers & player compatibility: The player now requires Mydia server 0.15.0 or newer. Multi-server and third-party media sources (Plex, Jellyfin, Stash) are in beta; credentials travel strictly in auth headers and are excluded from logs.
- S3-compatible storage backends: Libraries can now reside on S3 object storage. Existing local libraries are unchanged.
- Plex migration to bundled plugin: Native Plex servers automatically migrate to instances of the bundled plex plugin under Host Contract 1.5, carrying over tokens, account connections, and sync state without re-pushing historical progress.
- Per-user access restrictions and content rating age: Accounts can be restricted by category and age rating. Existing libraries backfill missing certifications automatically via background tasks; uncertified media remains hidden from restricted accounts until metadata is fetched.
- WebAuthn passkeys & TOTP 2FA: User accounts can now register WebAuthn security keys/biometrics and TOTP two-factor authentication.
- Quality profile grab delay: Quality profiles support an optional wait window (0–168 hours) before auto-grabbing acceptable releases. Existing profiles continue to grab immediately.
- Library custom display names: Libraries can specify custom display names, defaulting to folder names rather than exposing underlying host paths.
- Torrent infohash blacklisting: Release blacklists track infohashes, propagating bans across all indexers sharing the same torrent.
Full Changelog: v0.15.0...v0.16.0