Configuration — v0.8.5
Advanced edge-manager.yaml and edge-sync.yaml reference for Alloy Edge v0.8.5
This reference is for v0.8.5. Do not copy these files into a v0.9 installation.
The v0.8 Track Folder flow uses two YAML files:
| File | Loaded by | Purpose |
|---|---|---|
edge-manager.yaml | alloy-edge manager | Cloud connection, device identity, and local process supervision |
edge-sync.yaml | alloy-edge sync | Folder watching, uploads, cleanup, lifecycle, and the processing pipeline |
Durations use Go-style strings such as 5s, 1m, and 72h. Sizes and bandwidth
limits use values such as 500MB, 10GB, and 5MB.
Print the complete commented templates shipped with your installed binary:
alloy-edge manager sample-config
alloy-edge sync sample-configedge-manager.yaml
Top-level fields
| Field | Purpose |
|---|---|
backend_url | Alloy backend endpoint. Use the value generated by Add device; ALLOY_BACKEND_URL overrides it. |
state_dir | Manager state, credentials, and child configuration. Defaults to .alloy/state; ALLOY_STATE_DIR overrides it. |
seed_state | Bootstrap identity and transport used until the device is approved. |
local_state | Locally owned tags and processes that cloud configuration cannot overwrite. |
seed_state
| Field | Default | Purpose |
|---|---|---|
api_key | — | Provisioning key used until approval. ALLOY_PROVISIONING_KEY overrides it before approval; ALLOY_API_KEY overrides the permanent key at runtime. |
edge_id | Hostname, then generated UUID | Stable device identifier reported to Alloy. |
tags | {} | Free-form strings for grouping and filtering devices. |
transport.http.poll_secs | 15 | Seconds between desired-state checks. |
processes | [] | Bootstrap processes used before the first successful cloud sync. Prefer local_state.processes for locally owned processes. |
local_state.processes
| Field | Default | Purpose |
|---|---|---|
name | — | Required process name used in logs and reported state. |
command | — | Required command to execute. |
enabled | true | Keep the process declared but stopped when false. |
restart | on_failure | Restart policy: always, on_failure, or never. |
shell | false | Run through /bin/sh -c when shell expansion is required. |
trigger | Start on apply | Start at boot, on a cron schedule, or when connectivity changes. |
duration | — | Stop the process after a bounded duration. |
requires_auth | false | Hold the process until Alloy approves the device. Set this for alloy-edge sync. |
files | {} | Inline configuration files attached to the process. |
A locally owned Track Folder sync process has this shape:
local_state:
processes:
- name: edge-sync
command: alloy-edge sync --config /data/recordings/.alloy/edge-sync.yaml
enabled: true
restart: on_failure
trigger: boot
requires_auth: trueedge-sync.yaml
v0.8 uses strict schema version 1. Only input_dir is required. Cleanup limits
default to no size or age limit, with a default maximum of 100,000 files.
version: 1
input_dir: /data/recordings
file_pattern: "*.mcap,*.json,*.jsonl"
upload_delay: 30s
cleanup:
max_folder_size: 10GB
max_file_age: 72h
max_file_count: 1000
lifecycle:
original:
after: keepScanning and upload
| Field | Default | Purpose |
|---|---|---|
version | — | Set to 1 for the v0.8 schema. An absent value enters legacy compatibility mode. |
input_dir | — | Required folder to scan. |
file_pattern | *.mcap,*.json,*.jsonl | Comma-separated file globs. .tmp entries are reserved and removed. |
cycle_time | 1s | Safety-net scan interval. |
upload_delay | 30s | Minimum age before a footer-less recording is eligible. |
upload_order | oldest_first | Dispatch ready files using oldest_first or newest_first. |
mcap_require_footer | false | Require an MCAP footer instead of falling back to file age. |
upload_type | signed_url | signed_url, none, or feature-gated opendal. |
bwlimit | Unlimited | Outbound bandwidth limit. |
max_concurrent_uploads | 1 | Number of files uploaded in parallel. |
part_concurrency | 4 | Multipart upload parts sent in parallel for one file. |
metadata | {} | Free-form metadata included in upload requests. |
scan_exclude | [] | Subdirectory basenames to skip; dot-directories are always skipped. |
fs_event_enabled | true | Use filesystem events for low-latency scans while retaining periodic scans. |
Cleanup and upload state
| Field | Default | Purpose |
|---|---|---|
cleanup.max_folder_size | Unbounded | Delete oldest eligible files when the tracked folder exceeds this size. |
cleanup.max_file_age | — | Delete eligible files older than this duration. |
cleanup.max_file_count | 100000 | Delete oldest eligible files when the count exceeds this limit. |
state_dir | .alloy/state | Holds sync state and the shared device credentials. |
index_store.backend | sqlite | Per-file upload state: sqlite or jsonl. Switching backends migrates automatically. |
index_store.path | Derived from state_dir | Optional JSONL path and SQLite migration source. |
Lifecycle
Lifecycle controls what happens to the original and to each transformed artifact:
lifecycle:
original:
after: keep
upload: false
cleanup:
include_in_storage_cleanup: false
transform:
after: move
move_to: .alloy-redacted
cleanup:
include_in_storage_cleanup: false| Field | Default | Purpose |
|---|---|---|
original.after | keep | keep/keep_continue, keep_stop, delete, or move the source. |
transform.after | keep | keep, delete, or move the transformed artifact. |
<stage>.move_to | Stage-specific dot-directory | Destination when after: move; relative paths resolve from input_dir. |
<stage>.cleanup.include_in_storage_cleanup | false | Include moved files in the global size, age, and count limits. |
original.upload | false | Upload the untransformed original if it reaches the end of the pipeline. |
transform.on_rule_error | skip_record | skip_record, skip_file, or explicitly fail open with pass_original. |
transform.on_reader_error | skip_tail | skip_tail, abort, or recover malformed MCAP data. |
transform.output_compression | inherit | inherit, none, zstd, or lz4. |
transform.audit | Embedded audit enabled | Configure the JSONL sidecar and embedded MCAP audit record. |
Processing pipeline
The optional ordered pipeline can filter, transform, upload, and retain different artifacts from one recording:
pipeline_trigger: delay-after-close
pipeline:
- transform: .alloy/redaction.yaml
transform_suffix: redacted
upload: true
transform_after: delete
original_after: delete
file_pattern: "**/camera/*.mcap"
filter:
require_topics: ["/nav/**"]
min_duration: 60s
min_messages: 100
min_size: 10MB| Field | Default | Purpose |
|---|---|---|
pipeline_trigger | delay-after-close | Start after the close delay, or use close to start on a close event. |
transform | — | Rules file used to create a transformed artifact. |
transform_suffix | Step index | Infix added to the transformed filename. |
upload | false | Upload the transformed artifact. |
original_after | lifecycle.original.after | keep/keep_continue, keep_stop, delete, or move the source after this step. |
transform_after | lifecycle.transform.after | Keep, delete, or move the transformed artifact. |
file_pattern | All files | Restrict the step to matching paths. |
filter | — | Gate the step by footer, topics, duration, message count, file size, or content expression. |
An unstamped v0.7-style sync file is migrated in memory. To inspect or write the v0.8 form explicitly:
alloy-edge migrate --config /data/recordings/.alloy/edge-sync.yaml --dry-run
alloy-edge migrate --config /data/recordings/.alloy/edge-sync.yamlFor transform-rule syntax, use the Redaction reference.