Docs
15-minute quickstart
Power a WB-1, mint a token, read five events, hot-reload a rule, and add a second zone.
This path starts with a factory-reset WB-1 and ends with a reviewed rule firing across two zones. It does not require the cloud, an app store, or an account on our infrastructure.
0. What you need
- one WB-1, its USB-C supply, and a laptop on the same network;
curl,jq, andwebsocat;- 15 minutes and one input you can change safely.
Use the fictional host below exactly until your unit announces a different
.local name.
export WB_HOST="http://bobulator.local"
1. Power and join the network
Connect USB-C. The status ring breathes amber during boot, then holds mint when
the local dashboard is ready. Join the temporary WB1-SETUP-XXXX network,
open http://bobulator.local, choose the operating Wi-Fi network, and wait for
the mint ring to return.
Ethernet and offline commissioning use the same dashboard flow. No internet connection is required.
2. Mint a local token
In Settings → Access tokens, create a token named quickstart with
device:read, events:read, and rules:write. Copy it once:
export WB_TOKEN="paste-token-here"
The placeholder is the only secret in this guide. Do not commit the real value. Verify the device record:
curl -fsS "$WB_HOST/api/v1/device" \
-H "Authorization: Bearer $WB_TOKEN" | jq '{id, firmware, status}'
Expected shape:
{"id":"wb1-lab-01","firmware":"1.0.0-beta.7","status":"ready"}
3. Read five live events
Change the safe input while this is running:
websocat "ws://bobulator.local/api/v1/events" \
-H "Authorization: Bearer $WB_TOKEN" | head -5
If mDNS is unavailable, replace bobulator.local with the address shown on the
dashboard. A REST snapshot should return the same event schema:
curl -fsS "$WB_HOST/api/v1/events?limit=5" \
-H "Authorization: Bearer $WB_TOKEN" | jq '.data[] | {channel,value,zone,ts}'
4. Install the first rule
Create a local file:
cat > /tmp/quickstart-rule.yaml <<'YAML'
rule: quickstart-safe-indicator
priority: 20
when:
all:
- input: lab.button
equals: pressed
- zone: lab
then:
- output: light.lab.indicator
set: 30%
- emit: audit.quickstart_indicator
YAML
Validate and hot-reload it in one idempotent PUT:
curl -fsS -X PUT "$WB_HOST/api/v1/rules/quickstart-safe-indicator" \
-H "Authorization: Bearer $WB_TOKEN" \
-H "Content-Type: application/yaml" \
--data-binary @/tmp/quickstart-rule.yaml | jq '{revision,status,activated_at}'
Expected status is active. Press the input and confirm the audit event:
curl -fsS "$WB_HOST/api/v1/audit?event=audit.quickstart_indicator&limit=1" \
-H "Authorization: Bearer $WB_TOKEN" | jq '.data[0]'
5. Add a second zone
Map another physical input to annex.button in the dashboard, then expand the
rule’s paths to *.button and light.${zone}.indicator. Validate before the
fleet push:
curl -fsS -X POST "$WB_HOST/api/v1/rules:validate" \
-H "Authorization: Bearer $WB_TOKEN" \
-H "Content-Type: application/yaml" \
--data-binary @/tmp/quickstart-rule.yaml | jq '.valid, .diagnostics'
For a second node, pair it under Fleet → Add node. The rule revision moves only after validation succeeds on both devices; a failed node leaves the current revision active everywhere.
Next
Use the Rule DSL reference for operators, built-ins, action paths, and priority bands. Use the API overview for pagination, WebSocket reconnect, idempotency, and audit schemas.