Skip to content
Nominal

Docs

How Nominal works

A monitor is a row in your database. On an interval, a probe runs a check, conditions decide if that was healthy, and the result is stored. Alerts, status pages, and badges read the same records.

The loop

The scheduler looks for monitors whose next_check_at is due. For each assigned probe it enqueues a job on that probe’s queue (checks.local, checks.us-east, …). A worker with matching PROBE_REGION runs the check for that type.

After the probe returns, Nominal evaluates every condition against placeholders such as [STATUS] and [CONNECTED]. All of them must pass. The check result is written, consecutive success/failure counters update, and the monitor’s status becomes Up or Down. If the monitor is not in maintenance, alerting may fire.

Heartbeats skip the outbound probe. The same scheduler still “checks” whether a ping arrived in time.

What you configure

Create monitors in the Filament admin, with GraphQL (POST /graphql and a Sanctum token), or with Terraform. The admin is private. Public status is a status page, a badge, or Prometheus.

  • Get started — pull the image, boot Compose, open the admin.
  • Monitors — type, target, interval, and per-type request options.
  • Conditions — expressions evaluated on every run.
  • Alerts — channels, thresholds, reminders, and maintenance windows.
  • Status pages — public pages, incidents, and badges.

Check types

Outbound types send a probe. Heartbeats wait for your jobs to call in. Database types log in with a URL and run a version/status query unless you pass your own command.

Probes and regions

Each probe is a named worker region. Assign one or more to a monitor and the check runs from each. Workers listen to checks.{region}. SQLite is single-node; use Postgres or MySQL if more than one writer will touch the database. ICMP inside Docker needs cap_add: [NET_RAW] on the worker.

Where the data lives

Monitors, conditions, check history, and aggregates are ordinary tables. Query them. Scrape /metrics (prefix nominal_, labels monitor, type, success, region). Subscribe to Reverb on private-monitors for live updates; the admin also polls every 10s.

Auth

INTERFACE_AUTH is only the admin: login, none (auto operator), or cloudflare (Access JWT). GraphQL always uses a Sanctum bearer token from php artisan nominal:token.