Skip to content
Opal logo

Opal

Play everything. From one app.

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.

CI status Latest release Total downloads GitHub stars License: GPL-3.0 Written in Zig 0.16 Runs on macOS and Linux; Windows is alpha

opal.palash.dev

Get it · See it · Why · Under the hood · Support (Ko-fi, PayPal)

Opal home screen — a time-aware greeting, an ask-anything search box, and tonight's trending row of movies and shows

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

🚀 Get it

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 | sh

For 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 sh

Linux 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 fast

Linux/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; -r for ReleaseFast.
  • just hot — native --watch -fincremental, millisecond rebuilds.
  • just release / just app — ReleaseFast / macOS Opal.app bundle.
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), and opal.db (history, AI memory)
  • ~/.cache/opal/ — caches
  • ~/Downloads/opal — default downloads
  • ~/.config/opal/plugins/<name>/ — content plugins (manifest.json + a search/resolve executable that prints JSON; Lua runs sandboxed, native binaries don't — install only what you trust)

✨ The tour, in motion
Press play on a torrent result; playback starts while it downloads
🧲 Magnets behave like files
Press play on a torrent — you're watching while it downloads. (Sintel, © Blender Foundation, CC-BY 3.0)
One query fanned out across every source, ranked
🔭 One search, every source
Disk, torrents, Jellyfin, Plex, Stremio, anime, YouTube, live TV, TMDB, manga — one ranked, playable list.
Scrolling the trending wall, then switching to the YouTube tab
🗺️ Browse every source in one place
Trending walls, genres, and episode drill-downs across TMDB, YouTube, anime, Jellyfin, and Plex.
A suggestion chip answered by the local AI with a poster rail
🤖 An AI that lives on your machine
Local LLM with tool use answers with playable picks — no API key, no bill, no feed.

🆚 Why? One app instead of ten

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.

⌨️ Keyboard-first, remote-friendly

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.

🧩 Browser extension

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.

Opal Connect side panel — connection status, page actions, transport controls, and a live cross-source search returning YouTube results with play and queue buttons

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.

⚙️ Under the hood

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).

💜 Support

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.

🤝 Contributing

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.

📜 License

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).

The fine print

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.

About

Opal — The open-source everything media player & browser. Jellyfin/Stremio/Kodi alternative for macOS, Linux & Windows.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

78 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages