Skip to content

Architecture Overview

FrameWorks runs the same service topology in every environment — local, staging, production, self-hosted — and varies only the deployment substrate:

  • Local development: Docker Compose brings up the full stack on one host.
  • Production and self-hosted: The FrameWorks CLI (frameworks cluster provision) drives Ansible roles against the hosts named in the cluster manifest. Release manifests live in a GitOps repository; the CLI reads them to pin versions and reconcile state. See CLI Reference and Ansible Provisioning.
  • Coordination: Quartermaster is the runtime source of truth for tenants, clusters, and service discovery; every other service queries it rather than holding its own copy of routing state.

FrameWorks uses a multi-plane distributed architecture designed for scale, separating tenant-facing control logic from high-volume media, event data, and network automation. Plane names describe runtime responsibility; deployment tiers describe placement.

  • Control / API Plane: GraphQL aggregation, auth, stream management, tenant routing, and billing APIs.
  • Media Plane: Media ingest, processing, playback routing, edge orchestration, and media asset delivery.
  • Event & Analytics Plane: Event ingress, Kafka fan-out, real-time fan-out, and analytical storage/querying.
  • Network & Trust Plane: Public DNS, certificates, service identity, mesh networking, and ingress.
  • Support & Experience Services: Support workflows, AI consultant workflows, forms, newsletters, and stream interaction services.
  • Interfaces: Web apps, marketing sites, documentation, CLI, SDKs, and player/studio packages.
  • Observability & Operations: Metrics, dashboards, alerting, BI, and incident workflows.

Microservices Architecture


The FrameWorks platform is composed of specialized services, each responsible for a distinct domain. These services communicate primarily via gRPC for internal traffic and expose a unified GraphQL API for external clients.

ServicePort(s)TierPlanePurpose
Bridge18000RegionalControl / APIGraphQL API Gateway and MCP hub
Commodore18001 (HTTP), 19001 (gRPC)CentralControl / APIAuth, streams, API tokens, media registry, and business workflows
Quartermaster18002 (HTTP), 19002 (gRPC)CentralControl / APITenants, clusters, nodes, service discovery, and bootstrap state
Purser18003 (HTTP), 19003 (gRPC)CentralControl / APIBilling, usage, invoices, payments, and x402 state
Periscope Query18004 (HTTP), 19004 (gRPC)CentralEvent & AnalyticsAnalytics and reporting API
Periscope Ingest18005RegionalEvent & AnalyticsKafka event processing and ClickHouse writes
Decklog18006 (gRPC)RegionalEvent & AnalyticsgRPC event ingress → Kafka
Decklog (metrics)18026RegionalObservability & OperationsDecklog Prometheus metrics
Signalman18009 (WS), 19005 (gRPC)RegionalEvent & AnalyticsReal-time event fan-out and WebSocket hub
Foghorn18008RegionalMediaLoad balancer and media pipeline orchestrator
Foghorn (internal gRPC)18019 (gRPC)RegionalMediaInternal control API and HA relay over the internal CA
Foghorn (external gRPC)18029 (gRPC)RegionalMediaEdge bootstrap, Helmsman control, and FoghornFederation over ACME
Helmsman18007 (HTTP)EdgeMediaMistServer sidecar
Chandler18020 (HTTP)RegionalMediaCluster-scoped static media asset server
Navigator18010 (HTTP), 18011 (gRPC)CentralNetwork & TrustPublic DNS, ACME certificates, and internal CA material
Privateer18012 (HTTP)Central/RegionalNetwork & TrustWireGuard mesh agent and local .internal DNS
Deckhand18015 (HTTP), 19006 (gRPC)CentralSupport & Experience ServicesSupport messaging API (Chatwoot adapter)
Skipper18018 (HTTP), 19007 (gRPC)CentralSupport & Experience ServicesAI video consultant API
Forms18032CentralSupport & Experience ServicesContact form and newsletter handling
ComponentRolePlanePort(s)Deploy Location
MistServerMedia processing, ingest, and edge deliveryMedia4242, 8080, 1935, 5554, 4200, 8889/udp, 18203/udpEdge
Livepeer GatewayTranscoding gateway and compute-marketplace integrationMedia8935Edge (co-located with MistServer)
Livepeer SignerETH transaction signer for gatewayControl / API18016Central
PostgreSQL-compatible DB (Postgres/Yugabyte)Service-owned state and configuration database substrateInfrastructureOperator-definedCentral
ClickHouseTime-series analytics databaseEvent & Analytics8123 (HTTP), 9000 (Native)Central
KafkaEvent streaming backboneEvent & Analytics9092 (Int), 29092 (Ext)Central + Regional (single shared cluster)
Foghorn RedisFoghorn HA state syncMedia6379Regional
NginxReverse proxy and local development routingNetwork & Trust18090Central
CaddyEdge TLS termination and reverse proxyNetwork & Trust80, 443, 18090Edge
VictoriaMetrics + vmagentMetrics collection and remote-write fan-inObservability & OperationsOperator-definedCentral + every backend and edge host
GrafanaMetrics visualizationObservability & OperationsOperator-definedCentral
MetabaseBI analyticsObservability & OperationsOperator-definedCentral
ListmonkNewsletter and mailing list managerSupport & Experience Services9000 (service), 9001 (docker-compose host)Central

Livepeer integration: The Livepeer Gateway is provisioned via the CLI and discovered via Quartermaster service discovery. MistServer sends segments to the gateway automatically when Livepeer transcoding is configured for a stream. Ingest auth stays in the media plane: the gateway calls Foghorn’s internal /webhooks/livepeer/auth webhook, and wallet/top-up automation reads wallet_address from Quartermaster service-instance metadata.

ComponentRolePathPortDeploy Location
Chartroom / Web ConsoleSvelteKit user dashboardwebsite_application18030Regional
Foredeck / MarketingSales / Marketing websitewebsite_marketing18031Regional
Logbook / DocumentationAstro Starlight docs sitewebsite_docs18033Central
NPM PlayerEmbeddable multi-protocol playernpm_playerN/A (npm package)User websites
NPM StudioEmbeddable browser ingest studionpm_studioN/A (npm package)User websites
Android AppNative mobile client (in development)app_androidN/ARoadmap
ComponentRolePathInstall
FrameWorks CLICluster management and provisioningcli/go install or binary

  • Central: Commodore, Quartermaster, Purser, Navigator, Periscope Query, Deckhand, Skipper, Forms, PostgreSQL-compatible DB (YugabyteDB recommended), ClickHouse, Listmonk, Chatwoot + Redis.
  • Regional: Bridge, Foghorn, Decklog, Periscope Ingest, Signalman, Chandler, Kafka, Web Console, Marketing Site.
  • Central/Regional: Privateer (WireGuard mesh agent runs on all backend infrastructure nodes).
  • Edge: MistServer, Helmsman, Livepeer Gateway.

FrameWorks supports multiple clusters. A cluster is a Foghorn instance (or HA pair) plus its edge nodes — strictly the media plane. All clusters share the same central Control / API Plane (Commodore, Quartermaster, Purser) and Event & Analytics Plane (Decklog, Periscope, Signalman). These services are not duplicated or federated per cluster.

Cross-cluster coordination is handled exclusively by the FoghornFederation gRPC protocol between Foghorn instances:

  • Peer discovery: Quartermaster maintains a registry of all clusters. Foghorn queries ListPeers to find peers and opens PeerChannel bidirectional streams for real-time edge telemetry exchange.
  • Cross-cluster viewer routing: When a viewer’s cluster doesn’t have a stream, Foghorn uses QueryStream to find it on a peer, then either redirects the viewer or arranges a DTSC origin-pull to serve locally.
  • Cross-cluster artifacts: clips, VODs, and DVR chapters on remote clusters are all accessed via PrepareArtifact. Origin returns a presigned S3 URL when the artifact is synced, or a short-lived peer-relay URL + opaque capability grant pointing at the specific origin node when the canonical file is on disk but S3 sync is still pending (the origin Foghorn authorizes each pull online; no signing key on the edge) — viewers don’t wait on sync. DVR chapter listing flows through the GraphQL chapter API (Commodore → origin Foghorn for the chapter row metadata); each finalized chapter is a regular VOD-shaped artifact with its own Commodore-minted public playbackId, so chapter playback follows the same federation rules as any other VOD.
  • Leader-only peering: Each cluster elects one Foghorn instance (via Redis SET NX) to run PeerChannel connections, avoiding duplicate peer traffic.

Quartermaster is the sole routing authority. Commodore resolves tenant-to-cluster routing dynamically via GetClusterRouting — no hardcoded Foghorn addresses between services.

Deployment models:

ModelDescription
SharedFree shared capacity is currently unmetered; premium shared tiers are seeded for later enforcement. All tenants share the same cluster, edges, and services.
DedicatedEnterprise tier. Isolated cluster with dedicated Foghorn, edges, and capacity — operated by FrameWorks or self-hosted on-premise via the CLI, with Manual Deployment as an advanced reference.
HybridTenant runs self-hosted edges that fall back to the primary shared cluster. Edges federate via Foghorn; control/data plane remains shared.
Open MarketplaceOperators publish listed clusters with access controls, invites, subscription requests, and pricing metadata. Tenants browse listings and subscribe through the dashboard or API.

Understanding how data moves through the system is critical for operations and troubleshooting. The diagrams below illustrate the key pipelines for analytics, control, and media.

graph LR
    MS[MistServer] --> H[Helmsman]
    H <-->|gRPC| F[Foghorn]
    F --> D[Decklog]
    F -->|gRPC| C[Commodore<br/>validation]
    D --> K[Kafka]
    K --> PI[Periscope-Ingest]
    K --> S[Signalman]
    PI --> CH[(ClickHouse)]
    S --> FE[Frontend<br/>WebSocket]

Note: Helmsman maintains a persistent bidirectional gRPC stream with Foghorn:

  • Helmsman → Foghorn: MistServer triggers, heartbeats, clip/DVR progress updates
  • Foghorn → Helmsman: Clip pull requests, DVR start/stop commands, config seeds

Foghorn routes events to central services (Commodore for validation, Decklog for analytics, Quartermaster for tenant resolution).

graph LR
    FE[Frontend] --> B[Bridge]
    B -->|gRPC| COM[Commodore]
    B -->|gRPC| PUR[Purser<br/>billing]
    B -->|gRPC| QM[Quartermaster<br/>tenant info]
    B -->|gRPC| PER[Periscope Query<br/>analytics]

    H[Helmsman] <-->|gRPC| F[Foghorn]
    F -->|gRPC| COM2[Commodore<br/>validation]
    F -->|gRPC| QM2[Quartermaster<br/>enrollment]
graph LR
    IN[RTMP/E-RTMP/SRT/WHIP] --> MS[MistServer]
    MS <--> LP[Livepeer<br/>transcoding/AI]
    MS --> OUT[Multi-protocol outputs<br/>HLS / LL-HLS / DASH / WebRTC]
    OUT --> V[Viewers]
    MS --> H[Helmsman]
    H --> F[Foghorn]

Foghorn selects optimal edge nodes for viewers based on geography, load, and stream availability.

Routing Paths:

graph LR
    P[Player] -->|GraphQL| B[Bridge]
    B -->|gRPC| C[Commodore]
    C -->|gRPC| F[Foghorn]
    F -->|node list| C
    C --> B --> P
    P -->|connect| E[Edge Node]
PathFlowUse Case
GraphQL (primary)Player → Bridge → Commodore → FoghornFrameWorks Player, SDK integrations
HTTP (direct)Client → Foghorn /play/{viewkey}CLI tools, direct URL access, 307 redirects

Foghorn HTTP Endpoints:

EndpointResponseUse Case
GET /play/{viewkey}JSON with all endpointsDirect integration
GET /play/{viewkey}/hls/index.m3u8307 redirect to edgeDirect HLS playback
GET /play/{viewkey}/webrtc307 redirect to edgeDirect WebRTC (WHEP)
GET /{viewkey}Best node host or 307MistServer compatibility

For URI patterns and player integration, see Playback & Embedding.


graph TB
    subgraph "Infrastructure Layers"
        SOURCE["Release Source of Truth<br/>GitOps manifests"]
        CONFIG["Configuration Layer<br/>Ansible (driven by CLI)"]
        ORCH["Coordination Layer<br/>Quartermaster"]
    end

    subgraph "Components"
        VMS["Hosts (BYO or operator-provided)"]
        DNS["DNS (Cloudflare / Bunny via Navigator)"]
        CERTS["TLS Certificates"]
        MESH["WireGuard Mesh (Privateer)"]
        SERVICES["FrameWorks Services"]
        TENANTS["Tenants &amp; Clusters"]
    end

    SOURCE --> CONFIG
    CONFIG --> VMS
    CONFIG --> DNS
    CONFIG --> CERTS
    CONFIG --> MESH
    CONFIG --> SERVICES

    ORCH --> TENANTS
    ORCH --> SERVICES

Traffic routing and TLS termination vary by deployment tier:

  • Development: Nginx (via Docker Compose) handles local routing with self-signed or no TLS.
  • Production (Edge): Caddy serves edge traffic. Bootstrap templates start with internal TLS and a 503 response; after enrollment, Foghorn pushes SiteConfig and TLS material to Helmsman, which rewrites and reloads Caddy for viewer traffic.
    • Managed via CLI templates (cli/internal/templates/edge/Caddyfile.tmpl).
    • Supports HTTP/2, HTTP/3, and WebSocket upgrades natively.
  • Production (Central/Regional): Navigator manages public DNS through Cloudflare for root/API/web/admin names and Bunny DNS for delegated media cluster zones.
    • Root/API/web/admin names → Cloudflare A records or load balancers
    • Multiple root/global nodes → Cloudflare load balancer with one proximity-steered pool per Quartermaster cluster
    • Media cluster names → Bunny A-record sets under {cluster_slug}.{base_domain}
    • Media cluster records use Bunny geolocation Smart Routing when Quartermaster has node coordinates
    • Certificates issued via Let’s Encrypt DNS-01 through the provider authoritative for the name

Note: Cloudflare remains authoritative for root/API/web/admin/support names. Bunny DNS is authoritative for delegated media cluster zones. Traffic flows directly to FrameWorks services; provider-side proxies are not used for media traffic.


Internal communication between nodes uses a WireGuard mesh managed by the Privateer agent (api_mesh). This handles:

  • Secure inter-node communication
  • Internal DNS resolution
  • Backend infrastructure isolation

See Mesh Networking for bootstrap and runtime details.