stremio-core Documentation

️ The Stremio Core: types, addon system, UI models, core logic

2,512 stars Rust Rust 3 files · ~1,987 tokens
RAW Doc

Technical Documentation: Stremio/stremio-core

ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference

Overview (`README.md`)

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.

mermaid
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 / crate What it is
src/types The vocabulary: addon manifests and resources, meta items, streams, subtitles, library, profile, API types
src/models The state models: Ctx (profile, library, notifications — the backbone), CatalogWithFilters, MetaDetails, Player, LibraryWithFilters, StreamingServer, Calendar and more
src/runtime The reactive engine: Runtime, Effects, Env, messages
src/addon_transport Addon protocol client — modern HTTP(S) JSON plus a legacy JSON-RPC adapter
src/deep_links Deep 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

Feature Effect
derive Re-exports #[derive(Model)] from stremio-derive
analytics Enables the analytics module
env-future-send Adds Send bounds to Env futures (incompatible with the WASM target)
deflate Forwards to stremio-official-addons/deflate

🚀 Development

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

bash
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:

bash
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

Repository What it is
stremio-web The web UI, driven by this crate through stremio-core-web
stremio-core-kotlin Kotlin/JNI bindings for Android (archived)
stremio-addon-sdk Build your own addon in Node.js
local-search Search suggestions engine used by the LocalSearch model

📄 License

Copyright © 2019-2026 Smart Code OOD. Released under the MIT license — see LICENSE.


Overview (`stremio-core-web/README.md`)

Stremio Core Web

Bridge between stremio-core and stremio-web

Build

Builds a production wasm package and prepares the rest of the dependencies for the npm package.

bash
npm install
npm run build

Development

Building the package using ./scripts/build.sh with --dev would allow you to see more logging messages being emitted, this is intended only for debugging as it will log messages with sensitive information!

bash
./scripts/build.sh --dev

Or you can also use the development-specific Rust's wasm-watch alias from ./.cargo/config.toml.
It will automatically re-compile the package when a change on the files or dependencies is detected,
including when you're using a local patch for stremio-core.

  1. Install cargo-watch
    • cargo install cargo-watch
    • With cargo-binstall (prebuilt binaries): cargo binstall cargo-watch
  2. Run cargo wasm-watch

Publishing

  1. Update version to the next minor/major/patch version in Cargo (Cargo.toml and Cargo.lock) and npm (package.json and package-lock.json), e.g. from 0.44.13 to 0.44.14.
  2. Commit the change with the new version as a message, e.g. 0.44.14
  3. Wait for CI to build successfully
  4. Push a new tag starting with stremio-core-web-v, e.g. git tag stremio-core-web-v0.47.4 git push origin stremio-core-web-v0.47.4
  5. Create a new Release with the created tag and the tag name as a title, e.g. stremio-core-web v0.47.4
  6. Publish the Release
  7. CI will automatically build and release the npm package to the registry

Overview (`stremio-watched-bitfield/README.md`)

Stremio watched bitfield

Rust implementation of stremio-watched-bitfield


--- METRICS ---