Deploys
A deploy marker tells Mast you just shipped. Mast checks every probe on that channel right away instead of waiting out each probe's interval. If a page opens within the hour, it starts by naming the deploy:
3 min after deploy v2026-10-20 (a1b2c3d), from GitHub Actions #418.
Add wait= and the marker becomes a gate: the request stays open until the probes have been checked, and it fails when one of them is down. Put it as the last step of a deploy job and a broken release fails the job that shipped it.
Every example uses a channel's URL, https://mast.tissue.dev/mk_8e2a…, the same one you send messages to. Probes that page into that channel are the ones a marker checks. GET and POST both work.
Send a marker
curl -fsS "https://mast.tissue.dev/mk_8e2a…/deploy?v=v2026-10-20&sha=a1b2c3d4e5f6"The answer comes back at once with 202:
{"ok":true,"id":"dp_…","label":"v2026-10-20 (a1b2c3d)","version":"v2026-10-20","sha":"a1b2c3d4e5f6","at":"2026-10-20T14:02:11.402Z","burst":3,"check_at":"2026-10-20T14:02:11.402Z"}burst is how many probes were moved up to check at check_at. They run on the prober's next round, within a few seconds.
| Field | What it is |
|---|---|
v or version |
The version you shipped, up to 64 characters. A date plus the short commit reads well on a phone: v2026-10-20. |
sha or commit |
The commit, 4 to 64 hex digits. The page shows the first 7. |
source |
Where the deploy ran, up to 120 characters: GitHub Actions #418, deploy.sh on build-01. |
url |
A link to the run. It has to be https://. Anything else is dropped and the answer carries a warning. |
wait |
1 to 300 seconds. Hold the request until the probes settle. See the next section. |
Send v, sha or both. The fields can go in the query string, a form body or a JSON body. When the same field is in both, the query string wins.
curl -fsS -X POST https://mast.tissue.dev/mk_8e2a…/deploy \
-H 'content-type: application/json' \
-d '{"version":"v2026-10-20","sha":"a1b2c3d4e5f6","source":"deploy.sh on build-01"}'Wait for the probes
curl -fsS --max-time 200 "https://mast.tissue.dev/mk_8e2a…/deploy?v=v2026-10-20&sha=a1b2c3d4e5f6&wait=180"With wait, the request answers once every probe on the channel has been checked after the marker and has settled:
| Status | When |
|---|---|
200 |
Every probe answered. gate is up, or degraded when one fails from some places but not enough to page. |
503 |
A probe is confirmed down. It answers as soon as that happens. gate is down and message names the probe and what failed. |
504 |
The wait ran out before every probe settled. gate is pending. |
curl -f turns 503 and 504 into a failed step. The body lists each probe with its verdict, state, checked_at and detail, so the job log says which one broke.
A probe settles the same way it does for paging. A first failure is rechecked 10 seconds later before it counts as down, and a down probe needs two good rounds to come back. Allow a minute or more on top of the slowest probe's timeout. A channel with no probes answers 200 with a warning, because there was nothing to check.
Set curl's --max-time a little above wait, so curl doesn't give up before Mast answers.
GitHub Actions
- name: Tell Mast
if: success()
run: |
curl -fsS --max-time 200 \
"https://mast.tissue.dev/${{ secrets.MAST_KEY }}/deploy?wait=180" \
--data-urlencode "v=v$(date -u +%Y-%m-%d)" \
--data-urlencode "sha=${{ github.sha }}" \
--data-urlencode "source=GitHub Actions #${{ github.run_number }}" \
--data-urlencode "url=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"MAST_KEY is the mk_… part of the channel URL, kept as a repository secret. --data-urlencode makes this a POST with a form body.
On the page
When a probe or a vital on the channel goes down within an hour of a marker, the page and the incident card start with the deploy. The card's evidence keeps the full commit, the time and the link to the run. A deploy longer ago than that is listed in the evidence only.
The probe's screen in the app lists the channel's latest deploys.
Limits
- A channel's probes are moved up at most once a minute. A second marker inside that minute is recorded, and its probes check a minute after the first burst.
- An account can hold 5
waitrequests open at once. A sixth gets429withRetry-After. - Markers count against the channel's send rate limit like any other message.
- Markers are kept for 90 days, and they're deleted with their channel.
Reading them back
GET /v1/mast/deploys lists your markers, newest first. Add channel_id for one channel and limit for up to 50. GET /v1/mast/probes/{id} carries the newest 10 on the probe's channel as deploys. See the API.