Open sourceGoDevTools

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

Glorry
Glorry
April 5, 20266 min read
sidemon terminal dashboard showing uptime, errors and traffic

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.sh
# 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 summary

The 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

config.yml
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.

Share this article