sourcecanonicalOWNER-2026-07-10

Source — status.mainland.so health.json contract · src-status-health

Owner directive (2026-07-10), canonical. "Create a Dispatch, Wake you up every 10 minutes, check if all capability is allocated, check the conclusion of particles and atoms and if the run is moving." [src: wiki/development/prompts-archive/by-topic/knowledge-management-and-concept-modeling.md:646] — health.json is the estate-level probe the dispatch heartbeat reads.

Content

Absorption card for the live health contract of the estate: https://status.mainland.so/health.json — an unauthenticated, CORS-open endpoint ("/health.json is left unauthenticated + CORS-open so dashboards/widgets can poll the live status (it exposes only HTTP codes + up/down + disk/load — no credentials)" [src: runs/deploy-status/status.mainland.so:2]; Access-Control-Allow-Origin: *, Cache-Control: no-store [src: runs/deploy-status/status.mainland.so:17]). The rest of the status site is basic-auth gated (hos).

Generator

status-health.py runs on the droplet as a systemd oneshot service + timer, every 5 minutes (OnUnitActiveSec=300, OnBootSec=60) [src: runs/deploy-status/status-health.timer:1] and writes /var/www/status/health.json. It probes origin-local ("no Cloudflare round-trip, no single-IP rate-limit") by curling 127.0.0.1 with a Host: header per vhost [src: runs/deploy-status/status-health.py:2,13].

The JSON contract

{
  "generatedAt": "ISO-8601 UTC",
  "source": "live",
  "endpoints": [ { "group": "...", "name": "...", "url": "...", "purpose": "...", "code": 200, "agg": "28/28" } ],
  "services": { "hosweb": "active", "nginx": "active", "hosweb-health.timer": "active" },
  "box": { "disk": "42%", "load": "0.31, 0.28, 0.25", "port3300": "listening" }
}

[src: runs/deploy-status/status-health.py:79]

Endpoint groups probed

GroupEntriesNotes
Flagship & Orgsweb.mainland.so/website + the 28 org subdomains aggregated as one row (agg: "N/28")ORG_SLUGS lists 28 slugs (the 29 instances minus mainland itself) [src: runs/deploy-status/status-health.py:20]
Content & Staticorganizations · documentation · docs · prompts · showcase · poc · mvpthe static vhosts of src-droplet-index
Infrastructureapp (Coolify) · git (Gitea) · n8nHTTP-probed
Infrastructure (docker-detected)mail (Stalwart) · livekit · neo4jcode: 200 iff a matching container name is in docker ps, else null [src: runs/deploy-status/status-health.py:60]

services checks systemctl is-active for hosweb/nginx/timer; box reports disk %, load averages, and whether :3300 is listening [src: runs/deploy-status/status-health.py:71].

Consumption rules

  1. Any dashboard, widget or kernel-neural-engine heartbeat may poll it cross-origin; never cache (the server already forbids it).
  2. code: null means down or not probed-able, not necessarily an error class — pair with purpose text.
  3. The aggregated org row means per-org failures are invisible in this feed; for per-slug truth, probe https://<slug>.mainland.so/website directly per src-droplet-index.
  4. The 5-minute generator cadence and the 10-minute dispatch heartbeat are intentionally different clocks: health.json is estate truth; the dispatch heartbeat is run truth (schema-dispatch-json).

Composition

See also

  • bm-001-web-perf — performance gates complementing this availability gate
  • [Status generator source](../../../runs/deploy-status/status-health.py)

Linked from — 3 cards