Skip to content

AGPL v3

Run your own video platform.One command. Yours is the first account.

It installs on a server you administer, like WordPress. Viewers sign in with Bluesky.

curl -fsSL https://raw.githubusercontent.com/yegamble/vidra/main/install.sh | sh
$56
a month runs a small private instance
Bluesky
sign-in and cross-posting over ATProto; federation over ActivityPub
1 image
from a one-person box to an api+worker fleet — one variable apart
26
checks vidra doctor runs against a live instance, each naming its own failure

Who it's for

Instances that look nothing alike.

An independent creator

One 4 vCPU box, a CDN in front of it, and a channel people can follow over ActivityPub from wherever they already read.

More on the creator instance →

A community or club

A few dozen upload, a few hundred watch, and you answer for what appears. The moderation surface is in the box, not in a plugin.

More on the community instance →

A newsroom or podcast network

Live coverage that becomes an archive the moment it ends, and embargoed material that never turns into a public URL by accident.

More on the newsroom instance →

A course or conference archive

Four years of talks that have to stay findable, with an accessibility obligation you cannot hand-wave away.

More on the archive instance →

Sizing

Check our arithmetic.

Move the sliders and the box changes. The two profiles come from the deploy guide; everything between them is arithmetic you can check.

One job's ladder computes to a ~3.6 GB peak; budget ~8 GB of scratch per concurrent job, because the floor that admits work is deliberately generous.

The shipped 4-rung ladder computes to 17.4 GiB a source hour, from the bitrate table below. After the instance itself and this box's scratch, its 160 GiB carries about 6 hours before it starts buying block storage. Dropping the 1080p rung takes half the video bitrate with it.

Vidra keeps the file it ingested, and no setting deletes it. What yours weigh is your number, not ours, so it starts at zero. Set it to your own footage.

Your box

~$56 / month

About 6 hours of video, on the shipped ladder.

Small, private profile — a channel or two and a handful of viewers.

vCPU
4
RAM
8 GB
Disk
160 GiB

Premium AMD list price for the 4 vCPU / 8 GB plan. Its 160 GiB of disk is enough here.

Per source hour, retained

CMAF segments — four video representations, one shared audio
4.26 GiB
video.mp4 per rung, remuxed from those segments
4.46 GiB
video-only.mp4 per rung, beside it
4.19 GiB
A second copy of each video.mp4, which nothing serves
4.46 GiB
audio.m4a
0.07 GiB
Derivatives, computed from the ladder
17.4 GiB
Your originals, which Vidra keeps
yours
Trick-play, one dense rendition a rung
not derivable

Bitrate times duration, off the 4-rung table in vidra-core's hls.go, on the shipped CMAF and H.264 defaults. Trick-play is encoded at CRF 28 with no rate target, so there is no bitrate to multiply: it is named rather than guessed at. Turning on VP9, HEVC or AV1 adds a whole second set of representations.

Transfer, on top

5,000 GiB a month comes with the plan — pooled across every droplet on the team and accruing per second over a 28-day month, so it is never a per-box allowance. Inbound costs nothing. Past the pool, outbound is $0.01 a GiB, which is the number a CDN in front of your HLS is spent against.

Droplet, volume and bandwidth prices are DigitalOcean list prices, checked 2026-08-30.

The one-line installer sets up a box this size →

Two things that cost real money if you skip them: do not use a 2 GB droplet, and use Docker Compose 2.24 or newer. Older Compose silently publishes PostgreSQL and Redis on 0.0.0.0 — your database on the public internet, with no error to tell you.

The requirements, in detail →

Install

Four ways in. Pick your box.

Two paths for a server, one for a laptop, and one for migrating off PeerTube.

For a fresh server you control. Run it as a user who can use sudo. Here is what it will and will not do, before you run it.

curl -fsSL https://raw.githubusercontent.com/yegamble/vidra/main/install.sh | sh
What it will not touch
It never writes or overwrites env/production.env. That file holds the keys sealing MFA, federation and ATProto data in the database, and re-minting them orphans everything already sealed — so vidra setup owns the file, refuses to rewrite an existing one without --yes, and this script never passes --yes. It never runs docker compose up: deploying is a separate step. It opens no port and does not touch sshd.
What it will change
It installs Docker Engine and the Compose v2 plugin if they are missing, and stops if Compose is below 2.24 — docker-compose.prod.yml uses the !reset and !override merge tags, and an older Compose ignores them without a word, leaving PostgreSQL and Redis published on 0.0.0.0. It unpacks the release bundle into /opt/vidra, checksum-verified and without a git clone, and puts the vidra CLI in /usr/local/bin.
How you sign it
It asks before any of that, and reads your answer from /dev/tty rather than stdin — under curl … | sh, stdin is the script itself, so a script that read from it would answer its own questions. On a host with no terminal it stops instead of guessing. Unattended runs pass --yes, which is your decision to make, not its default.
How it hands back
vidra setup asks nine questions — domain, storage, mail, federation — in the terminal, or in a browser with --web. Then every signup path answers 403 until the instance is claimed: the api mints a one-time token at boot and prints it to its own log. Read the most recent log. A restart mints a new token and the previous one stops working.

Installer reference →

The product

The player, running.

Vidra v0.5.0 on a local machine, playing a 47-second clip the instance itself ingested and transcoded to four renditions.

The Vidra watch page mid-playback: the player with its quality control on Auto, then the video's title, view count and follow button.
Captured 2026-08-29 from Vidra v0.5.0 running locally via docker compose — all four repositories at the v0.5.0 release tags. The video shown was uploaded through the studio and transcoded by the instance itself.

See the rest of the instance →

Federation

Yours to enable. On for every channel once you do.

Three layers do three jobs. Step through them and watch what leaves your server.

your instancevideo.example.orgfediverseblueskygatewaysyour swarmActivityPub — live on this instance

Layer one of three

ActivityPub

Your channels and videos are addressable from the rest of the fediverse. A follow from Mastodon or another PeerTube instance travels over the protocol, not over an integration someone bolted on afterwards.

Federating is not the same as being read. Reach depends on other instances choosing to accept you, and that choice is getting easier to make in bulk: PeerTube 8.3.0-rc.1, tagged 25 August 2026, added blocklists an admin can subscribe to.

How federation works, in the docs →

Architecture

Tap a container. Read what it does.

Eight of the containers a production install runs, each doing one job. The compose file carries more: the migration steps, RTMP for live, and the optional captions, scanning and tracing services.

Your server

API

vidra-core

The Go backend. 230 OpenAPI paths, durable queues, the transcode pipeline, federation and the admin console behind it.

  • Go 1.26
  • Echo
  • /healthz

Uploads stream straight to the storage backend — they never touch the server's disk — and when one box stops being enough, the same image splits into api and worker roles, soak-tested with a deliberate counterfactual. Put a CDN in front of the HLS and the bytes reach viewers from its edge, not your box; turn on the IPFS tier and any copy someone pins becomes another source that is not your server.

What happens at scale →The architecture, in the docs →

Compared

Why not YouTube? Why not PeerTube?

YouTube

The terms, the moderation policy and the ranking are Google's to change, and the platform sells advertising against your audience. On your own instance there is no ad system and nobody between you and your viewers.

The full comparison →

PeerTube

PeerTube is the established choice, with years of maturity and a plugin ecosystem Vidra does not have. Vidra is a clean-room alternative that trades that head start for operability — a one-command install, a doctor, scripted backup and rollback — viewers who can sign in with Bluesky, and direct messages, which PeerTube does not have. PeerTube also has in-player peer-to-peer; that one Vidra declined rather than missed, and the reasoning is published.

Vidra vs PeerTube →

The project

Free software, and nothing behind it.

Vidra is written and maintained by Yosef Gamble, in public, at github.com/yegamble — where the commits, the issues and the releases are.

AGPL v3

Use it, study it, modify it, redistribute it. Run a modified version as a service and the network clause means your users get the source too.

No ads, nothing to upsell

No ad system and no monetisation layer, no hosted tier to be moved onto, and no pricing page that changes the day you depend on it. The only way to run Vidra is to run it.

Clean room

Not a PeerTube fork and not PeerTube-API-compatible. Migrating an existing instance across is supported and documented.

Three repositories

vidra-core (Go 1.26, Echo, PostgreSQL 18, Redis 8), vidra-user (Next.js 16) and vidra-search (Go), each with its own CI. Images build only from tags.

Is this ready?

Vidra is at v0.6.0, and the first commit in yegamble/vidra landed on 19 June 2026. The feature set is still growing, and three things it does not do are listed below. What is already fixed is the discipline it is built with: upgrading is reversible for one release, because vidra-core runs the previous release's own integration suite against every new schema before it merges.

Gates, and where they run
OpenAPI drift checks and integration suites against real Postgres and Redis run in all three services. Race detection runs in the two Go ones; vidra-user is a Next.js frontend.
Rollback, proved in vidra-core
Every migration runs the previous release's own integration suite against the new schema before it merges, so the one-release rollback is tested, not hoped for.
Releases, not branches
Container images are built from release tags only — never from the main branch. What you pull is what was tagged.
Accessibility, gated
Accessibility failures fail the build: axe serious and critical findings gate CI in both frontends, and this site's own CI additionally gates WCAG 2.2 AA explicitly.

DRM: None shipped: a test lane proves the seam, and production DRM sits behind an unbuilt roadmap item. If your distributor requires encrypted playback today, Vidra is the wrong tool.

Two more things Vidra does not do
In-player peer-to-peer
A decision, not a gap: Vidra adds no peer-to-peer in the player, so watching a video never exposes a viewer's IP address to other viewers. The reasoning is published. Size your bandwidth for every byte the instance serves.
A hosted tier
A design decision, not a gap in the roadmap.

Start with one command.

curl -fsSL https://raw.githubusercontent.com/yegamble/vidra/main/install.sh | sh

One command. 4 vCPU. $56 a month.

Install