diff --git a/README.md b/README.md index 5e30a34..019696c 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,8 @@ ### Your media, in one place. -A free, open-source, local-first **media player and browser**. Movies, TV, anime, -**live TV / IPTV**, YouTube, torrents, and manga — plus your own **Jellyfin & Plex** -libraries and an optional **on-device AI copilot**. +A free, open-source **media player and browser** for movies, live TV, YouTube, +torrents, manga, and your **Jellyfin & Plex** libraries. Optional **AI runs locally**.

CI status @@ -32,11 +31,8 @@ libraries and an optional **on-device AI copilot**.

-Opal searches your enabled providers, opens playable media and reading results, -and remembers where you left off. Personal libraries need a configured server; -catalog entries can lead to details or a source search. The player, browser, -torrent streamer, and AI live in one native app built with -[Zig](https://ziglang.org), [dvui](https://github.com/david-vanderson/dvui), and **mpv**. +Search your enabled sources, play or read a result, and resume where you left off. +Connect a server to browse your Jellyfin or Plex library. | Local history | No telemetry | Optional local AI | Free software | |:---:|:---:|:---:|:---:| @@ -46,46 +42,44 @@ torrent streamer, and AI live in one native app built with ## See Opal in action -### Browse without the tab overload +### Browse -Explore trending titles, genres, and sources from one native window. +Explore trending titles, genres, and sources. Animated Opal demo: scroll the movie poster wall, then switch to the YouTube source, inside a framed window on an opalescent backdrop. [Watch the browse recording →](assets/media/browse.mp4) -### Start watching while it downloads +### Stream torrents -Play a torrent result directly. The stream downloads around playback; -available peers are required. +Play while a torrent downloads. Available peers are required. Animated Opal demo: start a Sintel torrent and watch playback while it downloads, framed against an opalescent backdrop. [Watch the streaming recording →](assets/media/stream-a-torrent.mp4) · Sintel, © Blender Foundation, CC BY 3.0. -### Let your own AI find the next watch +### Ask your local AI -An optional local model answers with playable suggestions. Models are opt-in; -no API key or AI subscription is needed. +Get playable recommendations from an optional local model. No API key needed. Animated Opal demo: a suggestion chip prompts the local AI, which responds with recommendations and a poster rail. [Watch the AI recording →](assets/media/ask-the-ai.mp4) -The GIFs use existing demo recordings; the stills below show the refreshed desktop toolbar. +GIFs show earlier recordings; stills show the current toolbar.
Opal universal search with Sintel results and play or queue actions, presented in an opalescent screenshot card.
One query. Every source.
- Search supported, enabled providers for files, streams, reading results, and title details. Click the image for a closer look. + Find files, streams, reading results, and title details. Click to enlarge.
Big Buck Bunny playing in Opal, with quality, audio, subtitle, and translation controls, presented in an opalescent screenshot card.
Press play. Settle in.
- Quality, audio tracks, subtitles, and live translation stay close at hand. Big Buck Bunny, © Blender Foundation, CC BY 3.0. + Quality, audio, subtitles, and translation. Big Buck Bunny, © Blender Foundation, CC BY 3.0.
@@ -94,326 +88,245 @@ no API key or AI subscription is needed. ## Get Opal -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`: +Install with one command. It detects your platform and verifies checksums; +Linux installs to `~/.local` without `sudo`. ```sh curl -fsSL https://raw.githubusercontent.com/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): +Prefer a package? Download from [Releases](../../releases) or use a package manager: -```sh -curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | OPAL_SYSTEM=1 sh -``` +| Platform | Install | +|---|---| +| **macOS · Apple silicon** | Open the `.dmg` and drag Opal to Applications | +| **Homebrew** | `brew install debpalash/tap/opal` | +| **Arch / Omarchy / AUR** | `yay -S opal-media-player-bin` or `paru -S opal-media-player-bin` | +| **Debian / Ubuntu** | `sudo apt install ./opal__amd64.deb` | +| **Fedora** | `sudo dnf install ./opal-*.x86_64.rpm` | +| **openSUSE** | `sudo zypper install ./opal-*.x86_64.rpm` | +| **Linux · AppImage** | `chmod +x Opal-*.AppImage`, then run it | +| **Windows · x64 alpha** | Install the `.msi` or extract the portable `.zip` | + +**Linux:** standard packages need glibc 2.38+. Ubuntu 20.04/22.04, Debian 12, +and Mint 21 should use `_compat_amd64.deb` (glibc 2.31+). The installer selects +it automatically. [Compatibility details](packaging/linux-compat/README.md). -**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__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](packaging/linux-compat/README.md) 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](../../releases): - -| | Platform | Install | -|---|---|---| -| 🍎 | **macOS** (Apple silicon) | open the `.dmg`, drag, done | -| 🍺 | **Homebrew** | `brew install debpalash/tap/opal` | -| 📦 | **Debian / Ubuntu** | `sudo apt install ./opal__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` · `paru -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` | +**Arch:** the v0.8.8 AUR binary requires libtorrent 2.0; current Arch ships 2.1. +Use the AppImage until the binary package is updated. + +**Windows is alpha:** expect bugs and SmartScreen prompts. +[Report an issue](https://github.com/debpalash/Opal/issues). + +### First launch + +Browse **Movies & TV** without a key, or choose **Home** to open a file. +Install search sources in **Settings → General → Install source plugins**. +A **TMDB v4 token** adds richer metadata. AI and voice models are opt-in.
-Platform notes, first launch, and playback options +Updates and platform notes + +**Update:** rerun the installer with `sh -s -- update`. Set `OPAL_VERSION=vX.Y.Z` +to pin a release. -**Arch Linux, Omarchy, Manjaro, EndeavourOS** — Opal is on the AUR as -[`opal-media-player-bin`](https://aur.archlinux.org/packages/opal-media-player-bin) -(the official release binary) and -[`opal-media-player`](https://aur.archlinux.org/packages/opal-media-player) -(builds from source with zig). The two conflict; install one. +**System-wide Linux install** (requires root or `sudo`): ```sh -yay -S opal-media-player-bin # AUR helper (or: paru -S opal-media-player-bin) -yay -S opal-media-player # build from source instead +curl -fsSL https://raw.githubusercontent.com/debpalash/Opal/main/scripts/install.sh | OPAL_SYSTEM=1 sh +``` + +**Arch:** [binary package](https://aur.archlinux.org/packages/opal-media-player-bin) +or [source package](https://aur.archlinux.org/packages/opal-media-player); install one. +Update AUR packages with `yay -Syu` or `paru -Syu`. +Without a helper: -# no AUR helper — let makepkg call pacman +```sh git clone https://aur.archlinux.org/opal-media-player-bin.git cd opal-media-player-bin && makepkg -si - -# straight from the release, no AUR -sudo pacman -U ./opal-*-x86_64.pkg.tar.zst ``` -Update later with `yay -Syu` or `sudo pacman -Syu`. - -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](https://github.com/debpalash/Opal/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**. +The release `.pkg.tar.zst` also installs with `sudo pacman -U ./opal-*-x86_64.pkg.tar.zst`. + +**macOS:** Homebrew includes the app's media libraries. If an unnotarized DMG +shows “damaged,” use the installer or run `sudo xattr -cr /Applications/Opal.app`. +Intel Macs require a source build with `HOMEBREW_PREFIX=/usr/local`. + +**Linux:** standard `.deb` packages need `libmpv2` and `libtorrent-rasterbar2.0` +(Ubuntu 24.04+ / Debian 13+). Compatibility builds use software decoding and +X11/XWayland. AppImage needs glibc 2.38+ and system OpenSSL 3 +(`libssl.so.3`, `libcrypto.so.3`).
-
-🧱 Building from source +Playback and navigation tips -
+- **Search** works from any page; compact windows also offer it under **More**. +- Hover toolbar icons for labels; scroll the toolbar in narrow windows. +- Click a result or **Play** to watch; **+** queues a torrent. **Details** opens title info. +- **×** on Now Playing stops playback. More controls: **More → Playback options**. +- Install VLC, then choose **Settings → Playback → Open in VLC** to hand off playback. +- Source installation errors include recovery steps in redacted **Logs**. -Zig **0.16.x** plus a handful of native friends: +**Temporary torrents:** enable **Settings → Network → Stream torrents in memory**. +Choose 128, 256 (default), or 512 MiB per new torrent. Seeking may redownload +pieces; closing releases the buffer. Existing transfers keep their storage mode. +Decoder memory is extra, and the OS may swap RAM to disk. -```sh -brew install zig mpv sqlite onnxruntime sdl2 -# plus: libtorrent-rasterbar, g++ (torrent wrapper), ffmpeg/whisper-cpp for voice +Reopen onboarding in **Settings → About**. +
+ + +
+Build from source + +Use **Zig 0.16.x**; 0.17 requires a migration. On macOS: + +```sh +brew install mpv sqlite sdl2 libtorrent-rasterbar +# Install Zig 0.16.x separately if your package manager offers a newer version. git clone https://github.com/debpalash/Opal.git cd Opal -zig build run # first build is slow; incrementals are fast +zig build run ``` -**Linux/Wayland:** use `make run` (forces system SDL2 — the bundled one is -X11-only). macOS builds read `HOMEBREW_PREFIX` (default `/opt/homebrew`). +**Linux / Wayland:** run `./scripts/install-deps.sh`, then `make run` for system SDL2. +Minimums: libmpv **0.34** (0.38+ recommended), libtorrent-rasterbar **2.0**, and +SDL **2.0.22**. Ubuntu 20.04 needs newer mpv and libtorrent than its stock packages. -On macOS 14, current Homebrew FFmpeg/mpv dependencies have no working bottle -closure. Instead of `brew install mpv ffmpeg`, install +**macOS 14:** if Homebrew cannot provide FFmpeg/mpv, 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". +`./scripts/install-macos-ffmpeg.sh` and `./scripts/install-macos-mpv.sh`. +These target macOS 13+. `HOMEBREW_PREFIX` defaults to `/opt/homebrew`. + +**Optional:** ONNX Runtime with `zig build -Docr=true` for OCR; +FFmpeg and whisper-cpp for voice.
-🔧 For hackers: dev loops, tests, and the contract - -
+Development and tests -- `./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. - -```sh -just test-all # the comprehensive gate — must stay 0 fail -zig build test # pure-Zig unit tests only (fast) -``` +| Command | Purpose | +|---|---| +| `./dev.sh` | Hot reload; `-r` for ReleaseFast | +| `just hot` | Native incremental rebuilds | +| `just release` / `just app` | Release binary / macOS bundle | +| `zig build test` | Zig unit tests | +| `just test-all` | Full feature suite | -`fail` = real regression. `skip` = optional component not installed. That's the -contract — every PR reports its tally (see -[`CONTRIBUTING.md`](.github/CONTRIBUTING.md)). +Both test suites must have **0 failures** before committing. Optional-component +skips are allowed. Include the tally in your PR. +[Contribution guide](.github/CONTRIBUTING.md).
-📁 Where your stuff lives - -
+Files and data -XDG-compliant: +| Path | Contents | +|---|---| +| `~/.config/opal/` | Config, tokens (`0600`), history and AI memory (`opal.db`) | +| `~/.cache/opal/` | Caches | +| `~/Downloads/opal` | Default downloads | +| `~/.config/opal/plugins//` | Source plugins | -- `~/.config/opal/` — config, tokens (`0600`), and `opal.db` (history, AI memory) -- `~/.cache/opal/` — caches -- `~/Downloads/opal` — default downloads -- `~/.config/opal/plugins//` — content plugins (`manifest.json` + a - `search`/`resolve` executable that prints JSON; Lua runs sandboxed, native - binaries don't — install only what you trust) +Plugins use `manifest.json` and JSON-emitting `search`/`resolve` executables. +Lua is sandboxed; native binaries are not. Install trusted plugins.
-## One app instead of ten +## Features -| Instead of… | Opal gives you | +| Media | What you can do | |---|---| -| **Stremio / Kodi** + a pile of add-ons | one search across supported, enabled providers, with playback, reading, and detail actions | -| **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 | +| **Movies, TV, anime & YouTube** | Browse titles and search enabled sources | +| **Live TV / IPTV** | Search ~40,000 channels | +| **Jellyfin & Plex** | Connect and browse your servers | +| **Manga** | Use Mihon / Tachiyomi extensions through managed Suwayomi | +| **Torrents** | Stream magnets while they download | +| **Local AI** | Ask for playable recommendations | -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`](ROADMAP.md). +Also: subtitles, translation, SponsorBlock, casting, watch parties, session restore, +RSS, themes, incognito, and optional OCR. [Roadmap](ROADMAP.md) · +[Source coverage](docs/browse-sources.md). -## ⌨️ Keyboard-first, remote-friendly +## Keyboard and phone remote | | | | | |---|---|---|---| | 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** | +| ⌘O open file | ⌘, settings | Esc back | ⇧I shortcuts | -**📱 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://: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](docs/web-companion.md). +**From your phone:** open **Settings → Web UI**, enable it, set **Network** to +**LAN**, then scan the QR code. It includes a setup code on first use and opens +`http://:41595`. Home-screen installation requires HTTPS. +[Phone setup guide](docs/web-companion.md). -## 🧩 Browser extension +## 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** for Chrome, Edge, and Firefox sends videos to Opal, adds reading +sources, and controls playback from a side panel.
Opal Connect browser side panel with page actions, playback controls, and cross-source search, framed over an opalescent backdrop.
-**Install** — grab the Chrome/Edge or Firefox build from the -[latest release](../../releases/latest) (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`](extension/README.md). +Download the extension from [Releases](../../releases/latest), unzip and load it, +then pair with your Opal API token. [Install and build instructions](extension/README.md). -## ⚙️ Under the hood +## 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 +├── main.zig # app entry and frame loop +├── core/ # state, config, storage, I/O +├── player/ # mpv, playlists, subtitles +├── services/ # search, AI, torrents, remote API +└── ui/ # native dvui interface +web/ # companion web UI +extension/ # Opal Connect ``` -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`](.github/CONTRIBUTING.md). +Built with **Zig, dvui, and mpv**. One native binary, shared application state, +and a UI that repaints on change. [Architecture](docs/architecture.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`](docs/CONTENT_POLICY.md)). +Sources start disabled. Install and manage them from the plugin registry. +[Content policy](docs/CONTENT_POLICY.md). -## 💜 Support - -No telemetry to monetize, no accounts to upsell — Opal runs on goodwill: +## Support -- ☕ **[Ko-fi](https://ko-fi.com/debpalash)** or 💸 **[PayPal](https://paypal.me/palashCoder)** — keep the releases (and the coffee) coming. -- ⭐ **Star the repo** — it's how people find it. -- 🐛 **File good bugs** ([how](.github/SUPPORT.md)) · 🔧 **send PRs** ([how](.github/CONTRIBUTING.md)). -- 📣 **Show someone** — the GIFs above are yours to share. +[Ko-fi](https://ko-fi.com/debpalash) · [PayPal](https://paypal.me/palashCoder) · +[Star the repo](../../stargazers) · [Report a bug](.github/SUPPORT.md). -## 🤝 Contributing +## Contributing -Yes please — read [`CONTRIBUTING.md`](.github/CONTRIBUTING.md), run -`just test-all`, and report the tally in your PR. Questions live in -[Discussions](../../discussions); the help map is in -[`SUPPORT.md`](.github/SUPPORT.md). +Read the [contribution guide](.github/CONTRIBUTING.md), run both test suites, +and include results in your PR. [Discussions](../../discussions) · +[Help](.github/SUPPORT.md). -## 📜 License +## License -**GPL-3.0** ([`LICENSE`](LICENSE), [`NOTICE.md`](docs/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). +**GPL-3.0**. [License](LICENSE) · [Dependency notices](docs/NOTICE.md). -## The fine print +## Content and privacy -> **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`](docs/CONTENT_POLICY.md)). BitTorrent exposes your IP to -> the swarm — use a VPN if that matters to you. Rights holders: -> [`docs/DMCA.md`](docs/DMCA.md). Provided "as is", no warranty. - -
+Opal connects to sources you configure; it does not host or distribute media. +Only access content you have the right to use. BitTorrent shares your IP with +peers. [Content policy](docs/CONTENT_POLICY.md) · [Privacy](docs/PRIVACY.md) · +[Rights-holder contact](docs/DMCA.md). Provided as is, without 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](docs/browse-sources.md).