Planned. This section describes where hark is going. It is not built yet. SECURITY.md is the source of truth.
Your other agents and systems (my.ax, Pi, a terraloop, CI) can talk to you through hark. There are two doors. Both treat what they bring like a stranger in the room: hark will say it, but it can never approve anything.
Webhooks: the doorbell
For events that should reach you even when hark is asleep: a deploy finished, CI failed, a teammate answered.
- In Settings, Webhooks, create a hook and name it, for example “CI: hark repo”. Pick what it may do:
notify (default), store, or wake.
- Copy the URL and secret. The secret is shown once.
- Sign every request: an HMAC-SHA256 of the timestamp and raw body, in a header. Unsigned, old, or replayed requests are dropped.
POST https://<host>/hook/<hook id>
hark-timestamp: 1767225600
hark-signature: v1=<hex hmac of "timestamp.body">
content-type: application/json
{ "title": "CI failed on main", "detail": "3 tests", "level": "bad" }
What happens next depends on hark:
| hark is | It |
| Listening | Says it at the next pause, from a template. Never over you. |
| In a turn | Waits for the turn to end. |
| Asleep | Queues it, sends a push notification, and tells you when you wake it. |
notify speaks a template and never hands the payload to the model. wake starts a turn so hark can act, and anything gated still needs your passkey. Each hook has a rate limit, quiet hours, a delivery log, and can be rotated or revoked in Settings.
MCP: the conversation
hark is also an MCP server at https://<host>/mcp, so an agent can talk to it while it works.
- Add the URL to your MCP client: Pi, Claude, chat.ax.
- The client opens hark’s consent page. Sign in with Cloudflare and choose what it may do.
- hark gives the client its own token. Your Cloudflare token never leaves your Durable Object.
| Scope | Tool | What it does |
hark:tell | hark_tell(text) | hark says it to you out loud. No model turn. The default. |
hark:read | hark_status | Presence, timers, memories. |
hark:say | hark_say(text) | Starts a turn as that agent and streams the reply back. Voice goes first. |
A request for a gated action comes back as a pending task while your passkey decides. There is no approve tool. Settings, Connected agents lists every client with its scopes and last use, and revokes it at once. Every turn records whether it came from your voice or from which agent.
MCP events, while hark is awake
hark can subscribe to the MCP servers you connected and speak their updates as they happen, for example a ticket that changed state. That works only while hark is awake. Asleep, nothing is connected and nothing is billed, so events that must not be missed should also send a webhook. Webhooks wake hark. MCP lets it reply and fetch details.