The evolved media player for the next decades of entertainment.
Get it Β· See it Β· The AI Β· Under the hood Β· Support Development (Ko-fi, PayPal)
It's late. Opal knows it's late.
It's 11 PM and you just want to watch something. So why are there nine tabs open? A player for the files. A site for the show. An app for the server. A wiki for "what episode was that." A feed deciding what you see next. Opal's whole thesis is that this is one job: you say what you're in the mood for β a title, a file, a magnet, a vibe β and a moment later you're watching it. That's it. That's the app.
For decades the "media player" has been the dumb end of the pipeline β the
thing other apps hand a file to. Opal is what comes after: the place where
watching starts. It searches everywhere at once, curates to your taste,
remembers where you left off, and plays anything β a local-first media app
written in Zig, with an immediate-mode
dvui interface and an mpv
heart. It opens in a blink, idles in silence, and quits with a receipt:
Clean shutdown: 0 memory leaks.
| π No accounts | π‘ No telemetry | βοΈ No cloud | π³ No subscription |
|---|---|---|---|
| nothing to sign up for | nothing phones home | your history is a SQLite file you own | it's your computer |
One command. It figures out your platform, verifies checksums, and it's also
the updater (β¦ -s -- update) and version manager (OPAL_VERSION=v0.1.0 β¦):
curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | shPrefer to do it yourself? Find your row β every file is on the Releases page:
| Platform | The move | |
|---|---|---|
| π | macOS (Apple silicon) | open the .dmg, drag, done |
| πΊ | Homebrew | brew install debpalash/tap/opal |
| π¦ | Debian / Ubuntu | sudo apt install ./opal_*_amd64.deb |
| π© | Fedora / openSUSE | sudo dnf install ./opal-*.x86_64.rpm |
| πΉ | Arch | yay -S opal-bin (or opal to build) |
| π§ | Any Linux | chmod +x Opal-*.AppImage and run it |
| πͺ | Windows (x64) | run the .msi β or unzip the portable .zip anywhere |
| π | From source | git clone β zig build run (deps below) |
π macOS calls the downloaded .dmg "damaged" β it isn't; that's
Gatekeeper's way of saying we haven't paid Apple $99/yr for notarization yet.
Either use the one-command installer above (no quarantine, no dialog), or run
sudo xattr -cr /Applications/Opal.app once after dragging. πͺ Windows builds are
the newest of the family β treat the first releases as adventurous (SmartScreen
will also want a word). π Intel Macs: source build works
(HOMEBREW_PREFIX=/usr/local).
First launch: open Settings (β,) and paste a free TMDB v4 token to light up movie/TV browsing. Voice and AI models are opt-in downloads β one button each, nothing installs itself.
π§± Building from source
Zig 0.16.x plus a handful of native friends:
brew install zig mpv sqlite onnxruntime sdl2
# plus: libtorrent-rasterbar, g++ (torrent wrapper), ffmpeg/whisper-cpp for voice
git clone https://github.com/debpalash/Opal.git
cd Opal
zig build run # first build is slow; incrementals are fastLinux/Wayland: use make run (forces system SDL2 β the bundled one is
X11-only). macOS builds read HOMEBREW_PREFIX (default /opt/homebrew).
π§ For hackers: dev loops, tests, and the contract
./dev.shβ hot-reload loop that survives C changes;-rfor ReleaseFast.just hotβ native--watch -fincremental, millisecond rebuilds.just release/just appβ ReleaseFast / macOSOpal.appbundle.
just test-all # the comprehensive gate β must stay 0 fail
zig build test # pure-Zig unit tests only (fast)fail = real regression. skip = optional component not installed. That's
the contract β and every PR reports its tally
(see CONTRIBUTING.md).
π Where your stuff lives
XDG-compliant, no surprises:
~/.config/opal/β config, tokens (0600), andopal.db(history, AI memory)~/.cache/opal/β caches~/Downloads/opalβ default downloads~/.config/opal/plugins/<name>/β content plugins (manifest.json+ asearch/resolveexecutable that prints JSON; Lua runs sandboxed, native binaries don't β install only what you trust)
Become the true alternative to the whole stack β the streaming apps, the server front-ends, the trackers, the recommendation feeds β by being self-sufficient: one interface that understands what you need and quietly takes care of it, powered by an AI that runs on your hardware and answers to you.
A media system shouldn't need a corporation attached. Discovery, curation,
memory, playback β Opal's bet is that all of it can live on your machine,
learn your taste without reporting it, and get out of the way. Every release
walks further in that direction (ROADMAP.md).
β¨ The tour, in motion
- π§² Magnets behave like files β piece-prioritized streaming: press play on a torrent and you're watching while it downloads.
- π Search once, everything answers β disk, torrents, Jellyfin, Stremio, anime, YouTube, TMDB, comics β one ranked list, a play button on every row.
- π€ A local AI copilot β "what should I watch if I loved Interstellar?"
answered with playable picks; hands-free voice (Whisper ears, Piper/Kokoro
mouth, barge-in); taste memory in on-disk
sqlite-vec. No API key, no bill, no "your data helps us improve." βΆοΈ A player that sweats details β subtitles embedded, fetched, or Whisper-generated on the spot Β· SponsorBlock Β· Chromecast Β· LAN watch-party Β· phone web remote (:3000) Β· session restore mid-sentence.- πΊοΈ Browse like you own the place β trending walls, genres, episode drill-downs across every source, including your Jellyfin and Plex.
- π§° β¦and the drawer β comics & manga reader Β· live OCR on video frames Β·
language-learning flashcards Β· recommendations Β· history & queue Β· RSS Β·
incognito (I) Β· seven themes Β· JSON API (
:41595) for your own automations.
| S search | B browser | D library | H history |
| F fullscreen | P playlist | G grid layout | Z fit/crop |
| βO open file | β, settings | Esc backs out of things, politely | β§I the cheat sheet |
src/
βββ main.zig # appFrame() β one function per frame, immediate mode
βββ core/ # alloc, state, config, paths, io shim, sqlite (+sqlite-vec)
βββ player/ # mpv wrapper, playlists, subtitles, watch history
βββ services/ # search, AI, torrents, jellyfin, remote API, ...
βββ ui/ # dvui widgets β theme tokens, shell, grid, player chrome
web/ # companion web UI (its own Zig project)
The parts we're quietly proud of: the whole system β player, search, torrent
streamer, AI β compiles to one fast native binary; one global
allocator with leak detection on every exit; fixed-size buffers instead of
heap churn; a single state.app hub with disciplined thread-safety rules; a
render loop that repaints only when something changed (your fans will
thank us); and a threaded-Io shim for Zig 0.16. House rules in
CONTRIBUTING.md; where this is all going in
ROADMAP.md.
Content sources ship off: the core has no sources configured and nothing
enables itself β you explicitly install endpoints from the plugin registry,
and you can un-install them just as fast
(CONTENT_POLICY.md).
Opal has no telemetry to monetize and no account system to upsell β it runs on goodwill:
- β Buy the maintainer a coffee on Ko-fi or πΈ chip in via PayPal β donations keep the release cadence honest and the coffee supply uninterrupted.
- β Star the repo β it's genuinely how people find it.
- π File good bugs (how) Β· π§ send PRs (how).
- π£ Show someone. This pitch lands best as a 30-second demo β the GIFs above are yours to share.
Yes please β read CONTRIBUTING.md and the
CODE_OF_CONDUCT.md, run just test-all, and report the
tally in your PR. Questions live in Discussions;
the full help map is in SUPPORT.md.
GPL-3.0 (see LICENSE, NOTICE.md) β the honest
choice for a program linked against libmpv. Bundled dependencies keep their own
licenses (libtorrent BSD, dvui/ONNX MIT, SDL2 zlib, SQLite public domain).
Opal is a player and an aggregator β it hosts, indexes, and distributes nothing. It connects to sources you configure. Only access media you have the legal right to access in your jurisdiction; read
CONTENT_POLICY.mdbefore enabling content plugins or torrent features. BitTorrent exposes your IP to the swarm β use a VPN if that matters to you. Rights holders: seeDMCA.mdfor the takedown process.
Provided "as is", no warranty. The authors are not responsible for how the software is used or for content reached through third-party sources.



