Build your own streaming service.
A self-hosted media server and native Rust client with a real video engine, plus emulation and cloud gaming — your personal cloud for games and media, with a full-screen launcher for handhelds like the Steam Deck and ROG Ally.
It is a long way from a release. Things are missing, things are broken, and things will change without warning. See Known issues below — that list is not exhaustive, it is what is currently known.
Run it on a copy of your library, not your only copy. Expect to reinstall, rescan, and occasionally start over.
You must supply your own API keys. No keys are bundled with this project and none ever will be. See Metadata providers.
Three programs:
- The server — indexes your media, fetches metadata, decides how to deliver each file, and transcodes only when it has to. Runs headless with a browser admin panel.
- The client — a native desktop app with its own video engine. This is where you watch things.
- Emulation — a libretro frontend, shipped as a client-side plugin, with per-game fixes converted from the emulator projects' own databases.
The player is native, not a web view. Video is demuxed, decoded and
synchronised by a real engine built on FFmpeg, then drawn straight into the
window. No <video> element, no JavaScript, no browser media stack — which is
what makes hardware decoding, stereoscopic 3D and headset output possible at
all.
Direct play actually means direct play. The server asks the client what it can decode and takes the answer seriously. A native client that handles MKV/HEVC/AC3 gets the file byte for byte.
It works before you configure it. No forced account, no mandatory login, no setup checklist between a fresh install and playing something.
Playback
- Native FFmpeg-based demux/decode/AV-sync with hardware decode and automatic software fallback
- Direct play with per-client capability negotiation; HLS transcode as a fallback
- Stereoscopic 3D (side-by-side) with passthrough and 2D modes
- Headset output via OpenXR
- Skip intro/recap/credits, autoplay next, scrub-bar thumbnails
- Multi-track audio and subtitles, chapters, per-title playback overrides
Library
- Automatic scanning with metadata and artwork
- Grouping by genre, and for games by genre and system
- Match correction when automatic matching gets something wrong
- Watch state, watchlist, continue watching, incognito playback
Games
- ROM library served from the server, streamed to the client
- Emulator cores installed from the libretro project with one click
- Per-game fixes bundled from PCSX2, Dolphin and DuckStation
- Controllers over USB and Bluetooth: Xbox, PlayStation, 8BitDo and others, with steering wheels, joysticks and flight controllers
- Optional local game library — lists games already installed by Steam and other PC storefronts and launches them through their own launcher
Server
- Streaming defaults enforced server-side: quality ceilings, transcode and direct-play switches, hardware encoder selection with real detection
- API key management, plugin management, connected devices
- Optional multi-user with a profile picker and per-account passwords
Security
- TLS 1.3 between client and server, with the server's identity pinned by each client on first connection. No certificate to obtain, no domain to own — the only thing to configure is a port.
Current as of this alpha. Not exhaustive.
Playback
- Over-under 3D does not play. Side-by-side works; files marked
OU,HOUorHalf-OUare detected but the player cannot split the frame yet. wasm-optcrashes during the admin panel build, so the shipped web assets are unoptimised.
Metadata
- Per-episode metadata does not download. Episodes take their names from the filename; real episode titles, air dates and stills are not fetched.
- Ratings do not appear yet. The pipeline exists end to end but nothing renders on screen.
- Game metadata needs IGDB credentials. IGDB authenticates through Twitch, so a Twitch application's client ID and secret are required. Without them, games get box art from libretro but no descriptions, genres or release dates.
tvdbsearch is not implemented; it is listed but always returns nothing.
Library
- A library scanned by an older build may contain duplicate entries. A migration removes them, but rescan after upgrading.
- Compressed disc images (
.rvz,.chd,.7z, archives) cannot be identified by content. They are named from their file and their console is guessed from the extension.
Emulation
- No emulator core, ROM, BIOS or firmware ships with this project, and games are never downloaded for you. Cores are downloaded from the libretro project only when you ask for one.
- Multi-disc games list one entry per disc, and disc switching is manual.
Platform
- Windows only, in practice. The code is being made portable but Linux and macOS are not yet built or tested. Do not expect them to work.
- The desktop client and the browser admin panel are still one crate, which makes some of the above harder to fix than it should be.
Gaps
- "Optimize" in the item menu is not implemented.
- The server does not yet stop you running two instances against one database.
StreamIt ships no API keys. Register with whichever providers you want and enter your own keys in the server's API Management page, or through the first-run wizard.
| Provider | Needs | Covers |
|---|---|---|
| TMDB | API key | Films, TV |
| OMDb | API key | Ratings (including Rotten Tomatoes) |
| TVmaze | nothing | TV |
| IGDB | Twitch client ID + secret | Games |
| libretro | nothing | Game box art |
Keys are stored in your server's own database and are never sent anywhere except to the provider they belong to. The admin panel never displays a stored key back to you.
Without any keys, scanning still works — you get titles from filenames.
Grab the installers from Releases: install the server on the machine holding your media, the client on anything you want to watch from. The setup wizard handles the rest.
The client finds servers on your network automatically. If it cannot, you can enter an address by hand.
Requires a recent stable Rust toolchain.
cargo build --release
The desktop client additionally needs FFmpeg development libraries and a
matching libclang; dev-tools/README.md explains the specific versions and
why they matter.
Issues and pull requests are welcome. Given the alpha status, opening an issue before a large change is worthwhile — parts of this are still moving.
GNU General Public License v3.0 — see LICENSE.