Skip to content
ViewCasta
Streaming platform for operators

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.

66KLOC
Rust workspace
20
Services
638
Rust tests
AGPL3.0
License
smart_abr_ladder(codec, w, h)
H.265audio 128k / rung
  • 4K
    12,000 k
  • 1080p
    5,000 k
  • 720p
    2,000 k
H.264audio 128k / rung
  • 4K
    20,000 k
  • 1080p
    8,000 k
  • 720p
    4,000 k
Output
HLS · AES-128
HW detect
NVENC · QSV · VAAPI · VT

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.

ViewCastaPure RustAGPL-3.0Row-level multi-tenantISP edge CDNAES-128 HLSNever-upscale ABR

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.

Source: crates/services + crates/cdn

Platform plane · 13 services

  • Gatewayservices/gateway

    REST/gRPC bridge, tenant resolution, rate limit, WS push, tus uploads.

  • Catalogservices/catalog

    Content CMS, TMDB enrichment, genres, people, cast.

  • Transcoderservices/transcoder

    FFmpeg orchestration, never-upscale ABR, NVENC, QSV, VAAPI, VideoToolbox.

  • Streamerservices/streamer

    HLS manifest generation, signed key URLs, tier-filtered renditions.

  • Key Serverservices/keyserver

    AES-128 content protection, token-based key delivery, entitlements.

  • Subscriberservices/subscriber

    Users, plans, subscriptions, rentals, profiles, watch history, favorites.

  • EPGservices/epg

    XMLTV feed parsing, schedule editor, aggregator. Live TV groundwork.

  • Ad Serverservices/adserver

    Campaign, creative, and impression management.

  • Analyticsservices/analytics

    Event ingestion into a ScyllaDB-backed event store.

  • Tenantservices/tenant

    Multi-tenant operator lifecycle, ISP provisioning, activation codes.

  • Schedulerservices/scheduler

    Distributed job queue driving the billing cron jobs.

  • Notifierservices/notifier

    Delivery hand-off to BitsPath for SMS, email, push, WhatsApp.

  • Billingservices/billing

    Invoices from subscriber-count snapshots, line items, dunning.

CDN plane · 7 crates

axum + tokio inside
  • cdn-core
    cdn/cdn-core

    ContentSource trait, caching, request coalescing.

  • cdn-origin
    cdn/cdn-origin

    Origin server for segments and manifests.

  • cdn-edge
    cdn/cdn-edge

    axum-based re-streamer deployed inside ISP POPs, NATS heartbeat.

  • cdn-api
    cdn/cdn-api

    Edge fleet management and control APIs.

  • cdn-analytics
    cdn/cdn-analytics

    Edge delivery metrics and attribution.

  • cdn-dns
    cdn/cdn-dns

    GeoDNS 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.

EDGE01 / 03

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.

OP02 / 03

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.

CDN03 / 03

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.

subscriber>>cdn-dns (GeoDNS)>>cdn-edge (ISP POP, axum)>>cdn-origin / s3-source>>streamer + keyserver
cache hit >> served from edge LRUcache miss >> origin pull + pin

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.

EnginePattern
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.

CapabilityViewCastaMuxBitmovinAWS Media*Wowza
End-to-end pipeline (ingest to player to billing)Single productEncoding + deliveryEncoder + playerStitched servicesSelf-hosted only
ISP edge cache deployed inside operator POPsCloudFront only
Smart ABR ladder, never upscalessmart_abr_ladder()Per-title encodingPer-title encodingMediaConvert presetsManual ladder
Multi-tenant by row, single deployment
Multi-DRM (Widevine, FairPlay, PlayReady)Roadmapped, AES-128 todaySPEKE
Pure Rust, zero garbage collectionJava
Source-available licenseAGPL-3.0Proprietary
Subscriber-count operator billing built inUsage onlyUsage onlyUsage onlyBYO billing
Native TV and mobile app codebases4 codebasesBYO playerPlayer SDKBYO 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

Wenme

Identity

OAuth 2.1 + PKCE sign-in with JWKS rotation. JWT validation enforced at the gateway through the plexbd-auth crate.

Darwan

Darwan

Authorization

PBAC/RBAC decisions for operators, content managers, and support staff. Per-role API guards in the gateway.

BitsPath

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.

  1. Provision the operator tenant

    01

    Tenant service creates the row, default plans, content library, and Darwan role catalog. The operator becomes tenant #N in the same shared deployment.

  2. Wire identity through Wenme

    02

    Subscribers sign in through Wenme (OAuth 2.1 + PKCE). The gateway validates every JWT against a rotating JWKS set before any downstream gRPC call.

  3. Ingest the catalog

    03

    Upload 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.

  4. Deploy ISP edges

    04

    Run 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.

  5. Launch the portal and turn on billing

    05

    The 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.