Releases: debpalash/Opal
Release list
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
v0.6.0
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
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
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
.torrentfile 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
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
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
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