unsubbed.co

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_SIZE environment 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

  1. 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:

Features

Integrations & APIs

  • Webhooks