on this page

MonitorsDeploys

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 wait requests open at once. A sixth gets 429 with Retry-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.