Skip to content

seydd.toml

Generated from packages/seydd/src/config.rs: the structs the daemon deserialises the file into are the schema, so this page cannot disagree with the binary. Pass the file with seydd --config /etc/seyd/seydd.toml. See Integrate the daemon for a walkthrough and the protocol contract for the publisher-control messages.

The robot’s identity, transport and policy.

Key Type Required Default Meaning
robot_id string yes — The robot’s id as enrolled with the cloud; what pilots and the console see.
signal_url string yes — The signal server’s WebSocket URL, wss://host/ws. Enrolment derives its REST address from it.
credential_path path no "/var/lib/seyd/robot.key" Ed25519 seed file, created on first run. The private half never leaves the robot; enrolment registers the public half (ADR 0007).
quic_port integer no 4433 UDP port the QUIC endpoint binds; the port a router forward or pinhole must open.
ipv6 boolean no true Bind and advertise IPv6 as well as IPv4.
port_mapping boolean no true Ask the router for a port mapping (PCP, NAT-PMP, UPnP) during discovery, so a robot behind a consumer router is reachable without a manual forward.
qos_profile string no "balanced" The QoS ceiling: latency, balanced or quality.
max_sessions integer no 4 Concurrent pilot sessions (one driver, the rest observers).
host_override string no empty Skip discovery and advertise this host only (LAN testing).
recovery_ladder boolean no true Ask for the cheapest useful recovery point (LTR → intra-refresh → IDR) rather than always demanding a keyframe. Set false for a publisher that mishandles any kind but idr.
relay boolean no true Serve a session through the cloud relay when the pilot could not connect directly (ADR 0010). The pilot only asks after its direct attempts fail, and its HUD says so; set false to refuse relayed sessions altogether.
enrolment_token string no empty One-time enrolment token, redeemed on first start when no credential exists yet. SEYD_ENROLMENT_TOKEN overrides it — prefer the environment, so a provisioning secret need not be written to disk.

One per channel; numbered from 1 in file order, and that numbering is what the pilot sees.

Key Type Required Default Meaning
kind "video" | "sensor" | "command" yes — video, sensor or command.
name string yes — The channel’s name as shown to the pilot and used in SeydSession.send.
input string no empty Where the bytes come from: rtsp:// or rtp:// for video, udp:// for a sensor. Required for video and sensor channels without layers.
output string no empty Where a command channel delivers each driver message, as one UDP datagram per message.
codec string no "json" A WebCodecs codec string for video (avc1.42001f, hev1.…, mjpeg); json or octet-stream for messages.
fps integer no 0/false Nominal frame rate of a video channel; 0 for messages.
layer array of tables no empty Simulcast layers. Empty means the single input above — the ordinary case, and what every pre-simulcast config keeps doing.
max_bitrate_kbps integer no 0/false The most this video channel’s publisher can encode, in kbps; 0 (the default) means it has no limit of its own. Set it when the encoder tops out below the QoS profile’s ceiling — a drone whose highest setting is 4 Mbps under the quality profile’s 6 — so the rate controller’s range, floor and video-config requests stay within what the publisher can deliver.

Simulcast layers of a video channel (ADR 0008), lowest first.

Key Type Required Default Meaning
name string yes — The layer’s name, reported in layer messages and the HUD.
input string yes — The stream carrying this encoding, rtsp:// or rtp://.
activate_above_kbps integer no 0/false The ABR target at or above which this layer is the right choice. The lowest layer is the base and is used whenever nothing better is affordable, so leaving it at 0 is correct.

Where seydd posts video-config, recovery-request, layer and session messages for the publisher.

Key Type Required Default Meaning
udp string yes — host:port the daemon sends its JSON control messages to, one per datagram.

From the Layer doc comment in config.rs:

toml [[channel]] kind = “video” name = “main” codec = “avc1.42001f” # must admit the highest layer fps = 25

[[channel.layer]] name = “low” input = “rtsp://cam:554/Streaming/Channels/102”

[[channel.layer]] name = “high” input = “rtsp://cam:554/Streaming/Channels/101” activate_above_kbps = 1800