A free, open-source, local-first media player + browser. Search and stream movies, TV, anime, live TV / IPTV, YouTube, torrents, and manga — plus your own Jellyfin & Plex — with a private, on-device AI copilot. One native binary; no accounts, no cloud, no subscription.
Get it · See it · Why · Under the hood · Support (Ko-fi, PayPal)
Tip
🔮 New in v0.5.0 — a ~40,000-channel Live TV / IPTV catalog with instant search · Mihon / Tachiyomi manga extensions (Opal runs the Suwayomi server for you) · a refined YouTube with AV1-safe playback. Full release →
Opal replaces the stack you'd otherwise juggle — a player, a site for the show, a server front-end, a torrent client, a feed. Say what you want (a title, a file, a magnet); it searches every source, plays anything, and remembers where you left off. One native binary — Zig + dvui + mpv — fast and quiet.
| 🙅 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 — detects your platform, verifies checksums, doubles as the updater
(… -s -- update) and version pin (OPAL_VERSION=v0.1.0 …). On Linux it
installs to ~/.local and never needs sudo:
curl -fsSL https://github.com/@raw/debpalash/Opal/main/scripts/install.sh | shFor a system-wide Linux install through apt, dnf, zypper, or an AUR
helper, opt in explicitly (root or sudo is required):
curl -fsSL https://github.com/@raw/debpalash/Opal/main/scripts/install.sh | OPAL_SYSTEM=1 shLinux release requirements: standard artifacts require glibc 2.38+.
For Ubuntu 20.04/22.04, Debian 12 and Mint 21, v0.8.8 adds
opal_<version>_compat_amd64.deb with a private media runtime and glibc 2.31+.
The installer chooses it automatically; OPAL_SYSTEM=1 installs via apt, while
normal installation extracts it into your user prefix. Playback uses software
decoding and X11/XWayland. No system libraries are replaced. See the
compatibility build for details.
The standard .deb requires libmpv2 and libtorrent-rasterbar2.0 from your
repositories (Ubuntu 24.04+, Debian 13+). AppImage requires glibc 2.38+.
Or pick your row — every file is on Releases:
| Platform | Install | |
|---|---|---|
| 🍎 | macOS (Apple silicon) | open the .dmg, drag, done |
| 🍺 | Homebrew | brew install debpalash/tap/opal |
| 📦 | Debian / Ubuntu | sudo apt install ./opal_<version>_amd64.deb (use _compat_amd64.deb on older hosts) |
| 🎩 | Fedora / openSUSE | sudo dnf install ./opal-*.x86_64.rpm |
| 🏹 | Arch / Omarchy / Pacman | sudo pacman -U ./opal-*-x86_64.pkg.tar.zst |
| 📚 | AUR | yay -S opal-media-player-bin (or opal-media-player to build) |
| 🐧 | Linux (glibc 2.38+) | chmod +x Opal-*.AppImage and run it |
| 🪟 | Windows (x64) — alpha | run the .msi — or unzip the portable .zip |
| 🛠 | From source | git clone → zig build run |
Homebrew installs the self-contained macOS .app bundle; opal launches that
app directly. No Homebrew mpv or FFmpeg dependency is needed to install it.
🍎 macOS may call the .dmg "damaged" — it isn't; we're not Apple-notarized
yet. The one-command installer skips the dialog, or run sudo xattr -cr /Applications/Opal.app once. 🍎 Intel Macs: build from source
(HOMEBREW_PREFIX=/usr/local).
Warning
Windows support is alpha. It is the newest port and is not yet at parity with macOS and Linux — expect rough edges and bugs the other two do not have. SmartScreen will also want a word. Please do file issues; they are what moves it forward. macOS (Apple silicon) and Linux x86_64 are the supported platforms.
Start on Home with Search all sources or Browse movies & TV. The navigation bar's Search opens universal results from anywhere. On compact windows, Search is also under More; playback controls are under More → Playback options, and workspace, remote, theme and shortcut tools are under More → More tools.
On smaller Windows displays, Opal fits its initial window inside the usable desktop area. The bottom Now Playing bar stays visible while media plays; use its × to stop and close it. Movies & TV keeps search and filters in one icon toolbar: hover an icon for its name, and scroll across the toolbar in a narrow window. Poster cards keep list actions and Details available without hover; selected lists stay highlighted. Universal search uses compact rows and groups YouTube trailers and teasers separately; click a result row or its Play button to start playback, or + to queue a torrent. Install sources from Settings → General → Install source plugins; the source catalog reports the last operation and links to redacted Logs.
For temporary torrent playback, enable Settings → Network → Stream torrents in memory. Choose a 128, 256 (default), or 512 MiB payload buffer per torrent. New torrents keep media and torrent caches in RAM, download around the requested playback position, and discard older pieces. Closing or replacing the stream releases its buffer. Seeking into discarded data downloads it again. Existing transfers keep their storage mode; playback still needs available peers. Player/decoder memory is additional, and the operating system may swap RAM to disk.
Deleting a playing torrent stops its stream before removing the download, and the empty player offers Open file or Browse search. To hand playback to VLC, install VLC and choose Settings → Playback → Open in VLC while media is playing; VLC is optional and Opal reports if it is not installed. Source installation shows its current step and an error or success result; redacted Logs include the failed step and a recovery procedure.
The Linux AppImage uses the system's OpenSSL 3 libraries alongside system
libcurl (rather than bundling an older OpenSSL that conflicts on rolling
distributions). The AppImage requires libssl.so.3 and libcrypto.so.3 on
the host.
First launch: The welcome screen offers keyless Movies & TV browsing and optional one-click source installation for universal search. Choose Home to open local files instead. Add a free TMDB v4 token in Settings (⌘,) for richer metadata. Voice and AI models remain opt-in; nothing downloads itself. Reopen the welcome screen from Settings → About.
🧱 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).
On macOS 14, current Homebrew FFmpeg/mpv dependencies have no working bottle
closure. Instead of brew install mpv ffmpeg, install
sqlite sdl2 libtorrent-rasterbar libass libplacebo meson ninja pkgconf, then run
./scripts/install-macos-ffmpeg.sh and ./scripts/install-macos-mpv.sh
before zig build run. These build shared libraries from checksum-pinned
source with macOS 13 as the minimum deployment target.
Minimum versions (Linux source builds): libtorrent-rasterbar 2.0 or
newer and libmpv 0.34 or newer (mpv 0.38+ recommended;
Ubuntu 22.04's 0.34 works — Opal picks the loadfile argument shape from the
library version at runtime), SDL 2.0.22 or newer when building against the
system SDL via make run (jammy's 2.0.20 lacks SDL_PIXELFORMAT_RGBX32).
Standard Linux artifacts need glibc 2.38; Debian 12 / Mint 21 can use the
compatibility package or build from source. Ubuntu 20.04's stock mpv and libtorrent are below the source-build
minimums; those libraries also need upgrading before compiling. A rejected
loadfile is now reported in the app's log and as a toast rather than hanging
on "Opening stream".
🔧 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 — every PR reports its tally (see
CONTRIBUTING.md).
📁 Where your stuff lives
XDG-compliant:
~/.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)
✨ The tour, in motion
| Instead of… | Opal gives you |
|---|---|
| Stremio / Kodi + a pile of add-ons | one search across every source, a play button on each row |
| an IPTV / live-TV app | ~40,000 live channels, searchable as you type |
| Jellyfin / Plex web clients | your own media servers, browsed natively |
| Tachiyomi / Mihon stuck on your phone | manga extensions on the desktop — server bundled, self-managed |
| a torrent client + a player | magnet → instant streaming while it downloads |
| ChatGPT for "what do I watch?" | a local AI copilot — no key, no bill, no feed |
| SponsorBlock · subtitle sites · Chromecast apps | all built in |
Plus a player that sweats the details — auto subtitles, watch-party, phone
remote (:41595), session restore — and a drawer full of extras: OCR on video
frames, language flashcards, RSS, incognito, seven themes, a JSON API (:41595).
Where it's all going: ROADMAP.md.
| S search | B browser | D library | H history |
| F fullscreen | P playlist | G grid layout | Z fit/crop |
| ⌘O open file | ⌘, settings | Esc back out | ⇧I cheat sheet |
📱 From your phone: Settings › Web UI → Enable Web UI, set Network to
LAN, then scan the QR code shown there (it carries the one-time setup code
on first use). That opens http://<your-pc-ip>:41595 in the phone's browser —
plain HTTP on your own network, no account or cloud involved. Installing it as
a home-screen app needs a secure context (HTTPS); see
docs/web-companion.md.
Opal Connect (Chrome / Edge / Firefox) turns any tab into an Opal action — send or queue a video, add a manga/novel site as a source, or drive playback from a side-panel remote.
Install — grab the Chrome/Edge or Firefox build from the
latest release (unzip → load unpacked), or build from
extension/ (npm install && npm run build). Pair it with your Opal API token
and every action routes to the desktop app —
extension/README.md.
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)
extension/ # Opal Connect — cross-browser MV3 extension
Player, search, torrent streamer, and AI compile to one native binary: a
single leak-checked allocator, fixed-size buffers over heap churn, one
state.app hub under strict thread-safety rules, and a render loop that
repaints only on change. House rules in
CONTRIBUTING.md.
Content sources ship off — nothing enables itself. You install endpoints
from the plugin registry, and un-install them just as fast
(CONTENT_POLICY.md).
No telemetry to monetize, no accounts to upsell — Opal runs on goodwill:
- ☕ Ko-fi or 💸 PayPal — keep the releases (and the coffee) coming.
- ⭐ Star the repo — it's how people find it.
- 🐛 File good bugs (how) · 🔧 send PRs (how).
- 📣 Show someone — the GIFs above are yours to share.
Yes please — read CONTRIBUTING.md, run
just test-all, and report the tally in your PR. Questions live in
Discussions; the help map is in
SUPPORT.md.
GPL-3.0 (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 (
CONTENT_POLICY.md). BitTorrent exposes your IP to the swarm — use a VPN if that matters to you. Rights holders:docs/DMCA.md. Provided "as is", no warranty.
Built with Zig, mpv, and dvui. Yours since first launch.
Opal — open-source media player · IPTV / live TV player · torrent streaming ·
Jellyfin & Plex client · YouTube desktop app · manga reader (Mihon / Tachiyomi / Suwayomi) ·
local AI copilot · self-hosted Stremio & Kodi alternative · for macOS and Linux (Windows alpha).
Browse source details, supported discovery paths, and live-check limitations: Browse sources.




