Send Beacon a webhook from your build, your monitoring, or your agent. It becomes a Live Activity, a widget, or a notification. You write the rules.
live demo · swipe to dismiss · tap a button to answer
The app gives you an inbound URL and, if you want one, a signing secret. One source per tool is a good habit.
Anything that can POST works. No SDK to install, no schema to match.
curl -X POST $SRC \
-d '{"title":"Hello from Beacon","status":"ok"}'When the payload matches, show it as a Live Activity, a widget, or a notification using one of eight templates. Replay recent payloads in the editor to check it first.
Pick the surface by how long the thing lasts. A deploy is a Live Activity. A queue depth is a widget. A failed job is a notification with buttons.
Starts on the first event, updates in place on each one after, ends when you send phase: end. The eight-hour cap is handled by restarting.
The same activity folded into the island. Expand it for the full template and its buttons.
Recent events, the latest from one source, or a grid of statuses. Buttons fire actions without opening the app.
Grouped by source, with the rule's actions as buttons, straight from the lock screen.
Conditions use JSONPath against the payload. Bindings pull fields into a template. The same evaluator runs on the phone and on the relay, so the debugger shows exactly what gets delivered.
equalsnot equalscontainsstarts withmatches>≥<≤existsEight templates. Tap one to send a sample event.
title · body
severity · urlstatus · message
author · durationvalue · unit
delta · labelvalue · label
thresholdstate · name
sincetitle · body
senderline · level
timestampdelta · label
periodA rule can carry actions. They become buttons on the notification, in the Live Activity, in the island, and on widgets. Tap one and Beacon posts a signed callback to your URL with the original payload attached.
Or let the sender wait. A script or an agent posts a question, blocks on the answer, and carries on when you tap.
ID=$(curl -s -X POST $SRC \
-d '{"title":"Deploy 4271 to production?",
"status":"waiting"}' | jq -r .payloadId)
curl "$SRC/wait/$ID?timeout=600"
# blocks until you tap, then:
{"actionId":"ship","label":"Ship it"}
Each recipe in the app copies a working snippet with your URL and secret filled in, and installs default rules. Tap one to see what its event looks like when it lands.
Turn on a per-source secret and the relay checks an HMAC on every request. Leaked a URL? Rotate it and the old one retires after a grace period.
Sign in with Apple is the only account. The relay keeps push tokens and the most recent payloads per source, nothing else.
One switch in Settings clears the relay and the phone.