Minimal uptime monitoring server written in Rust.
Checks HTTP endpoints and TCP services. Alerts on Slack. Runs anywhere.
UpSlim runs as a single process, reads a YAML config, and periodically checks your services. When something goes down it alerts you on Slack. When it recovers, it tells you that too.
- HTTP monitors — checks status codes, response times, and JSON body fields
- TCP monitors — verifies that a port is reachable within a timeout
- Smart alerting — configurable failure/success thresholds to avoid flapping noise
- Reminder intervals — re-alerts every N hours while a service stays down
- State persistence — survives restarts without duplicate alerts
Benchmarked against the production Docker image (scratch-based) on Apple M4 Pro (arm64).
Each scenario ran HTTP monitors at 5-second intervals against a local mock server.
| Scenario | Monitors | CPU avg | CPU peak | RAM avg | RAM peak |
|---|---|---|---|---|---|
| idle | 1 | 0.02% | 0.11% | 1.2 MB | 1.4 MB |
| light | 10 | 0.19% | 0.64% | 1.6 MB | 2.1 MB |
| medium | 50 | 0.34% | 0.63% | 2.3 MB | 3.1 MB |
| heavy | 100 | 0.32% | 0.65% | 2.4 MB | 3.5 MB |
Docker image: 1.9 MB. RAM is measured via docker stats. CPU is sampled every 2 seconds.
Scaling from 50 → 100 monitors adds ~0.1 MB of RAM — Tokio async tasks are nearly free.
Run
pnpm benchfrom the repo root to reproduce these results.
# config/monitors.yaml
alerting:
- name: slack-ops
type: slack
token: ${SLACK_BOT_TOKEN}
channel: "#ops-alerts"
monitors:
- name: api
type: http
url: "https://api.example.com/health"
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 500"
alerts:
- name: slack-ops
- name: database
type: tcp
host: "db.internal"
port: 5432
conditions:
- "[CONNECTED] == true"
alerts:
- name: slack-opsdocker run -d \
-v ./config:/config:ro \
-v upslim-state:/data \
-e UPSLIM_STATE_DIR=/data \
-e SLACK_BOT_TOKEN=xoxb-... \
abians7/upslim-server:latestservices:
upslim:
image: abians7/upslim-server:latest
volumes:
- ./config:/config:ro
- upslim-state:/data
environment:
UPSLIM_STATE_DIR: /data
SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
RUST_LOG: info
restart: unless-stopped
volumes:
upslim-state:| Field | Default | Description |
|---|---|---|
interval |
60s |
Check frequency |
timeout |
30s |
Max wait per check |
failure_threshold |
3 |
Failures before alerting |
success_threshold |
2 |
Successes before marking recovered |
send_on_resolved |
true |
Send recovery notification |
Supports ${ENV_VAR} substitution in any string value. Load from a single file or a directory — all *.yaml files are merged in lexicographic order.
[STATUS] == 200
[RESPONSE_TIME] < 500
[BODY].status == healthy
[CONNECTED] == true
git clone https://github.com/AbianS/upslim
cd upslim
cargo build --release -p upslim-server
./target/release/upslim-server --config ./config/Requires Rust 1.86+.
Full docs at abians7.github.io/upslim
MIT