SGAI-native · render-mode-agnostic · written in Rust

The ad-insertion control plane that
your cloud doesn't own.

broadcast.ad is the portable, inspectable ad-signal & manifest-control layer that lets broadcasters keep linear-grade control while integrating with the ad servers and delivery models they already use — on any cloud, CDN, or on-prem infrastructure they choose.

SSAI & SGAI from one core Standards-pure — no proprietary wire format Never dead air — structural invariant Deploy laptop → Linode → bare K8s
The problem

SSAI is consolidated, cloud-locked, and opaque.

Broadcasters need dynamic ad insertion across OTT, FAST, vMVPD and D2C — but today they must either surrender their insertion logic to a hyperscaler or build bespoke glue with no standards spine.

The incumbent trap

Yospace, AWS Elemental MediaTailor and Google DAI couple ad insertion to their platform and their cloud. Per-stream hyperscaler tax. Hard to debug. Poorly aligned with broadcast signaling.

The retrofit problem

The SSAI→SGAI migration is underway — HLS Interstitials are shipping. Incumbents are bolting SGAI onto SSAI cores. A greenfield build can be render-mode-agnostic from day one.

The unsecured control plane

ESAM (SCTE 130-3) assumed a trusted LAN. Multi-tenant cloud breaks that — leaving an unauthenticated, money-and-compliance-bearing API exposed. No standardized fix exists.

The opening

Deploy-anywhere cloud independence, a render-mode-agnostic core, and signal-integrity as a first-class product — the combination the incumbents structurally cannot offer at once.

Strategic differentiators

Five wedges the incumbents can't close.

This is deliberately not "another SSAI." The defensible position is the combination below.

Wedge 01

Cloud / CDN independence as the product

Deploy-anywhere: local lab → private cloud → Linode → customer infra → Kubernetes. Stateless workers, no cloud-proprietary primitives. The transcode backend is bundled and modular (ffmpeg baseline, swappable) so it never reaches for a cloud's transcode service. Rust's low per-stream footprint makes the cost argument real, not philosophical.

Wedge 02

Signal-integrity as a product

Conformance: a verifiable SCTE-35/224 conditioning pipeline — provable signal integrity from contribution to avail, where day-to-day revenue leakage lives. Trust (SESAME): securing the ESAM messaging layer, a proposed SCTE 130-9 standard. Standards-track and hard to copy.

Wedge 03

SGAI-native, render-mode-agnostic core

One session / decision / tracking layer; switchable output as stitched segments (SSAI) or interstitial/event signals (SGAI). No mode leaks into the core — SSAI and SGAI are the only implementors of one Renderer trait. The single most important architecture call, made at the start instead of retrofitted.

Wedge 04

Observability + reconciliation

First-class per-session telemetry and automatic ad-server reconciliation — targeting the impression-discrepancy revenue leakage that incumbents treat as an afterthought. Per-avail audit records, tracing, Prometheus metrics. "Wireshark for broadcast ad insertion."

Wedge 05

Broadcast-native, not OTT-retrofit

Frame-accurate boundaries. Graceful underfill and slate. Blackout, affiliate replacement and regionalization honored through POIS policy. Built for linear-grade control — not an OTT tool stretched to fit broadcast.

Foundation

Standards-pure, by constraint

Output conforms to SCTE-35/224, VAST/VMAP, Apple HLS Interstitials, DASH events, OMID, and the Google DAI Pod Serving component model. Maximum compatibility is a hard constraint — no proprietary wire format, ever. Integrate with the ad servers customers already run.

The architecture

One decision & tracking path. Two render modes.

SCTE-35 in, ad-conditioned manifest out — the core never knows or cares whether the output is stitched or signaled.

live HLS manifest + EXT-X-DATERANGE SCTE-35
Cue Detector type-5 splice_insert · type-6 time_signal
AdDecider + POIS policy VAST / VMAP · rust-pois · never errors
AdPod + TrackingSet shared · renderer-independent
↓    ↓
SSAIEXT-X-DISCONTINUITY + segments
SGAIDATERANGE + asset-list
  • Render-mode-agnostic. Decision, session and tracking logic is renderer-independent. The core never matches on RenderMode.
  • HLS-first, DASH-ready. A Manifest trait abstracts format — DASH multi-period + emsg drops in behind the same seam.
  • Pluggable everything. AdDecider, Transcoder, SessionStore, BeaconSink are traits — in-memory + ffmpeg today, Redis + Pod Serving tomorrow.
  • Reuse, don't reimplement. SCTE-35 parsing, POIS policy and conditioning are integrated dependencies, not rebuilt wheels.
The four-layer market model

We integrate where others compete — and own where they don't show up.

A clear stance on each layer of the stack keeps the product a control plane, not another demand platform.

LayerAnswersRepresentative playersOur stance
A — Ad decisioning "Which ad plays?" Google Ad Manager, FreeWheel, Magnite, SpringServe Integrate, never compete
B — Session / manifest "How do I personalize per session?" MediaTailor, Google DAI, Yospace, Broadpeak, Amagi Play — lead with portability
C — Broadcast signaling "What does policy require?" SCTE-35/104, ESAM, POIS, ESNI / SCTE-224 Own — our head start
D — Observability / proof "Did it work — can I prove it?" Underserved across all vendors Own — concrete differentiator
Conformance, not lock-in

Built on the standards your workflow already speaks.

Maximum compatibility is a hard product constraint. Every output is something an off-the-shelf player or ad server already understands.

SCTE-35 in-band spliceSHIPPING SCTE-224 / ESNI scheduling & policyMVP SCTE 130-3 ESAM conditioningMVP SCTE 130-9 SESAME ESAM securityPROPOSED VAST 3/4 · VMAP ad decisioningSHIPPING Google DAI Pod Serving interopMVP HLS (RFC 8216) + LL-HLSSHIPPING Apple HLS Interstitials SGAISHIPPING MPEG-DASH multi-period · emsgREADY IAB OMID · Nielsen DARPHASE 2
The loop, end to end

Signal → decision → insertion → proof.

Create a session

A player hits POST /session with channel + targeting. It gets back an HMAC-signed manifest URL — session state lives behind a SessionStore trait, never in a cloud primitive.

Detect & decide

The origin manifest is parsed, SCTE-35 cues become avails, POIS policy applies (blackout / regionalization), and the AdDecider resolves a pod from VAST/VMAP — behind a timeout with slate fallback.

Condition to the ladder

Ad creatives are conditioned to the content's actual rendition ladder by a pluggable Transcoder (ffmpeg baseline) — derived from the content master so ads match the stream exactly.

Render — your way

One Renderer emits SGAI (EXT-X-DATERANGE + per-session asset-list) or SSAI (EXT-X-DISCONTINUITY stitched segments) — selected per session. Always padded with slate.

Beacon & reconcile

Impressions and quartiles fire through a BeaconSink (retry + dedup). Every avail leaves an audit record and Prometheus metrics — so you can prove what played.

For operators the incumbents priced out

Keep linear-grade control.
Lose the cloud tax.

Small / mid broadcasters, FAST and niche-sports operators, and sovereignty-sensitive teams who want broadcast-grade ad insertion that runs identically on a laptop, on Linode, or on their own iron.