Blog

Technical write-ups on building okokumo, in public.

A status badge that's safe to put on any website

2026-10-26

Archer is okokumo's embeddable status badge, one check rendered in an iframe on your own site. This post walks through what the embed route actually does. Its handler is pinned by a test never to set a frame-blocking header, an unknown token and a disabled badge get the identical 404, a paused check never shows why it is paused, and it renders the check's name and status and nothing else.

engineeringstatus-pages

Ask your AI assistant "was I alerted?" — okokumo's MCP server

2026-10-19

okokumo runs a hosted MCP server at /mcp. Claude, Cursor and other MCP clients can use it to read your checks, pause one, or draft a status-page incident. Each of its 18 tools is a thin call onto an existing /v1 route and runs under your role and your plan limits, so an assistant can do nothing your API key couldn't already do over REST. This post covers what the tools are, what one exchange looks like on the wire, and how browser sign-in replaces pasting a key.

engineeringmcp

Your data, as a download — not an email to support

2026-10-12

okokumo has two self-serve JSON exports for GDPR art. 20 portability. One is for admins and covers everything an organization configured. The other is for any user and covers only that person. This post covers what each file contains, what it leaves out and why, and how the document tells you when it was cut short.

engineeringprivacy

What "99.9% uptime" actually counts

2026-10-05

An uptime percentage is a ratio of probe results, not a measurement of time. How okokumo computes the number on badges and status pages, how a UTC day becomes up, partial, down or no data, why a paused check is grey rather than red, and why a 3-minute outage still reads 100.0%.

engineeringstatus-pages

Verifying an okokumo webhook — the signature, the retries, and the duplicate you'll eventually get

2026-09-28

Checking an HMAC signature takes three lines, and most receivers still get it wrong by checking it against re-serialised JSON. How to verify okokumo's X-Sentinel-Signature against the raw body in Node, Python and Go, which responses we retry and which we don't, and why your receiver has to cope with the same alert arriving twice.

guidealerting

Your status page is an incident-communication tool, not a dashboard

2026-09-21

Flipping a component to red automatically is easy and usually wrong. What a status page is actually for, why okokumo drafts an incident but never publishes one for you, what to write in the first update when you still don't know what broke, and why "investigating" for four hours followed by "resolved" is a communication failure.

guidestatus-pages

The cron job that stopped running

2026-09-14

A job that fails sends you a stack trace. A job that never starts sends you nothing, and nothing looks exactly like success. How heartbeat checks turn silence into a signal — and how to size the grace window so a slow nightly backup doesn't page you at 3am.

guideheartbeat

Why we delete your job output after 30 days

2026-09-13

A retention number without its error bar is marketing. We publish 90 days for check results and 30 days for the output your job attaches to a failed ping — plus how far past each one a record can actually survive, because we measured it and the first number we published was wrong.

engineeringprivacy

Your SSL certificate expires in production, not in staging

2026-09-07

Certificate expiry is the most preventable outage in the industry and it still takes down major products every year. Why escalating D-30/D-14/D-7/D-1 alerts, chain validation, and domain-expiry checks belong in the same monitor as your uptime probes.

guidetls

Writing assertions that catch a "200 OK" outage

2026-09-06

A 200 with an empty body, a stale cache, or a pretty error page is still an outage. How to layer status, latency, body and header assertions so a check verifies the service works — not just that something answered.

guidehttp-checks

Pause the alerts, not the check

2026-09-04

Disabling a check during planned work stops the probing too, which leaves a hole in the uptime history exactly where the interesting hour was. How okokumo suppresses paging without suppressing measurement — and what has to happen when the window closes and the thing is still down.

engineeringalerting

A canary for alerting: breaking our own API every morning

2026-08-31

A monitoring product's worst failure is silence, because a broken alerting pipeline looks exactly like a quiet week. Here is the alert of ours that reached nobody, why health checks could not see it, and the endpoint that breaks on purpose every morning so that silence becomes something a pager outside our own infrastructure can see.

engineeringalerting

How to create your first check on okokumo

2026-08-18

A walkthrough of the first ten minutes in okokumo — set up an alert channel, create an HTTP check, read what it tells you, then publish a status page if you want one.

guidegetting-started

Custom domains, on-demand TLS, and the endpoint that says no

2026-08-18

Letting a customer serve their status page from status.theircompany.com is four lines of Caddy config and one endpoint you must not get wrong. How okokumo gates certificate issuance, verifies with a single CNAME, and takes a hostname back when it stops pointing at us.

engineeringtls

Multi-region confirmation without false positives

2026-08-13

A monitoring tool that cries wolf gets muted, and a muted tool is worse than none. How okokumo requires two probe regions to agree before it pages you — and why it deliberately stops requiring that when a probe dies.

engineeringalerting

Designing a check scheduler

2026-07-27

How okokumo schedules thousands of due checks without a global periodic scan, and without double-firing when two scheduler ticks overlap.

engineeringscheduling