Simple service monitoring, zero dependencies
Features •
Quick Start •
Configuration •
API •
Deployment
svstat is a minimal, self-contained service status dashboard that monitors your HTTP and TCP services and renders a real-time status page. Written in Go with zero external runtime dependencies — just a single binary and a YAML config file.
- HTTP health checks — Monitor REST APIs, web apps, and HTTP endpoints with configurable expected status codes
- TCP health checks — Monitor databases, caches, and raw TCP services (PostgreSQL, Redis, MySQL, etc.)
- Real-time dashboard — Dark-themed, mobile-responsive HTML dashboard with auto-refresh every 10 seconds
- JSON API — Machine-readable
/api/statusendpoint for integration with monitoring tools - Concurrent checks — Services are checked in parallel with configurable intervals
- Single binary — No Node.js, no Python, no database. Just
./svstatand you're done - Graceful shutdown — Clean SIGINT/SIGTERM handling
- Customizable — Configure port, services, check intervals, and timeouts
# Clone the repo
git clone https://github.com/AFS-Agentics/svstat.git
cd svstat
# Build
go build -o svstat .
# Or run directly
go run .Edit services.yaml with your services:
services:
- name: "My API"
url: "https://api.example.com/health"
type: http
expected_code: 200
interval: 30
- name: "My Database"
url: "localhost:5432"
type: tcp
interval: 60
timeout: 5# Using the default config
PORT=8080 ./svstat
# Open in browser
open http://localhost:8080| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | ✅ | — | Display name for the service |
url |
string | ✅ | — | URL (HTTP) or host:port (TCP) to check |
type |
string | ✅ | — | http or tcp |
expected_code |
int | HTTP only | 200 |
Expected HTTP status code |
interval |
int | no | 30 |
Check interval in seconds |
timeout |
int | no | 10 |
Request timeout in seconds |
| Variable | Default | Description |
|---|---|---|
PORT |
8080 |
HTTP server port |
Renders the HTML status dashboard.
Returns JSON with all service statuses.
[
{
"name": "My API",
"url": "https://api.example.com/health",
"type": "http",
"status": "up",
"response_time_ms": 145,
"last_checked": "2026-06-19T01:00:00Z",
"error": ""
}
]Status values: up, down, checking.
Returns JSON for a single service by name.
Application health check — returns {"status": "ok"}.
[Unit]
Description=svstat Service Status Dashboard
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/svstat
Environment=PORT=8080
Restart=always
RestartSec=10
WorkingDirectory=/etc/svstat
[Install]
WantedBy=multi-user.targetFROM golang:1.21-alpine AS build
WORKDIR /app
COPY . .
RUN go build -o svstat .
FROM alpine:3.19
COPY --from=build /app/svstat /usr/local/bin/
COPY services.yaml /etc/svstat/
EXPOSE 8080
CMD ["svstat"]server {
listen 80;
server_name status.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}services:
- name: "Production API"
url: "https://api.production.com/health"
type: http
expected_code: 200
interval: 15
timeout: 5
- name: "Staging API"
url: "https://staging.example.com/healthz"
type: http
expected_code: 200
interval: 30
- name: "PostgreSQL"
url: "db.internal:5432"
type: tcp
interval: 30
timeout: 3
- name: "Redis Cache"
url: "redis.internal:6379"
type: tcp
interval: 60
timeout: 2# Run tests
go test ./... -v
# Build
go build -o svstat .
# Run with race detector
go run -race .MIT © AFS Agentics
Built by AFS Agentics
