Transom accepts posts two ways. They do exactly the same thing, pick whichever fits your tool.
For anything that can make a web request.
POST http://127.0.0.1:17893/
Content-Type: application/json
Authorization: Bearer <your-token>
{"title": "Build finished", "message": "Ready to ship"}
For Shortcuts, AppleScript, or anything that can open a URL.
open "transom://post?title=Build%20finished&message=Ready%20to%20ship"
URL-scheme values must be URL-encoded (spaces become %20). In the Shortcuts app, pass your text through the built-in "URL Encode" action first.
Include your token as a Bearer header: Authorization: Bearer <your-token>. Find it in Preferences → Advanced → Local API (or read the Keychain item "Transom Local API Token"). Requests without a valid token get a 401.
curl -s -X POST 127.0.0.1:17893 \
-H "Authorization: Bearer $TRANSOM_TOKEN" \
-d '{"title":"Build done","symbol":"checkmark.seal.fill"}'
One required field, eight optional. In the URL scheme these are query parameters; booleans accept 1 or true.
Four things that make automation posts safe to fire and forget.
Automation posts are low-priority by default: while a Focus is on they're held and counted, then shown in the digest when it ends. Your build notification never interrupts deep work. Some machine messages are not build notifications, though. Send "priority":"urgent" on the token'd door and the card rides the same lane an urgent text from an unsaved number does: through a Focus, still held by "VIPs and codes only" and by Sleep.
If a persistent card is on screen when another arrives, nothing is lost, the newest shows with a "+1" chip and dismissing reveals the next.
Recent Notifications in the menu bar keeps the last 200 cards, including the ones that were held.
The server binds to 127.0.0.1 exclusively; nothing on your network can reach it, and Transom never makes outbound calls on your behalf. Every post must carry your Mac's local API token, which Transom stores in the Keychain, and Transom validates each request's Origin and Host. So a website you visit can't reach the API, and no other app can post without the token.
Copy, paste, adjust. These examples mirror the current API.
This is schema v1. Fields will be added over time, always optional, and existing fields will never be renamed, removed, or change meaning.