Installation
Install KROMA on every screen you own.
The model fits in one sentence: install the server once, then every client, TV, computer, phone, browser, points at it and remembers it.
The server
Installed once, on a NAS, in Docker or on a Raspberry Pi.
The clients
Every screen asks for its address on startup.
Install the server
A single Rust server: on a NAS, in Docker, or built by hand. It serves the API, the web app and the video stream on port 4040 in direct-play: video is never transcoded.
Docker / Docker Compose
RecommendedThe image is multi-architecture (linux/amd64 + linux/arm64) : it runs just as well on x86 as on a Raspberry Pi 4/5 with a 64-bit OS. Save this file, then bring the stack up.
services:
kroma:
image: ghcr.io/maxscharwath/kroma:latest
restart: unless-stopped
ports:
- "4040:4040"
environment:
# Library roots INSIDE the container (must match the bind-mount below).
KROMA_MEDIA_DIRS: /media
volumes:
- kroma-data:/data
- /volume1/video:/media
volumes:
kroma-data:docker compose up -dMediaKROMA_MEDIA_DIRS points at your media inside the container; mount the folder read-write if you use the built-in requests / downloads.
Synology (.spk)
The package is self-signed, not Synology-certified: you have to allow it once.
- 1Package Center → Settings → Trust Level : allow Any publisher.
- 2Package Center → Manual Install, pick the .spk, follow the wizard.
- 3Open KROMA; configure the media folders in its admin console.
From source (cargo)
A single Rust binary: build it yourself. SQLite and TLS are bundled; ffmpeg/ffprobe are still required for metadata and HLS audio.
# Rust ≥ 1.86 + ffprobe. From the repo:
cd server
KROMA_MEDIA_DIRS=/mnt/media cargo run --releaseInstall the apps
Grab the right package from GitHub Releases (one vX.Y.Z tag carries every artifact). A single setup per device, developer mode or lifting quarantine, then the client asks for the server address on first launch. GitHub Releases →
Televisions
Sideload from a computer on the same network. Developer mode is enabled once.
Detailed stepsSamsung (Tizen)
.wgtDeveloper modeThe Apps panel, type 1 2 3 4 5, turn it on and enter your computer's IP. The .wgt is already signed, no certificate required, just the Tizen Studio CLI.
sdb connect 192.168.1.50
tizen install -n KROMA.wgt -t <device-id>LG (webOS 4.0+)
.ipkDeveloper modeInstall the Developer Mode app (free LG account), enable Dev Mode then Key Server. The session lasts 50 h, extend it from the app.
bun add -g @webos-tools/cli
ares-install tv.kroma.webos_*_all.ipk -d tvAndroid TV / Google TV / Chromecast
.apkDeveloper optionsSettings → About → Android TV OS build : tap 7 times, then enable network debugging. Without a computer, the Downloader app installs the .apk from a URL.
adb connect 192.168.1.60:5555
adb install -r KROMA-androidtv.apkApple TV
BetaTestFlightDistributed through TestFlight, no sideloading. Join the beta →
macOS
.dmgQuarantineNot notarized: on first launch, macOS calls it "damaged". Drag it into Applications, then lift the quarantine once (or Settings → Privacy → Open anyway).
xattr -dr com.apple.quarantine /Applications/KROMA.appWindows
.exe.msiSmartScreenUnsigned installer: "Windows protected your PC" → More info → Run anyway. Silent updates from there on.
Linux (desktop)
.AppImage.debVideompv is bundled (the kroma-mpv sidecar drives hardware decoding), nothing to install.
chmod +x KROMA_*.AppImage && ./KROMA_*.AppImage
# .deb : sudo apt install ./KROMA_*.debSteam Deck
.AppImage- 1Copy KROMA_*.AppImage onto the Deck and chmod +x (Desktop Mode).
- 2Steam → Add a Non-Steam Game → Browse, then pick the AppImage.
- 3Launch in Game Mode, set the controller layout to Gamepad (D-pad = focus, A = OK, B = back).
iPhone / iPad
BetaTestFlightJoin the iOS beta through TestFlight. Tester instructions →
Android
BetaFirebaseDistributed through Firebase App Distribution. Tester instructions →
NAS & browser
Where the server already lives, there is usually nothing more to install.
Detailed stepsWeb browser
Nothing to installThe server serves the web app itself. Open its address in any browser, or let mDNS discovery find it on the network.
http://nas.local:4040Synology
.spkAutomatic updatesThe best route on a NAS: add KROMA as a package source in Package Center. The server installs, then updates itself, without re-downloading a .spk for every release.
- 1Package Center → Settings → Package Sources → Add.
- 2Paste the source URL below, then confirm the "Any publisher" trust level (the package is self-signed).
- 3Install KROMA from the source; updates then arrive automatically.
https://packages.kroma.tvPrefer a manual install? Download the .spk from the releases and go through Package Center → Manual Install. See the releases →
Signed for development, not for a store.
The builds are signed with a development certificate, not a paid store certificate. That is the whole reason for the one-time setup per device (developer mode, quarantine, SmartScreen): once done, updates go through without friction. Everything stays self-hosted, your library and your activity never leave your network.
A package that refuses to install? Most often a signature that changed: uninstall the old version, then reinstall.