A single-file bash monitor for nginx + host. Bash dashboard or richer Charm TUI, multi-destination alerts, historical metrics, σ-based anomaly detection, host integrity audits, and an optional eBPF probe sidecar streaming kernel events through the same alert pipeline.
Designed for the people who run one or three servers themselves — not for SREs with a Datadog budget.
Most server-monitor tooling assumes either a team or a SaaS budget. MiLog assumes one operator, one or three boxes, and a Discord channel.
One milog.sh drops into /usr/local/bin. No
daemons-on-daemons, no Python venv, no Node, no Docker.
Per-rule cooldown, cross-rule dedup keyed on
(ip, path). Discord, Slack, Telegram, Matrix — all behind
the same rule catalog.
Compares each minute against the same minute over the last 14 days. Absorbs the daily traffic curve so you don't page on the 9am rush.
Optional Linux-only Go binary. Streams kernel events — exec, tcp, file, ptrace, kmod, retransmit, syscall-rate, bpf-load — through the same alert pipeline.
FIM, persistence, ports, YARA scans, accounts, rootkit checks. Baselines once, diffs every tick.
milog attacker <ip>, milog replay,
archived-log search, hourly top-IP rollup — the postmortem tooling is
first-class, not bolted on.
One process, six surfaces. Everything fires through the same alert pipeline with cooldown and dedup.
sar, iostat, etc./etc + binaries + cron + ~/.sshexec — process spawns matching allowlisttcp — outbound connect to non-allowlisted CIDRsfile — writes to /etc, binaries, etc.ptrace, kmod, bpf-loadNative packages on Debian/Ubuntu, Fedora/RHEL, Alpine. Or the universal curl one-liner.
curl -fsSL https://raw.githubusercontent.com/chud-lori/milog/main/install.sh \
| sudo bash
Installs milog + the milog-tui and
milog-web Go binaries from the latest release.
Ensures gawk / curl / sqlite3
via your distro's package manager.
milog monitor # bash dashboard, refresh-and-redraw
milog tui # richer Charm TUI, help footer, same data
The Charm TUI keeps active keys in the footer, opens full help with
?, and scrolls longer alert/path/error/trend output in
focused views so navigation stays predictable.
sudo milog alert on 'https://discord.com/api/webhooks/ID/TOKEN'
milog alert status
milog alert test
Installs the systemd unit, enables it, fires a test embed. Slack / Telegram / Matrix work the same way — see docs/alerts.md.
milog config set HISTORY_ENABLED 1
sudo systemctl restart milog.service
# ...wait 14 days, then:
milog config set ANOMALY_ENABLED 1
milog auto-tune 7 # calibrate thresholds from history
sudo milog probe install-service
sudo journalctl -u milog-probe.service -f
Streams kernel events through the same Discord / Slack / Telegram webhook config, with the same cooldown + dedup. See docs/probe.md.
Topical guides. Every doc starts with what the thing is, then why you'd turn it on, then how — with the gotchas spelled out.
log_format recipe
Alerts
Discord / Slack / Telegram / Matrix setup, rule catalog, history
milog daemon
Headless mode, systemd service, permissions, decision log
Historical metrics
SQLite, trend/diff/auto-tune, σ-anomaly detector
Kernel observability
eBPF probe sidecar, 8 probes, install-service, allowlist tuning
Host integrity audits
FIM / rootkit / persistence / ports / YARA / accounts
Web dashboard
milog web + SSH / Tailscale / Cloudflare exposure
TUI
Charm Bubble Tea binary, key help, scrollable focused views
GeoIP enrichment
MaxMind license + weekly auto-refresh + COUNTRY column
Troubleshooting
milog doctor + common failure modes
milog.sh from modular src/*.sh. Users install
one file; contributors edit small ones.(ip, path). The day a
scanner shows up shouldn't be the day your Discord channel breaks.MIN_DAYS, per-metric floor,
stddev > 0). Better to under-alert during ramp-up than
cry wolf.journalctl -u milog.service -f tells the whole story.