stremio-core

July 25, 2026 ยท View on GitHub

Stremio logo

stremio-core

The Rust engine that powers every Stremio app.

Build Workflow Status Latest MSRV workflow Status Latest deployed docs on GH pages License

๐Ÿ“š API Docs ยท Website ยท Report a bug

Stremio is a modern media center โ€” a one-stop solution for discovering, organizing and streaming video content via addons. stremio-core is the single Rust codebase that contains all the logic shared between Stremio apps: user/addon state, the addon protocol, library, notifications, playback state and deep links. The UIs are thin layers on top โ€” this crate is the app.

Goals

  • Flexibility โ€” integrates into any codebase, across the entire stack and in different paradigms: types alone can be used by addons, or the full Ctx model can be the backbone of a whole Stremio app
  • Emphasis on correctness
  • No cruft / legacy โ€” not burdened by obsolete decisions and solutions

๐Ÿง  Architecture

The state management is inspired by the Elm Architecture: state flows in one direction, side effects are explicit, and the platform is abstracted away behind a trait.

flowchart LR
    UI["Platform UI"] -- "Action" --> RT["Runtime"]
    RT -- "Msg" --> M["Models<br>(Ctx, Player, ...)"]
    M -- "Effects" --> ENV["Env<br>(fetch, storage, exec)"]
    ENV -- "Internal Msg" --> RT
    RT -- "NewState / CoreEvent" --> UI
  1. The UI dispatches an Action to the Runtime.
  2. The Runtime routes it as a Msg to the state models, which update themselves and return Effects โ€” explicit descriptions of side effects (futures) to run.
  3. Effects execute through the Env trait and resolve back into the loop as Internal messages.
  4. Changed models are announced to the UI as NewState; noteworthy happenings are emitted as Events.

Each platform only has to implement Env โ€” HTTP fetch, storage, task execution and time โ€” and compose its own model out of the building blocks with #[derive(Model)].

๐Ÿ“ฆ What's inside

Module / crateWhat it is
src/typesThe vocabulary: addon manifests and resources, meta items, streams, subtitles, library, profile, API types
src/modelsThe state models: Ctx (profile, library, notifications โ€” the backbone), CatalogWithFilters, MetaDetails, Player, LibraryWithFilters, StreamingServer, Calendar and more
src/runtimeThe reactive engine: Runtime, Effects, Env, messages
src/addon_transportAddon protocol client โ€” modern HTTP(S) JSON plus a legacy JSON-RPC adapter
src/deep_linksDeep link generation for every platform
stremio-core-web/WASM bridge published to npm as @stremio/stremio-core-web โ€” runs core in a Web Worker for stremio-web
stremio-derive/#[derive(Model)] proc macro
stremio-watched-bitfield/Compact encoding of per-video watched state

Feature flags

FeatureEffect
deriveRe-exports #[derive(Model)] from stremio-derive
analyticsEnables the analytics module
env-future-sendAdds Send bounds to Env futures (incompatible with the WASM target)
deflateForwards to stremio-official-addons/deflate

๐Ÿš€ Development

You'll need Rust 1.77 or newer (MSRV, checked in CI).

cargo fmt --all -- --check
cargo clippy --all --no-deps -- -D warnings
cargo test
cargo build

Docs are built with the nightly toolchain pinned in docs.yml:

RUSTDOCFLAGS="--cfg docsrs -Z unstable-options --enable-index-page" cargo +nightly build-docs

For the WASM bridge, see stremio-core-web/README.md.

Tips

  • New actions are defined in src/runtime/msg/action.rs โ€” the message enums there are the public API surface of the crate.
  • WASM output can get large, especially when deriving Serialize/Deserialize where it isn't needed. Run twiggy top ..._bg.wasm to find the biggest code size offenders.

๐Ÿงฉ Ecosystem

RepositoryWhat it is
stremio-webThe web UI, driven by this crate through stremio-core-web
stremio-core-kotlinKotlin/JNI bindings for Android (archived)
stremio-addon-sdkBuild your own addon in Node.js
local-searchSearch suggestions engine used by the LocalSearch model

๐Ÿ“„ License

Copyright ยฉ 2019-2026 Smart Code OOD. Released under the MIT license โ€” see LICENSE.