What HUP is
HUP is FERAL’s equivalent — for heterogeneous hardware — of what the USB HID class spec was for input devices: a stable, versioned, vendor-neutral protocol that lets any vendor plug hardware into any FERAL brain without proprietary glue. Current version:HUP v1.0.0 (stable, Apache-2.0 licensed)
Full normative spec: feral-nodes/HUP_SPEC.md
How a daemon connects
- Daemon opens a WebSocket to
wss://<brain>:<port>/v1/node. - Sends a
node_registerframe with itsnode_id, capabilities, sensors, actuators, firmware version. - Brain replies with
node_ack— session token, expected heartbeat interval, granted capabilities, denied capabilities. - From that point the daemon can send
device_eventframes (sensor readings, button presses, camera frames) and respond tohup_action_requestframes the Brain sends to trigger actuators (buzz, LED, motor, etc.).
Message types (abbreviated)
| Frame | Direction | Purpose |
|---|---|---|
node_register | daemon → brain | First message: identity + capabilities. |
node_ack | brain → daemon | Acknowledges registration, grants capabilities. |
node_heartbeat | daemon → brain | Every 10s; carries battery, RSSI. |
device_event | daemon → brain | A sensor reading or observable event. |
hup_action_request | brain → daemon | Trigger an actuator. |
hup_action_response | daemon → brain | Result of an action. |
node_bye | either side | Graceful disconnect. |
type key. Schemas are Pydantic (Python SDK)
and Zod (TypeScript SDK) — both enforce the same contract.
Writing a daemon
Two SDKs are published and maintained by FERAL:Python SDK
pip install feral-node-sdk. Async FeralNode class with auto-reconnect, mDNS discovery, and 6-digit pairing.TypeScript SDK
npm install @feral-ai/node-sdk. Same surface as the Python SDK for Node.js 20+.Cookiecutter template
Ship a new daemon in under an hour:manifest.json, mock hardware, two
placeholder @on_action handlers, and one placeholder event stream.
Replace the mocks with your real integration and feral publish --daemon .
when ready.
Publishing to the registry
Once your daemon is stable:kind=daemon. Any FERAL user can install it with:
Pairing + security
- First-time pairing uses a 6-digit code the daemon prints to its own log. The user types that code into Settings → Devices → Pair. The Brain returns an API key the daemon saves locally.
- Steady-state: daemon sends
Authorization: Bearer <key>in the WebSocket upgrade. - Per-capability gating: the user approves each capability (camera, audio,
actuator) in Settings. The Brain only sends
hup_action_requestframes for capabilities the user has granted.
Compliance
- Licensed Apache-2.0 — any vendor may implement, fork, or extend.
- No certification program — vendors self-declare conformance by passing
the schemas in
feral-node-sdk/@feral-ai/node-sdk. - Bug reports + protocol additions go through github.com/FERAL-AI/FERAL-AI/issues.
