Releases: debpalash/Opal
Release list
v0.8.5
Highlights
Releaser: Palash Debnath
- Files open like a media player should. Opal presents a finished first
frame instead of exposing the startup shell, overlaps safe initialization,
prepares libmpv early, and keeps local-file loading off unrelated database,
model and network work. Measured Windows ReleaseFast baselines are 171 ms
startup p95 and 121 ms local-video first-frame p95. - Now Playing is an immersive, responsive surface. Video occupies the full
client area while glass controls and navigation float above it, remain
legible over bright scenes, hide smoothly when idle, and avoid overlapping
close actions. Back, Settings, Close and track pickers respond on the first
click; outside clicks dismiss popovers without consuming the intended action. - Windows behavior is native again. The custom title bar exposes caption
hit testing, resize borders, maximize/restore behavior and Aero Snap while
preserving drag from safe background regions. File and magnet associations
now cover the common video, audio, playlist and torrent formats. - Playback choices survive the next file and restart. Aspect mode, speed,
hardware decoding, audio/subtitle language and track choices are restored
safely. Direct, playlist, queue and torrent playback have explicit ownership,
actionable pre-playback fallback, and honest hardware-decoder feedback. - The omnibox finally adapts to intent. Links and paths open, normal text
searches the visible source or universal catalog,?recalls local memory,
and>or a question invokes the assistant. Slow semantic recall runs in a
generation-safe worker instead of freezing the interface, and Browse uses a
compact grouped source menu. - Queues, torrents and self-hosted libraries recover cleanly. Queue order,
repeat/shuffle and cold-start actions are durable; torrent opens wait for the
engine without needing a second click and restart from privacy-safe swarm
identity plus bounded fast-resume data. Jellyfin, Plex and Audiobookshelf
regain authenticated resume, alternate-version recovery and non-blocking
progress reporting. - Credentials and helpers are safer. Windows secrets use current-user DPAPI
with legacy migration, credential-bearing playback URLs are scrubbed from
persistent identity, and yt-dlp/model downloads are explicit, HTTPS-only,
checksum-aware staged updates that cannot replace a working helper on a bad
download. - The release has measurable gates. Startup, playback, close and resource
probes are checked alongside Zig unit tests, web lifecycle tests and 442
whole-product feature checks using an isolated generated database fixture.
Changes
Features
- harden playback and content workflows (
2c3c8f3)
Fixes
- support libtorrent 2.0 checkpoints (
257e513)
Other
- Pin verified 0.8.1 packages (
48c5180)
Internal (1 commit — tests, refactors, CI, docs)
- chore(release): 0.8.5 (
4fcc68e)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.8.1...v0.8.5
v0.8.1
Highlights
- YouTube plays on Windows again, and picks the right stream. The bundled
yt-dlp path never reached mpv (a malformed option made mpv drop it), so
YouTube links failed unless a system yt-dlp happened to be on PATH. Fixed.
HDR uploads now play their SDR rendition — the correct picture on Opal's
8-bit render path, ~20% less bandwidth, and 4K60 at a steady 60 fps. - 4K HDR files play smoothly. Video is rendered on a per-player worker
thread and uploaded in place into a persistent texture, and HDR sources no
longer rebuild mpv's scaler every frame. A 4K Dolby Vision file that ran at
~4 fps now holds its native rate. - Works with Ubuntu 22.04's mpv 0.34. Playback no longer hangs on
"Opening stream" on libmpv older than 0.38; a rejected load is now reported
in the log and as a toast instead of silently. Minimum versions (libmpv,
SDL, glibc for the AppImage) are documented in the README. - Pair a phone with one scan. Settings › Web UI shows a QR code of the LAN
address (carrying the one-time setup code on first use) when the server is
bound to your LAN, plus a README walkthrough. opal <file-or-url>opens the file again on the desktop build.- Movies/TV catalog search is always visible, and "Find" is now "Search".
Changes
Other
- Cast mpv_client_api_version() to u32 for the loadfile shape check (
9527730) - Fix loadfile on mpv < 0.38 and add a phone-pairing QR to Settings (
6d8106e) - Make the feature suite green after the render-worker and transport changes (
f70a32f) - Make 4K HDR playback smooth on the software render path (
f08ad7b) - Fix YouTube loading on Windows and prefer SDR renditions (
76d9711) - Make Movies/TV catalog search always visible, rename Find to Search (
17c005c) - Local changes: http transport extraction, worker shutdown, player and service refactors (
8afd53b) - Pin verified 0.8.0 packages and record passing feature checks (
0f94a55)
Internal (1 commit — tests, refactors, CI, docs)
- chore(release): 0.8.1 (
80b344b)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.8.0...v0.8.1
v0.8.0
Highlights
- TV browsing fits small and short windows. Episode thumbnails, titles,
descriptions and controls adapt to available space, with a single page
scroller and a themed, scrollable season picker. Selecting a season dismisses
the menu; Retry can recover a failed season fetch. - Continue watching shows episodes, not raw filenames. Home offers one
landscape card per tracked show, episode artwork when available, and an exact
next-episode action. Keyless episode metadata works after restarting too. - Navigation is compact and search is unified. The source picker sits by
the logo, and one field handles questions, searches and pasted links. Narrow
windows retain navigation and wrap their controls. - Episode startup and tracking are more reliable. Playback enters its
loading state promptly, tries bounded fallback sources, selects the requested
torrent episode, and tracks actual viewing rather than counting seeks as
watched time. Large season libraries and specials retain their identities. - Restore your session with confirmation. Closing saves playback position
and episode identity; reopening asks before restoring playback. - Update checks and Linux packaging are hardened. Update work uses bounded,
cancellable processes and synchronized state; subprocesses inherit the
environment, and Linux.runpackages include required runtime resources.
Changes
Other
- Improve responsive TV browsing, episode continuity and update reliability (
13da8f2) - fix release workflow reruns (
8bfb6fd) - fix headless shutdown compilation (
82e9ccd)
Internal (2 commits — tests, refactors, CI, docs)
- chore(release): 0.8.0 (
a4f982e) - chore: pin Homebrew checksum for 0.7.0 (
e7bd106)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.7.0...v0.8.0
v0.7.0
Highlights
- Closing Opal is immediate and final, even during active playback. Native
window close,Ctrl+W, andCtrl+Qnow share one bounded teardown path;
playback stops before the surface disappears, raw SDL/Wayland close events
cannot leave a windowless stream behind, and stuck workers cannot keep the
process alive indefinitely. - Background work no longer races the UI during shutdown. Resolver, search,
poster, HTTP, and stream-proxy work receives cancellation before teardown,
UI refreshes carry the real window, and the worker supervisor drains owned
tasks before shared state is released. - Linux AppImages launch through an explicit runtime entry point. The
release pipeline now packages the expected AppRun launcher and validates the
resulting image, alongside the existing tarball, DEB, RPM, and.run
formats. - The keyless Movies & TV flow is documented end to end. A new guide shows
how Cinemeta browsing, search, posters, and TV season/episode navigation work
without a TMDB key, with clearer privacy and provider-boundary documentation.
Changes
Features
- add AppImage launch support and keyless guide (
eb1619b)
Other
- chore update test results (
414416c) - stop playback when closing the app (
d8a12cb) - fix keyboard and native window close responsiveness (
81cfeb2) - fix unresponsive app shutdown path (
6a09f51) - fix shutdown freezes and worker refresh races (
f0e6274)
Internal (2 commits — tests, refactors, CI, docs)
- chore(release): 0.7.0 (
b6ede5a) - chore(brew): pin the v0.6.6 artifact checksum (
3bfed7e)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.6...v0.7.0
v0.6.6
Highlights
- Movies and TV now work without a catalog API key. The built-in Cinemeta
feed supplies trending, popular, top-rated, genre-filtered and searched
cards, while TMDB remains an optional metadata upgrade rather than a setup
requirement. - TV cards open a real season and episode browser in keyless mode. Series
metadata, episode names, summaries, dates and thumbnails flow into the same
desktop and web drill-down used by TMDB-backed shows. - Poster loading is reliable again. Absolute Metahub artwork is accepted by
the guarded proxy, and WebP-only poster responses are requested through a
decoder-compatible JPEG endpoint instead of becoming permanent placeholders. - Browse behaves properly from phones to ultrawide desktops. Navigation no
longer disappears during resize, Movies & TV gains compact filters and live
search, cards adapt to available space, and the source menu follows the
active theme instead of opening a bright white popup. - The Web UI is safer under hostile and concurrent input. Text and HTML
attributes use separate encoders, session and API response boundaries are
hardened, and a real Chromium test proves provider markup cannot reach the
live DOM. - Background work has clearer ownership. Critical workers are supervised
through shutdown, remote writes release player state first, and Podcast and
Jellyfin readers publish immutable snapshots instead of racing live state. - Linux setup and display defaults are friendlier. The installer is
rootless by default, HiDPI scaling respects the whole panel, and font metrics
no longer clip titles on Linux. - Release and project pages are easier to trust and navigate. Download and
playback paths received additional validation, and the website now exposes
crawlable changelog, comparison and SEO pages.
Changes
Features
- site — add changelog and comparison pages, sharpen SEO and design (
3a06783) - harden remote playback and release paths (
c502de0) - site — add crawlable SEO pages and metadata checks (
8e5c420)
Fixes
- supervise all application worker lifetimes (
3dcac4e) - separate web text and attribute encoding (
6b31793) - isolate Jellyfin readers behind snapshots (
d6a7a5c) - hide unavailable browse connectors (
567d1dd) - finish lock-free remote response boundaries (
cc3ba74) - release player state before remote writes (
c9fa142) - make active-worker shutdown signal-safe (
9fb8763) - publish podcast and Jellyfin snapshots safely (
5cb96b9) - own critical background worker lifecycles (
407ddd9) - harden web sessions and concurrent API responses (
e57c422) - desktop — stabilize window identity and runtime cadence (
13de260) - security — single-source app identity, race-free media opens, Watching redesign (
b7eb374) - ci — harden cross-platform process and trust tests (
94df05e) - windows — hash plugin files with positional reads (
2aa42cc) - ui — default scale ignored the panel, so hi-DPI Linux rendered tiny (
469b179) - ui — make title metrics font-safe on Linux (
723b52c) - installer — make Linux installs rootless by default (
23a6378)
Performance
- harden render and background ingest paths (
bbfd83b)
Other
- fix poster decoding and themed source menu (
cc5a833) - fix keyless media browse and TV episodes (
cd6844b) - fix keyless catalog redirect handling (
6326c84) - fix responsive shell and add keyless catalog feeds (
8402622)
Internal (17 commits — tests, refactors, CI, docs)
- chore(release): 0.6.6 (
4940a9a) - ci: use dedicated Chrome headless shell (
0445ab8) - ci: install pinned Chrome artifact directly (
15d80f6) - ci: select available Chrome 151 build (
2114141) - ci: pin known-good Chrome DOM runtime (
1a15926) - ci: pin browser security test runtime (
e3270d9) - test: serve DOM fixture over loopback (
ebb9792) - test: isolate headless Chrome in CI (
9df81b6) - test: make CI gates reflect current boundaries (
d6e4015) - refactor: separate podcast service and presentation (
b36a260) - test: stress authenticated snapshots and SSE (
3bb847f) - test: exercise DOM hardening in Chromium (
cef775e) - test: align integration gates with hardened runtime (
98bd107) - test: avoid Windows positional I/O panic (
74055c7) - test: refresh feature-suite results (
f07c88f) - test(site): validate shared SEO architecture (
ee03076) - chore(brew): pin the v0.6.5 artifact checksum (
bea2ba7)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.5...v0.6.6
v0.6.5
Highlights
- Torrent search works from the desktop app again. Python's process pool
crashed when nova2 was launched through Zig's child runtime, so every
installed torrent source appeared to return zero results. Opal's bounded
search path now uses network threads, while the qBittorrent-compatible CLI
keeps its process pool. A dedicated CI job executes this exact Zig-to-Python
seam so it cannot silently regress. - Torrent files selected by hand start sooner and keep working. A chosen
episode now gets the same head-first priority as the automatic pick, old
buffer gates are released when switching files, and mpv no longer adds a
second three-second startup buffer on top of Opal's readiness gate. - Startup and shutdown are safer. Background services and process watchers
now have explicit lifetimes, responsive stop paths, and one owner for each
child-process handle instead of detached workers racing teardown. - Windows title-bar behaviour is native again. Double-click maximizes and
restores, maximize respects the current monitor's work area instead of
covering the taskbar, and normal PowerShell builds locate their MSYS2 shell
and toolchain without hand-editingPATH. - Windows releases can sign the whole payload. When Azure Artifact Signing
is enabled, the pipeline signs every executable and DLL, verifies that none
were missed, then signs the MSI itself—covering the modules Windows 11 Smart
App Control evaluates, not onlyopal.exe. - Opal Connect 0.4 has a real setup flow and a useful side panel. It finds
a local Opal, signs in or creates the first account without asking users to
find a token file, and adds live torrents, downloads, recent searches,
casting and watch-party controls, keyboard shortcuts, and the real Opal logo. - The new Opal website makes releases easier to install. The download flow
exposes every published format, detects the visitor's platform, retains
no-JavaScript links, and adds install help, screenshots, comparisons, search
metadata, and a proper project home at opal.palash.dev. - Browser transcoding no longer takes Opal down. ffmpeg's stdout now has one
close owner, eliminating the double-close that could panic the app or close
an unrelated client socket during "Play here".
Changes
Features
- windows — sign the whole release payload, not just opal.exe (
96ce9c4) - site — photographic bands, a real download flow, and a comparison matrix (
1485152) - site — opal.palash.dev — an Astro 7 + React landing page (
586c999) - extension — real logo, two-click setup, and the surfaces it was missing (
24a6dcf)
Fixes
- keep torrent search alive under Zig child runtime (
657a0ec) - harden startup shutdown and search workers (
cf7cfbf) - ci — the two Packaging tests that have been red on main (
33d61dc) - site — the star button links to the repo, not the stargazer list (
45ca5fa) - site — licence cells checked against each project's LICENSE file (
6526607) - torrents — a hand-picked file got no streaming window, and gates leaked (
5a10e9f) - windows — maximize covered the taskbar and double-click did nothing (
3ffb64a) - windows — zig build needed MSYS2 on PATH; now it finds it itself (
1985aea) - ci — read the smoke page into a file instead of piping it to grep (
88a299f) - transcode — stop double-closing the encoder's stdout (
800757a) - tests — the release-notes gate assumed history CI does not have (
0803a4d) - extension — the logo 404'd in the build; the icon now shows the connection (
8bb701b)
Other
- gitignore (
744f2cf)
Internal (8 commits — tests, refactors, CI, docs)
- chore(release): 0.6.5 (
1e21b4c) - test: follow joinable worker lifecycle (
b550e6a) - ci: fetch pinned DVUI from public upstream (
b2c9cf7) - ci: gate the torrent child-process seam (
08385f1) - docs(readme): link the site under the badges (
14d4461) - chore(git): ignore the Claude Code skills tooling (
30979ec) - docs(release): give every release highlights and a commit list (
a19192b) - chore(brew): point the formula at the v0.6.4 tarball (
0c6337a)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.4...v0.6.5
v0.6.4
Highlights
- Torrents play a second time. The metadata cache rebuilt the info dict on
write, which changed the info-hash, so every replay of an already-cached
torrent stalled at 0%. It now stores the original bencoded info dict
byte-for-byte. - An unlimited download rate means unlimited. The setting wrote
-1to
libtorrent, which reaches the bandwidth manager as a negative quota; and the
rate field mixed KB/s with bytes/s, so a4096typed in Settings became
4 KB/s. Both fixed, with the conversion behind a tested pure function. - "Play here" in the browser transcodes instead of refusing. MKV, AVI, TS
and H.265-in-MP4 releases now stream through ffmpeg as fragmented MP4.
Only what nothing can play (a disc image) is still turned away. - The Watching page got its Play and Remove buttons back. They had been
drawn past the bottom edge of their own card and clipped away — a card that
carries both a progress bar and an action row is now sized for both. - Remove watched items one at a time, from Watching and from the Home
"Jump back in" row. - Double-tap
Ffor real fullscreen. It used to expand the player inside
the window only; nothing had ever calledSDL_SetWindowFullscreen. - The releases calendar backfills yesterday by paging the EZTV API, and
buckets into three days instead of one. - Windows: the headless build compiles again.
Changes
Features
- web — "Play here" transcodes instead of refusing (
569f7db) - eztv — backfill yesterday by paging, and bucket into three days (
83db14b) - home — remove watched items one at a time (
d5f0095) - input — fullscreen needs a double-tap of F (
e9363db) - web — fold the Setup page; pct hid the difference between slow and dead (
d66bca3) - web — parity reaches 100%; lanIp never resolved outside a terminal (
e978709) - web — close five parity gaps; plugin secrets were sent in URLs and lost (
4fbfe3d) - web — desktop parity, in-browser playback, and access control (
3730729) - resolver — route results through a sink; warm the next episode (
ecef2f8) - sources — EZTV via its JSON API, sharing the Stremio IMDb lookup (
bbb03df) - library — remove items from Watching (
0b9806e) - browse — live search for Movies & TV (
5221ce5) - player — opt-in prefetch, audio passthrough and exclusive output (
56b8e80) - ui — command palette (Ctrl/Cmd+K), re-applied from the arch branch (
cfa7e36) - player — picture presets with HDR-aware Auto on the transport bar (
7c998fa) - scrape — carry POST through the anti-block path (
394e72b) - search — show size and swarm on result rows; pre-warm the scrape browser (
c78b51a) - ui — justify the window title — media name left, resource meters right (
4362d25) - sources — Prowlarr as its own source, therarbg failover (
071b389) - sources — live trackers, indexer failover, and a source upgrade path (
14bc6eb)
Fixes
- ui — the Watching page's Play and Remove controls had zero height (
3749b4a) - ui — fullscreen only expanded the player, never the window (
ab48305) - torrents — the metadata cache made a second play impossible (
38761d2) - windows — headless build did not compile; a label returned a dead stack slice (
57c56db) - torrents — proxy_url was a dead setting; first magnet after launch vanished (
302a1d3) - web — a magnet sent to /api/load went to mpv, so no torrent ever played (
b498c8b) - ui — settings labels named a path that does not exist on Windows (
2bf558f) - windows — config lived in two trees; route every path through configDir() (
8e0d82c) - ytdlp — "found" meant the file existed, not that it would run (
8ad220d) - windows — HOME is unset there, so 40 code paths silently did nothing (
25a6d3f) - dpi — the bypass proxy leaked one sidecar per restart, 57 of them (
96e3c07) - transcode,web — reap the encoder via pipe close; forms + console noise (
c8ec184) - web — repair broken page, add a JS syntax gate, silence favicon 401 (
30a8d36) - web — rank search results by seeds, not by which engine answered first (
f3b1a93) - ui,engines — two bugs found by driving the app as a user (
24a63e3) - torrents — the wall fallback and the stall watchdog were both off by default (
57047c7) - engines — eight engines hand-rolled their own fetch and bypassed everything (
3846724) - sources — retired sources stayed installed and live; verify Prowlarr for real (
728b62c) - engines — unbounded fetches hung the search; walls had no path at all (
5cc7ef0) - engines — retrieve_url never retried, so flaky hosts always read as dead (
f76f359) - engines — stray prints polluted the result stream; re-derive health table (
0ea138d) - engines — therarbg parser aborted on one bad magnet; drop orphan piratebay (
2273a05) - ci — smoke-windows was dying on a bare
powershell(88b4dbb) - sources — drop two retired Stremio addons, correct the TorrentFunk domain (
7a9e075) - ci — repair the smoke step, and prove the Windows AVX-512 hit was a misdecode (
89de9ae)
Internal (9 commits — tests, refactors, CI, docs)
- chore(release): 0.6.4 (
3731c8c) - test(build): fail the gate on AI attribution in a commit (
a5545df) - test(parity): the desktop⇄web number was hand-maintained, so it read high (
4245695) - test(web): verify torrent per-file streaming end to end (
d105d62) - refactor(resolver): extract resolveImdbId so EZTV can share it (
c9d7994) - ci: smoke-windows is blocking now that it passes (
e680f6f) - ci(windows): assert the CIM kill from a native pwsh step (
fedb3c9) - ci: keep the smoke trace on, and stop guessing where powershell lives (
0ce173f) - ci: trace the smoke step and simplify DLL staging (
8f7b187)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.3...v0.6.4
v0.6.3
Highlights
- Re-cut of v0.6.2 so Windows users get a build: v0.6.2's own ISA gate rejected
the Windows exe over a single isolated instruction, which turned out to be a
PE misdecode rather than real AVX-512 contamination. Same code otherwise.
Changes
Fixes
- ci — unblock the Windows release; explain what the ISA gate tolerates (
c318fe0)
Internal (1 commit — tests, refactors, CI, docs)
- chore(release): 0.6.3 (
f3f13b1)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.2...v0.6.3
v0.6.2
Highlights
- Storage page: see what Opal actually stores and reclaim it.
- Fixed the two bugs reported against the shipped release (#21, #22).
- Windows and Linux portability:
/tmpwrites were silently dead on
Windows, and every sidecar (Suwayomi included) now starts on both. Added a
Windows CI smoke run so this stops regressing. - Upcoming sorts by popularity rather than release date.
- Danger buttons no longer float over the Storage rows.
Changes
Features
- player — tested pure layer for the control bar; wire the clock through it (
35b37af) - storage — show what Opal actually stores, and let users reclaim it (
33fd547)
Fixes
- two shipped-release bugs, plus the UI work they surfaced (#21, #22) (
5c8bb42) - ui — danger buttons floated over the Storage rows (
7131d25) - portability — /tmp writes were silently dead on Windows; add Windows CI smoke (
1d72ae8) - portability — Suwayomi + every sidecar now work on Windows and Linux (
0b71713) - tmdb — sort Upcoming by popularity, not release date (
c8cbadd) - tests — CLAUDE.md is gitignored — don't hard-fail CI on its absence (
3b88a4b) - assets — social preview tagline ran off the canvas (
bc57040)
Internal (3 commits — tests, refactors, CI, docs)
- chore(release): 0.6.2 (
833a53a) - refactor(player): route the control bar through its tested pure layer (
bd02a6f) - chore(brew): point the formula at v0.6.1 (
7ff7c64)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.1...v0.6.2
v0.6.1
Highlights
- Windows: fixed the four bugs behind "crashes on almost anything" (#21).
- Every HTTPS fetch works again — the HTTP client never loaded a CA bundle,
so seeding the clock alone left TLS broken. - The arm64 Docker image builds and runs; IPTV reconnect was half-disabled.
Changes
Fixes
- docker,iptv — arm64 image builds and runs; IPTV reconnect was half-disabled (
05a3443) - http — load the CA bundle — seeding
nowalone broke every https fetch (127ee12) - windows — repair the four bugs behind "crashes on almost anything" (#21) (
81d1c1d)
Internal (1 commit — tests, refactors, CI, docs)
- chore(release): 0.6.1 (
accb23d)
Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.
Full Changelog: v0.6.0...v0.6.1