I built a minimal monitoring tool for side projects - and it ships as a single binary

The problem
Most side projects get zero monitoring. You find out your app is down when a friend texts you, or when you check it yourself at 2am. Setting up Prometheus + Grafana feels like a weekend project on its own. SaaS tools cost money and send your logs to someone else's servers.
So for most side projects, the monitoring stack is: nothing.
What I built
sidemon is a single static Go binary. You drop a monitor.yaml in your project, run sidemon start, and you get:
- Uptime monitoring - polls your HTTP endpoints, records status code and latency, alerts on down/recovered transitions
- Error detection - tails your log files and matches lines against patterns. Works with plain text and JSON structured logs
- Traffic tracking - either parses your existing nginx/apache access log, or runs as a lightweight reverse proxy in front of your app
- Alerting - Slack/Discord webhooks and SMTP email, with cooldown tracking so you don't get spammed
No Docker. No database server. No dashboards to log into. Everything is stored in a local SQLite file.
How it works
# Install
curl -sSL https://raw.githubusercontent.com/WHITELOTUS0/sidemon/main/install.sh| sh
# Set up
sidemon init # creates monitor.yaml
nano monitor.yaml # point it at your app
# Run
sidemon start # runs in foreground, use tmux/systemd to background it
sidemon status # live TUI dashboard in another terminal
sidemon tail # stream errors as they happen
sidemon report # 24h summaryThe architecture is intentionally simple. sidemon start writes everything to SQLite. sidemon status reads from that same file - they are separate processes talking through the database, no sockets or ports needed. SQLite's WAL mode handles concurrent reads and writes cleanly.
The config
name: my-app
endpoints:
- name: API
url: https://myapp.com/health
interval: 60s
expected_status: [200]
logs:
- name: app
path: ./app.log
patterns: [ERROR, panic, "level=error"]
traffic:
mode: proxy
proxy:
listen: :8080
upstream: http://localhost:3000
alerts:
cooldown: 15m
webhook:
url: https://hooks.slack.com/services/...
on: [down, recovered]Why Go
Single binary distribution was the main reason. No runtime to install, no pip install, no node_modules. go install go github.com/WHITELOTUS0/sidemon/cmd/sidemon@latest and you're done. GoReleaser handles cross-compilation for macOS, Linux, and Windows automatically on every tag push.
The other reason: goroutines made the concurrency model clean. Each endpoint checker, log watcher, and traffic monitor runs in its own goroutine, all sharing the same SQLite connection pool.
What's next
- Prometheus /metrics endpoint for people who do want to plug into Grafana
- JSON field-based filtering (e.g. match only when level=error AND service=payments)
- sidemon alert test is already in — run it to verify your webhook works before you need it
The repo is open source at github.com/WHITELOTUS0/sidemon. Install it, break it, open issues.