Configs
Versioned, immutable robot behavior config — separate lifecycle from releases.
Configs are how you change robot behavior without shipping a new build. They live in their own table, deploy through their own pipeline, and the agent applies them to a known on-disk location so robot apps can read them with a plain file watcher.
Why separate from releases
A release is a binary. A config is a payload — speed limits, feature flags, calibration values, fleet-wide on/off switches. Decoupling lets operators flip a flag without queuing a build, and lets the audit log distinguish "the build changed" from "the behavior changed."
Data model
config_blobs ─< config_deployments ─< config_deployment_eventsconfig_blobs—name,namespace,version,checksum, the JSON payload, and the user who created it. Immutable. You publish a new version rather than mutate an old one.config_deployments— one blob + target (robot|fleet) + required idempotency key.config_deployment_events—queued → dispatched → applied | unchanged | failed.unchangedis a real status: the agent recomputes the on-disk file's checksum before writing and skips work when nothing would change.
Namespaces
Each config has a namespace. The agent writes the applied payload to
~/.roboflare/robot-configs/<namespace>.json. Your robot app picks the
namespace it cares about. Common patterns:
motion— speed limits, accel curves.vision— detection thresholds, model URLs.features— boolean toggles.
A single robot can have many namespaces active at once; each is its own file.
API surface
# Publish a new config blob
POST /api/configs
{
"name": "default speed limits",
"namespace": "motion",
"payload": { "max_linear_mps": 1.2, "max_angular_rps": 0.8 }
}
# Deploy it
POST /api/configs/deployments
Idempotency-Key: ...
{
"config_blob_id": "...",
"target_kind": "fleet",
"target_id": "..."
}
# Read events
GET /api/configs/deployments/{deploymentId}/eventsWhat the agent does
- Receives a
config.applyframe over the tunnel with the blob payload and checksum. - Compares the checksum to the existing
~/.roboflare/robot-configs/<namespace>.json— if it matches, reportsunchanged. - Atomically writes the new file and reports
applied, or reportsfailedwith the error.
Robot apps watch the file with inotify or a poll loop. There is no
agent-mediated callback into the application — the file is the API.