A notification when a cron job or a script finishes or fails

One line at the end of the job. Plain text becomes the title; JSON sets the priority, a link and a few fields. Failures go high, repeats become one card.

1 · Get a key

Sign in at youlmk.com or in the app, create a source of type script (name it after the job, backup.sh), and copy its key. One source per job is the idea: each gets its own Reach, its own quiet-hours rule and its own history. See Your first source.

2 · At the end of the job

$ curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 -d "backup finished · 4.2 GB"

Finished and failed, in one cron line, with the failure at high priority so it pins to the top of the inbox for an hour:

0 3 * * * /usr/local/bin/backup.sh \
&& curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 -d "backup finished" \
|| curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 -d '{ "title": "backup failed", "priority": "high" }'

A body that starts with { is read as JSON, so no content-type header is needed. Add a line of context and a link to the log:

$ curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 \
-d '{ "title": "backup finished",
"body": "4.2 GB · 3 min 10 s",
"url": "https://example.com/logs/2041",
"fields": { "host": "db-1", "size": "4.2 GB" } }'

In a shell script, the exit code decides:

#!/bin/sh
if ./nightly.sh; then
curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 -d "nightly finished"
else
curl -s youlmk.com/k/k_7hq2nk3f9qd8w4 -d '{ "title": "nightly failed", "body": "exit '"$?"'", "priority": "high" }'
fi

Tools that can only make a GET use the same key with query parameters: youlmk.com/k/k_7hq2nk3f9qd8w4?title=backup%20finished&priority=low.

3 · Make it quiet where it should be

Rule
What it does for a job
Priority
low never sounds and groups, for the routine "finished". high pins for an hour, for a failure. critical can break through quiet hours if the source's switch and the global one are on.
Reach
Per source: Silent, Badge, Banner, Break through. A nightly job at Badge is in the inbox in the morning and never woke anyone.
Quiet hours
Held, never dropped, delivered as one summary when quiet ends. A source can be told not to respect them.
Grouping
Same source, same title, within ten minutes: one card with a count. A job that retries forty times is one card, not forty.

Every rule is set once on the source, in the app or on the web, and the script never changes. Details in Reach, Quiet hours and Grouping.

If the job never ran

A job that dies before its last line sends nothing. For those, a schedule watch reminds you at the time the job should have finished ("remind me at 04:30 to check the backup"), and an endpoint watch can check a page the job writes ("tell me when example.com/backups/latest stops returning 200").

Retries: send an Idempotency-Key header and a retried request within 24 hours answers with the first result, so a flaky network never doubles a notification. The limits are 60 sends a minute per key and 8 KB a body; the codes are in the HTTP API.

Next

When an endpoint goes down: A notification when an endpoint stops returning 200, checked every minute, from one sentence. No agent to install, nothing to host. · HTTP API · Payload reference · Reach