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

SettingDefaultPurpose
Operation ModeRecord 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)6Hours 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.

WorkerMin defaultMax default
Clipper15
S3 Mover13
Uploader13
Blue Alliance12
Slack Notifier12
Signage Controller11
Restream Pusher11

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

SettingDefaultPurpose
Active Poll Interval (s)30sHow often the platform polls the FIRST Events API for a currently-live event.
Idle Poll Interval (s)300sHow often it polls when nothing is live.
Wait for Match ScoresonHold an upload until the match API reports final scores (rechecked every 60s) rather than uploading before the score is official.
Default TimezoneAmerica/New_YorkUsed 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 Pollingoff / 12 hrsEnable/interval (hours) for proactively polling the FRC event schedule, separate from active-event polling.
FRC Off-Season Event PollingoffAdditional gate on top of FRC schedule polling specifically for off-season events — see Event Configuration Reference.
FTC Schedule Pollingoff / 12 hrsEnable/interval (hours), same idea as FRC.
FRC Season / FTC Season2026Under Season Selection: which competition season’s events to poll — a dropdown, not a plain field, with its own Refresh Now button.

Ingest

SettingDefaultPurpose
Stream Preview (stream_preview_enabled)offWhen 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-Reseton / 120sAutomatically 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 / 90sDisconnects 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 / 120sWhether 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 minCompletes 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)10How often, in seconds, the stream metrics poller reads a stream’s data from MediaMTX.
Sample History10How many recent samples are kept for the rolling average bitrate.
Raw Segments Length (min)60 minutesDuration of each raw recording segment on disk. Changing this restarts the rtmp-ingest deployment — expect a brief interruption to any stream currently connecting.

Clipping

SettingDefaultPurpose
Clip Padding Before (s) / Clip Padding After (s)30s / 60sExtra seconds captured before/after a match’s official window when cutting a clip.
Clipping Tolerance (s)10sHow 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)10sDelay before a dequeued clip job actually extracts its clip, so the raw recording segment has time to finish flushing to disk.
Max Clip Retries3How many times a failed clip extraction is retried before landing in Jobs as permanently failed.
Stale Clip Sweepon / 15 minA 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 Outoff / 14 frames eachOptional fade at clip start/end, in frames at the clip’s native frame rate.
Cleanup EFS After S3 MoveonDelete the on-disk copy once it’s safely in object storage.
Minimum free disk space (GB) on recordings volume before blocking new streams5 GBMinimum free space on the recordings volume before the platform blocks new streams rather than risk filling the disk mid-recording.

Branding

SettingDefaultPurpose
Post-Roll EnabledoffWhether the platform-wide post-roll asset is appended to clips.
Pre-Roll EnabledoffPlatform-wide kill switch for pre-roll application (per-Client assets and the per-event checkbox still apply on top of this).
Pre-Roll OverlayonAn 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_limit is 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.

Livestream Restreaming group:

SettingDefaultPurpose
Restream Integration EnabledoffSee the restream switches above.
YouTube Preview (Monitor Stream)offCreates 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)30Seconds between restream-pusher reconcile passes, which drive each push toward its desired state.
Restream Re-encode EnabledoffSee 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)15Seconds between api-server’s passes reconciling the platform’s YouTube Live broadcasts with YouTube.
Live Broadcast Quota Cost / Live Stream Quota Cost50 / 50Quota 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
    is lite_mode or full_power; it never runs in record_only regardless of this setting (see
    Architecture Overview).

Per-event Blue Alliance credentials are set from
Event Configuration Reference, not here.

Signage

SettingDefaultPurpose
Signage Integration EnabledoffPlatform-wide kill switch for the AbleSign signage integration.
Signage Poll Interval (s)120sHow 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)600sHow 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)300sHow 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:

    SettingDefault
    Output Resolution1920x1080
    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 ControlCBR (YouTube requires CBR for live streaming)
    Video Encoderauto (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 leading v, 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’s DEPLOYMENT.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.
  • 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:

SettingWhat 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