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 of the ad break while plugging into the ad servers and delivery models they already use, on any cloud, CDN, or on-prem they choose.

SSAI & SGAI from one core Prove every impression Standards-pure, no proprietary wire format Deploy laptop to bare K8s
What it does

Keep more of every streaming ad dollar.

Streaming ad revenue leaks across the break: missed SCTE markers, underfilled avails, opaque SSAI reports, vendor-locked workflows, cloud-bound render costs, reconciliation disputes, and makegoods.

broadcast.ad gives broadcasters an independent control plane for the ad break: it validates the signal, enforces your policy, asks the ad server you already use what to play, renders SSAI or SGAI output, and proves what happened. The result is not more ad load. It is better retained revenue from the inventory you already sell.

Independence

No cloud tax. Stateless Rust workers run anywhere, from a laptop to bare Kubernetes, with no cloud-proprietary primitives in the path.

Proof

Bill what actually aired. Per-avail audit records and automatic ad-server reconciliation close the gap that otherwise turns into discrepancy disputes and makegoods.

Standards

Bring your own everything. SCTE-35 in, VAST/VMAP decisioning, HLS or DASH out. It works with the ad servers and players you already run.

The problem

Streaming ad insertion has become a margin black box.

Broadcasters need dynamic ad insertion across OTT, FAST, vMVPD and D2C. Today they either surrender the insertion logic to a hyperscaler or build bespoke glue with no standards spine, and either way they lose visibility into the dollars.

The incumbent trap

Yospace, AWS Elemental MediaTailor and Google DAI all do SSAI and SGAI. Their commercial center of gravity is platform-owned insertion; broadcast.ad's is broadcaster-owned policy, signal, manifest, and proof. With theirs, the control plane lives in someone else's stack: a per-stream cost, hard to debug, and only loosely coupled to your broadcast signaling.

The retrofit problem

The SSAI to SGAI migration is underway and 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) was born in a trusted-network era. In multi-tenant cloud workflows there is no broadly adopted ESAM-native security profile, so identity, replay protection, and policy authorization get bolted on per deployment instead.

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 places broadcasters lose control, and margin.

Each one keeps control in your hands instead of a vendor's cloud: your infrastructure, your ad servers, your data, your economics. No incumbent closes all five at once, because each wedge removes a lock-in or per-stream revenue stream their platform is built to sell. Doing all five would mean competing with their own economics.

Wedge 01

Cloud / CDN independence as the product

Cut the per-stream cloud tax. Deploy-anywhere: local lab, private cloud, Linode, OCI, 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

Stop revenue leaking through bad signaling. Conformance: a verifiable SCTE-35/224 conditioning pipeline for provable signal integrity from contribution to avail, where day-to-day revenue leakage lives. Trust (SESAME): a proposed ESAM security profile adding identity, replay protection, and authorization to the messaging layer. Hard to copy.

Wedge 03

SGAI-native, render-mode-agnostic core

Run SSAI and SGAI from one stack, with no rebuild when the standard shifts. 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

Stop paying for impressions you can't prove. First-class per-session telemetry and automatic ad-server reconciliation target the impression-discrepancy leakage, the disputes and makegoods, 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

Honor blackouts, affiliate swaps and regional rules automatically. 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

Plug into the ad servers and players you already run. 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.

The architecture

One decision & tracking path. Two render modes.

SCTE-35 in, ad-conditioned manifest out. If you own ad ops, the takeaway is short: every break resolves to something playable and every impression is logged. If you own the architecture, here is exactly how, and where each guarantee is enforced.

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.
Enforced, not promised
async fn decide(&self, avail: &Avail, ctx: &SessionCtx) -> AdDecision;

Ad decisioning is structurally infallible. The signature returns AdDecision, not Result, so it has no error variant: timeout, underfill, or an upstream ad-server failure returns AdDecision::no_fill, which the renderer converts into slate or fallback output. "Never errors" is a compiler guarantee here, not a hope.

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
Who it's for

Built for the operators the incumbents priced out, where margin leaks most.

Small and mid-size 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.

Use case

FAST channels

Margin at scale. High break volume across many low-ARPU channels means per-stream cloud cost and unfilled avails compound fast. Independence and full fill protect the spread.

Use case

Live & niche sports

Frame-accurate breaks. Tight, high-value windows where a missed SCTE marker or a late ad is lost inventory. Conformance and slate keep every break clean.

Use case

Affiliate replacement & regionalization

Rights enforced automatically. Blackouts and regional swaps driven by POIS policy, so the right ad airs in the right market without manual glue.

Use case

Sovereignty-sensitive operators

Your data, your iron. Run the whole control plane on infrastructure you control, with no viewer or signaling data leaving your boundary.

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. Each item is tagged by how far along it is.

IMPLEMENTED shipping  ·  PROTOTYPE / MVP TARGET in progress  ·  PLANNED / ROADMAP / ARCHITECTURE-READY ahead  ·  PHASE 2 / PROPOSED CONCEPT on the design board

Inputs
SCTE-35 in-band spliceIMPLEMENTED SCTE 130-3 ESAM conditioningPROTOTYPE SCTE-224 / ESNI scheduling & policyPLANNED
Ad decisioning
VAST 3/4 · VMAP ad decisioningIMPLEMENTED Google DAI Pod Serving interopMVP TARGET
Render outputs
HLS (RFC 8216) manifest controlIMPLEMENTED Apple HLS Interstitials SGAIIMPLEMENTED MPEG-DASH multi-period · emsgARCHITECTURE-READY LL-HLS low-latencyROADMAP
Proof & measurement
IAB OMID · Nielsen DAR verificationPHASE 2 ESAM security (SESAME)PROPOSED CONCEPT
The loop, end to end

Signal, decision, insertion, proof.

The same loop runs whether you output SSAI or SGAI: signal in, decision and policy, conditioned ad, rendered break, and a receipt at the end.

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

Creative compatibility is enforced at the boundary: ads are conditioned to the content's rendition ladder by a pluggable Transcoder (ffmpeg baseline), or rejected, with slate fallback when conditioning can't complete safely.

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.

Bring a live HLS feed with SCTE-35. We'll show you the break, stitched or via interstitials, with the audit trail.