SkillAgentSearch skills...

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/Hovod

README

<div align="center">

Hovod

The Open-Source Video Platform

Stop paying per-minute for video infrastructure. Own your video pipeline.

Docker GitHub Stars License

Quick StartFeaturesAPIConfigurationDocker 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
  1. Upload a video through the dashboard or API
  2. Transcode automatically to adaptive HLS (360p, 720p, 1080p)
  3. 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 /data volume.


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) |

<details> <summary><b>Optional variables</b></summary>

| 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) |

</details> <details> <summary><b>Registration control</b></summary>

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

View on GitHub
GitHub Stars8
CategoryData
Updated13d ago
Forks3

Languages

TypeScript

Security Score

90/100

Audited on Mar 27, 2026

No findings