client.preferences holds per-client defaults the SDK reads when
no per-call options override them: which mic / camera to use, whether
to receive video by default, ICE / recovery tuning, codec ordering,
and custom userVariables attached to every call. Preferences live
in the browser, optionally persist to localStorage, and are
distinct from per-User configuration (which lives on the
platform — see Users).
This page covers how preferences fit into the SDK lifecycle. For the
full property list, see ClientPreferences.
Anything set on preferences applies to every subsequent
dial() that doesn’t pass a competing field.
Per-call options always win:
Use preferences for app-wide defaults (codec ordering, a tier-wide
userVariables payload). Use per-call options for situational values.
By default, preferences live in memory only. Set
savePreferences: true to hydrate from localStorage on startup and
write back on every setter:
Persisted: timeouts, ICE settings, codec preferences, device-management
flags, and userVariables — anything cleanly JSON-serializable.
Not persisted: MediaDeviceInfo references. Device IDs aren’t stable
across sessions in every browser, so device picks happen at runtime
via the device controller.
For a different storage backend (IndexedDB, server-side per user),
leave savePreferences off and mirror manually:
ClientPreferences is a synchronous object — there is no update$
observable. Preferences are read at dial time.
userVariablesuserVariables is a free-form payload attached to every outbound
Verto invite. The receiving side (an AI agent, a SWML script, a
backend) reads it via signalwire-address:event events.
Set on preferences for app-wide values; pass to dial() for per-call
attribution.
Timeouts on the preferences surface are exposed in seconds (stored as milliseconds internally):
Other fields use the unit of the underlying API (kbps, integer levels, etc.).
ClientPreferences — the property surfaceSignalWire.preferences — the instanceSignalWireOptions — savePreferences, skipDeviceMonitoring, reconnectAttachedCalls, persistSessionSignalWire.dial() — per-call overrides