Skip to content

Replay (Operator UI)

The manager’s /replay page is the operator surface on top of the edge replay server. It gives you a JKL-style scrub timeline, a clip library, sport-tagging profiles, and a one-click push-to-air. This page is for the people in the chair during a live event — what each button does, every keyboard shortcut, and how the custom tag profiles work.

The page has three tabs — Live (the JKL scrub workspace, which is most of this page), Recordings, and Sync Groups. The active tab is carried in the URL, so /replay?node=…&flow=…&tab=recordings and /replay?tab=sync-groups are both linkable.

  • The edge node must advertise the replay capability — every release with the default feature set does.
  • The flow must have recording.enabled = true. Add it on the flow create / edit modal (the Recording sub-block).
  • Operators need at least the Operator role on the group that owns the node + flow.

To filter /admin/nodes to just the replay-capable edges, append ?capability=replay.

The /replay page is the per-flow scrub view:

/replay?node=<node-id>&flow=<flow-id>

Quickest way in: click any flow card with a ● REC (Recording) or ● PRE-ROLL chip on the dashboard — the chip is a deep-link to /replay.

The timeline shows the rolling buffer for the currently-recording flow. The vertical play-head sits on the cursor; live frames stream from the right.

Action Mouse Keyboard
Pause click play-head K
Play forward 1× L
Reverse scrub drag left J
Frame step back ,
Frame step forward .
Mark in click marker I
Mark out click marker O
Lock to live toggle the Lock-to-live checkbox

Lock to live keeps the play-head on the latest frame as new content arrives — useful when you want to stay in step with the broadcast and only break off to clip something on demand.

Replay page — live preview, JKL-scrub timeline with play-head, mark in/out, and the per-flow clip library

Below the timeline are four single-button quick-clip pills — 10s, 20s, 30s, 60s. Each one immediately creates a clip ending at the current play-head position with the corresponding lookback. Useful for the moment-of-action workflow where there’s no time to mark in/out manually.

Each button uses the active tag profile’s default tag (see below).

Once a clip exists, select it in the library and use:

  • [ to nudge the in-point later by 100 ms.
  • ] to nudge the out-point earlier by 100 ms.

Both keys trim the clip inward in 100 ms steps. Trims fire update_clip against the edge — SMPTE timecode strings are cleared on PTS trim because the index doesn’t store them.

The right-hand panel lists every clip in the current flow’s recording. It’s group-scoped — operators only see clips from flows their group owns.

Action How
Sort by header dropdown — Newest, Oldest, Name, Duration
Search the search box; case-insensitive substring across name + description + tags
Filter by tag click a tag pill at the top of the panel; clicks toggle inclusion / exclusion
Rename / re-describe row hover → pencil icon
Tag row hover → tag icon, or use the active profile’s hotkeys
Trim select row, then [ / ]
Delete row hover → trash, then confirm

The Push to air button on each clip row opens a flow-selector modal. Pick:

  • Target node + flow — any flow in the same group that the operator can edit.
  • Replace modeReplace input (swap the live input out, replace with this clip) or Add as new input (add the clip alongside, useful when running a multi-input flow).

The manager creates a replay-type input pointing at the clip on the source edge, attaches it to the target flow, and sets it active. From the operator’s POV: one click and the clip is on PGM. Returning to live is the same flow in reverse — a Return to live button appears once a replay input is active.

Tagging clips with sport-specific markers (GOAL, FOUL, OFFSIDE, …) lets you find them later by tag-pill filter. Tag profiles let each group define its own taxonomy; sport presets seed those profiles with sensible defaults.

A tag profile is a list of up to 9 tags, each [A-Z0-9_-]{1,32}. Each group can have up to 20 profiles, stored on groups.replay_tag_profiles as JSON:

[
{ "id": "soccer", "name": "Soccer", "tags": ["GOAL", "FOUL", "OFFSIDE", "SAVE", "YELLOW", "RED", "VAR-CHECK", "SUB", "OG"] },
{ "id": "studio", "name": "Studio default", "tags": ["INTERVIEW", "CLIP", "FAIL", "GAG"] }
]

The group’s default_replay_tag_profile_id selects which profile applies when an operator hasn’t picked one yet.

Each operator picks an active profile via the dropdown at the top of the /replay page; the choice is persisted into their own ui_preferences.replay_tag_profile_id (a JSON object keyed by group_id, so operators in multiple groups keep distinct preferences).

Number-row keys 1-9 apply the currently-active profile’s tag at index 0-8 to the selected clip (or the clip created by the next quick-clip press). Switching profiles instantly rebinds the hotkeys — no extra step.

For Soccer, 1 = GOAL, 2 = FOUL, 3 = OFFSIDE, …. For Studio default, 1 = INTERVIEW, 2 = CLIP, ….

The system ships a built-in catalogue at static/js/shared/replay_tag_presets.js covering: Soccer, Rugby Union, Rugby League, NFL, AFL, Cricket, Tennis, Basketball, Ice Hockey, Field Hockey, Volleyball, Badminton, Baseball, Netball, Handball, Combat Sports, Athletics, and a fall-through Generic profile. Group admins can copy any preset into the group as a new profile from Admin → Groups → <group> → Replay tag profiles → Import sport preset, then edit it freely.

The system Soccer preset is the NULL fallback when neither the group nor the operator has selected a profile — clicks just work.

The flow card on the dashboard shows one of three chips:

  • ● REC (red dot) — the writer is actively recording. recording_status.mode = "armed".
  • ● PRE-ROLL (amber dot) — the writer is rolling under the pre_buffer_seconds retention window, ready for an operator Start. recording_status.mode = "pre_buffer".
  • No chip — the writer is idle. recording_status.mode = "idle".

Older edges (Phase 1.0) only report a boolean armed — the manager falls back to a two-state Recording / Idle chip in that case.

The Recordings tab is the disk-side view: every on-disk recording across the replay-capable nodes you can see, grouped one section per node. Open a row to list its clips.

The difference from the Live tab is what it can reach. The Live tab works against the flow that is recording now; the Recordings tab lists recordings whose flow no longer has recording armed, and recordings whose flow has been deleted entirely — tick Orphans only to see just those. That is the tab to use when you need to get a clip off a node after the event has finished, or to reclaim disk.

Per row you can:

  • Export — the whole recording, or one clip, as MPEG-TS.
  • Download a clip directly.
  • Delete a recording. Select several and the bulk bar at the bottom shows how many you have picked and how many bytes they hold before you commit.

There is a search box that matches on recording id, flow and node.

A sync group is a named set of (node, flow) members — typically one main and several iso cameras — that record and mark together. Each edge still records its own flow independently; the manager is what makes one operator action land on all of them at once.

  • Start / Stop recording fan to every member in parallel. Each member gets a 10-second budget to acknowledge; the result panel reports per member, so one node that has gone quiet is named rather than silently skipped, and the rest still run.
  • Mark in / Mark out fan the same way and produce one synchronised clip set instead of N unrelated clips.
  • Play fires every member against a shared future start anchor — roughly 250 ms ahead of now — rather than telling each one “start now” as its command arrives. That is what keeps the members within about a frame of each other regardless of how much the WebSocket round-trip to each node varies, including across manager instances in an HA pair.

A sync group is tenant-owned, like a switcher preset: it belongs to one group and is only visible to that group’s members. Creating or editing one requires membership of the owning group plus Operate on every member node — authority over one camera is not authority over the set.

The old /sync-groups URL still works; it redirects to /replay?tab=sync-groups.

  • Edge replay — the on-disk format, recording configuration, error catalogue.
  • Switcher — the live PGM/PVW director console. Replay clips can be loaded onto PVW for same-style takes.
  • Routines — clips can be pushed to air on a cron schedule via the play_clip action type.
  • Multi-tenant Groups — clip libraries are group-scoped.