Skip to content
Go back

Argus

A self-hosted uptime monitor — concurrent checker in Go, real-time SolidJS dashboard, Postgres-backed history, and BetterStack-style request timing.

Go active live ↗

Argus is a self-hosted uptime monitor in the spirit of BetterStack or UptimeRobot. It checks your endpoints on a schedule, opens an incident the moment one goes down, and shows the whole history on a live dashboard and a public status page.

It started as the first project on my backend roadmap and turned into the most complete thing I’ve built: a concurrent checker in Go, a real-time SolidJS frontend, Postgres-backed history, and request-timing breakdowns you’d normally pay for.

What it does

Stack

LayerTech
BackendGo
FrontendSolidJS + TypeScript
DatabasePostgreSQL 18 (pgx/v5)
RealtimeServer-Sent Events
Migrationsgolang-migrate
DeployHetzner + Docker

How it works

The architecture has one idea at its center: every completed check flows into a single onResult callback, and everything else subscribes to it.

pool := checker.NewPool(workers, buffer, func(r checker.URLResult) {
    models.Results.Insert(ctx, r)                         // 1. persist the check

    if summary := models.Incidents.DetectAndUpdate(ctx, r); summary != nil {
        r.Incident = summary                              // 2. open or close an incident
    }

    hub.Broadcast(r)                                      // 3. push to the live dashboard
})cmd/server/main.go

Adding a new concern — an email alert, a webhook — means adding one line here, not threading a dependency through the checker. A fixed worker pool does the actual checking, so the number of in-flight HTTP requests stays bounded no matter how many monitors exist. A scheduler ticks every 10 seconds and submits only the monitors that are due, based on each one’s interval.

Engineering decisions worth calling out

Status

Live and running, still building incrementally.