HTTP and ping
Custom method, headers, and body for HTTPS. ICMP with a TCP fallback when the network won’t let you ping.
Self-hosted endpoint monitoring
In ops, nominal means everything is within expected parameters. Nominal is the monitor that tells you when it isn’t.
Database-backed monitors. Readable conditions. GraphQL, Terraform, and alerts where you already sit.
Why Nominal
Write conditions as expressions. Put the records in a database you can query, mutate, and Terraform.
Custom method, headers, and body for HTTPS. ICMP with a TCP fallback when the network won’t let you ping.
[STATUS], [BODY], [RESPONSE_TIME], [IP], [CONNECTED], [CERTIFICATE_EXPIRATION].
API tokens for GraphQL. A Terraform provider when the admin shouldn’t be the source of truth.
Each region has its own queue. Workers set PROBE_REGION and check from where you actually run.
Mail, Slack, Teams, Discord, generic webhooks, and PagerDuty.
Login, no login, or Cloudflare Access in front of the admin. GraphQL always uses tokens.
Conditions
Nominal evaluates them on every run and keeps the history.
[STATUS] == 200
[RESPONSE_TIME] < 400
[CERTIFICATE_EXPIRATION] > 48h
[BODY] == pat(*"ok"*)
[CONNECTED] != false
Get started
git clone https://github.com/returnearly/nominal.git
cd nominal
cp .env.example .env
php artisan key:generate
docker compose up --build
Admin is at http://localhost:8000/admin. Create a GraphQL token with php artisan nominal:token.