Subatic
Subatic gives you simple video hosting site that scales with content on your own infrastructure.
Self-hosted video hosting, honestly reviewed. No marketing fluff, just what you get when you run your own video platform.
TL;DR
- What it is: A minimal, GPL-3.0-licensed self-hosted video platform that transcodes uploads to HLS and streams them via any S3-compatible bucket — no per-minute billing, no vendor lock-in [1][README].
- Who it’s for: Solo developers and technically-inclined founders who need to host and embed videos without paying per-GB to Cloudflare Stream, Vimeo, or Mux. The project’s own origin story claims a 99.46% reduction in streaming costs [website].
- Cost savings: Cloudflare Stream charges $5/1,000 minutes stored and $1/1,000 minutes delivered. Vimeo Pro runs $20/mo with storage caps. Subatic on Cloudflare R2 + a $5 VPS costs near-zero at modest scale because R2 has no egress fees [README].
- Key strength: Absurdly simple architecture — one Docker Compose file, one transcoding container, one S3 bucket. There’s almost nothing to break [README][1].
- Key weakness: This is an early-stage, one-developer project with 159 GitHub stars. No user roles, no upload quotas, no content moderation, and no dashboard analytics beyond third-party scripts. If you need anything beyond “upload → transcode → embed,” it’s not there yet [README][1].
What is Subatic
Subatic is a self-hosted video hosting platform. You upload a video, it gets transcoded to HLS (HTTP Live Streaming), the output gets pushed to an S3-compatible bucket, and you get back a URL you can embed anywhere. That’s the entire product.
The GitHub description calls it “Extremely simple video hosting Site that scales with you,” and for once a self-description undersells rather than oversells [README]. There is no social layer, no discovery feed, no monetization system. The homepage of the live demo shows a sparse grid of user-uploaded clips — nothing that would remind you of YouTube or Vimeo.
The project was open-sourced by a single developer (GitHub handle: orthdron) who built it to solve a personal cost problem. The website’s About page links to an origin story about cutting streaming costs by 99.46% — the specific numbers aren’t publicly summarized but the architecture explains how: by routing HLS delivery through Cloudflare R2, which charges zero egress fees to the internet, the CDN bill collapses [website][README].
The architecture is split into two components: the main Subatic app (Next.js + PostgreSQL) and a separate subatic-transcoding service. Both are required for a working install. The transcoding service handles the FFmpeg work and pushes finished HLS segments to your “processed” S3 bucket via webhooks back to the main app [README].
As of this review, Subatic sits at 159 GitHub stars under a GPL-3.0 license. It is early, small, and actively maintained by its author.
Why people choose it
The r/selfhosted community reception [1] was warm but measured. The developer announced it themselves, framing it as a tool for self-hosting videos to share across the internet — with the explicit note that it supports serverless deployment (meaning you don’t need a beefy VPS for the storage/delivery layer, only for the transcoding step).
The upvotes and comments cluster around the same appeal: the cost math is real. Anyone who has received a Cloudflare Stream invoice after a viral clip, or hit Vimeo’s storage wall, or priced out AWS MediaConvert and CloudFront, understands exactly what problem this solves. R2’s zero-egress pricing is the unlock — Subatic is essentially a lightweight control plane around that pricing arbitrage [1][README].
What the community also noted: the project is genuinely simple. The README is honest about what it does and doesn’t do. There’s no inflated feature list. The transcoding pipeline is a separate repo (subatic-transcoding) that you run alongside the main app, which is either a plus (clean separation of concerns) or a minus (two things to deploy and keep running) depending on your tolerance [README][1].
No third-party review sites have covered Subatic yet — it’s too new and too niche. Everything below is synthesized from the README, the live site, and the r/selfhosted thread [1].
Features
What the README and site actually document:
Video pipeline:
- Upload → transcode to HLS via FFmpeg in the transcoding container [README]
- HLS delivery from any S3-compatible bucket (AWS S3, Cloudflare R2, MinIO) [README]
- Configurable maximum file size via
MAX_FILE_SIZEenvironment variable [README] - Webhook-based signaling between the main app and transcoder [README]
- Public embed URL for each video [1]
Storage architecture:
- Two-bucket pattern: a raw upload bucket (private) and a processed output bucket (public) [README]
- Optional Cloudflare R2 with CORS configuration for browser-side range requests [README]
- Optional Cloudflare caching rules on top of R2 for repeat-viewer performance [README]
- MinIO included in docker-compose for fully local setups [README]
Auth and access:
- Local authentication (username/password) [README][1]
- No OAuth, no SSO, no invite system documented
Optional analytics integrations:
- Umami (self-hosted analytics) [README]
- Plausible (privacy-friendly analytics) [README]
- Google Analytics [README]
Infrastructure:
- Docker Compose deployment with health checks and service dependencies [README]
- PostgreSQL for metadata [README]
- Optional SQS integration for the transcoding queue (AWS SQS or compatible) [README]
What’s not there:
- No video access controls (public-only delivery once processed)
- No upload quotas per user
- No content moderation tools
- No built-in player customization
- No API documentation beyond environment variables
- No dashboard for video management beyond the basic upload interface
Pricing: SaaS vs self-hosted math
There is no Subatic SaaS tier. It’s self-hosted only. The relevant comparison is against managed video hosting services.
Cloudflare Stream:
- $5/1,000 minutes of video stored
- $1/1,000 minutes of video delivered
- A 500-video library averaging 10 minutes each = 5,000 minutes stored = $25/mo storage alone, before any views
Vimeo:
- Basic: free with 5GB total storage and Vimeo branding
- Starter: $20/mo for 60GB storage, no Vimeo branding
- Standard: $33/mo for 1TB storage
- Advanced: $108/mo for unlimited
Bunny Stream (Bunny.net):
- $10/mo base + $0.015 per minute of video encoded + $0.01/GB storage + CDN egress costs
- Cheaper than Stream for low-traffic sites, still usage-based
Mux:
- $0.015/min stored, $0.015/min delivered — developer-friendly but adds up fast for volume
Subatic self-hosted:
- VPS for transcoding: $5–6/mo (Hetzner CX22 or similar, 2 vCPU / 4GB RAM handles moderate transcoding load)
- Cloudflare R2 storage: $0.015/GB stored, zero egress fees
- R2 operations: $0.36/million Class B (read) operations
- For a 100-video library with moderate traffic, realistic monthly cost: $3–8/mo all-in
The math the Subatic author is pointing to [website]: if you were paying $300/mo for streaming costs on a managed platform and move the delivery to R2 with Subatic handling the transcoding, you could realistically land at $6–15/mo for the same traffic. That’s the 99% reduction claim — plausible for certain traffic profiles and egress-heavy situations, especially if you were previously on AWS CloudFront [website][README].
The catch: R2’s zero-egress only applies to internet egress from R2 to end users. If your architecture moves data between providers, egress fees reappear. And Subatic’s transcoding service needs a running server — it doesn’t autoscale [README].
Deployment reality check
The README is honest about setup complexity. This is not a one-click install.
What you need:
- A Linux VPS with enough CPU for FFmpeg transcoding (2 vCPU minimum; 4 vCPU if you want transcoding to not block while multiple users upload)
- Docker and docker-compose
- A PostgreSQL database (bundled in docker-compose)
- Two S3-compatible buckets: one for raw uploads (private), one for transcoded output (public)
- A domain connected to the public bucket for video delivery
- Optionally: Cloudflare R2 + CORS config + cache rules for zero-egress delivery [README]
The two-container requirement is the main friction point. You’re deploying subatic (the main app) and subatic-transcoding (the FFmpeg worker) as separate services. They communicate via webhooks using a shared WEBHOOK_TOKEN. If the transcoder goes down, uploads queue but don’t process — there’s no retry queue or dead-letter mechanism documented [README].
Optional SQS integration for the transcoding queue is listed but disabled by default (SQS_ENABLED=false). For high-volume setups, enabling SQS decouples the transcoder from the main app — but that adds AWS service setup to the list [README].
The live demo (subatic.com) shows the product working in production, but notably the public demo instance has no content moderation — the homepage displays user-uploaded content with no filtering [website]. If you’re running a multi-user instance, plan for moderation tooling that Subatic doesn’t provide.
Realistic time estimate: 1–2 hours for a developer comfortable with Docker and S3 configuration. For someone new to either, half a day including reading the separate transcoding repo’s documentation.
Pros and Cons
Pros
- Clean cost architecture. The two-bucket pattern with Cloudflare R2 for delivery is genuinely smart. Zero egress to end users means video delivery costs stop scaling with traffic [README][website].
- Actually simple. The codebase is small, the setup is two containers and two buckets. There’s very little magic to debug when things go wrong [1][README].
- S3-compatible storage means flexibility. You can use AWS S3, Cloudflare R2, MinIO (included), Backblaze B2, or any compatible API. No vendor lock-in on the storage layer [README].
- HLS out of the box. Transcoding to HLS means adaptive bitrate streaming and broad device compatibility without any client-side work [README].
- GPL-3.0 open source. You own the deployment. No license enforcement, no “community vs enterprise” tier gating [README][1].
- Analytics integrations are opt-in. Umami or Plausible instead of Google Analytics if you want privacy-preserving tracking [README].
Cons
- Very early stage. 159 GitHub stars, one maintainer. There’s no company, no commercial tier, no SLA, no support beyond GitHub issues and the author’s goodwill [merged profile].
- No content moderation. The live demo demonstrates this problem clearly — without moderation tooling, a multi-user instance is a liability [website].
- No user management. Local auth only, no roles, no per-user storage quotas, no invite system [README]. This is a single-owner tool, not a multi-tenant platform.
- Two-service deployment. The main app and transcoder are separate repos and containers. More moving parts than alternatives like PeerTube, which bundles everything [README].
- No REST API beyond webhooks. Programmatic video management isn’t documented. The webhook system is internal plumbing between the two Subatic services, not an external API surface [README].
- GPL-3.0 is restrictive for embedding. Unlike MIT (Activepieces) or Apache 2.0, GPL-3.0 means any product you build on top of Subatic must also be GPL-3.0. Not suitable for proprietary SaaS products built around it [merged profile].
- No video player customization. What you get for playback is whatever HLS player you wire up yourself. There’s no branded player, chapters, captions, or analytics built into the player [README].
- Data not available: No documented performance benchmarks, concurrent upload limits, or transcoding throughput numbers.
Who should use this / who shouldn’t
Use Subatic if:
- You’re a developer who hosts videos for personal projects, documentation, or a small community and your current bill is $20–100/mo on a managed service.
- You’re comfortable running two Docker containers and configuring S3 buckets — this is not a GUI-friendly setup.
- You want zero egress costs and you’re willing to use Cloudflare R2 as the delivery layer.
- You’re building a small, single-admin site where content moderation isn’t a concern.
Skip it (consider PeerTube instead) if:
- You need multi-user accounts, channel management, federation, or any social features.
- You want a production-ready, community-supported platform with years of deployment history.
- You need content moderation tools, DMCA compliance workflows, or user reporting.
Skip it (consider Cloudflare Stream or Bunny Stream instead) if:
- You don’t want to manage infrastructure at all — even two Docker containers.
- You need autoscaling transcoding for burst uploads.
- You value managed reliability over cost savings.
Skip it (consider Mux or AWS MediaConvert instead) if:
- You’re building a video-first product with per-user uploads, complex encoding profiles, or real-time analytics at scale.
- You need a documented API for programmatic video management.
Alternatives worth considering
- PeerTube — the most mature self-hosted video platform, ActivityPub-federated, multi-user, with plugins and a proper admin interface. More complex to deploy, but battle-tested in production by thousands of instances. The obvious choice if you need user accounts.
- Cloudflare Stream — managed video hosting with the same R2 ecosystem Subatic targets. Costs money but removes all infrastructure management. Worth running the numbers against Subatic’s self-hosted cost if your time is valuable.
- Bunny Stream — cheaper than Stream for many workloads, simple API, no self-hosting required. Good middle ground.
- Mux — developer API for video, excellent for products building video features. Not self-hostable.
- AVideo — self-hosted, PHP-based, older but more feature-complete than Subatic for multi-user video sites.
- MediaCMS — Django-based self-hosted video and media platform, more features than Subatic, less architectural elegance.
Bottom line
Subatic is a one-trick pony that does its trick well: it takes a video, transcodes it to HLS, and delivers it from cheap object storage. The origin story about 99% cost reduction is credible — the architecture is designed specifically to exploit Cloudflare R2’s zero-egress pricing. For a developer who’s been paying $50–200/mo on Cloudflare Stream or Vimeo and just needs videos to play on a website, the math genuinely works.
What it is not: a platform, a community, or a production-ready product for multi-user deployments. With 159 stars and a single maintainer, you’re betting on a project that could go quiet. The GPL-3.0 license limits commercial embedding. There’s no moderation, no roles, no API. If you build on it, you’re also maintaining it when it breaks.
For the right person — a solo developer or technical founder who owns their hosting decisions and wants to stop paying per-minute for video that doesn’t change — Subatic is a smart, underbuilt tool worth deploying. Everyone else should start with PeerTube or stay on managed hosting until Subatic matures.
Sources
- r/selfhosted — “Subatic: Extremely simple video sharing platform” (Product Announcement by orthdron, ~2024). https://www.reddit.com/r/selfhosted/comments/1ekraf3/subatic_extremely_simple_video_sharing_platform/
Primary sources:
- GitHub repository and README: https://github.com/orthdron/subatic (159 stars, GPL-3.0)
- Official website: https://subatic.com
- About page: https://subatic.com/about
- Origin story (cost reduction): https://subatic.com/story
- Transcoding repository: https://github.com/orthdron/subatic-transcoding
Features
Integrations & APIs
- Webhooks
Related Media & Streaming Tools
View all 334 →Immich
95KHigh-performance self-hosted photo and video management — automatic backup, ML-powered search, and a Google Photos-like experience on your own server.
Jellyfin
49KThe volunteer-built media solution that puts you in control of your media. Stream movies, shows, music, and photos to any device from your own server.
PhotoPrism
39KAI-Powered Photos App for the Decentralized Web. Tag and find pictures automatically without getting in your way.
Cobalt
39KSave what you love without ads, tracking, paywalls or other nonsense. Just paste the link and you're ready to rock.
qBittorrent
36KAn open-source software alternative to uTorrent. Feature-rich and runs on all major platforms.
SRS
29KSimple, high efficiency, realtime video server. Supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181.