What it is

The EBU's white paper The Dynamic Media Facility: Reference Architecture v2.0 describes how a broadcast facility can be built from software instead of fixed hardware. Productions are workloads: they are designed, given resources, run on shared compute, and torn down when they're done. Inside the facility, media moves between functions through the Media eXchange Layer (MXL) rather than across cables or the network.

The white paper is a reference architecture, not a product. This project is an attempt to make it real on one machine, end to end, with real software. It has two parts:

Design

DMF Toolkit

A web app for designing a workload. You place products on a canvas (a vision mixer, camera sources, an SRT encoder at the edge), configure them and wire them together. Then you publish the result as an XML desired state.

React, TypeScript, React Flow, and a small Node API with SQLite.
Source on GitHub

Deploy

DMF Orchestrator

Builds the facility and runs what the Toolkit publishes. It compiles the XML, checks that the facility can run the design, then provisions it on Kubernetes, with MXL shared memory carrying the media between functions.

Python, Terraform, Ansible, k3s, Helm, Keycloak and Prometheus.
Source on GitHub

The media function in every production is SwitchFrame, an open-source software vision mixer, built with MXL support. Camera and A/V sync test sources feed it through MXL SDK v1.1.0. The director operates it from a browser.

Why this was done

Both projects were built to see how DMF works in practice, and to gain a deeper understanding of the mechanics involved.

DMF has the potential to let anyone provision and launch a professional broadcast production environment with very little knowledge of the technologies that power it. That level of accessibility could lead to a wave of self-service, pay-as-you-go professional production products. In fact, there could be a broadcast app store, where media functions are purchased, downloaded and plugged into a DMF. There would be no need for a team of broadcast engineers to configure and maintain the production environment.

Physical broadcast facilities could become non-proprietary virtual hosting environments. Cloud hosting would be the ideal home for them, if cloud providers can bring down their notoriously high data transfer and egress costs.

Eventually, AI will be able to build, configure and manage DMF environments on its own. That seems inevitable.

Goals

Prove the architecture

Implement every layer of the reference architecture and the full workload lifecycle, from design to finalise, on one machine anyone can rebuild from scratch.

Say what, not how

The designer states intent and requirements. The orchestrator makes every infrastructure decision: ports, user IDs, memory sizes, containers and hosts.

Refuse early

A design the facility can't run is refused before anything changes, with every problem named at once. The Toolkit greys out options the facility can't honour.

Media on MXL only

Between functions, video and audio go only through MXL shared memory. The network carries only control traffic, browser monitoring and SRT at the edge.

Isolated productions

Each production gets its own namespace, resource reservation, network policy, sign-in roles and MXL Flow Domain.

Be honest about gaps

A compliance matrix maps each item in the reference architecture to what's built, and marks it met, partial or missing.

How it works

From design to on air

DesignProducts on a canvas in DMF Toolkit, wired and configured. Every save is a new revision.
Publish XMLA deterministic desired state, validated against a shared XML schema. Secrets are references, never values.
CompileChecked against the facility profile. User IDs, ports, hostname and memory sizes are allocated.
Plan & provisionCapacity is checked, the plan is reviewed, then Terraform and Helm bring the production up.

The Toolkit is a high-level declarative language, and the orchestrator is its compiler. The two sides share one XML schema and one facility profile: a list of what this facility can run. The Toolkit uses the profile to grey out options and say why. The compiler uses it to refuse anything that slipped through. Flow IDs come from the design, so they stay the same across revisions.

DMF Toolkit canvas: an A/V sync test source and an MXL test source wired by MXL bundles into a Switchframe node, with the product palette on the left and the workload panel on the right showing access roles, flow defaults and 'Ready to publish'
DMF Toolkit: two MXL test sources wired into SwitchFrame. The panel on the right sets who may operate the production and the default flow format, and shows whether the design is ready to publish.
Configuring Switchframe in DMF Toolkit: the Inputs tab, with SRT, MoQ, MXL and ST 2110 input types, two MXL sources in use, and per-source label, multiview position and alignment delay
Configuring a function: each product feature has its own tab. Here SwitchFrame uses two MXL sources, each with its own label, multiview position and alignment delay.

The six layers

The reference architecture describes a facility as six horizontal layers. This is what runs at each one:

Application & UI
SwitchFrame's browser UI behind single sign-on (Keycloak, TLS 1.3). Facility groups map to operator roles: director, audio, graphics, captioner and viewer.
Media Functions
The SwitchFrame vision mixer and MXL camera and A/V sync test sources, each a container packaged as a Helm chart.
Media Exchange
MXL SDK v1.1.0. Each production gets its own Flow Domain in shared memory, and every flow is registered in an NMOS IS-04 registry.
Container Platform
k3s with a namespace per production, resource quotas, default-deny network policy and admission rules that guard each Flow Domain.
Host Platform
Ubuntu 24.04, hardened and configured by Ansible, with PTP (SMPTE ST 2059) timing where the network card supports it.
Infrastructure
One workstation (bare metal or WSL2), or a lab of KVM virtual machines, described with Terraform.

Running across all six: orchestration (Terraform and Ansible, driven by make or the facility console), monitoring (Prometheus, Alertmanager, Grafana, Loki), and security (Keycloak, a local certificate authority, policy).

Inside one production

Camera 1
test pattern + tone
Camera 2
test pattern + tone
Sync source
flash + beep
MXL Flow Domain shared memory, owned by this production only
uncompressed 10-bit video · 32-bit float audio
SwitchFrame
vision mixer; programme written back to MXL
Browsers
low-res proxies over WebTransport
SRT / RTMP
contribution in, programme out

The sources write frames into the production's Flow Domain, and SwitchFrame reads them straight from memory. Nothing uncompressed crosses the network. The director sees compressed proxies in the browser. Outside sources reach the facility over SRT, and the programme can go out over SRT, RTMP or to a recording.

SwitchFrame running in the facility, signed in as director1 and LIVE: an MXL test source on preview, bars on programme, the source row with two MXL sources, and the audio mixer with meters for each MXL source and the master
SwitchFrame on air in the facility, signed in through single sign-on as the director. Both MXL sources are live in the source row and the audio mixer.

Keeping settings applied

SwitchFrame forgets destinations and recording when it restarts, and it resets an SRT source every time the encoder reconnects. So each production runs a small reconciler next to it. The reconciler applies the design's settings, reapplies them after any restart or reconnection, and applies a new revision without restarting anything when only settings changed. Unchanged settings are never sent again, so an operator's live changes stand.

The lifecycle

  1. Design
    Drawn in the Toolkit, published as XML
  2. Plan
    Compiled, capacity and clashes checked, changes shown
  3. Provision
    Flow Domain, namespace, sign-in and functions created
  4. Configure
    Connections made; reconciler applies every setting
  5. Operate
    Operators sign in and run the show
  6. Finalise
    Recordings, design, logs and state archived, then torn down

Each stage is a make target. The facility console is a local web page that shows the state of the facility and runs the same lifecycle from buttons. Each button types its command into a terminal on the page, so you see exactly what runs. Before anything is provisioned, a review dialog shows what the plan will create, change and restart.

The facility console: platform services all up, reserved CPU and memory, a workload ON AIR at revision 4, the archive of finalised runs with Redeploy buttons, the toolkit's publishable designs, a finished update that went through Import, Secrets, Plan, Review and Provision, and the terminal showing the provisioning output, the flow IDs and the play recap
The facility console: platform health and reserved capacity, a production on air, the archive, the Toolkit's designs, an update that has gone through Import, Secrets, Plan, Review and Provision, and the terminal where the commands run. Click to enlarge.

How it was built

Both projects were built with Claude, Anthropic's AI model, working in Claude Code, from the first canvas prototype to a working facility console. A human set the direction, made the design decisions and reviewed each stage. Claude wrote the code, the tests and the documentation, and ran the facility to check the results.

Write the definition first, then build in stages. The handover between the two projects was written down before any of it was coded: the XML contract, what happens to every SwitchFrame option, and a spec for each side. The build was then split into nine stages, each with its own self-contained prompt, run in a fresh session in the right repository. Each stage was reviewed before the next started. When the code disagreed with the definition, the disagreement was reported and the definition updated, never quietly worked around.
StageWhereResult
1ToolkitProduct options settled, feature toggles, test source modules
2ToolkitXML publishing, with the shared schema
3OrchestratorOffline compiler, with golden-file tests
4OrchestratorA Toolkit design runs from XML, matching the hand-written example
5OrchestratorReconciler, secrets, SRT, RTMP and recording
6OrchestratorRemaining settings wired through
7BothGreyed-out options, and a full end-to-end run from the Toolkit
8–9OrchestratorFacility console: status, terminal, lifecycle buttons and the deploy flow

Problems found and fixed

Running real software end to end turned up problems that no design document would have shown. Each fix is applied as a patch at build time, checks that the upstream code it changes is still the same, and runs upstream's own tests:

A/V offsetBeforeAfter
Programme on MXL66 to 195 ms+22 ms, steady
Programme in Chrome−371 to +422 ms26 to 29 ms, steady

The orchestrator also adds three small tools of its own. A flow agent registers every MXL flow with NMOS and exports per-flow metrics. An SSO bridge gives SwitchFrame single sign-on without patching it. An admission policy stops a production's containers from reaching any Flow Domain but their own.

Stack

DMF Toolkit
  • React 19, TypeScript, Vite, React Flow
  • Node 24 API with built-in SQLite
  • Product catalogs and a versioned feature library
  • XML output checked against the shared XSD
DMF Orchestrator
  • Python compiler and reconciler
  • Terraform, Ansible, k3s, Helm
  • MXL SDK v1.1.0, SwitchFrame, NMOS IS-04
  • Keycloak, cert-manager, Prometheus, Grafana, Loki

Results

In the end-to-end test, a production was designed and revised only through the Toolkit's API, then deployed with nothing typed by hand except passwords and secrets. It had an MXL test source, an SRT source, SRT output with AES encryption, RTMP output and recording. The run covered:

The same lifecycle then ran again from the facility console's buttons: deploy, a settings-only update, stop and start, finalise, and a redeploy from the archive.

Limits of a proof of concept