Using Mast

Which level to reach for, and what the phone does with it.

Every message Mast delivers carries one of four levels. A level is not a rating of how bad the thing is; it is a decision about what the phone does and who gets interrupted. A disk at 92% and a database that is down are both serious, and only one of them needs somebody awake.

quietLands in the feed and in the notification list. No sound, no banner, no lit screen.
normalA banner and a sound, held by the ringer switch, by a Focus mode and by the channel's quiet hours.
loudMarked time-sensitive, so it arrives during a Focus mode. Once, with no repeat.
pageRe-alerts every two minutes until somebody acknowledges it, then moves to a second phone if the channel names one.

A channel sets the level it sends at by default. A sender can name a different one per message, up to a ceiling its owner set on their own phone.

picking a level

Three questions, in order. The first no is the answer.

  1. Does a person have to do something? If not, it is quiet or normal, and the difference between those two is only whether you want to be told today.
  2. Does it have to be today? If it can wait for the morning, it is normal, and the channel's quiet hours will hold it there.
  3. Would you rather be woken than find it at breakfast? Yes is a page. No is loud.

The cost of over-paging is not the noise. It is that the next real page arrives at a phone you have already taught yourself to ignore. A channel that pages for things nobody acts on stops being a pager inside a week.

what to put on each one

quiet

Things you want on the record and never want to be told about. A deploy that landed. A nightly backup that finished, with the byte count in the body. A certificate that renewed thirty days early. You read these when you go looking, or when something else has sent you looking, and the feed holds thirty days of them.

normal

Something a person should see today, on their own schedule. A payment that failed and will retry. A webhook that gave up after five attempts. A new signup flagged for review. Most channels never need to be louder than this, and one that starts here still has room to mark a single message urgent when the sender knows something the channel does not.

loud

Something that becomes a page if it is left alone. Storage down to two replicas of three and still serving. A queue that has been growing for an hour. Disk at 92%. Loud comes through a Focus mode, so it finds you in the middle of something else, and then it stops. It is the level for a problem with hours of headroom.

page

Somebody has to act, and the acting cannot wait for them to next pick up the phone. The database is unreachable from both edges. Certificate issuance is failing on the machine serving traffic. The nightly backup has not checked in for twenty-five hours. A page repeats until it is acknowledged, and an unacknowledged one moves on to a second phone if the channel names one. The whole level assumes a person will be found; use it where that is true.

making a page wake you

A page is delivered time-sensitive. That is enough to break through a Focus, Sleep included, and it is not enough to beat the ringer switch. Three settings on the phone decide whether one actually wakes anybody, and all three belong to whoever is holding it.

allow Mast in the Focus you sleep underSettings → Focus → Sleep → Apps. A Focus that does not list Mast holds its notifications back until morning, whatever level they carry.
leave Time Sensitive on for MastSettings → Notifications → Mast. Not the first switch under another name: each Focus carries its own Time Sensitive toggle, which admits every app already allowed under it, and a page is judged against both.
leave the ringer onThe switch on the side of the phone silences a time-sensitive notification. Only a critical alert overrides it, and Mast sends one of those only to a phone that has critical alerts turned on for it.

None of this is assumed. The line under the page tier in the app reads time sensitive · breaks through Focus once the first two are set, and turns amber with a button to fix it when a page could go unheard. Send yourself one before you rely on it.

the ceiling

A channel carries two settings for loudness rather than one: the level it sends at by default, and the highest level it can ever reach. The second is what makes a send address safe to paste into a CI config.

A sender can ask for any level it likes. Asking for more than the ceiling gets the ceiling.

$ curl -d "quorum lost" -d priority=page \
    https://mast.tissue.dev/mk_9f2a41c8b7
# delivered as loud, on a channel whose ceiling is loud

A channel made in the app can be given any ceiling, page included, because the person choosing it is holding the phone that will ring. A channel made with an API token starts at loud and that token cannot raise it. Moving a channel up to the pager tier is a tap in the app, on the device that will be woken: deciding to be woken up is not a thing a credential should be able to do on your behalf.

quiet hours, and muting for an hour

Quiet hours are a window on the channel, 22:00 to 07:00 to begin with. Inside it, that channel's messages arrive without a sound. Mute is the same idea in a hurry: one hour of silence, from a swipe on either list or from the notification you are already looking at.

A page ignores both, and that is fixed rather than configurable. A channel that can wake you is a channel you asked to be woken by, and a pager with a snooze that covers pages is a notification app with extra steps. If you have a channel that should never wake anyone, the setting you want is its ceiling: hold it at loud, and quiet hours will hold everything it sends.

when silence is the alert

A vital is a channel that alerts when the posts stop. The sender checks in on a schedule, and a late check-in is the thing that gets you.

@daily backup && curl -fsS https://mast.tissue.dev/mk_0c47e2a91d
# a failed backup, a dead cron daemon, a powered-off box:
# all one missing check-in, and one alert

Two numbers set it. The period is how often a check-in is expected, from every five minutes to daily. The grace is how late is still not a problem: ask how long a run can honestly overshoot, because a backup that usually takes four minutes and occasionally takes twenty wants twenty minutes of grace, not five. New vitals start at every hour with ten minutes of grace, and fire a page when they go late, on the reasoning that you would not be watching for silence if the silence did not matter.

acknowledge, resolve, and swiping it away

acknowledgeI have this. It stops the repeat and stops the escalation clock. One tap from the lock screen, with no app launch and no Face ID, because the point of a pager is the seconds.
resolveit is over. The message closes and stops asking.

Dismissing the notification is neither of those. Swipe a page out of the notification list and it keeps repeating, because a swipe is also what a hand does to a phone in a pocket, and nothing on this side can tell the two apart. Every state change in Mast is a button somebody pressed on purpose. That is why Acknowledge is not a swipe action anywhere in the app, and why it is the only red button in it.

the gestures

The feed and the channel list take the same two swipes, and neither fires on a full swipe: pull a row as far as it goes and it springs back with the buttons showing, waiting to be tapped.

swipe right, on either screenmute that channel for an hour. One gesture with one meaning, whether you are looking at a message or at the channel that sent it.
swipe left on a messageresolve it. Offered on a page that asked for acknowledgement and has not been closed yet, and on nothing else, because resolving a build log is a verb with no object.
swipe left on a channeldelete it, behind a confirmation. The button is amber and not red: red here means a person is needed, and a channel being deleted needs nobody.
repeats, storms and duplicateshow often a page comes back, when it gives up, and what keeps a flapping check from burying a real one.unfoldfold

How often a page repeats is set on the channel: once, or every one, two or five minutes. It also carries an expiry, from fifteen minutes to a day, or never. At the expiry it stops repeating and stays in the feed as a page nobody answered, which is worth going back to read.

Two things keep noise off the top of the feed. A dedupe window, up to an hour, folds an identical message into the one already sitting there and counts it. A channel that floods collapses into one row with a count on it. Neither ever collapses a page: a pager that swallows the second page because it looked like the first has lied to you once, and you will not know which time it was.

channels from a script

Mast works with no account at all. The phone is the credential and a channel's URL is the only secret, which is the whole setup for most people.

Connecting a tissue.systems account adds a second way in. An API token can do what the phone does: create channels, send on them, read the feed, acknowledge a page. That is what turns the channel list into something you keep in a file rather than in a settings screen, and it means a new service can arrive with its channel already made, its address already in the deploy config and its vital already ticking, because the script that created the service created those too.

$ ribo token create mast --scope mast:write --scope mast:read

The token is minted with ribo, the tissue.systems command line, and pasted into the app once. The docs cover connecting an account and channels as code, including the reconcile loop and the full send API.

Mast's own server side runs on the tissue.systems fleet, with the same tokens and the same scopes as anything else deployed there. If you already have an account, the pager is not a second system to learn, and if you do not, a channel that pages you is a small first thing to run on one.

The overview, the screenshots and the price are on the Mast page. Questions reach support@tissue.systems.