Package: onbod/. Optional daemon, auto-included in compose when ONBOARDING_ENABLED=true.
onbod handles new JIDs that arrive with no existing group registration. It registers itself as a channel with receive_only: true capability โ the gateway routes unmatched JIDs to it, but onbod responds via the notify/ library rather than through a router outbound call.
The gateway does not know that onbod exists. From the gateway's perspective, it is just another registered channel. No onboarding-specific code is in gated.
ONBOARDING_ENABLED=true
Set this in .env. When true, gated routes messages from unregistered JIDs to the onboarding channel instead of discarding them. arizuko generate includes the onbod service in the compose file.
Per JID, tracked in the onboarding table:
user sends name
awaiting_name โโโโโโโโโโโโโโโโโโโโโโ pending
โ
/approve JID โ /reject JID
โ
approved / rejected
States: awaiting_name, pending, approved, rejected.
Runs every 10 seconds:
awaiting_name records that have not been prompted recentlypending, notify all tier-0 JIDs via notify/pending: reply "Still waiting for approval" if they send another messageOn startup, onbod seeds command routes in the routes table:
| Command | Action |
|---|---|
/approve <jid> | Create group dir, copy prototype, insert registered_groups row, insert default routes, send welcome system event |
/reject <jid> | Set status to rejected, send rejection message to JID |
Operator must be a tier-0 group (no parent). onbod verifies this before executing the command.
On /approve <jid>:
groups/<world_name>/ directoryCLAUDE.md and SOUL.md are copied; session and memory are notregistered_groupsnotify/The prototype path is configured via ONBOARDING_PROTOTYPE_FOLDER. When set, CLAUDE.md and SOUL.md from the prototype are copied to the new group directory. Session state, memory, and diary are not copied.
Agents can also spawn child groups directly via the register_group IPC tool with fromPrototype: true, which applies the same copy logic.