Skip to main content

Configuration Reference

This page covers all configurable settings for Otto: relay environment variables, CLI config file, extension runtime settings, and the build path contract.

Relay environment variables

Set these in the relay process environment before starting with otto start or otto relay:start.

VariableDefaultDescription
OTTO_RELAY_PORT8787Relay HTTP and WebSocket listen port
OTTO_TOKEN_SECRETauto-generatedJWT signing secret for all tokens
OTTO_TOKEN_PREVIOUS_SECRET(empty)Previous secret for rotation compatibility
OTTO_TOKEN_ISSUERotto-relayJWT iss claim
OTTO_TOKEN_AUDIENCEotto-clientsJWT aud claim
OTTO_TOKEN_TTL_MINUTES15Access token lifetime in minutes
OTTO_REFRESH_TTL_DAYS30Refresh token lifetime in days
OTTO_EXTENSION_ORIGIN(extension origin)Allowed origin for node WebSocket connections
OTTO_LOG_DIR~/.otto/relayDirectory for JSONL operation log files
OTTO_LOG_MAX_FILE_BYTES104857600 (100 MB)Max size per log file before spillover
OTTO_RATE_LIMIT_PER_MIN(runtime default)Max authenticated frames per session per minute
OTTO_REPLAY_WINDOW_MS60000Timestamp skew window for replay protection
OTTO_TAB_QUEUE_LIMIT(runtime default)Max queued commands per tab session
OTTO_CONTROLLER_QUEUE_LIMIT(runtime default)Max queued commands per controller session
OTTO_DEFAULT_CONTROLLER_SCOPES(runtime default)Scopes assigned to newly registered controller clients
OTTO_ALLOW_REMOTE_CONTROLLER_REGISTRATIONfalseSet to true to allow unauthenticated remote client registration
OTTO_CONTROLLER_REGISTRATION_SECRET(empty)Shared secret required for remote controller registration
OTTO_CONTROLLER_HEARTBEAT_INTERVAL_MS8000Heartbeat check interval for controller sessions
OTTO_CONTROLLER_HEARTBEAT_MISS_LIMIT3Number of missed heartbeats before controller is marked stale
warning

Set OTTO_TOKEN_SECRET explicitly in production. The auto-generated value is rotated on every relay restart, invalidating all existing tokens.

CLI config file

Path: ~/.otto/config.json

Managed by the otto config and otto client commands. Common fields:

FieldDescription
relayUrlWebSocket URL for the relay (e.g. ws://localhost:8787)
relayHttpUrlHTTP URL for the relay (e.g. http://localhost:8787)
nodeIdTarget node ID for CLI commands
clientIdRegistered controller client ID
accessTokenCurrent controller access token
refreshTokenCurrent controller refresh token
note

Do not edit ~/.otto/config.json directly. Use otto config to set relay URLs and otto client login to manage tokens.

Extension runtime settings

Stored in chrome.storage.* and managed from the extension popup and options pages.

SettingDescription
Relay URLWebSocket URL the extension node connects to
Node IDNode identity for this browser instance
Node token statePairing and auth token lifecycle
Reconnect stateOffscreen WebSocket reconnect backoff metadata
Local dev log streamingToggle to stream structured extension logs to relay (source=node)

Extension settings are intentionally independent from ~/.otto/config.json, even when both point to the same relay host.

Build path contract

Local extension build output path (used by otto extension update and otto setup):

extension/output/chrome-mv3

This path is the source for local extension loading instructions in Chrome.

Next steps