Skip to main content

Configuration & Server Arguments

Xenon is highly configurable to suit single-node, hub-node, or cloud deployments. You can configure Xenon using:

  1. Configuration File (Recommended for production)
  2. Runtime API (For dynamic updates)
  3. CLI Arguments (Good for quick testing)

1. Using Configuration File

We recommend using an Appium configuration file to manage complex settings.

server:
keepAliveTimeout: 800
basePath: /wd/hub
usePlugins:
- xenon
plugin:
xenon:
platform: both
maxSessions: 8
enableDashboard: true
bootedSimulators: true
aiProvider: gemini
# Local Ollama alternative:
# aiProvider: ollama
# aiModel: llava
# aiBaseUrl: "http://localhost:11434"
buildCleanupDays: 30

To run:

appium server --config xenon-config.yaml

2. Runtime Configuration (API)

Xenon exposes a REST API to update configuration at runtime. This is useful for adjusting timeouts or concurrency limits without downtime.

Endpoint: PUT /xenon/api/config

Example Request:

curl -X PUT http://localhost:4723/xenon/api/config \
-H "Content-Type: application/json" \
-d '{ "maxSessions": 12, "newCommandTimeoutSec": 120 }'

Response:

{
"success": true,
"config": { ... },
"restartRequired": false,
"message": "Configuration updated..."
}

Restart Required: Changing these properties via API will NOT take effect until a server restart:

  • hub
  • platform
  • bindHostOrIp
  • proxy
  • cloud
  • iosDeviceType / androidDeviceType

3. Master Parameters Reference

Below is the definitive list of all Xenon configuration parameters.

YAML KeyCLI FlagMandatoryType / ValuesDefaultDescription
Core Options
platform--plugin-xenon-platformNoandroid, ios, bothbothTarget platform for automation
maxSessions--plugin-xenon-max-sessionsNoNumber8Maximum concurrent sessions
enableDashboard--plugin-xenon-enable-dashboardNoBooleanfalseEnable the web dashboard interface
bindHostOrIp--plugin-xenon-bind-host-or-ipNoStringLocal IPInternal binding address
Device Filters
androidDeviceType--plugin-xenon-android-device-typeNoboth, real, simulatedbothAndroid device categories to include
iosDeviceType--plugin-xenon-ios-device-typeNoboth, real, simulatedbothiOS device categories to include
bootedSimulators--plugin-xenon-booted-simulatorsNoBooleanfalseUse only simulators already in Booted state
skipChromeDownload--plugin-xenon-skip-chrome-downloadNoBooleantruePrevent automatic Chromedriver fetching
hub--plugin-xenon-hubNoURLNoneHub URL when running in Node mode
AI & Self-Healing
enableSelfHealing--plugin-xenon-enable-self-healingNoBooleantrueEnable global locator auto-recovery
aiProvider--plugin-xenon-ai-providerNogemini, openai, anthropic, ollamageminiPrimary AI diagnostics provider
aiModel--plugin-xenon-ai-modelNoStringProvider defModel name override (e.g. gpt-4o)
aiBaseUrl--plugin-xenon-ai-base-urlNoURLNoneCustom API endpoint (e.g. for Ollama)
Database
databaseProvider--plugin-xenon-database-providerNosqlite, postgresqlsqliteState storage engine
databaseUrl--plugin-xenon-database-urlNoStringLocal DB PathConnection string or path
Cleanup & Retention
buildCleanupDays--plugin-xenon-build-cleanup-daysNoNumber30Build retention period in days
buildCleanupMaxCount--plugin-xenon-build-cleanup-max-countNoNumber100Max builds to retain in database
buildCleanupSchedule--plugin-xenon-build-cleanup-scheduleNoCron String0 0 * * *Cleanup job execution schedule
deleteBuildAssets--plugin-xenon-delete-build-assetsNoBooleantrueDelete video/screenshots during cleanup
Timeouts & Monitoring
deviceAvailabilityTimeoutMs--plugin-device-availability-timeout-msNoNumber300000Max wait for a free device (ms)
newCommandTimeoutSec--plugin-new-command-timeout-secNoNumber60Auto-release idle sessions (sec)
healthCheckIntervalMs--plugin-xenon-health-check-interval-msNoNumber86400000Frequency of device health audits
sessionHeartbeatIntervalMs--plugin-xenon-session-heartbeat-interval-msNoNumber30000Session health check frequency
enableJsonLogging--plugin-xenon-enable-json-loggingNoBooleanfalseFormat logs as structured JSON
healthCheckSchedule--plugin-xenon-health-check-scheduleNoCron StringCron form for health-check job; takes precedence over healthCheckIntervalMs when set
deviceAvailabilityQueryIntervalMs--plugin-device-availability-query-interval-msNoNumber10000Poll interval (ms) while a session waits for a free device
bootedEmulators--plugin-xenon-booted-emulatorsNoBooleanfalseDiscover only Android emulators that are already booted
simulators--plugin-xenon-simulatorsNoArray[] (all)Allow-list of iOS simulators (name + sdk). Empty = expose all.
emulators--plugin-xenon-emulatorsNoArray[] (all)Allow-list of Android emulator AVDs. Empty = expose all.
adbRemote--plugin-xenon-adb-remoteNoArray[]Remote ADB hosts in host:port form for cross-machine device discovery
removeDevicesFromDatabaseBeforeRunningThePlugin--plugin-xenon-remove-devices-...NoBooleanfalseWipe persisted Device table at startup (clean-slate discovery)
Autowait
autowait— (config-file only, object)NoObjectNoneImplicit-wait defaults for findElement / findElements and pre-action enabled checks. See Autowait. Object members: enabled, timeoutMs, intervalBetweenAttemptsMs, excludeEnabledCheck.
Network Interceptor
interceptor— (config-file only, object)NoObjectNoneServer-level interceptor defaults. See Network Interceptor for the per-session capability. Object members: enabled, bufferSize, captureBodies, includeHosts, excludeHosts, mocks.
Security
authDisabled--plugin-xenon-auth-disabledNoBooleanfalseDisable auth on /xenon/api/*. Local dev only.
tlsRejectUnauthorized--plugin-xenon-tls-reject-unauthorizedNoBooleantrueVerify TLS certs for internal outgoing requests. Set false only for dev/test.

Hub-node pair-auth credentials are configured via env vars (no CLI flag — these are secrets):

Env varSidePurpose
XENON_HUB_ACCESS_KEYnode (outbound)Access key the node sends in X-Xenon-Access-Key. Required alongside XENON_HUB_TOKEN.
XENON_HUB_TOKENnode (outbound)API token the node sends in X-Xenon-Token. Mint via /profile on the hub.
XENON_BOOTSTRAP_ADMIN_EMAIL / XENON_BOOTSTRAP_ADMIN_PASSWORDhubFirst-run super-admin user created on first boot. Defaults admin@xenon.local / Admin@123 — change in any non-throwaway environment.
XENON_AUTO_MIGRATEhubWhen true (default), the hub auto-applies pending schema changes on startup (prisma db push for SQLite, prisma migrate deploy for PostgreSQL). Set false for ops who run migrations externally via CI for auditable change-control.

See Security → Hub-node channel authentication for the full provisioning flow. | Hub-Node Tuning | | | | | | | sendNodeDevicesToHubIntervalMs | --plugin-xenon-send-node-devices-... | No | Number | 30000 | How often (ms) a node pushes its device list to the hub | | checkStaleDevicesIntervalMs | --plugin-xenon-check-stale-devices-... | No | Number | 30000 | How often (ms) the hub prunes silent nodes | | checkBlockedDevicesIntervalMs | --plugin-xenon-check-blocked-devices-... | No | Number | 30000 | Cadence for re-evaluating manually-blocked devices | | remoteMachineProxyIP | --plugin-xenon-remote-machine-proxy-ip | No | String | — | Public host/URL clients should use to reach this node when behind a proxy |


4. Environment Variables

Some advanced features are configured via environment variables.

AI & Diagnostics

VariableDescriptionDefault
GEMINI_API_KEY or XENON_GEMINI_API_KEYGoogle Gemini API key
OPENAI_API_KEY or XENON_OPENAI_API_KEYOpenAI API key
ANTHROPIC_API_KEY or XENON_ANTHROPIC_API_KEYAnthropic API key
XENON_AI_PROVIDERAI provider: gemini, openai, anthropic, ollamagemini
XENON_AI_MODELUniversal AI model override (all providers)Provider default
XENON_GEMINI_MODELGemini-specific model (e.g., gemini-3-flash-preview)
XENON_OPENAI_MODELOpenAI-specific model (e.g., gpt-4o)
XENON_ANTHROPIC_MODELAnthropic-specific model
XENON_OLLAMA_MODELOllama-specific model (e.g., llava)
XENON_AI_BASE_URLCustom base URL (for self-hosted Ollama)

→ See AI Features for full provider documentation.

Database

VariableDescriptionDefault
DATABASE_URLPostgreSQL or SQLite connection stringfile:~/.cache/xenon/xenon.db
XENON_DB_PROVIDERDatabase provider (sqlite or postgresql)sqlite

→ See Deployment Guide for database setup instructions.

Observability

VariableDescriptionDefault
OTEL_EXPORTER_OTLP_ENDPOINTOpenTelemetry collector endpoint (e.g., http://jaeger:4318/v1/traces)
XENON_OTEL_DEBUGLog traces to console for debuggingfalse

Cloud & Proxy

Xenon also supports cloud and proxy configurations. See the Cloud Execution and Deployment Guide for structure.