Hovod
Open-source, self-hosted video platform (Mux alternative). Upload, transcode to multi-quality HLS (360p–4K), stream via S3-compatible storage. Built-in dashboard, analytics, AI transcription/chapters, comments, team management & optional Stripe billing. Single Docker image, zero external deps.
Install / Use
/learn @Synapsr/HovodREADME
Hovod
The Open-Source Video Platform
Stop paying per-minute for video infrastructure. Own your video pipeline.
Quick Start • Features • API • Configuration • Docker Guide
<br>https://github.com/user-attachments/assets/bc9d7ec3-d351-405f-874a-a3b8db9f309f
</div>What is Hovod?
Hovod is an open-source, self-hosted alternative to Mux. Upload a video, get adaptive HLS streams in 360p/720p/1080p, and deliver them from your own infrastructure. No vendor lock-in, no per-minute pricing.
| | | |:--|:--| | Upload a video through the dashboard or REST API | Transcode automatically to adaptive HLS (360p, 720p, 1080p) | | Stream via any HLS player or the built-in embeddable player | Scale with hardware-adaptive workers that auto-tune to your machine |
Why Hovod?
| No Per-Minute Fees | One Command Deploy | Own Your Data | |:----------------------:|:----------------------:|:-----------------:| | Self-host for free. No usage-based billing, no vendor lock-in. | Single Docker image with embedded database & queue. Just add S3. | Your server, your storage, your videos. Full control. |
| AI-Powered | S3-Compatible | Embeddable Player | |:--------------:|:-----------------:|:---------------------:| | Optional transcription, subtitles & chapter generation via Whisper + LLM. | Works with AWS S3, Cloudflare R2, Backblaze B2, MinIO, and more. | Drop-in HLS player with quality selector and thumbnail seek preview. |
How It Works
Upload/Import Transcode Deliver
+-----------+ +--------------+ +------------+
| Video in |----->| FFmpeg HLS |----->| S3 / CDN |
| (API) | | (Worker) | | (Stream) |
+-----------+ +--------------+ +------------+
| |
v v
Dashboard HLS Player
- Upload a video through the dashboard or API
- Transcode automatically to adaptive HLS (360p, 720p, 1080p)
- Stream via any HLS player, or use the built-in embeddable player
Video playback is served directly from S3. The API only handles metadata and coordination — S3 absorbs all bandwidth, keeping the API lightweight.
Quick Start
One image, everything included (API, worker, dashboard, database, queue). You only need S3-compatible storage.
docker run -d \
--name hovod \
-p 3000:3000 \
-v hovod-data:/data \
-e S3_ENDPOINT=https://s3.amazonaws.com \
-e S3_REGION=us-east-1 \
-e S3_BUCKET=my-hovod-bucket \
-e S3_ACCESS_KEY_ID=AKIA... \
-e S3_SECRET_ACCESS_KEY=... \
-e S3_PUBLIC_BASE_URL=https://my-hovod-bucket.s3.amazonaws.com \
synapsr/hovod
That's it. Open http://localhost:3000 — dashboard and API on the same port.
MariaDB and Redis run inside the container automatically. Data is persisted in the
/datavolume.
Features
Dashboard & Player
| | Feature | Description | |:-:|---------|-------------| | | Dashboard | Web UI to upload, manage, and preview all your video assets | | | Embeddable Player | HLS player with adaptive quality selector and thumbnail seek preview | | | Direct Upload | Pre-signed S3 URLs for efficient browser-to-storage uploads | | | URL Import | Import videos from any public URL | | | Transcript & Subtitles | AI-generated transcription and WebVTT subtitles (via Whisper API) | | | Chapters | Auto-generated chapters from transcript (via LLM) |
Video Pipeline
| | Feature | Description | |:-:|---------|-------------| | | Adaptive Bitrate | HLS output in 360p / 720p / 1080p (H.264 + AAC) | | | Thumbnail Sprites | Seek preview thumbnails with VTT metadata | | | Hardware-Adaptive | Workers auto-detect CPU/RAM to optimize concurrency and threading | | | Horizontal Scaling | Run multiple stateless workers against the same Redis queue | | | REST API | Clean JSON endpoints for full programmatic control | | | S3-Compatible | AWS S3, Cloudflare R2, Backblaze B2, MinIO — anything S3-compatible |
Deployment
Full Docker guide: See DOCKER.md for architecture diagrams, all deployment modes, scaling, and networking reference.
All-in-One (simplest)
Everything in a single container. Database and Redis are embedded. Only S3 storage is external.
docker run -d \
--name hovod \
-p 3000:3000 \
-v hovod-data:/data \
-e S3_ENDPOINT=https://s3.amazonaws.com \
-e S3_REGION=us-east-1 \
-e S3_BUCKET=my-bucket \
-e S3_ACCESS_KEY_ID=AKIA... \
-e S3_SECRET_ACCESS_KEY=... \
-e S3_PUBLIC_BASE_URL=https://my-bucket.s3.amazonaws.com \
-e S3_FORCE_PATH_STYLE=false \
synapsr/hovod
External Database & Redis (production)
For production, use external MySQL/MariaDB and Redis. Set DATABASE_URL and/or REDIS_URL to disable the embedded services.
docker run -d \
--name hovod \
-p 3000:3000 \
-e DATABASE_URL=mysql://user:pass@db-host:3306/hovod \
-e REDIS_URL=redis://redis-host:6379 \
-e S3_ENDPOINT=https://s3.amazonaws.com \
-e S3_REGION=us-east-1 \
-e S3_BUCKET=my-bucket \
-e S3_ACCESS_KEY_ID=AKIA... \
-e S3_SECRET_ACCESS_KEY=... \
-e S3_PUBLIC_BASE_URL=https://my-bucket.s3.amazonaws.com \
-e S3_FORCE_PATH_STYLE=false \
synapsr/hovod
Docker Compose (development)
git clone https://github.com/Synapsr/Hovod.git && cd Hovod
cp .env.example .env
docker compose up -d --build
Dashboard: http://localhost:3003 | API: http://localhost:3002
One-Click Deploy
Works out of the box with your favorite platforms:
| Platform | How to deploy |
|----------|---------------|
| EasyPanel | Add Docker app → synapsr/hovod |
| Dokploy | Import from Docker Hub |
| Coolify | One-click from Docker image |
| Portainer | Create stack from compose |
| Railway | Deploy from Docker image |
API at a Glance
# Create an asset
curl -X POST http://localhost:3000/v1/assets \
-H "Content-Type: application/json" \
-d '{"title": "My Video"}'
# Get upload URL, upload file, start transcoding
curl -X POST http://localhost:3000/v1/assets/{id}/upload-url
curl -X PUT "<uploadUrl>" --data-binary @video.mp4
curl -X POST http://localhost:3000/v1/assets/{id}/process
# Get playback URL
curl http://localhost:3000/v1/assets/{id}/playback
| Endpoint | Method | Description |
|----------|--------|-------------|
| /v1/assets | POST | Create a new asset |
| /v1/assets | GET | List all assets |
| /v1/assets/:id | GET | Get asset details + renditions |
| /v1/assets/:id/upload-url | POST | Get pre-signed upload URL |
| /v1/assets/:id/import | POST | Import from external URL |
| /v1/assets/:id/process | POST | Start transcoding |
| /v1/assets/:id/playback | GET | Get HLS manifest + player URL |
| /v1/assets/:id | DELETE | Soft-delete an asset |
| /v1/playback/:playbackId | GET | Public playback endpoint |
Configuration
Required
| Variable | Description |
|----------|-------------|
| S3_ENDPOINT | S3-compatible endpoint URL |
| S3_REGION | S3 region |
| S3_BUCKET | S3 bucket name |
| S3_ACCESS_KEY_ID | S3 access key |
| S3_SECRET_ACCESS_KEY | S3 secret key |
| S3_PUBLIC_BASE_URL | Public URL to access S3 objects (used for HLS playback URLs) |
| Variable | Default | Description |
|----------|---------|-------------|
| DATABASE_URL | embedded MariaDB | MySQL/MariaDB connection string |
| REDIS_URL | embedded Redis | Redis connection string |
| PORT | 3000 | API/dashboard port |
| S3_FORCE_PATH_STYLE | true | Path-style S3 URLs (set false for AWS S3) |
| S3_PUBLIC_ENDPOINT | same as S3_ENDPOINT | Public S3 endpoint for browser uploads |
| CORS_ORIGIN | * | Allowed CORS origins (comma-separated) |
| DASHBOARD_URL | http://localhost:3000 | Base URL for embed player URLs |
| JWT_SECRET | — | Secret for JWT auth (required in split mode) |
Control who can create accounts on your Hovod instance. By default, registration is open to everyone.
| Variable | Default | Description |
|----------|---------|-------------|
| REGISTRATION_ENABLED | true | Set to false to disable new account registration |
| REGISTRATION_ALLOWED_DOMAINS | — | Comma-separated list of allowed email domains (e.g. company.com,partner.org) |
# Disable all new registrations
REGISTRATION_ENABLED=false
# Allow only specific email domains
REGISTRATION_ALLOWED_DOMAINS=company.com,partner.org
# Both can be combined: enabled but restricted to certain domains
REGISTRATION_ENABLED=true
REGISTRATION_ALLOWED_DOMAINS=company.com
</details>
<details>
<summary><b>AI Processing (optional)</b></summary>
Hovod can auto-generate transcripts, subtitles, and chapters. Omit these variables to disable AI features.
| Variable | Description |
|----------|-------------|
| WHISPER_API_URL | Whisper-compatible transcription endpoint (OpenAI, Groq, local) |
| WHISPER_API_KEY | API key for Whisper service |
| WHISPER_MODEL | Model name (e.g. whisper-1) |
| LLM_PROVIDER | Chapter generation provider (openai, anthropic, groq, custom) |
| LLM_API_KEY | API key for LLM service |
| LLM_MODEL | Model name (e.g. gpt-4o-mini, `llama-3.3-70b-versatil
