Anything that can make one HTTP request can push a message to your iPhone — home automation, a price watcher, a script you wrote, or your own coding agent.
Download Knockbox and scan the QR code on the join page. No sign-up, no password — once you scan you have your own inbox and a first channel. No account also means losing every device loses the identity; to add a device, generate a code in the app that is already connected.
Each channel has its own send address, sound, interruption level and mute switch. Give “home” and “deliveries” one each, and only the first will wake you at night. In the app, open a channel → “…” at the top right → Channel settings to get back to its send page.
The whole body is the message; nothing to configure. It arrives as a plain text notification.
The title is the first line of the notification, the body sits under it. Plain GET works too, for places that can only build a URL.
Tables, lists, quotes and code blocks (with line numbers and highlighting) all render. The body is not part of the push itself — the app fetches it separately — so it can be long.
Bulleted, numbered and checkable lists all work — good for “what is still left”.
An ordered set of key-value pairs — tighter than a table, good for “a few facts about one thing”. style can be ok / warn / error / muted and only colours the value on the right.
The app icon on the notification is replaced by the image itself, and expanding shows it full size. Images are scaled to a long edge of 1600; the original is not kept.
Long-press the notification to open it directly, without going into the app first.
A new notification carrying the same collapse_id replaces the old one, so the notification centre only ever holds the latest — good for progress and status. Press this button a few times to see it. There is also idem_key for idempotency: a retry carrying the same value does not push twice.
Copy the whole block into Claude Code or any other agent that can run commands. The address is already in it; nothing needs changing.
The same address also speaks MCP over streamable HTTP, with a single tool that sends one notification — for a client that cannot run commands, and so the block above does not have to be pasted into every project. Add it in whichever form your client takes: hand the first block to an assistant and it configures itself, paste the JSON into a config file, or run the command in Claude Code. The endpoint carries exactly the permission of the send address: post to this channel, read nothing.
429 saying when it recovers — messages are never dropped silentlyThe server is open source — one binary and one SQLite file, with the messages entirely on your own machine. Joining works exactly as it does here, only the address is yours.