Contents
General
Scaling
Match Polling
Ingest
Clipping
Branding
YouTube
Blue Alliance
Signage
OBS
Slack
Test Mode
Settings That Change What Operators See
The system admin Settings page is organized into tabs, one row per setting. Every setting here
is system-admin-only — there’s no client-level equivalent for anything on this page. This is a
field-by-field reference; for the workflows that actually change these day-to-day, see
System Admins and Test Mode and
Monitoring and Troubleshooting.
If a value is refused when you save it, the reason also appears under that setting’s row.
General
| Setting | Default | Purpose |
|---|---|---|
| Operation Mode | Record Only (record_only) | See Architecture Overview for exactly what each of the three modes (Record Only, Lite Mode, Full Power) does. Rendered as a 3-button mode card, not a dropdown. |
| Sweep Interval (hours) | 6 | Hours between automatic orphan-file sweeps of clips and raw recordings. Set to 0 to disable. A Sweep Now button runs one immediately without waiting for the interval. |
Switching out of record_only doesn’t retroactively push out deferred uploads by itself. While
uploads are deferred, the General tab shows a banner: “⚠️ N uploads are currently deferred due to
operation mode.” In Record Only it adds “Switch to Lite Mode or Full Power, then release from
the Jobs page.”; in the other modes it points you to the Upload Deferred queue on the Jobs page.
The release actions live there, on the queue:upload-deferred card: Release Mode Deferred,
Release Paused, and a per-row Force Release — see
Monitoring and Troubleshooting.
Scaling
One row per background worker, each a min / max replica count pair. Saving a row directly
patches that worker’s Kubernetes Deployment replica count — there’s no real autoscaler behind this;
raising the minimum scales up immediately, lowering the maximum only clamps down if the worker is
currently above it.
| Worker | Min default | Max default |
|---|---|---|
| Clipper | 1 | 5 |
| S3 Mover | 1 | 3 |
| Uploader | 1 | 3 |
| Blue Alliance | 1 | 2 |
| Slack Notifier | 1 | 2 |
| Signage Controller | 1 | 1 |
| Restream Pusher | 1 | 1 |
If a queue is backing up and its worker is already at its max, raise the max here before assuming
something is broken — see
Monitoring and Troubleshooting.
Match Polling
| Setting | Default | Purpose |
|---|---|---|
| Active Poll Interval (s) | 30s | How often the platform polls the FIRST Events API for a currently-live event. |
| Idle Poll Interval (s) | 300s | How often it polls when nothing is live. |
| Wait for Match Scores | on | Hold an upload until the match API reports final scores (rechecked every 60s) rather than uploading before the score is official. |
| Default Timezone | America/New_York | Used when an event’s own FIRST Events API data doesn’t specify a recognizable IANA timezone. See Event Configuration Reference for where this shows up on an event. |
| FRC Schedule Polling | off / 12 hrs | Enable/interval (hours) for proactively polling the FRC event schedule, separate from active-event polling. |
| FRC Off-Season Event Polling | off | Additional gate on top of FRC schedule polling specifically for off-season events — see Event Configuration Reference. |
| FTC Schedule Polling | off / 12 hrs | Enable/interval (hours), same idea as FRC. |
| FRC Season / FTC Season | 2026 | Under Season Selection: which competition season’s events to poll — a dropdown, not a plain field, with its own Refresh Now button. |
Ingest
| Setting | Default | Purpose |
|---|---|---|
Stream Preview (stream_preview_enabled) | off | When on, any member of the owning Client, Readonly included, can watch the live preview in the Control Center. When off, only system admins can; everyone else sees ”🔒 Live preview turned off by system administrators”. |
| Stale Session Auto-Reset | on / 120s | Automatically reset a stream-auth session that’s gone stale for longer than the timeout. |
Recording Health Auto-Kick (recording_wedge_auto_kick, Timeout (s) recording_wedge_timeout_s) | on / 90s | Disconnects a publisher that’s still connected to MediaMTX when either its inbound bytes or the size of its open recording file stop growing for longer than the timeout. It’s measured per session and connection, once the session is at least that old. The encoder reconnects and a new session starts. |
| Keyframe Interval Check / Interval (s) | off / 120s | Whether stream-auth periodically probes each active stream’s keyframe interval via ffprobe. Off by default because the probe is memory/CPU-intensive; turning it on is what enables the keyframe-interval health-check warning described in Monitoring and Troubleshooting. While it’s off, the warning’s Re-check action is disabled with ”🔒 Turned off by system administrators” for everyone, system admins included. |
Event Auto-Complete (event_auto_complete, Grace (min) event_auto_complete_grace_min) | on / 120 min | Completes an in-progress event once its stream window ended more than the grace ago, it has had no status change for the same time, and no recording session is open. A live event is never touched, so a running feed is never cut: once the feed ends the event is in progress and a later pass completes it. Test events are left alone. Each completion is recorded in the audit log as a “system” actor named “Event Auto-Complete”. With this on, nothing needs a manual close; a Client Admin can still Reopen a completed event. |
| Stream Sample Rate (s) | 10 | How often, in seconds, the stream metrics poller reads a stream’s data from MediaMTX. |
| Sample History | 10 | How many recent samples are kept for the rolling average bitrate. |
| Raw Segments Length (min) | 60 minutes | Duration of each raw recording segment on disk. Changing this restarts the rtmp-ingest deployment — expect a brief interruption to any stream currently connecting. |
Clipping
| Setting | Default | Purpose |
|---|---|---|
| Clip Padding Before (s) / Clip Padding After (s) | 30s / 60s | Extra seconds captured before/after a match’s official window when cutting a clip. |
| Clipping Tolerance (s) | 10s | How much shorter than expected a clip’s actual duration can be before it’s held in Needs Review instead of being queued for upload automatically — see Clips, Uploads and Signage. A User or above (or a system admin) then approves it for upload or discards it; the platform no longer deletes short clips and marks the match missed on its own. |
Auto-Discard Needs-Review Clips (days) (needs_review_auto_discard_days) | 0 (never) | In its own Needs Review section of the Clipping tab. When set to N, a clip still sitting in Needs Review after N days is discarded automatically — same outcome as a manual Discard — and recorded in the audit log with the setting itself as the actor, shown as a “system” actor in the admin audit log. The Settings page refuses a value outside 0–3650 with “needs_review_auto_discard_days must be between 0 and 3650”. Each hourly pass discards at most 200 clips, oldest first, so a larger backlog clears over several passes rather than all at once. |
| Start Delay (s) | 10s | Delay before a dequeued clip job actually extracts its clip, so the raw recording segment has time to finish flushing to disk. |
| Max Clip Retries | 3 | How many times a failed clip extraction is retried before landing in Jobs as permanently failed. |
| Stale Clip Sweep | on / 15 min | A clip job stuck past this timeout is treated as failed and swept (ffmpeg itself times out at 10 minutes; 15 gives overhead). |
| Fade In / Fade Out | off / 14 frames each | Optional fade at clip start/end, in frames at the clip’s native frame rate. |
| Cleanup EFS After S3 Move | on | Delete the on-disk copy once it’s safely in object storage. |
| Minimum free disk space (GB) on recordings volume before blocking new streams | 5 GB | Minimum free space on the recordings volume before the platform blocks new streams rather than risk filling the disk mid-recording. |
Branding
| Setting | Default | Purpose |
|---|---|---|
| Post-Roll Enabled | off | Whether the platform-wide post-roll asset is appended to clips. |
| Pre-Roll Enabled | off | Platform-wide kill switch for pre-roll application (per-Client assets and the per-event checkbox still apply on top of this). |
| Pre-Roll Overlay | on | An overlay behavior for how pre-roll is composited — leave on unless you have a specific reason to change it. |
Pre-roll and post-roll video files themselves are uploaded from the admin Clients page (per-Client
pre-roll) and this Settings page’s asset uploader (platform-wide post-roll), not typed in as
settings — see
Branding.
Each file is capped at 100 MB by the application itself; the ingress proxy in front of it allows a
little more headroom (up to 110 MB) before rejecting anything larger outright with an immediate HTTP
413, so a file just over the 100 MB app limit but still under 110 MB reaches the application and gets
rejected there instead. Every other request to the platform is capped at 4 MB by the same proxy. If
you or a Client Admin see a 413 on a branding upload, re-export the video smaller rather than
retrying the same file.
YouTube
-
Quota Throttle (with Daily Limit) — the platform’s YouTube Data API usage is a single
system-wide daily quota, not a per-Client quota.youtube_quota_throttle_enabled(default on)
turns throttling on at all;youtube_daily_quota_limitis the budget itself, in units/day — set
it to match whatever daily quota Google has actually granted your API project, not a guess. When
the budget is nearly spent, uploads across every Client can show as paused — see
Clips, Uploads and Signage.
Per-action costs are also settings, not hardcoded: a video upload costs 100 units and a
playlist insert costs 50 units by default; the live-broadcast and live-stream costs (50 units each
by default) are explicitly marked in the platform as provisional estimates, since YouTube doesn’t
publish an official figure for those two. -
Upload Privacy — default
unlisted(options:public,unlisted,private) for videos the
platform uploads. -
Auto Token Refresh — on by default, with a configurable Window (min) (default 15
minutes before expiry) and a Token Expiry Fallback (s) (default 3600s) for channels that don’t
report their own token lifetime. -
Description Footer — text appended to every uploaded video’s description; blank by default.
-
Max Upload Retries / Deferred Check Interval (min) — default 3 retries; deferred (mode-blocked)
uploads are re-checked for release every 60 minutes by default. -
Restream switches — three independent on/off switches. Which of the first two applies to a
given event is decided by that event’s own restream mode (None, YouTube channel
(system-managed broadcasts), or Manual RTMP key):- Manual-Key Re-Streaming (
manual_key_restream_enabled, default on) — a kill switch for
events set to Manual RTMP key mode, where the push goes straight to a pasted stream key
entered as a restream key. - Restream Integration Enabled (
restream_integration_enabled, default off, in the
Livestream Restreaming group) — governs the platform-managed path used by events set to
YouTube channel (system-managed broadcasts) mode, which creates one YouTube broadcast per
broadcast day through YouTube’s Live Streaming API. This is the standard, supported way an event
restreams to YouTube; the setting simply ships off in a fresh install, and is expected to be
turned on in production. While it’s off, Start Push and Go Live are disabled with
”🔒 Turned off by system administrators”; Stop Push and Stop Broadcast still work. - Restream Re-encode Enabled (
restream_reencode_enabled, default off) — see
Re-encoding Restreamed Sources below.
The first two are not interchangeable and don’t have to be set the same way.
- Manual-Key Re-Streaming (
Livestream Restreaming group:
| Setting | Default | Purpose |
|---|---|---|
| Restream Integration Enabled | off | See the restream switches above. |
| YouTube Preview (Monitor Stream) | off | Creates YouTube broadcasts with YouTube’s private preview, so operators can check picture and sound in YouTube Studio before the broadcast goes public. With it on, a broadcast moves into the preview by itself once the push is running and YouTube is receiving it, and stays there until Go Live; operators also get an End preview button. It applies only to broadcasts created after the change, because YouTube fixes it per broadcast at creation: replace an existing broadcast to change it. Previews still open when an event completes are ended automatically. See The YouTube Preview. |
| Restream Poll Interval (s) | 30 | Seconds between restream-pusher reconcile passes, which drive each push toward its desired state. |
| Restream Re-encode Enabled | off | See Re-encoding Restreamed Sources. |
Restream Hold Timeout (s) (restream_hold_timeout_s) | 600 | ”How long (in seconds) restream-pusher holds a YouTube push open on a generated slate after the OBS source drops, before giving up and marking the push as errored.” It also bounds how long a push waits for a source that never started publishing. Operators see it as the “gives up in m:ss” countdown on the Holding — standby slate on YouTube row. |
| YouTube Live Reconcile Interval (s) | 15 | Seconds between api-server’s passes reconciling the platform’s YouTube Live broadcasts with YouTube. |
| Live Broadcast Quota Cost / Live Stream Quota Cost | 50 / 50 | Quota units counted per live-broadcast write call (insert, bind, transition) and per live-stream call — provisional estimates, see Quota Throttle above. |
Re-encoding Restreamed Sources
Restream Re-encode Enabled is off by default; enable it only if your source isn’t copy-safe for
YouTube’s ingest (for example, its keyframe interval/GOP), since re-encoding costs CPU.
- Off (copy mode): video and audio pass through unchanged. H.264, AV1, HEVC and VP9 video all
reach YouTube without transcoding, including AV1, HEVC and VP9 sent by OBS’s Enhanced RTMP
output; VP8 is refused. Audio must already be AAC. After a change of source codec, have an
operator confirm picture and sound in YouTube Studio. - On: every source is re-encoded, H.264 included, within its own codec family — H.264 → H.264,
AV1 → AV1, VP9 and VP8 → VP9 — except HEVC, which becomes H.264 because the image has no HEVC
encoder. Audio is always re-encoded to AAC. VP8 can be pushed only with re-encode on.
Turning re-encode on also skips the whole YouTube-ingest-compatibility health check, the keyframe
check included — see
Source Codec Rules.
Blue Alliance
- Blue Alliance Enabled — default off. When on, the platform submits match video links to
The Blue Alliance’s Trusted API after a successful YouTube upload — but only while Operation Mode
islite_modeorfull_power; it never runs inrecord_onlyregardless of this setting (see
Architecture Overview).
Per-event Blue Alliance credentials are set from
Event Configuration Reference, not here.
Signage
| Setting | Default | Purpose |
|---|---|---|
| Signage Integration Enabled | off | Platform-wide kill switch for the AbleSign signage integration. |
| Signage Poll Interval (s) | 120s | How often signage-controller runs a pass. Every pass refreshes each Client’s sign list and online status, and checks the signs an event is currently controlling. Minimum 10. |
Signage Poll Interval, Uncontrolled Signs (s) (signage_uncontrolled_poll_interval_s) | 600s | How often signs that no event is controlling are checked for drift and re-applied. A change made to one of these signs from the platform is still applied straight away; only the routine check is slower. A sign an event takes control of moves to the faster interval on the next pass. Minimum 10. |
| Signage Offline Threshold (s) | 300s | How long a sign can go without checking in before it’s shown as offline. |
| Signage Idle Footer Text | ”FIRST Chesapeake Event Streaming Services” | Text shown on signage when idle (also used as the OBS Test Clock’s footer). |
Signage Drift Action (signage_drift_action) | Leave (mark Drifted) | What happens once a sign is confirmed Drifted (3 consecutive polls all show this platform’s item missing from its AbleSign playlist). Leave (mark Drifted) marks the sign Drifted and unmanaged until an operator clicks Re-apply. Reclaim (auto re-apply) re-applies the platform’s playlist item automatically, keeps the sign managed, and notes the reclaim in its status text; a failed automatic reclaim shows an error with the reason and retries on the next poll. |
Each adopted AbleSign sign gets its own web app and playlist once, when it’s adopted; later display
changes only update that web app.
Per-sign assignment is done from
Clips, Uploads and Signage.
OBS
-
Encoder Profile — the output settings pushed to every paired OBS plugin the next time it
checks in. These are the actual values applied, not just a recommendation:Setting Default Output Resolution 1920x1080 Frame Rate (fps) 30 fps Video Bitrate (kbps) 4500 kbps (the platform’s own note: YouTube recommends 3000–6000 kbps for 1080p30 live) Keyframe Interval (s) 2s (YouTube requires ≤ 4s) Rate Control CBR (YouTube requires CBR for live streaming) Video Encoder auto(or force x264 / NVENC / QuickSync / AMF)Audio Bitrate (kbps) 128 kbps Audio Sample Rate (Hz) 44100 Hz -
Plugin Distribution — Plugin Release Repo (
obs_plugin_github_repo), the GitHub repo the
Download button pulls the latest release from (its description reads “owner/repo hosting the
plugin installers as GitHub Releases (e.g. your-org/your-plugin-repo). Only the owner/repo shape
is checked when saving — a well-formed but incorrect value won’t be caught until a plugin
download is attempted.”); Minimum Plugin Version (advisory only — older
plugins still work but show an update banner); Update Check Interval (h), how often the plugin
checks for updates (default every 6 hours); and Plugin Downloads Enabled, a switch to disable
the Download button entirely.- Minimum Plugin Version must be
X.Y.Z, with an optional leadingv, and is stored in that
canonical form; leave it empty for no minimum. Anything else is refused under the row with
“obs_plugin_min_version must be a version like 1.2.0 (X.Y.Z, optional leading v), or empty for
no minimum”. - The download comes from the latest GitHub release of the release repo, cached for 10 minutes.
Reading the release needs the deployment’s release-read token; without it, the plugin download
is unavailable. Deployment details are in the kube-match-splitter repository’sDEPLOYMENT.md,
for people with repository access. - Check now — “Look up the latest plugin release now instead of waiting for the 10-minute
cache.” The button reads Checking… while it runs. The result shows “Latest: vversion,
published date” with a Release notes link, plus ” — no Windows installer in this
release” if the release has no installer; “No release found”; and “Last successful check:
time”. Checks are limited to 10 per 10 minutes across all admins; beyond that you get “Too
many requests — try again shortly”. If no repo is set you get “No plugin release repository
is configured (obs_plugin_github_repo)”; if GitHub refuses the token, the error says GitHub
rejected the configured token.
- Minimum Plugin Version must be
-
Pairing — OBS Plugin Enabled, a platform-wide kill switch for the pairing API (off by
default); Pairing Code TTL (min) (default 15 minutes); Device Token Lifetime (days)
(default 365 days); and Token Rotation Grace Period (h) (default 24 hours) during which an old
and new device token both still work while a plugin picks up its refreshed token. See
OBS Plugin Devices for
the client-facing side of pairing.
Slack
Platform-wide notification toggles (admin notifications on by default, client notifications off by
default), plus the system Slack workspace connection and per-failure-type admin alert toggles (clip,
upload, storage-move, and Blue Alliance-submission failures) — all separate from a Client’s own
Slack workspace connection at
YouTube and Slack Integrations.
Test Mode
Settings that shape how test events (see
System Admins and Test Mode) behave, plus the OBS Test Clock’s own display options.
The tab has Test Event Uploads & Re-Streaming, Match Settings, Test Events and OBS Test
Clock sections and shows the OBS Test Clock URL.
- Test Event Uploads & Re-Streaming — Test Mode Uploads (
test_mode_upload_enabled,
default off) and Test Mode Re-Streaming (test_mode_restream_enabled, default off),
at the top of the tab. Test uploads need the first on and an Operation Mode other than
Record Only. The second applies to manual-key test events only, and only while
Manual-Key Re-Streaming is on; a YouTube-channel-mode test event restreams whenever
restreaming is enabled. - Match Settings — Match Length (seconds) (default 90), Dwell Time (seconds) — the
seconds between a test match’s end and its score being posted (default 10) — Cycle Time
(minutes), the minutes between test match starts (default 8.0), and First Match Delay
(seconds), the delay after the stream starts recording before match 1 (default 60). A line
under the fields checks that match length + dwell time fits within the cycle time. See
How Test Matches Are Scheduled. - Test Events — creating and listing test events.
- OBS Test Clock — 12-Hour Clock (default off, so 24-hour), Timezone (default UTC),
Show Color Bars and Show Diagnostics Row (both on by default), Beep Interval (s)
(default 10; 0 turns beeps off), Top-of-Minute Chime (on by default), 440Hz Reference
Tone (off by default), Audio Channel (both/left/right, default both) and Volume (%)
(default 20). See
OBS Test Clock.
Settings That Change What Operators See
Some settings show up for operators as a disabled control with a reason, or as a countdown. When a
Client asks why something is greyed out, check these first:
| Setting | What operators see |
|---|---|
| Restream Integration Enabled (off) | Start Push and Go Live disabled with ”🔒 Turned off by system administrators” |
| Keyframe Interval Check (off) | The keyframe warning’s Re-check disabled with ”🔒 Turned off by system administrators” |
| Stream Preview (off) | ”🔒 Live preview turned off by system administrators” instead of the preview |
| Restream Hold Timeout (s) | The “gives up in m:ss” countdown while a push is holding |