Two install paths work today: pull the published Docker image, or build from source. CI publishes a tagged server image to Docker Hub on every vX.Y.Z release; there’s no platform package (apt/brew/…) yet.

Docker (quickest)

docker run -d --name mythos \
  -p 8080:8080 \
  -v mythos-data:/data \
  -v /path/to/media:/media:ro \
  darkspar/mythos-server:latest

:latest tracks the newest release; pin an immutable semver tag (e.g. :0.3.6) for production-ish setups. The image bundles jellyfin-ffmpeg (so HW tonemap filters and the SIMD-CPU tonemapx kernel are available) and is built for linux/amd64. Bind-mount your media read-only; everything Mythos writes lives under /data. For hardware acceleration, see the Configuration page .

Once it’s up, open http://localhost:8080 and jump to First-run setup below.

Build from source

If you’d rather build it yourself — or you want to hack on it — main builds end-to-end. The numbered steps below are the from-source path.

1. Install prerequisites

  • Rust 1.95+rustup will pick it up from rust-toolchain.toml.
  • Node 22+ and pnpm 10+ — the SvelteKit UI is built and embedded.
  • ffmpeg / ffprobe on PATH — used by the scanner and the HLS transcoder.

2. Clone and run

git clone https://gitlab.mattmoore.io/darkspar/mythos
cd mythos
cargo run --release --bin mythos-server

The first build is slow — Cargo compiles the workspace and the build.rs in mythos-server runs pnpm install && pnpm build to produce web/build/, which rust-embed bakes into the binary.

When it’s up, the log line you’re looking for is:

INFO mythos: ready on http://0.0.0.0:8080

The server binds to all interfaces by default, so it’s reachable from any device on the LAN. To restrict it to localhost, set MYTHOS_LISTEN=127.0.0.1:8080 (or put listen = "127.0.0.1:8080" in mythos.toml).

First-run setup

Visit http://localhost:8080. A 3-step setup wizard walks you through bringing the server online:

  1. Admin account. Username + password, hashed with argon2id.
  2. TMDb API key. Optional — scans still index files without one, they just won’t have titles or art beyond what’s in the filename. You can drop the key in later from the admin settings page; the live TmdbHandle swaps on save, so a new key takes effect on the next scan without a restart.
  3. First library. Point it at a directory of movies or TV on disk; the scan starts immediately. The wizard advances in-page via local state, so the layout’s “redirect to login once an admin exists” rule doesn’t fight the flow mid-setup.

Watch something

Pick any movie. Mythos serves the file directly (HTTP byte-range) if your browser can decode it, and falls back to an on-the-fly HLS transcode if it can’t. Hardware acceleration is picked automatically at startup if it’s available.

Want a native client?

Beyond the browser, the repo ships a fleet of native clients that talk to the same REST API and can pair with multiple servers at once: a Qt 6 + cxx-qt desktop app (apps/mythos-qt/) that swaps the browser <video> for libmpv, so HEVC, AV1, and HDR play natively without the browser codec gauntlet; a Kotlin + Jetpack Compose Android build (phone/foldable + a D-pad-native Google TV app, on Media3/ExoPlayer); a SwiftUI Apple TV app on AVPlayer; and an LG webOS TV launcher. They build with their own toolchains (Gradle, Xcode, ares-package); only the Qt app is a Cargo workspace member. See the Download page for build commands and current limitations — they’re early but usable, not yet polished install paths.

What’s next

  • Configuration — the mythos.toml keys and MYTHOS_* env vars that actually exist.
  • Library layout — how the scanner reads filenames today, and what’s still scheduled.
  • Architecture — the workspace, the runtime, the shape of the streaming pipeline, and how the persistent mini-bar player is wired up.