Watch your APIs. Catch outages early. Ship with confidence.
Most “health checks” stop at a green ping.
Apollo is a full monitoring cockpit: scheduled probes, transition alerts, incidents, a public status page, charts, and exports — in one Django + React monolith.
probe ──► assert ──► threshold ──► incident
│ │
└──► webhook / email / Discord / Slack
└──► public /status page
|
HTTP methods, custom headers, bearer/basic auth, request bodies, SSL expiry, latency caps, body / header / JSON-path assertions. |
Transition-only notifications, failure thresholds, mute windows, quiet hours. Channels: webhook, email, Discord, Slack. |
|
Auto open/resolve, acknowledge in UI, multi-user ownership, optional registration, staff sees everything. |
Public |
|
Uptime & latency charts, due checks, CSV export, paginated history, check retention. |
Poetry, pnpm, Docker Compose ( |
cp .env.example .env
poetry install && poetry run python manage.py migrate && poetry run python manage.py seed
pnpm --dir frontend install
# terminal 1
poetry run python manage.py runserver
# terminal 2
pnpm --dir frontend dev| Surface | URL |
|---|---|
| App | http://localhost:5173 |
| Public status | http://localhost:5173/status |
| Demo login | apollo / apollo |
cp .env.example .env
docker compose up --build| Surface | URL |
|---|---|
| App + API | http://localhost:8000 |
| Status | http://localhost:8000/status |
Worker runs due checks and prunes old results on an interval.
flowchart LR
U[Operator UI] --> API[Django / DRF]
S[Public /status] --> API
API --> DB[(SQLite / Postgres)]
W[Check worker] --> API
W --> DB
API -->|alerts| C[Webhook · Email · Discord · Slack]
Monolith layout: React (Vite) talks to /api/*; production serves the built frontend via WhiteNoise.
| Method | Path | Auth |
|---|---|---|
GET |
/api/health/ |
public |
GET |
/api/status/public/ |
public |
GET/PATCH |
/api/status/config/ |
token |
POST |
/api/auth/login/ · /api/auth/register/ |
public* |
GET |
/api/dashboard/ |
token |
CRUD |
/api/endpoints/ |
token |
GET |
/api/incidents/?status=open |
token |
POST |
/api/incidents/{id}/acknowledge/ |
token |
GET |
/api/exports/{checks|alerts|incidents}.csv |
token |
* Register only if APOLLO_ALLOW_REGISTER=true.
poetry run pytest
poetry run python manage.py check_endpoints --due
poetry run python manage.py run_check_worker --once
poetry run python manage.py prune_checks --dry-run
pnpm --dir frontend build
docker compose up --buildCopy .env.example → .env. Highlights:
| Variable | Purpose |
|---|---|
DJANGO_SECRET_KEY |
Required when DJANGO_DEBUG=false |
DATABASE_URL |
Postgres URL (empty → SQLite) |
CHECK_INTERVAL_SECONDS |
Worker loop |
CHECK_RETENTION_DAYS |
Auto-prune old checks |
APOLLO_ALLOW_REGISTER |
Open self-serve signup |
EMAIL_* / mailer settings |
Email alerts |
Apollo
├── monitoring/ models · probes · alerts · incidents · status
├── config/ Django settings & URLs
├── frontend/ React + Redux + Vite UI
├── docker/ entrypoint + worker
└── .github/ CI
Built as a Django + React monolith · Designed to stay out of the way until something breaks
