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+ —
rustupwill pick it up fromrust-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:
- Admin account. Username + password, hashed with argon2id.
- 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
TmdbHandleswaps on save, so a new key takes effect on the next scan without a restart. - 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.tomlkeys andMYTHOS_*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.