Skip to content
Arael Espinosa edited this page Jul 13, 2026 · 4 revisions

Piro

Piro is an open-source, self-hosted status page and uptime monitoring platform. It lets you track the health of your services, notify your team when things go wrong, and keep your users informed through a public status page.


Features

Monitoring

  • HTTP checks — monitor endpoints with configurable expected status codes, keywords, and response time thresholds
  • TCP checks — verify that a port is open and accepting connections
  • Ping checks — ICMP ping with latency tracking
  • DNS checks — validate DNS resolution and record values
  • SSL checks — track certificate validity and expiry

Multi-region

  • Deploy remote workers (Piro.Worker) in different regions — each runs checks independently and reports back
  • Multi-region checks fan out to all connected workers; results are aggregated (worst-status wins)
  • The API itself can act as a local worker via PIRO_API_WORKER=true
  • Workers report their version and heartbeat in real time

Alerting

  • Configurable alert configs per check: thresholds for failure/recovery, severity levels
  • Triggers: Email, Telegram, Twilio SMS, Opsgenie, Pushover, Ntfy — attach triggers to individual checks or globally (see Triggers)
  • On-call & escalation policies — per-service escalation chains that page on-call schedules when alerts go unacknowledged
  • Incident management — link alerts to a new or existing incident (always a manual step), track investigation state through to resolution

Status page

  • Public-facing status page showing service health at a glance
  • Maintenance windows — schedule downtime and suppress alerts

Operations

  • YAML import — define your entire monitoring setup as code and import it
  • API keys — authenticate external integrations
  • Serilog structured logging — persisted to PostgreSQL, visible in the admin UI
  • OpenAPI 3.1 spec at /openapi/v1.json with Swagger UI at /swagger
  • Real-time admin UI via SignalR — Workers page updates instantly on connect/disconnect

Architecture

┌─────────────────────────────────────┐
│           Piro.Api (ASP.NET Core)   │
│  REST API · SignalR Hubs · Quartz   │
│  PostgreSQL (EF Core) · Serilog     │
└────────────┬──────────┬─────────────┘
             │          │ SignalR /hub/worker
    ┌────────┘          └──────────────────────┐
    │ In-process                               │
    │ (PIRO_API_WORKER=true)          ┌────────┴────────┐
    │                                 │  Piro.Worker    │
    │                                 │  (remote agent) │
    └─────────────────────────────────┴─────────────────┘
                    ↑ both feed into MultiRegionBatchTracker
┌──────────────────────────────┐    ┌──────────────────────────────┐
│   apps/web (Next.js 16)       │    │  apps/admin (Vite + React)    │
│   Public status page          │    │  Admin panel (SPA)            │
│   port 3000                   │    │  port 5173                    │
└──────────────────────────────┘    └──────────────────────────────┘
              both talk to the API · admin also uses SignalR /hub/admin (RT)

Wiki

Clone this wiki locally