The whole loop, one client
Browse, watch, track, sync, extend — a complete platform, not a wrapper around one website. Every volatile piece sits behind a trait, so the client outlives any single source.
Browse without an account
Search, seasonal charts and a week-spanning airing calendar from AniList’s public API. No login, no config — browsing is the default state of the app.
mpv does the playing
JSON IPC to real mpv: resume, auto-next, persisted speed, and aniskip opening-skip that announces itself on the OSD. A failed playback shows mpv’s own words. Licensed services open in their own apps, by deep link.
Local is the source of truth
History is SQLite on your disk and works with no account at all. Sync is a projection of it — never the other way around.
Sync that survives being offline
AniList, MyAnimeList, Simkl and Trakt through a durable outbox. Watch offline for a week; it pushes in order when you return. Real conflicts get a screen, not a silent overwrite.
Bring your own sources, as plugins
Provider plugins are sandboxed WASM components in Rust, Go, JavaScript or Python — built for legitimate APIs, self-hosted services, and your own media. The sandbox has no sockets; the host lends fetch, so a plugin is kilobytes and cannot exfiltrate.
Real images, in the terminal
Cover art renders as actual images over the Kitty, Sixel and iTerm2 protocols, decoded off the event loop so scrolling never stutters. Elsewhere it falls back to halfblocks, and says so.
If you torrent, it fails closed
Torrent support exists, and it is never assumed: off by default, unreachable until a VPN mode is chosen and egress is verified through the proxy. DHT forced off, re-checked on an interval, every transfer paused the moment a check fails.
Vim-first, fully rebindable
hjkl everywhere, arrows always aliased, every key rebindable. The help overlay is generated from the resolved keymap, so it matches whatever you set.
Legal sources first. External, always.
anistream hosts no content and ships no sources of its own.The intended path is legitimate: AniList’s public API for browsing, deep links that open licensed services in their own apps — never scraped, never DRM-circumvented — and plugins for APIs you have the right to use, self-hosted servers, and your own media. Torrent support exists too, off by default and unreachable without the VPN guard; what you point any external source at is your decision, at your own risk, under the laws that apply to you. Every source is a config edit away from being removed.
Built from source
There are no published binaries and no download. You read the code, then you run it. Browsing works immediately, with no account and no config.
$ brew install mpv ffmpeg cmake # mpv plays; cmake builds BoringSSL $ git clone https://github.com/bitknox/anistream && cd anistream $ cargo run --release # rustup picks up the pinned 1.97.1
best in a terminal with a graphics protocol · ghostty · kitty · iterm2 · wezterm
Building in the open
anistream is under active development. Kitsu sync is still to come, and the plugin system is the path for new sources. Follow along, open an issue, or write a provider plugin: the architecture was built for other people’s ideas to plug into.
流 NAGARE — anistream’s mascot.
an original character; appears wherever anistream goes.