Every codec, every rung,
never upscaled.
ViewCasta is the 20-service streaming platform an operator can run on its own metal. VOD with an ABR ladder that refuses to invent pixels, AES-128 encrypted HLS, row-level multi-tenancy, and axum-based edge caching that lives inside the ISP's own POP. One Rust workspace, 66 thousand lines, AGPL-3.0.
- 4K12,000 k
- 1080p5,000 k
- 720p2,000 k
- 4K20,000 k
- 1080p8,000 k
- 720p4,000 k
Rungs at or below the source resolution only, never above. Sources below 720p get a single rung at source resolution. The function is smart_abr_ladder(codec, width, height) in crates/services/transcoder/src/ffmpeg.rs.
What is ViewCasta
A complete streaming platform an operator can deploy as one product.
ViewCasta is the product brand; the live demo runs at plexbd.com. It is one Cargo workspace, 20 services across a platform plane (13 services) and a CDN plane (7 crates), and 66,326 lines of Rust under the AGPL-3.0 licence.
It is built for the operator that wants the whole pipeline as a single product. Ingest through tus, smart ABR transcoding with a ladder that never upscales, hardware encoding on NVENC, QSV, VAAPI, and VideoToolbox, AES-128 encrypted HLS delivery, ScyllaDB analytics, row-level multi-tenancy, profiles and continue-watching on the portal, and axum-based cdn-edge nodes that live in the ISP's POP rather than in a foreign cloud. VOD ships today; live TV groundwork (XMLTV parsing, a schedule editor) is on the roadmap.
Live at plexbd.com.
Architecture
Two planes. 20 Rust services. One workspace.
The platform plane runs the business: catalog, subscribers, billing, analytics, ads. The CDN plane runs the bytes: origin, edge, GeoDNS, and pluggable content sources. Both planes ship in the same Cargo.toml.
Sync paths are gRPC over tonic. Async paths are NATS JetStream subjects like plexbd.transcode.complete. Client-facing surface is REST through the gateway, with WebSocket push for live admin dashboards.
crates/services + crates/cdnPlatform plane · 13 services
- Gateway
services/gatewayREST/gRPC bridge, tenant resolution, rate limit, WS push, tus uploads.
- Catalog
services/catalogContent CMS, TMDB enrichment, genres, people, cast.
- Transcoder
services/transcoderFFmpeg orchestration, never-upscale ABR, NVENC, QSV, VAAPI, VideoToolbox.
- Streamer
services/streamerHLS manifest generation, signed key URLs, tier-filtered renditions.
- Key Server
services/keyserverAES-128 content protection, token-based key delivery, entitlements.
- Subscriber
services/subscriberUsers, plans, subscriptions, rentals, profiles, watch history, favorites.
- EPG
services/epgXMLTV feed parsing, schedule editor, aggregator. Live TV groundwork.
- Ad Server
services/adserverCampaign, creative, and impression management.
- Analytics
services/analyticsEvent ingestion into a ScyllaDB-backed event store.
- Tenant
services/tenantMulti-tenant operator lifecycle, ISP provisioning, activation codes.
- Scheduler
services/schedulerDistributed job queue driving the billing cron jobs.
- Notifier
services/notifierDelivery hand-off to BitsPath for SMS, email, push, WhatsApp.
- Billing
services/billingInvoices from subscriber-count snapshots, line items, dunning.
CDN plane · 7 crates
- cdn-core
cdn/cdn-coreContentSource trait, caching, request coalescing.
- cdn-origin
cdn/cdn-originOrigin server for segments and manifests.
- cdn-edge
cdn/cdn-edgeaxum-based re-streamer deployed inside ISP POPs, NATS heartbeat.
- cdn-api
cdn/cdn-apiEdge fleet management and control APIs.
- cdn-analytics
cdn/cdn-analyticsEdge delivery metrics and attribution.
- cdn-dns
cdn/cdn-dnsGeoDNS routing, subscriber-to-nearest-edge resolution.
- cdn-sources
cdn/cdn-sources/*Pluggable origin adapters: PlexBD, S3, FS, HTTP origin pull.
Three-entity CDN
The ISP brings the rack. The operator brings the brand. The bytes belong to whoever pays for them.
ViewCasta does not lock an edge to a single tenant. The ISP that hosts the rack, the operator that ships the catalog, and any third party that buys CDN-as-a-Service are three separate entities. A single edge serves all three simultaneously, with delivery metrics flowing back to cdn-analytics.
Edge Host
The ISP
Provides the rack space, power, and uplink inside its POP. ViewCasta ships the edge software; the operator never sees the host's tenant data.
Platform Tenant
The operator
An ISP, telco, or cable company running ViewCasta white-label. Owns its catalog, subscribers, branding, and apps. Auto-enrolled as a CDN customer.
CDN Customer
Anyone with bytes to ship
Third parties that buy ViewCasta CDN-as-a-Service. An edge cache serves every CDN customer at once, not locked to a single tenant.
Data tier
Five engines. One tenancy model.
ViewCasta does not pretend a single database handles every workload. Catalog and subscribers live in Postgres with row-level isolation. Clickstream lives in ScyllaDB with tenant-prefixed partition keys to keep each partition bounded. Hot session state lives in Redis. Object bytes live in MinIO. Cross-service events ride NATS JetStream.
The plexbd-db crate enforces tenant-scoping at the query layer. The migration set has 21 files spanning 2026-03 to 2026-05 covering tenants, content, subscribers, CDN, ads, keys, transcode jobs, EPG, notifications, profiles, ISP provisioning, media asset management, ingest, and billing.
| Engine | Pattern |
|---|---|
PostgreSQL 18.4 Catalog, subscribers, profiles, schedules, jobs, ads, EPG, billing | Row-level tenancy |
ScyllaDB 2026.1.4 Analytics events with tenant-prefixed partition keys | Shared keyspace |
Redis 8.8 Sessions, JWKS cache, active profile, rate-limit counters | Sub-ms reads |
MinIO (S3) plexbd-thumbnails, plexbd-trailers, plexbd-segments buckets | AGPL throughout |
NATS JetStream plexbd.content.* / transcode.* / edge.health topics | Fire-and-forget |
ViewCasta vs the stack you would otherwise stitch
Mux ships encoding. Bitmovin ships a player. AWS bills you for both. ViewCasta ships the whole pipeline as one product.
The honest comparison: ViewCasta is one product, source available under AGPL-3.0, runnable on the operator's own metal, with an ISP edge tier that none of the SaaS encoders attempt. The gap is multi-DRM (Widevine, FairPlay, PlayReady), roadmapped behind a pluggable protection trait. AES-128 token-protected delivery is the default today.
| Capability | ViewCasta | Mux | Bitmovin | AWS Media* | Wowza |
|---|---|---|---|---|---|
| End-to-end pipeline (ingest to player to billing) | Single product | Encoding + delivery | Encoder + player | Stitched services | Self-hosted only |
| ISP edge cache deployed inside operator POPs | CloudFront only | ||||
| Smart ABR ladder, never upscales | smart_abr_ladder() | Per-title encoding | Per-title encoding | MediaConvert presets | Manual ladder |
| Multi-tenant by row, single deployment | |||||
| Multi-DRM (Widevine, FairPlay, PlayReady) | Roadmapped, AES-128 today | SPEKE | |||
| Pure Rust, zero garbage collection | Java | ||||
| Source-available license | AGPL-3.0 | Proprietary | |||
| Subscriber-count operator billing built in | Usage only | Usage only | Usage only | BYO billing | |
| Native TV and mobile app codebases | 4 codebases | BYO player | Player SDK | BYO entire app | |
| * AWS MediaLive + MediaConvert + CloudFront, stitched. Not a single product. Comparison reflects publicly documented capabilities at time of writing. | |||||
KaritKarma platform
Identity, authorization, and comms come from the platform. ViewCasta keeps shipping pixels.
ViewCasta does not reinvent auth, RBAC, or notification fan-out. It integrates with three KaritKarma platform services that the rest of the KaritKarma product family also uses, so an operator that runs ViewCasta plus Wenme gets the same single sign-in across every surface in the suite.
Wenme
Identity
OAuth 2.1 + PKCE sign-in with JWKS rotation. JWT validation enforced at the gateway through the plexbd-auth crate.
Darwan
Authorization
PBAC/RBAC decisions for operators, content managers, and support staff. Per-role API guards in the gateway.
BitsPath
Communications
Outbound delivery for new-content alerts, billing, and ops alarms. Notifier hands off; BitsPath fans out.
Launch path
Five steps from new tenant to live subscribers.
No on-prem rebuild. A new operator is provisioned into the same shared ViewCasta deployment as every other tenant, owns its catalog and apps, and rolls out edge nodes into its own POPs at its own pace.
Provision the operator tenant
01Tenant service creates the row, default plans, content library, and Darwan role catalog. The operator becomes tenant #N in the same shared deployment.
Wire identity through Wenme
02Subscribers sign in through Wenme (OAuth 2.1 + PKCE). The gateway validates every JWT against a rotating JWKS set before any downstream gRPC call.
Ingest the catalog
03Upload titles via tus resumable upload. Catalog enriches with TMDB metadata (poster, backdrop, cast, bios). The transcoder schedules smart ABR jobs bounded by a tokio::Semaphore.
Deploy ISP edges
04Run the cdn-edge binary on hardware inside the POP. cdn-dns routes nearby subscribers to the closest healthy edge; edges report health back over NATS heartbeats.
Launch the portal and turn on billing
05The subscriber portal goes live under the operator's brand, with native app codebases ready for Android, Android TV, iOS, and Apple TV. Notifier dispatches launch comms through BitsPath, and integrated subscription billing generates operator invoices automatically from subscriber-count snapshots.
Engineering questions
The nine questions a streaming buyer always asks.
What is ViewCasta?
ViewCasta is a 20-service streaming platform written in pure Rust (66,326 lines, AGPL-3.0) that operators deploy white-label for VOD and CDN-as-a-Service, with live TV groundwork (EPG, XMLTV parsing) on the roadmap. It ships the pipeline as one product: tus resumable ingest, smart ABR transcoding that never upscales, AES-128 encrypted HLS delivery, origin and ISP edge CDN, multi-tenant catalog, subscriber and profile management, an ad server, subscriber-count operator billing, and a ScyllaDB-backed analytics tier. The live demo runs at plexbd.com.
Does ViewCasta support HLS out of the box?
Yes. ViewCasta is HLS-first: the streamer generates HLS manifests with signed key URLs injected from the key server and renditions filtered by subscription tier, so a basic-plan subscriber never sees the 4K rung. Segments are encrypted with AES-128 through FFmpeg's HLS key pipeline, and the web portal plays back through hls.js. Delivery is HLS-only.
Can I run ViewCasta on-prem?
Yes. ViewCasta ships as a single Cargo workspace with a production Docker Compose deployment and a Docker Swarm stack. Operators can run the full 20-service stack in their own data centre or as a managed tenant in a shared deployment. The CDN edge specifically is designed to live inside an ISP POP: an axum-based re-streamer with GeoDNS routing and NATS heartbeats, never phoning home to a central origin for cache hits.
What is the concurrent-viewer ceiling?
The platform is horizontally scalable at every plane. The gateway is stateless behind a load balancer, the catalog and subscriber services scale per CPU, the streamer is bandwidth-bound and runs N replicas behind the edge tier, and the edge tier itself scales by adding cdn-edge nodes inside ISP POPs. The transcoder is the only intentionally rate-limited service: a tokio::Semaphore bounds concurrent FFmpeg jobs (default 2, production tuned to 1 on 4GB memory boxes) to avoid OOM under unbounded ingest bursts.
Does the transcoder use hardware encoding?
Yes. The transcoder detects available hardware encoder backends (NVENC, QSV, VAAPI, and VideoToolbox) and orchestrates FFmpeg as a bounded child process for H.264 and H.265 output. The ABR ladder it builds never upscales: smart_abr_ladder(codec, width, height) keeps only the rungs at or below the source resolution, and sources below 720p get a single rung at source resolution. Audio is 128 kbps on every rung.
Does ViewCasta have its own player?
Yes. The portal at web/portal ships a Next.js 16 player built on hls.js, with profiles (including kids mode with maturity ratings and per-profile language), continue watching, watch history, favorites, genre browse, and person and filmography pages driven from TMDB enrichment. The same portal runs operator-branded for white-label tenants, and native app codebases exist for Android, Android TV, iOS, and Apple TV with platform players (ExoPlayer/media3 and AVPlayer).
How does ViewCasta handle multi-tenancy?
Postgres uses row-level isolation with a tenant_id column on every table, enforced inside the plexbd-db crate. ScyllaDB uses shared tables with tenant-prefixed partition keys (not per-tenant keyspaces) to keep operational complexity flat. The Tenant service owns tenant lifecycle; the gateway resolves the tenant from the Wenme JWT and pushes it into the request context for every downstream gRPC call.
How does the ISP edge CDN actually work?
The cdn-edge crate is an axum-based re-streamer that an ISP installs inside its POP. cdn-dns answers subscriber DNS queries with the nearest healthy edge. Hot segments are served from the edge cache; cold segments are fetched from cdn-origin with request coalescing, so a thundering herd collapses into a single origin pull. Edges report health back over NATS heartbeats. The model is three-entity (Edge Host, Platform Tenant, CDN Customer); an edge serves every CDN customer simultaneously, not just the tenant that hosts it.
What about content protection and DRM?
AES-128 token-protected delivery ships today through the key server: per-content keys, signed key URLs injected into every manifest, and entitlement and session checks before a key is released. Content protection is a pluggable trait, with AES-128 as the default implementation and multi-DRM (Widevine, FairPlay, PlayReady) on the roadmap. For most operators, token-protected AES-128 plus tier-filtered manifests is enough to start.
One product. 20 Rust services. Two codec ladders that never upscale. Your edge in the ISP's rack.
ViewCasta is the streaming platform an operator can actually deploy as one thing. Start a tenant in the shared deployment, launch the branded portal, drop cdn-edge nodes into your POPs as the subscriber count grows.