Skip to content

Glossary

Terms that recur throughout these docs.

The four execution environments a source can run in, from the fallback backend (E0) up to the companion extension (E3). See The New System.

Environment What it is
E0: Backend The floor; serves operator-owned sources and holds secrets.
E1: Plain browser fetch A real browser, but bound by CORS and forbidden headers.
E2: Edge proxy Header injection + CORS relay, but from a datacenter IP.
E3: Extension A real browser on the viewer’s IP with header rewrite + CORS bypass.

A small, login-gated backend endpoint (/scrape-meta, /sign, /resolve) that gives the client something it can’t derive itself, without leaking a server-held secret.

Media the server operator controls: your own files (Local), the server-side Cache, or your own Jellyfin, as opposed to third-party scraping. The only streams the backend serves directly.

Your private TypeScript package (bundled into the client) that finds and resolves streams. The public stack ships none. See Adding your own sources.

Newline-delimited JSON: one JSON object per line. The /watch endpoint streams results this way so each resolved source reaches the player as soon as it’s ready.

One line of the /watch NDJSON: {type:"stream", source, streamType, url, …}. The client’s engine emits the same shape, so local and backend streams merge cleanly.

The bundle of identifiers (TMDB id, season/episode, titles, year, IMDb id) that tells a source what to resolve.

The members-only gate (REQUIRE_LOGIN) that requires a valid session on content endpoints. See Accounts.

A passwordless account that is an Ed25519 key derived from a 12-word phrase held only on the user’s device. No mail server needed; no recovery if the phrase is lost.

The shared HMAC secret that lets the backend sign edge-proxy links and the proxy verify them. Same value on both sides.

A secret held by the proxy edge (e.g. a Jellyfin token) and applied on the byte path, so even that source’s bytes bypass the backend, without the secret ever reaching the browser.

Per-source declarations (needsCORSBypass, needsJA3, needsResidentialIP, needsServerSecret, …) that tell the engine’s router which environment can run a source.

A git repository nested inside another. The client bundles your sources as a submodule at build time. (The companion extension is no longer vendored; it ships on the Chrome Web Store.) See CI/CD.

The Movie Database and AniList, the metadata sources the backend maps together for posters, titles and episode data.

The dataset the backend uses to map TMDB TV shows/seasons to their AniList ids, resynced periodically (on exactly one replica).

The public, community-curated index of free-to-air broadcast streams behind the Live TV surface. The backend fetches its JSON API twice daily into an in-memory catalogue (no key, no database table) and honours the project’s blocklist.

The per-account permission to talk to Lumi’s chatbot. Denied by default for everybody, granted one member at a time on Admin › Users, and audited like an admin promotion, because it lets that member spend money against your provider key.

How the chatbot touches your catalogue. Instead of answering from memory, the model asks the backend to run one of five named functions (search, recommend, resume, watchlist, open) and answers from the result. Each is a thin wrapper over an existing engine, so she can’t contradict the rest of the API. A tool round is one such request and answer, capped per reply so a model that keeps searching can’t keep billing.

A member marking one anime so it shows on the airing calendar and, if the operator enabled the mail, so they get a notice when a new episode airs. Always available; the email half is opt-in per deployment and per follow.

The rule the notification job runs on: a row is inserted for (user, title, episode) before the mail is attempted, and the insert’s rowcount is what grants the right to send. Sending first and recording after would mail the same episode on every tick forever if the recording failed.

A member’s year in review, built from an append-only watch_events table. Its approximate flag says when part of the year predates that table and was reconstructed from the weaker progress rows instead.

A one-way hash over a session’s token_hash, derived in the data layer, so a member can list and revoke their own sessions without the server ever publishing the SHA-256 of a live bearer token.

Collapsing concurrent misses on the same cache key onto one upstream fetch: the first caller fetches, the rest await the same result. Applied per process to the AniList and TMDB fetchers with the widest fan-in.

The Live TV playback model: a feed the browser is allowed to load (https, no gated headers) plays straight off the broadcaster’s CDN with zero backend bandwidth. Only when the browser’s own rules (mixed content, CORS, gated headers) forbid the direct path does it fall back to the signed /iptv_proxy.