Self-hosted video platform for VOD, live, and API access
NixStream is a Laravel app you run on your own hardware. Upload video and transcode to HLS/DASH, push live from OBS over RTMP, share with password-protected links or embeds, and automate uploads through a REST client API. Playback goes through nixstream-edge signed URLs, not Laravel public storage.
./install.shCopies env, builds images, runs migrations, and starts the stack. See the Docker install guide.
What it does
NixStream powers bitbyte3.com video stack (120 TB+ encoded media between 2022 and 2025) and remains in production today.
Upload videos through the admin panel or client API. Queue workers run media-vod to transcode into multi-resolution HLS and DASH, generate thumbnails, and optionally run Whisper.cpp for VTT subtitles. See VOD uploads, encoding.
Create a live stream, copy the RTMP URL and stream key into OBS, and viewers watch through the player or a share link while the event runs. Turn on Save recording as VOD to archive the broadcast into your library when it ends. See Live streaming.
Share pages work out of the box: public links, password-protected links, email invites, and embed codes. Domain allowlists and geo rules apply at the edge. See Sharing and embeds.
The client API under /api/client/v1/* handles uploads, library access, share links, and live monitoring. API keys come from Settings > General in the admin panel. See API reference, Security.
Architecture
Browser requests hit Nginx and Laravel for the admin panel and API. Encoding and transcription run in queue workers. Playback goes through nixstream-edge, which serves signed URLs and AES-128 decrypt at the edge.
| Service | Role |
|---|---|
| Laravel app | Admin panel, Client API, job dispatch |
| Queue workers | VOD encoding (media-vod), Whisper transcripts |
| media-live | RTMP ingest and live packaging |
| nixstream-edge | Signed playback URLs, AES-128 decrypt at edge |
| MySQL / Redis | Data, cache, sessions, queues |
Upload to playback
An upload triggers a queue job. media-vod transcodes the source, Shaka Packager writes HLS/DASH manifests, and the video lands in your library ready to share or embed.

Player
Adaptive HLS/DASH playback with subtitles, quality selection, and Chromecast. Share pages and embeds use the same player.
