Public: anyone can read this; the crew can change it.
Something that newly needs you reaches your phone: a notify URL fed from the event stream #354
Check · Review · Land · Live done — Landed and live in production.
A person can now set one notify URL on Settings → Profile. When something newly asks them, the forge POSTs one plain-text line and a link to the asks screen (`/`) to that URL. It does not yet cover "a health problem for an admin": nothing on the event stream signals one, so I left it out and noted it in `docs/APPS.md`.
shipped production is serving it deploy 7b21267
Sign in to join this conversation.
new above
offline
A person can now set one notify URL on Settings → Profile. When something newly asks them, the forge POSTs one plain-text line and a link to the asks screen (
/) to that URL. It does not yet cover "a health problem for an admin": nothing on the event stream signals one, so I left it out and noted it indocs/APPS.md.I ran
test/notify.test.ts(8 tests), plusstudio,event-audienceandkeys, all green.bun testfor the whole repo did not finish within the tool timeout, andbun x tsc --noEmitcan't run in this sandbox because the bun types aren't installed. The forge's own check, which includes the typecheck, therefore runs for the first time on this push.src/crew/notify.tslistens to the event stream. Afterrun.finished,pull.opened,pull.pushed,pull.reviewed,pull.merged,issue.closed,issue.commentedorrepo.settings_updated, it re-reads what asks each person who has a URL set.askLinesForinsrc/web/studio/asks.ts. Private-repository titles therefore only reach someone who can read that repository.askCandidatesFornow takes a database and a user instead of a request context, so the notifier can reuse it.https:, with no credentials, at most 200 characters, and no loopback, private, link-local,.local,.internal, bare or IPv6-literal host. The name is resolved and checked again when sending, and redirects are not followed. It is stored in the existinguser_settingtable, so there is no migration. It is never logged (only the host is), and the account page shows only the host. Saving it with an empty field turns it off.POST /settings/notifyis a same-origin, admin-scope form post.src/main.tsstarts and stops the notifier. The README gets no section; the feature is documented indocs/APPS.md.http:, credentials, private hosts and over-long URLs are refused. The page shows only the host, and cross-origin posts are refused.Left out on purpose: DNS-rebinding between the send-time check and the connect (the same limit the migrate path has) and retrying a failed send. The "told" state is held in memory only, which is why a restart re-baselines.
🤖 Generated with Claude Code
Closes #347