Skip to content

Runtime Settings Reference

Runtime settings are hot-reload settings stored in PostgreSQL. They are mainly for changing product policy while the service is running. They are different from YAML/env/CLI startup configuration:

TypeStorageHot reloadSuitable for
Startup configurationYAML, env, secret files, CLI flagsNo; usually requires restartPorts, database, Redis, secrets, TLS, data_dir, cache enablement
Runtime settingsPostgreSQL settings tableYes; replicas sync through LISTEN/NOTIFYRegistration, room creation, permission defaults, proxy switches, CORS, chat retention
Terminal window
synctv settings list
synctv settings get user.enable_password_signup
synctv settings update user --set enable_password_signup=true

If the command supports grouped --set form:

Terminal window
synctv settings update email --set whitelist_enabled=true --set whitelist=example.com

Check the current binary with synctv settings --help.

Runtime settings are written to PostgreSQL and propagated to other replicas through PostgreSQL LISTEN/NOTIFY.

Semantics:

  • Each setting key has a registered typed provider.
  • Writes are type-checked and value-validated before persistence.
  • Cross-key invariants use transactional validation, for example room.room_must_need_pwd and room.room_must_no_need_pwd cannot both be true.
  • If a replica misses notifications, it refreshes from a full snapshot.
KeyTypeDefaultValidationMeaning
server.allow_room_creationbooltrueboolWhether users can create rooms
server.max_rooms_per_useri64101..=1000Maximum rooms per user
server.max_members_per_roomi641001..=10000Maximum members per room
server.max_chat_messagesu64500<=10000; 0 means unlimitedService-level public chat message cap policy; cleanup uses chat.max_messages_per_room
KeyTypeDefaultMeaning
permissions.admin_defaultu64 bitmask1073741823Global default permissions for room admin
permissions.member_defaultu64 bitmask262143Global default permissions for room member
permissions.guest_defaultu64 bitmask511Global default permissions for room guest

Permission bitmask semantics are described in Rooms, Permissions, and Preferences.

KeyTypeDefaultValidationMeaning
room.disable_create_roomboolfalseboolDisable room creation
room.create_room_need_reviewboolfalseboolRequire review for room creation
room.room_ttli64 seconds172800>=0; 0 means never expireRoom auto-expiration time
room.room_must_need_pwdboolfalseMutually exclusive with room.room_must_no_need_pwdForce rooms to require passwords
room.room_must_no_need_pwdboolfalseMutually exclusive with room.room_must_need_pwdForce rooms to not require passwords
KeyTypeDefaultMeaning
user.enable_password_signupboolfalseAllow password signup, including legacy password and OPAQUE password registration
user.password_signup_need_reviewboolfalseRequire review for password signup
user.enable_email_signupboolfalseAllow email signup. Current email login only serves existing accounts; this switch is reserved for a future passwordless email account-creation endpoint
user.email_signup_need_reviewboolfalseRequire review for email signup
user.enable_webauthn_signupboolfalseAllow WebAuthn/passkey as the initial account registration method; authenticated passkey binding is not signup
user.webauthn_signup_need_reviewboolfalseRequire review for WebAuthn signup. The current review table does not store temporary WebAuthn credentials, so enabling this rejects new WebAuthn registrations
user.enable_guestbooltrueAllow guest capability

All registration modes are disabled by default. Production deployments should enable only the intended entry points and configure review independently for each mode.

KeyTypeDefaultMeaning
oauth2.providersJSON object{}OAuth2/OIDC provider instance registry. Each key is an instance name. Each value contains type, enable_signup, signup_need_review, and provider-private config

oauth2.providers is the only OAuth2 configuration entry point. Provider instances are no longer defined in the static config file, environment variables, or Helm values. Instance names may contain only ASCII letters, digits, _, and -, and must be at most 64 bytes. The outer envelope is fixed; the nested config object is parsed by the selected provider:

{
"github": {
"type": "github",
"enable_signup": true,
"signup_need_review": false,
"config": {
"client_id": "github-client-id",
"client_secret": "github-client-secret",
"redirect_url": "https://app.example.com/oauth2/callback"
}
},
"corp_oidc": {
"type": "oidc",
"enable_signup": false,
"signup_need_review": false,
"config": {
"client_id": "synctv",
"client_secret": "oidc-client-secret",
"issuer": "https://idp.example.com",
"redirect_url": "https://app.example.com/oauth2/callback"
}
}
}

A missing provider instance means that login entry point is unavailable. Missing or false enable_signup blocks first-time OAuth2 account creation while existing linked OAuth2 logins continue to work. signup_need_review=true stores first-time OAuth2 signup in the user registration review queue; approval creates the local account and OAuth2 binding.

User-level 2FA, notification preferences, and provider defaults are user preferences, not runtime settings. See Rooms, Permissions, and Preferences.

KeyTypeDefaultMeaning
proxy.movie_proxybooltrueAllow media proxy paths
proxy.live_proxybooltrueAllow livestream proxy paths
proxy.allow_proxy_to_localbooltrueAllow proxying to local or private targets

These are business proxy policy switches, not startup setting cache.proxy_slice_cache_enabled. Slice-cache enablement is startup-only.

KeyTypeDefaultMeaning
rtmp.custom_publish_hoststring""Custom publish host returned to stream publishers
rtmp.ts_disguised_as_pngboolfalseDisguise TS segments as PNG paths or responses
KeyTypeDefaultMeaning
email.whitelist_enabledboolfalseEnable email allowlist
email.whiteliststring""Email allowlist content as comma-separated domains or email addresses

When email.whitelist_enabled=true but email.whitelist is empty, no email domain is rejected. Matching is enforced only when the allowlist has entries.

SMTP host, password, and sender configuration remain startup settings. See Email and OAuth2.

KeyTypeDefaultMeaning
webrtc.external_ice_serversJSON/string structuretwo Google STUN entriesExternal ICE servers returned to native clients

Default value:

[
{ "urls": ["stun:stun.l.google.com:19302"] },
{ "urls": ["stun:stun1.l.google.com:19302"] }
]

Built-in STUN listener configuration is startup configuration. See WebRTC Configuration.

KeyTypeDefaultValidationMeaning
chat.max_messages_per_roomu64500<=100000; 0 means unlimitedMaximum retained chat messages per room
chat.message_retention_daysi64 days901..=3650Maximum chat message retention age
KeyTypeDefaultMeaning
cors.allowed_originsJSON/string structure[]Runtime CORS allowed origins for proxy-related paths

Main service startup CORS is server.cors_allowed_origins. Runtime CORS is for policy that can change while the service runs.

Terminal window
synctv settings update user --set enable_password_signup=true

Confirm Hot-Reload Scope

Ports, secrets, database, Redis, TLS, and cache enablement are startup configuration, not runtime settings.

Read Current Value

Run synctv settings get <key> before changing a value and keep it for rollback.

Watch Replicas

Multi-replica sync depends on PostgreSQL notifications; observe all replicas after changes.

Record Reason

Keep reasons for registration, room creation, proxy, and permission-default policy changes.