Skip to content

Releases: debpalash/Opal

v0.6.4

Choose a tag to compare

@github-actions github-actions released this 06 Aug 08:03

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 -1 to
    libtorrent, which reaches the bandwidth manager as a negative quota; and the
    rate field mixed KB/s with bytes/s, so a 4096 typed 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 F for real fullscreen. It used to expand the player inside
    the window only; nothing had ever called SDL_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

Choose a tag to compare

@github-actions github-actions released this 29 Jul 09:08

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

Choose a tag to compare

@github-actions github-actions released this 28 Jul 20:07

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: /tmp writes 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

Choose a tag to compare

@github-actions github-actions released this 26 Jul 09:35

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 now alone 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

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 22:56
3988473

Highlights

  • Movies and TV work out of the box — default TMDB/OMDb keys ship with the
    release, no sign-up before the first search.
  • Accounts for the headless/web build: register and sign in from the web UI,
    with a session-aware bearer gate replacing the old pairing screen.
  • Web UI parity, tier 2: Comics, Novels, Drama, VNDB, Audiobookshelf, OPDS,
    Plex, Music, Radio, Live TV, YouTube, the AI copilot, and the Logs tab.
  • Headless deployment: Caddy TLS and Tailscale access profiles.
  • The browser extension is now Opal Connect, with cross-browser builds.

Changes

Features

  • keys — ship default TMDB/OMDb keys; Movies/TV work out of the box (v0.6.0) (ba172a9)
  • web — parity tier 2 — Comics, Novels, Drama, VNDB, Audiobookshelf, OPDS, Plex, Logs (21031fe)
  • remote — make the placeholder routes real (recommendations, party, cast, comic pages) (51937d8)
  • web — Music + Radio tabs and routes (parity P2) (49557c6)
  • web — AI copilot tab + /api/ai route (parity P2) (5f1b05c)
  • web — add-download box + comic/novel source catalog (parity P1) (6bb2c90)
  • web — Sign out button in Setup (5c2cdb6)
  • web — Live TV tab + /api/livetv catalog route (parity P2) (c1f3a51)
  • headless-deploy — Caddy TLS + Tailscale access profiles (A5) (35ff27e)
  • headless-auth — web UI account login/register, drop pairing screen (A4) (ec16012)
  • headless-auth — auth routes + session-aware Bearer gate (A3) (7f1308f)
  • headless-auth — DB user + session store (A2) (5d63cdd)
  • headless-auth — bcrypt password core (A1) (71d91ce)
  • web — scrollable bottom nav so parity verticals scale (79d377d)
  • web — YouTube tab in the headless web UI (parity P1) (a88b521)
  • extension — rebrand to Opal Connect, composite logo, browser builds (be43934)
  • extension — expose Opal's full remote API (35c8559)

Fixes

  • calendars — route eztv fetches through the DPI-bypass sidecar (e91088b)
  • opds — fetch through curl — std.http could not reach a live OPDS server; retire web/app; pin container UID (61e3160)
  • eztv,headless — one dropped fetch no longer blanks the release rail for 15 min; headless drains deferred comic loads (fb4006c)
  • aur — the publish job could not have worked even with a valid key (1efa3bc)
  • ci — docker smoke no-token check — capture 401, don't -f on it (ad01169)
  • reap orphaned nova2.py search subprocesses on clean shutdown (c0b5caa)
  • docker — don't dockerignore the bundled data/*.json (b7d44fd)
  • apply reference updates for the docs/deploy relocation (875e16a)

Other

  • headless — S1 slim build — the server binary links no dvui/SDL/X11 (9c9b14a)
Internal (14 commits — tests, refactors, CI, docs)
  • ci(docker): multi-arch — amd64 + arm64 on native runners (Phase S3) (512e37b)
  • refactor: remove the pairing code — accounts are the only web auth (3621efe)
  • docs(readme): tighter, more elegant — single-line feature bullets (e1f4c10)
  • docs: document the browser extension + add verified side-panel screenshot (95660ab)
  • ci: publish headless image to GHCR (ghcr.io/debpalash/opal) (7daad85)
  • docs(readme): polish prose — cut filler and try-hard phrasing (37702b9)
  • chore: relocate root docs + compose into folders (d0bc2b5)
  • docs(readme): trim prose — tighter goal/under-the-hood/support/caveats (f90b992)
  • refactor: move bundled data JSONs to data/ (bdfc7be)
  • docs: move CONTENT_POLICY + DMCA into docs/, fix links (e320e14)
  • docs: bump Live TV to ~40k, tighten headings, tidy repo root (eab04ce)
  • docs(readme): cut the 11PM prose intro, tighten the pitch (0752520)
  • docs(readme): v0.5.0 features + SEO/marketing pass (9836135)
  • chore(release): set opal.rb sha256 to published v0.5.0 tarball (d36885c)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 07:21

Highlights

  • Live TV (iptv-org) as a first-class source in the Video group.
  • DPI-bypass proxy sidecar with a Settings toggle — reaches sources that a
    filtering ISP blocks; enabled on Windows too.
  • Browse's 15 sources fold into collapsible groups.
  • YouTube search and channel paging.

Changes

Features

  • YouTube search/channel paging + channel parse path, fix remote.zig grid JSON (6356701)
  • iptv — Live TV source (iptv-org) in the Video group (3158ad2)
  • ui — fold the Browse rail's 15 sources into collapsible groups (0b08342)
  • net — DPI-bypass proxy sidecar with a Settings toggle (109cbc6)

Fixes

  • net — enable the DPI-bypass sidecar on Windows (568f7e1)
  • windows — make every network-backed source load (37c95d7)
  • test — stop the Windows unit-test runner stalling on trace output (e356f01)
  • formula — pin v0.4.1's real tarball checksum (9677de6)
Internal (1 commit — tests, refactors, CI, docs)
  • chore(release): bump version to 0.5.0 (25af481)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.4.1...v0.5.0

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 18 Jul 10:20
93c3550

Highlights

  • Windows: DPI scaling, the console window, plugins, and the custom title
    bar all fixed; the formula builds from source there.
  • Plex: a restored session loads its library again.
  • Loading a .torrent file no longer dead-ends in the web browser.

Changes

Features

  • ui — group the plugins catalog + compact the logs view (938fd96)
  • anime — extract AllAnime endpoint to opal-plugins (gated source) (d545284)
  • anime — repoint lists id-map data at opal-plugins (dc175f0)

Fixes

  • windows — build from source + fix DPI, console, plugins, custom title bar (44e9462)
  • plex — restored session loads its library; harden stale-append guards (3f8d1b7)
  • torrent — loading a .torrent file dead-ended in the web browser (2de8b21)
  • formula — pin v0.4.0's real tarball checksum (5b94ecf)
Internal (3 commits — tests, refactors, CI, docs)
  • test: make the feature suite runnable on Windows (901740d)
  • ci: bump Homebrew formula to 0.4.1 to match build.zig.zon (757d822)
  • ci: fix feature-suite + bump version to 0.4.1 (cada568)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.4.0...v0.4.1

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 21:50

Highlights

  • Comics, manga and novels at scale: Madara (~332 sites), MangaThemesia
    (~143), plus lightnovelwp/readwn engines (~120) — one framework per site
    family rather than one scraper per site.
  • Anime video extractors (MegaCloud/HiAnime, StreamWish, Dood, Mp4Upload …)
    hand off straight to mpv.
  • Anti-block fetching: source scrapers route through an anti-detect browser
    when they hit Cloudflare or a captcha.
  • Encrypted persistent content cache with stale-while-revalidate — cold
    start shows content immediately, then refreshes.
  • Opal Connect, a cross-browser extension: play/read/download/scrape into
    the local app, and add the site you are on as a source.
  • Infinite scroll across drama/vndb/novels/jellyfin/plex/opds/audiobookshelf/radio.

Changes

Features

  • browse — infinite scroll on drama/vndb/novels/jellyfin/plex/opds/audiobookshelf/radio (d533f4e)
  • anime — TV-show-parity detail view — rich header + polished episode rows + type/year/status (4ee2a34)
  • cache — SWR seed/store for comics, anime, podcasts, radio browse listings (b2fe73a)
  • cache — encrypted persistent content cache — instant cold-start views + SWR refresh (afb6a0a)
  • anime — DooPlay + AnimeStream site-framework engines (c801796)
  • sources — opt-in SFW manga source catalog (Madara/MangaThemesia/HeanCms, classified from keiyoushi) (383b849)
  • extension — deep Opal integration — add-site-as-source, typed send, player remote (0643147)
  • scrape — route source scrapers through the anti-block fetch layer (5f35d62)
  • anime — video extractors (MegaCloud/HiAnime, StreamWish, Dood, Mp4Upload…) → mpv (c7bc64e)
  • novels — Madara/lightnovelwp/readwn source engines (~120 sites) (fca5cce)
  • scrape — anti-block fetch via the anti-detect browser (Cloudflare/captcha fallback) (5e556e4)
  • extension — cross-browser Opal Connector (play/read/download/scrape → local Opal) (92add7f)
  • comics — Madara source engine (~332 sites) (2a9eee4)
  • comics — MangaThemesia source engine (~143 sites) (b0d6ed7)
  • comics — HeanCms/Iken JSON source engine (43feef6)
  • reading — OPDS-PSE page streaming for Komga/Kavita comics (af8b939)
  • audiobooks — resume at server-saved position (8c06e08)
  • anime — manual Skip button in player control bar (c44aa1e)
  • anime — airing-schedule view + Anime News Network feed (74f42a4)
  • browse — live-action Asian drama + tokusatsu (1bc0052)
  • browse — VNDB visual-novel catalog (SFW-filtered) (1cb45a4)
  • downloads — gallery-dl backend for image galleries (c23b006)
  • anime — Anime-Skip integration — auto-skip intros/recaps/credits (fb29a4f)
  • reading — light-novel / web-novel reader (5515d4a)
  • reading — OPDS client — Komga/Kavita/Calibre-Web/LANraragi (a95a049)
  • reading — Audiobookshelf client — self-hosted audiobooks (2e806fd)
  • downloads — paste-a-URL affordance in the transfers control bar (83a6848)
  • browser — CloakBrowser engine option + find-in-page, zoom, downloads, history (2aa9327)
  • downloads — segmented downloads, resume, speed limit, scheduler (6c90281)
  • ai — local-only taste engine — activity log + sqlite-vec For You suggestions (e0c5e2a)
  • search — scam-torrent heuristics — flag and block risky results (4ab6f73)
  • security — user-triggered VirusTotal lookups for torrents and downloads (d4046e7)
  • playlist — shuffle, repeat modes, reorder, m3u save (23ac5ea)
  • player — seconds-accurate, path-keyed resume with schema migration (2fbaa9b)
  • OS file associations + single-instance open forwarding (b409822)
  • audio — audio-delay controls + output device picker (d0398e7)
  • macos — Now Playing integration + hardware media keys (c898209)
  • youtube — search suggestions, clickable channels, play → player view (b7ecf5c)

Fixes

  • anime — posters no longer blank out on the SWR revalidate (1668a03)
  • posters — fetch images via curl so anime (MAL CDN) covers load (1e40d70)
  • youtube — use TVHTML5 player client to bypass bot wall + 429 (f78551e)
  • anime — load data despite Jikan 504s on sfw/filtered endpoints (1eb9f7c)
  • http — seed Client.now so TLS fetches don't panic (fa3fb82)
  • comics — don't destroy GPU textures after the frame loop ends (fbd7785)

Performance

  • http — shared keep-alive client + enforce request timeout (no more hangs) (09f561d)
  • startup — warm the common browse routes at launch (1a9d0bf)
  • net — bound connect time on curl content fetchers (b09d464)
Internal (3 commits — tests, refactors, CI, docs)
  • refactor(browse): remove tokusatsu lane — Asian drama tab is drama-only (2f18c50)
  • refactor(tests): chunk test_features.py into per-category modules (bd955af)
  • chore: credit Palash Deb on copyright surfaces (af6e9da)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 18:57

Highlights

  • Watching library — what you are part-way through, in one place.
  • Full-duplex voice mode with live partial transcripts.
  • Winamp-style audio visualizers, including mirrored gradient bars.
  • Torrent streaming starts in seconds instead of hanging.
  • The three download tabs merged into one list.
  • Paged onboarding tour, replayable from Settings.
  • The installer no longer needs Xcode.

Changes

Features

  • player — mirrored gradient bars — the visualizer people actually mean (208fede)
  • Winamp-style audio visualizers; Windows installer; podcast/greeting fixes (cf466ea)
  • resource meters in the title bar, shared media card, richer calendar (7265eb7)
  • Watching library, richer sources, and a calmer player control bar (fe803ff)
  • downloads — merge the three tabs into one unified list (6d036bf)
  • voice — full-duplex conversational mode with live partials (0ff3b5b)
  • onboarding — paged feature tour + replay from Settings (4eef0ba)

Fixes

  • installer no longer needs Xcode; podcast episodes no longer hang (38947b8)
  • player — torrent streaming — start in seconds, and stop hanging (16d41d3)
  • ui — kill the red line under the player, bare play/pause button (e46a81c)
  • repo — track tools/lang_server.py explicitly + guard test (d771aeb)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 11 Jul 18:41

Highlights

  • Podcasts as a new media class — search, browse, stream, with cover art
    and now-playing metadata.
  • Internet radio via RadioBrowser, also a new media class.
  • More sources: Stremio addon pack, Knaben aggregator, NASA, Wikimedia
    Commons, Internet Archive audio.
  • OMDb ratings (IMDb / Rotten Tomatoes / Metacritic) on the detail view.
  • Keyless subtitle providers extended (Subdl, Stremio OpenSubtitles-v3).
  • Broad performance pass: virtualized grids, poster failure latches, cheaper
    per-frame polling.
  • Persisted Settings toggles now actually take effect.

Changes

Features

  • audio — cover art + now-playing metadata for podcasts & radio (11f85f4)
  • subtitles — Subdl provider with in-process ZIP extraction (wave-2) (12160c1)
  • sources — NASA + Wikimedia Commons + Internet Archive audio (legal, default-on) (099ee96)
  • subtitles — keyless Stremio OpenSubtitles-v3 provider in the search chain (df56077)
  • sources — RadioBrowser internet radio — new Radio media class (cefb302)
  • sources — OMDb ratings enrichment (IMDb / RT / Metacritic) on detail view (57912f9)
  • sources — Stremio addon pack + Knaben aggregator; raise manifest cap (09769c0)
  • art — podcast cover images + web Jellyfin poster cards (4a39e93)
  • podcasts — new media class — search, browse, stream audio (desktop + web) (0ab5b88)
  • anime — enrich anime tab with AniList metadata (SFW-gated) (c436db1)
  • tv — TVmaze episode air-dates + next-episode countdown (66a1b22)
  • sources — Internet Archive — legal public-domain video search (cef9193)
  • sources — generic Torznab/Prowlarr/Jackett adapter (ships inert) (b036d65)
  • web — Jellyfin, Anime, and RSS tabs on the web companion (7fae32b)
  • dev — give the dev binary a real macOS app identity (Opal + logo + About) (a39a050)
  • web — queue reorder (up/down) via /queue/move (5b4bc48)
  • web — SSE status push (/events) replaces 1s polling (746651c)
  • home — Coming-up rail uses poster cards (like Trending tonight) (4b1bf9d)
  • safety — never auto-select/open executables or archives in torrents (138a3ba)
  • web — browser-first setup + live torrent progress + history rerun (159090f)
  • web — live torrent progress in Activity (/api/torrents) (2cc7383)
  • hosting+perf — headless web hosting, browser streaming, CPU fixes (a8648c8)
  • smart TV playback, cloud LLM, web companion, CPU + UX overhaul (027a77e)

Fixes

  • build — explicit piece_index_t casts for newer libtorrent (macOS CI) (f2959a4)
  • build — source libtorrent TLS defines from pkg-config (fixes macOS CI) (9d56a7f)
  • onboarding — redesign the welcome modal — logo, cards, wrapping copy (61880ba)
  • startup — first-launch "Nothing loaded" race in Movies&TV / Trending (2ed7efb)
  • settings — make persisted toggles actually take effect (audit fixes) (0b0a701)
  • torrent — proportional piece-map downsample + guard dead torrent_destroy (P2) (974f1e3)
  • torrent — erase removed torrents — stop unbounded dead-slot growth (P1-2) (33c12db)
  • torrent — lock wrapper vector access (P0 data race), atomic session, proxy leak (1d4457c)
  • threads — atomic-ize cross-thread control bools; snapshot jellyfin auth (b57b377)
  • stability — comics download UAF, extractor player race, player panics (c36e79f)
  • playback — letterbox video instead of stretch in fullscreen/full-height (20d0b68)
  • build — give libtorrent_wrapper.so a SONAME (790fed3)
  • web — history items are search strings — render + tap-to-rerun (6192169)
  • docker — correct zig 0.16 tarball name; drop unused onnxruntime deps (965c2ca)

Performance

  • youtube — virtualize the results grid (ad0247b)
  • posters — add missing thumbnail/poster failure-latches (stop per-frame respawn) (d24a840)
  • comics — virtualize the discovery grid + add a cover failure-latch (fdffd35)
  • footer — cache per-frame libtorrent + mpv chrome polls at ~2Hz (1c8dc75)
  • isInList pointer-capture, poster_cache index, search status memoization (5d970ad)
  • lang-learn — move the TTS health probe off the render thread (4af5c9a)
  • web — bound the jellyfin poll loop + skip no-op DOM rebuilds (32df888)
  • playback — throttle interactive chrome repaint 120Hz -> 30fps (eb376d6)
Internal (5 commits — tests, refactors, CI, docs)
  • chore(release): bump to 0.2.0 + reconcile version, add CHANGELOG (fcb5ee7)
  • chore(tests): refresh results.json (140 passed, 0 failed) (42e932d)
  • refactor(ui): extract control-bar picker popovers into ui/pickers.zig (8a52180)
  • refactor(settings): move About into its own tab (out of Playback) (8cc7fd3)
  • docs: mark headless H3 shipped (df3befb)

Install: curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | sh
Verify a download against SHA256SUMS.txt below.

Full Changelog: v0.1.2...v0.2.0