Selkies

Settings Reference

Every command-line option and environment variable of the selkies server, with its type and default.

Every setting below is one entry of SETTING_DEFINITIONS in src/selkies/settings.py, which is also what selkies --help prints. Each one is read with the precedence command-line flag > SELKIES_<NAME> environment variable > fallback environment variable (where one is listed) > built-in default. The flag accepts both spellings, --my-setting and --my_setting, and a bool flag takes a value (--enable-resize=false). A flag or variable set to an empty value means the built-in default; an unknown flag is ignored with a warning, never an error.

Value syntax

  • List/enum (e.g. SELKIES_ENCODER="jpeg,h264enc"): first item is the default, the full list is the allowed options; a single value locks the choice. Invalid items are dropped; an entirely-invalid override keeps the full built-in menu and default.
  • Bool (case-insensitive): "true"/"1" is on, anything else off; a "|locked" suffix (e.g. "true|locked") forbids the client changing it.
  • Range: "8-240" restricts the allowed span (initial value = built-in default, clamped in); a bare value "60" keeps the built-in span and makes it the initial value, widening the span if it falls outside (so legacy fixed-value configs still resolve); "60,8-240" sets initial and span in one value; a degenerate span "60-60" locks the setting.
  • An override set to "" means "use the built-in default"; list types keep their explicit ""/"none" = disable semantics.

Settings

SettingEnvironmentTypeDefaultDescription
--addrSELKIES_ADDRstr0.0.0.0Host address to start the streaming service, default: "0.0.0.0"
--portSELKIES_PORT, CUSTOM_WS_PORTint, 1 to 655358080Port to start the streaming service, default: "8080"
--unix-socketSELKIES_UNIX_SOCKETstr(empty)Unix socket path to start the streaming service; when set, a Unix domain socket is bound instead of the TCP addr/port pair.
--web-rootSELKIES_WEB_ROOTstr(empty)Path to directory containing web application files. Defaults to web files packaged with Selkies application
--audio-enabledSELKIES_AUDIO_ENABLEDbooltrueEnable server-to-client audio streaming. Disabling this will also disable microphone support.
--microphone-enabledSELKIES_MICROPHONE_ENABLEDboolfalseEnable client-to-server microphone forwarding.
--gamepad-enabledSELKIES_GAMEPAD_ENABLEDbooltrueEnable gamepad support.
--webcam-enabledSELKIES_WEBCAM_ENABLEDboolfalseEnable client-to-server webcam forwarding to the virtual V4L2 device.
--enable-clipboardSELKIES_ENABLE_CLIPBOARDstrtrueClipboard policy for both transports: "true" (both directions), "in" (client-to-server only), "out" (server-to-client only), "false" (disabled).
--command-enabledSELKIES_COMMAND_ENABLEDboolfalseEnable parsing of command websocket messages. Disabled by default for security; opt in with SELKIES_COMMAND_ENABLED=true (or --command-enabled true).
--webrtc-pacerSELKIES_WEBRTC_PACERbooltruePace outgoing WebRTC packets per transport with strict priorities (audio/RTCP > data-channel > video), an IDR-aware video queue budget and GOP-reset recovery, so audio and interactive signaling are protected from video bursts on congested links. Enabled by default; set SELKIES_WEBRTC_PACER=false to disable. SELKIES_WEBRTC_PACER_STALE_MS sets the stale-GOP purge deadline in milliseconds (0 = disabled).
--file-transfersSELKIES_FILE_TRANSFERSlist: any of upload, downloadupload,downloadAllowed file transfer directions (comma-separated: "upload,download"). Set to "" or "none" to disable.
--file-transfer-limit-mbpsSELKIES_FILE_TRANSFER_LIMIT_MBPSfloat, from 0.00.0Static file-transfer throttle in Mbit/s, one allowance shared by all downloads and uploads, for links whose rate the operator knows. 0 disables. The congestion-control pacing protects the video stream without it; the cap is chiefly for links its gauges cannot see, e.g. behind a reverse proxy.
--file-transfer-ccSELKIES_FILE_TRANSFER_CCbooltrueCongestion-control pacing for file transfers: a greedy transfer otherwise queues ahead of the video stream (bufferbloat) and the session stalls. Downloads are held inside a shared allowance that adapts from kernel queue depth (and RTT off-Linux); uploads back off the moment the uploader's own session round trip inflates past its floor, so they take whatever the uplink has spare and yield to the stream. Neither needs a link estimate. Behind a reverse proxy the download gauge measures only the hop to the proxy, so the static cap is the download lever there; the upload gauge times the client end to end and keeps working.
--framerateSELKIES_FRAMERATErange, within 8-24060Framerate: allowed range (e.g., "8-240"), initial value (e.g., "60"), or both ("60,8-240"); "60-60" locks.
--video-crfSELKIES_VIDEO_CRFrange, within 5-5025Video CRF (constant quality): allowed range (e.g., "5-50"), initial value (e.g., "25"), or both ("25,5-50"); "25-25" locks.
--video-bitrateSELKIES_VIDEO_BITRATErange, within 100-10000008000Video bitrate aka CBR, in kilobits per second (kbps): allowed range (e.g., "100-1000000"), initial value (e.g., "8000" for 8 Mbps, "250" for 250 kbps), or both ("8000,100-1000000"); "8000-8000" locks.
--rate-control-modeSELKIES_RATE_CONTROL_MODEenum: one of cbr, crfcrfRate control mode for the H.264 encoders (crf = constant quality/QP, cbr = constant bitrate). Honored for every H.264 encoder when enable_rate_control is true (the default).
--enable-rate-controlSELKIES_ENABLE_RATE_CONTROLbooltrueHonor the client-selected rate_control_mode (crf/cbr). Enabled by default so both modes are selectable; set false to lock the encoder to its built-in default.
--keyframe-intervalSELKIES_KEYFRAME_INTERVALfloat, 0.0 to 300.00.0Seconds between scheduled video recovery keyframes (any video codec). 0 (default) keeps the GOP infinite: keyframes are sent only on demand (client join/reset, keyframe requests), which keeps bitrate and quality steady.
--video-min-qpSELKIES_VIDEO_MIN_QPint, 0 to 510CBR-mode minimum H.264 QP (0 = encoder default). Raising it caps bit spend on easy content when the bitrate budget is generous.
--video-max-qpSELKIES_VIDEO_MAX_QPint, 0 to 510CBR-mode maximum H.264 QP (0 = encoder default). Lowering it keeps screen text legible under motion at the cost of overshooting the bitrate target on hard content (measured at 720p60 scrolling text: 35 lifts x264 by ~19 dB at ~2.5x the target).
--audio-frame-duration-msSELKIES_AUDIO_FRAME_DURATION_MSenum: one of 2.5, 5, 10, 20, 40, 6010Opus frame duration in milliseconds for server-to-client audio. Lower values cut audio latency (each frame must fill before it can be sent, and the client buffers a fixed number of frames) at a small bitrate-efficiency and packet-rate cost. On WebRTC the SDP ptime/minptime follow this value.
--audio-bitrateSELKIES_AUDIO_BITRATEenum: one of 32000, 48000, 64000, 96000, 128000, 192000, 256000, 320000, 384000, 510000, or any value from 6000 to 510000128000The default audio bitrate.
--audio-redundancySELKIES_AUDIO_REDUNDANCYbooltrueEnable Opus RED (RFC 2198) audio redundancy to cut dropouts/concealment under packet loss. On by default; carries prior frames as redundancy on WebRTC (browsers de-RED natively, plain-opus fallback for peers that decline) and, on WebSocket, is gated on every client supporting it.
--audio-redundancy-distanceSELKIES_AUDIO_REDUNDANCY_DISTANCEint, 0 to 42Number of prior Opus frames carried as RED redundancy when audio_redundancy is enabled (0-4; higher survives longer loss bursts at proportionally more bandwidth).
--is-manual-resolution-modeSELKIES_IS_MANUAL_RESOLUTION_MODEboolfalseLock the resolution to the manual width/height values.
--manual-widthSELKIES_MANUAL_WIDTHint0Lock width to a fixed value. Setting this forces manual resolution mode.
--manual-heightSELKIES_MANUAL_HEIGHTint0Lock height to a fixed value. Setting this forces manual resolution mode.
--scaling-dpiSELKIES_SCALING_DPIenum: one of 96, 120, 144, 168, 192, 216, 240, 264, 28896The default DPI for UI scaling.
--force-aligned-resolutionSELKIES_FORCE_ALIGNED_RESOLUTIONboolfalseForces the display resolution to be a multiple of 16 pixels.
--enable-binary-clipboardSELKIES_ENABLE_BINARY_CLIPBOARDbooltrueAllow binary data (e.g., images) on the clipboard.
--use-browser-cursorsSELKIES_USE_BROWSER_CURSORSbooltrueUse browser CSS cursors instead of rendering to canvas.
--use-css-scalingSELKIES_USE_CSS_SCALINGboolfalseHiDPI when false, if true a lower resolution is sent from the client and the canvas is stretched.
--ui-titleSELKIES_UI_TITLEstrSelkiesTitle in top left corner of sidebar.
--ui-show-logoSELKIES_UI_SHOW_LOGObooltrueShow the Selkies logo in the sidebar.
--ui-show-core-buttonsSELKIES_UI_SHOW_CORE_BUTTONSbooltrueShow the core components buttons display, audio, microphone, webcam, and gamepad.
--ui-show-sidebarSELKIES_UI_SHOW_SIDEBARbooltrueShow the main sidebar UI.
--ui-sidebar-show-video-settingsSELKIES_UI_SIDEBAR_SHOW_VIDEO_SETTINGSbooltrueShow the video settings section in the sidebar.
--ui-sidebar-show-screen-settingsSELKIES_UI_SIDEBAR_SHOW_SCREEN_SETTINGSbooltrueShow the screen settings section in the sidebar.
--ui-sidebar-show-audio-settingsSELKIES_UI_SIDEBAR_SHOW_AUDIO_SETTINGSbooltrueShow the audio settings section in the sidebar.
--ui-sidebar-show-statsSELKIES_UI_SIDEBAR_SHOW_STATSbooltrueShow the stats section in the sidebar.
--ui-sidebar-show-shortcutsSELKIES_UI_SIDEBAR_SHOW_SHORTCUTSbooltrueShow the keyboard shortcuts section in the sidebar (both dashboards honor this).
--ui-sidebar-show-clipboardSELKIES_UI_SIDEBAR_SHOW_CLIPBOARDbooltrueShow the clipboard section in the sidebar.
--ui-sidebar-show-filesSELKIES_UI_SIDEBAR_SHOW_FILESbooltrueShow the file transfer section in the sidebar.
--ui-sidebar-show-appsSELKIES_UI_SIDEBAR_SHOW_APPSbooltrueShow the applications section in the sidebar.
--ui-sidebar-show-sharingSELKIES_UI_SIDEBAR_SHOW_SHARINGbooltrueShow the sharing section in the sidebar.
--ui-sidebar-show-gamepadsSELKIES_UI_SIDEBAR_SHOW_GAMEPADSbooltrueShow the gamepads section in the sidebar.
--ui-sidebar-show-webcamSELKIES_UI_SIDEBAR_SHOW_WEBCAMbooltrueShow the webcam toggle among the core buttons (classic sidebar) and stream controls (wish top menu). Hides the control only; webcam_enabled governs whether the server accepts webcam frames.
--ui-sidebar-show-fullscreenSELKIES_UI_SIDEBAR_SHOW_FULLSCREENbooltrueShow the fullscreen button in the sidebar.
--ui-sidebar-show-gaming-modeSELKIES_UI_SIDEBAR_SHOW_GAMING_MODEbooltrueShow the gaming mode button in the sidebar.
--ui-sidebar-show-trackpadSELKIES_UI_SIDEBAR_SHOW_TRACKPADbooltrueShow the virtual trackpad button in the sidebar.
--ui-sidebar-show-keyboard-buttonSELKIES_UI_SIDEBAR_SHOW_KEYBOARD_BUTTONbooltrueShow the on-screen keyboard button in the display area.
--ui-sidebar-show-soft-buttonsSELKIES_UI_SIDEBAR_SHOW_SOFT_BUTTONSbooltrueShow the soft buttons section in the sidebar.
--enable-sharingSELKIES_ENABLE_SHARINGbooltrueMaster toggle for all sharing features.
--enable-collabSELKIES_ENABLE_COLLABbooltrueEnable collaborative (read-write) sharing link.
--enable-sharedSELKIES_ENABLE_SHAREDbooltrueEnable view-only sharing links.
--enable-player2SELKIES_ENABLE_PLAYER2booltrueEnable sharing link for gamepad player 2.
--enable-player3SELKIES_ENABLE_PLAYER3booltrueEnable sharing link for gamepad player 3.
--enable-player4SELKIES_ENABLE_PLAYER4booltrueEnable sharing link for gamepad player 4.
--debugSELKIES_DEBUGboolfalseEnable debug logging.
--modeSELKIES_MODEstrwebsocketsSpecify the mode: 'webrtc' or 'websockets'; defaults to websockets
--enable-dual-modeSELKIES_ENABLE_DUAL_MODEbooltrueEnable switching Streaming modes from UI
--audio-device-nameSELKIES_AUDIO_DEVICE_NAMEstroutput.monitorAudio device name for pcmflux capture.
--master-tokenSELKIES_MASTER_TOKENstr(empty)Master token to enable secure mode and protect the control plane API. Never sent to clients.
--enable-httpsSELKIES_ENABLE_HTTPSboolfalseEnable or disable HTTPS for the web application, specifying a valid server certificate is recommended
--https-certSELKIES_HTTPS_CERTstr/etc/ssl/certs/ssl-cert-snakeoil.pemPath to the TLS server certificate file when HTTPS is enabled
--https-keySELKIES_HTTPS_KEYstr/etc/ssl/private/ssl-cert-snakeoil.keyPath to the TLS server private key file when HTTPS is enabled, set to an empty value if the private key is included in the certificate Never sent to clients.
--cert-reload-intervalSELKIES_CERT_RELOAD_INTERVALint, from 030Seconds between checks for SSL certificate file changes when HTTPS is enabled, set to 0 to disable automatic certificate reloading
--enable-basic-authSELKIES_ENABLE_BASIC_AUTHbooltrueEnable basic authentication on the server. On by default, and the server refuses to start until a password is set through --basic-auth-password, SELKIES_BASIC_AUTH_PASSWORD, PASSWORD or PASSWD; pass --enable-basic-auth=false to serve without a login instead.
--basic-auth-userSELKIES_BASIC_AUTH_USER, CUSTOM_USER, USERNAME, USERstrubuntuUsername for basic authentication; resolves from the CUSTOM_USER, then USERNAME, then USER environment variables, and defaults to "ubuntu" when none is set. Never sent to clients.
--basic-auth-passwordSELKIES_BASIC_AUTH_PASSWORD, PASSWORD, PASSWDstr(empty)Password used when basic authentication is set; resolves from SELKIES_BASIC_AUTH_PASSWORD, then PASSWORD, then PASSWD, so an image that already names a container account password does not have to repeat it. There is no default: the server will not start with basic authentication enabled until one of these is set. Never sent to clients.
--basic-auth-viewonly-passwordSELKIES_BASIC_AUTH_VIEWONLY_PASSWORD, VIEWONLY_PASSWORDstr(empty)Optional second basic-auth password that grants view-only access. Clients authenticating with it are capped at the viewer role (no keyboard, mouse, clipboard, gamepad, or command input) regardless of the role they request, while the main password authorizes full control. Empty disables the split. Ignored in secure mode, where the master token governs roles. Never sent to clients.
--subfolderSELKIES_SUBFOLDER, SUBFOLDERstr(empty)URL path prefix the server is reverse-proxied under; prepended to every route (websockets, tokens, metrics, static files). Slashes are optional, so "desk", "/desk" and "/desk/" are the same prefix and "/" is the root. The web client reads its own prefix from the URL it was loaded from, so only the server needs telling.
--run-after-connectSELKIES_RUN_AFTER_CONNECTstr(empty)Shell command run after the first client has connected ('' = off); runs again each time a client connects while no others are connected.
--run-after-disconnectSELKIES_RUN_AFTER_DISCONNECTstr(empty)Shell command run after the last client has disconnected ('' = off), including on server shutdown while clients are connected.
--encoderSELKIES_ENCODERenum: one of h264enc, h264enc-striped, jpegh264encThe default video encoder: h264enc is full-frame H.264 on NVENC or VA-API, falling back to the software encoder pixelflux was built with (x264, or OpenH264 in a GPL-free build); h264enc-striped is CPU-striped H.264 on that same software encoder; jpeg is CPU-striped JPEG. Only h264enc streams over WebRTC.
--jpeg-qualitySELKIES_JPEG_QUALITYrange, within 1-10040JPEG quality: allowed range (e.g., "1-100"), initial value (e.g., "40"), or both ("40,1-100"); "40-40" locks.
--video-fullcolorSELKIES_VIDEO_FULLCOLORboolfalseEnable H.264 full color range for pixelflux encoders.
--video-streaming-modeSELKIES_VIDEO_STREAMING_MODEbooltrueEnable H.264 streaming mode (Turbo: encode every frame like a traditional video encoder) for pixelflux encoders.
--use-cpuSELKIES_USE_CPUboolfalseForce CPU-based encoding for pixelflux.
--use-paint-over-qualitySELKIES_USE_PAINT_OVER_QUALITYbooltrueEnable high-quality paint-over for static scenes.
--paint-over-jpeg-qualitySELKIES_PAINT_OVER_JPEG_QUALITYrange, within 1-10090JPEG paint-over quality: allowed range, initial value, or both ("90,1-100"); "90-90" locks.
--video-paintover-crfSELKIES_VIDEO_PAINTOVER_CRFrange, within 5-5018H.264 paint-over CRF: allowed range, initial value, or both ("18,5-50"); "18-18" locks.
--video-paintover-burst-framesSELKIES_VIDEO_PAINTOVER_BURST_FRAMESrange, within 1-305H.264 paint-over burst frames: allowed range, initial value, or both ("5,1-30"); "5-5" locks.
--second-screenSELKIES_SECOND_SCREENbooltrueEnable support for a second monitor/display.
--encode-driSELKIES_ENCODE_DRI, DRI_NODEstr(empty)Path to the DRI render node the ENCODER uses (VA-API/NVENC device selection).
--render-driSELKIES_RENDER_DRI, DRINODEstr(empty)Path to the DRI render node the Wayland compositor RENDERS on (defaults to auto_gpu selection, else software rendering).
--auto-gpuSELKIES_AUTO_GPU, AUTO_GPUstrtrueGPU auto-selection for rendering, enabled by default: "true" picks the first GPU; "false" disables it; otherwise a case-insensitive token picks the first GPU it matches — a vendor name (nvidia, amd/ati, intel, arm/mali, qualcomm/adreno, broadcom/videocore, apple, imagination/powervr, vmware, virtio, ...), a kernel driver name (amdgpu, i915, xe, nouveau, panfrost, msm, v3d, ...), a devicetree vendor prefix (qcom, rockchip, brcm, ...), or a raw PCI vendor ID (0x10de).
--waylandSELKIES_WAYLAND, PIXELFLUX_WAYLANDboolfalseRun the Wayland (headless compositor) backend instead of X11 capture/input (default: X11); PIXELFLUX_WAYLAND remains as a legacy fallback.
--app-wayland-displaySELKIES_APP_WAYLAND_DISPLAYstr(empty)Wayland socket where applications run — the target for input injection and clipboard — when it differs from the pixelflux capture compositor (e.g. a nested session that pixelflux captures). Empty auto-detects the nested compositor socket in XDG_RUNTIME_DIR, falling back to the capture compositor when nothing is nested.
--computer-use-bindSELKIES_COMPUTER_USE_BINDstr(empty)Start pixelflux's Computer-Use HTTP server: a bare port listens on all interfaces, host:port scopes it (e.g. 127.0.0.1:9500). Empty leaves it off; the PIXELFLUX_CU environment variable remains the standalone fallback.
--wayland-host-displaySELKIES_WAYLAND_HOST_DISPLAYstr(empty)Wayland socket of an EXTERNAL compositor (e.g. labwc started with WLR_BACKENDS=headless) that pixelflux captures and injects into as a client, instead of compositing its own. Frames arrive by screencopy into pixelflux-allocated GPU buffers (zero-copy into the encoder); input rides virtual-keyboard/pointer devices. Empty keeps the built-in compositor.
--recording-socketSELKIES_RECORDING_SOCKET, PIXELFLUX_RECORDING_SOCKETstr(empty)Unix socket path for the out-of-band H.264 recording tap ('' = off); pixelflux binds it and multiplexes the elementary stream to connected clients.
--file-manager-pathSELKIES_FILE_MANAGER_PATH, FILE_MANAGER_PATHstr~/DesktopDirectory for client file transfers on both transports: uploads land here and the file-browser/download API serves it (created at startup if missing).
--watermark-pathSELKIES_WATERMARK_PATH, WATERMARK_PNGstr(empty)Absolute path to the watermark PNG file.
--watermark-locationSELKIES_WATERMARK_LOCATION, WATERMARK_LOCATIONint-1Watermark location enum (0-6).
--wayland-socket-indexSELKIES_WAYLAND_SOCKET_INDEXint, from 00Index for the Wayland command socket (e.g. 0 for wayland-0).
--rtc-config-jsonSELKIES_RTC_CONFIG_JSONstr/tmp/rtc.jsonJSON file with WebRTC configuration to use, checked periodically, overriding all other STUN/TURN settings
--turn-rest-uriSELKIES_TURN_REST_URIstr(empty)URI for TURN REST API service, example: http://localhost:8008
--turn-rest-api-keySELKIES_TURN_REST_API_KEYstr(empty)API key to pass to the TURN REST API service Never sent to clients.
--turn-rest-usernameSELKIES_TURN_REST_USERNAMEstr(empty)Username sent to the TURN REST API service (x-auth-user header); the service embeds it in the HMAC credential. Empty (default) uses the generic 'selkies'.
--turn-rest-username-auth-headerSELKIES_TURN_REST_USERNAME_AUTH_HEADERstrx-auth-userHeader to pass user to TURN REST API service
--turn-rest-protocol-headerSELKIES_TURN_REST_PROTOCOL_HEADERstrx-turn-protocolHeader to pass desired TURN protocol to TURN REST API service
--turn-rest-tls-headerSELKIES_TURN_REST_TLS_HEADERstrx-turn-tlsHeader to pass TURN (D)TLS usage to TURN REST API service
--turn-hostSELKIES_TURN_HOSTstrstaticauth.openrelay.metered.caTURN host when generating RTC config from shared secret or using long-term credentials, IPv6 addresses must be enclosed with square brackets such as [::1]
--turn-portSELKIES_TURN_PORTint, 1 to 65535443TURN port when generating RTC config from shared secret or using long-term credentials
--turn-protocolSELKIES_TURN_PROTOCOLstrudpTURN protocol for the client to use ("udp" or "tcp"), set to "tcp" without the quotes if "udp" is blocked on the network, "udp" is otherwise strongly recommended
--turn-tlsSELKIES_TURN_TLSboolfalseEnable or disable TURN over TLS (for the TCP protocol) or TURN over DTLS (for the UDP protocol), valid TURN server certificate required
--turn-shared-secretSELKIES_TURN_SHARED_SECRETstropenrelayprojectsecretShared TURN secret used to generate HMAC credentials, also requires --turn-host and --turn-port Never sent to clients.
--turn-usernameSELKIES_TURN_USERNAMEstr(empty)Legacy non-HMAC TURN credential username, also requires --turn-host and --turn-port
--turn-passwordSELKIES_TURN_PASSWORDstr(empty)Legacy non-HMAC TURN credential password, also requires --turn-host and --turn-port Never sent to clients.
--stun-hostSELKIES_STUN_HOSTstrstun.l.google.comSTUN host for NAT hole punching with WebRTC, change to your internal STUN/TURN server for local networks without internet, defaults to "stun.l.google.com"
--stun-portSELKIES_STUN_PORTint, 1 to 6553519302STUN port for NAT hole punching with WebRTC, change to your internal STUN/TURN server for local networks without internet, defaults to "19302"
--webrtc-public-ipSELKIES_WEBRTC_PUBLIC_IPstr(empty)Public IP address(es) to advertise in WebRTC host ICE candidates (Pion-style NAT1TO1), for a host behind static 1:1 NAT such as a cloud instance whose private address maps to a fixed public/elastic IP with the WebRTC UDP ports forwarded. Accepts one IPv4 and/or one IPv6 address (comma- or space-separated); each replaces the private address of host candidates in its own family, while server-reflexive (STUN) and relay (TURN) candidates are left untouched so hole-punching and TURN fallback still work. Empty (default) keeps the gathered addresses unchanged.
--enable-cloudflare-turnSELKIES_ENABLE_CLOUDFLARE_TURNboolfalseEnable Cloudflare TURN service, requires SELKIES_CLOUDFLARE_TURN_TOKEN_ID, and SELKIES_CLOUDFLARE_TURN_API_TOKEN
--cloudflare-turn-token-idSELKIES_CLOUDFLARE_TURN_TOKEN_IDstr(empty)The Cloudflare TURN App token ID. Never sent to clients.
--cloudflare-turn-api-tokenSELKIES_CLOUDFLARE_TURN_API_TOKENstr(empty)The Cloudflare TURN API token. Never sent to clients.
--app-wait-readySELKIES_APP_WAIT_READYboolfalseWaits for --app-ready-file to exist before starting stream if set to "true"
--app-ready-fileSELKIES_APP_READY_FILEstr/tmp/selkies-appreadyFile set by sidecar used to indicate that app is initialized and ready
--uinput-mouse-socketSELKIES_UINPUT_MOUSE_SOCKETstr(empty)Path to the uinput mouse socket, if not provided uinput is used directly
--js-socket-pathSELKIES_JS_SOCKET_PATHstr/tmpDirectory to write the Selkies Joystick Interposer communication sockets to, default: /tmp, results in socket files: /tmp/selkies_js{0-3}.sock
--webcam-socket-pathSELKIES_WEBCAM_SOCKET_PATHstr/tmpDirectory to write the Selkies V4L2 Interposer webcam socket to, default: /tmp, results in socket file: /tmp/selkies_webcam0.sock
--webcam-widthSELKIES_WEBCAM_WIDTHint1280Width of the virtual webcam device; client camera frames are scaled and letterboxed to fit.
--webcam-heightSELKIES_WEBCAM_HEIGHTint720Height of the virtual webcam device; client camera frames are scaled and letterboxed to fit.
--webcam-pixel-formatSELKIES_WEBCAM_PIXEL_FORMATstrautoPixel format of the virtual webcam device. "auto" follows the uplink: a browser sending JPEG (no WebCodecs) gets an MJPEG device that carries its frames as received, any other uplink an I420 device, and a later uplink of the other kind re-creates the device for itself while no application is reading it. Or pin "I420" (planar 4:2:0, the browsers' preference), "NV12", "YUYV" or "MJPEG", which is then kept whatever arrives.
--webcam-encoderSELKIES_WEBCAM_ENCODERenum: one of auto, h264, vp8, mjpegautoCodec WebSocket clients encode the webcam uplink with. "auto" runs the measured ladder (H.264, else VP8, JPEG when neither keeps up) on engines that stream camera frames through MediaStreamTrackProcessor, and JPEG on the <video>-element path (Firefox): its software encoders can hold the camera rate while costing a full core, which no client-side probe can price. "h264" or "vp8" run that one codec on every path, trading client CPU for a fraction of the uplink bandwidth, still falling to JPEG where it cannot keep up or encodes the wrong colours; "mjpeg" pins JPEG everywhere. Clients may override per user unless the value is locked; the WebRTC transport encodes in the browser and ignores this.
--webcam-deviceSELKIES_WEBCAM_DEVICEstrautoAlso mirror the webcam into a v4l2loopback kernel device, which applications find without the V4L2 Interposer: "auto" uses the first v4l2loopback output device found (typically a desktop host or privileged container), a path such as "/dev/video10" uses that device, and "false" never does. The interposer socket is always served.
--webcam-pipewireSELKIES_WEBCAM_PIPEWIREbooltrueAlso publish the webcam as a PipeWire Video/Source node when a PipeWire daemon is reachable, for PipeWire-native applications and the pipewire-v4l2 wrapper. The interposer socket is always served.
--uinput-gamepadSELKIES_UINPUT_GAMEPADstrautoRegister gamepads as kernel devices through /dev/uinput, which applications (Steam, Proton, in-desktop browsers) find without the Joystick Interposer or fake-udev: "auto" does so only where the interposer is not configured for the session and /dev/uinput is writable — typically a desktop host rather than a container — while "true" always attempts it and "false" never does.
--gpu-idSELKIES_GPU_IDstr(empty)GPU ID for hardware video encoders: selects /dev/dri/renderD{128 + n} and the GPU-stats index. Empty (default) sets no explicit pick, encoding on ID 0 — the first GPU — or on the GPU chosen by --auto-gpu; -1 disables hardware encoding. Ignored when --encode-dri specifies a device path.
--congestion-controlSELKIES_CONGESTION_CONTROLboolfalseAdapt the video bitrate to the transport-wide-cc (GCC-style) bandwidth estimate from WebRTC receiver feedback. Effective in CBR rate-control mode; may trade quality/stability for congestion responsiveness.
--audio-channelsSELKIES_AUDIO_CHANNELSint, from 12Number of audio channels, defaults to stereo (2 channels)
--enable-resizeSELKIES_ENABLE_RESIZEbooltrueEnable dynamic resizing to match browser size
--enable-cursorsSELKIES_ENABLE_CURSORSbooltrueEnable passing remote cursors to client
--debug-cursorsSELKIES_DEBUG_CURSORSboolfalseEnable cursor debug logging
--cursor-sizeSELKIES_CURSOR_SIZE, XCURSOR_SIZEint-1Cursor size in points at 96 DPI (scaled with the session DPI). Applies to the X11 server cursor, the Wayland compositor cursor theme, and the remote-cursor capture cap on both transports; -1 uses the platform default (32 on X11, 24 on Wayland).
--enable-webrtc-statisticsSELKIES_ENABLE_WEBRTC_STATISTICSboolfalseEnable WebRTC Statistics CSV dumping to the directory --webrtc-statistics-dir with filenames selkies-stats-video-[timestamp].csv and selkies-stats-audio-[timestamp].csv
--webrtc-statistics-dirSELKIES_WEBRTC_STATISTICS_DIRstr/tmpDirectory to save WebRTC Statistics CSV from client with filenames selkies-stats-video-[timestamp].csv and selkies-stats-audio-[timestamp].csv
--enable-metrics-httpSELKIES_ENABLE_METRICS_HTTPboolfalseEnable the Prometheus HTTP /metrics endpoint.
--backpressure-queue-sizeSELKIES_BACKPRESSURE_QUEUE_SIZEint, 1 to 100000120Max frames/audio chunks buffered per stream before dropping under backpressure (WebSockets mode). Higher tolerates larger client hiccups at the cost of latency.
--allowed-originsSELKIES_ALLOWED_ORIGINSstr(empty)Comma-separated browser Origins allowed to open the streaming WebSocket (cross-site WebSocket-hijacking guard). Empty (default) allows only same-origin plus non-browser clients that send no Origin; use '*' to allow any origin.

On this page

Edit on GitHub