Monitor a Linux server or laptop from your phone, with nothing running in the middle.
StatixAgent is a single static Go binary that watches one machine and talks to your own private Telegram bot. It samples the system, watches sshd, and pushes alerts straight to your chat. There is no central server, no dashboard to host, and no third party in your data path — the agent talks only to Telegram's Bot API and to GitHub Releases when you ask it to update.
Everything after installation happens in Telegram: type /status for a live
dashboard, get a push message the moment someone logs in over SSH or the power
cord is pulled, and tap buttons to drill in.
curl -fsSL https://raw.githubusercontent.com/eliau2005/statixagent/main/install.sh | sudo bash
Project status: early open-source release (v0.x). The core is built, tested, and running; the project is now opened to the community. See Project status and ROADMAP.md.
Most monitoring stacks assume you are running a fleet and want a time-series database, a query language, and a dashboard. For a single VPS or a home laptop, that is a lot of moving parts to install, secure, and keep alive — often heavier than the thing you are trying to watch.
StatixAgent takes the opposite trade-off:
| Prometheus / Grafana-style | StatixAgent | |
|---|---|---|
| Components to run | exporter + TSDB + dashboard + alertmanager | one binary |
| Where your data goes | scraped into a central store | stays on the machine; only alerts you request leave |
| How you interact | a web UI you host and secure | a private Telegram bot you already carry |
| Footprint | designed for fleets | designed for one box (MemoryMax=128M) |
| Setup | compose files, config, reverse proxy | one command, a one-time TUI wizard |
It is deliberately not a fleet tool. Each install is fully isolated: one agent, one bot, one chat. That buys simplicity and a small attack surface, at the cost of cross-server correlation (see Trade-offs).
Reach for StatixAgent when you want to know your one box is okay — and hear about it the moment it is not — without standing up an observability stack.
/ping).SSH visibility is a first-class feature, not an afterthought:
authorized_keys change alerts — the agent hashes root's and every home
user's key files and alerts when one changes.Alerts arrive as push messages — you never have to ask for them:
Each alert carries one-tap action buttons for the obvious next step (jump to the relevant metric view, list SSH sessions, open the firewall control) and a 🔕 button to snooze that alert for an hour while you handle it.
Remediation is intentionally minimal and always gated behind an explicit confirmation:
/ssh./firewall — open or close SSH port 22 via ufw, behind a mandatory
confirmation screen.Commands are registered for autocomplete, and every metric view carries an inline keyboard so you can navigate by tapping instead of typing.
| Command | Result |
|---|---|
/status | full snapshot: CPU, RAM, disks, net, temps, battery, uptime |
/cpu /mem /disk /net /temp /battery | one metric in detail, with sparkline trends on /cpu and /mem |
/top | heaviest processes by CPU and memory |
/digest | the day's recap — also auto-sent every morning |
/services | systemd units, processes, ports, healthchecks |
/http | endpoint checks · /http add <url> [status] · /http remove <url> |
/ping <host[:port]> | TCP connect latency from the server |
/docker | containers with CPU/RAM and restart counts |
/ssh | live sessions with disconnect buttons · /ssh history · /ssh fails |
/ssl | certificate expiry · /ssl add <host> · /ssl remove <host> |
/firewall | open/close SSH port 22 via ufw |
/watching | everything watched, managed with buttons |
/settings | alert thresholds and digest schedule, tuned with buttons |
/services_scan /ports_scan | discover candidates to watch |
/update | check for a new release · /update_confirm installs it |
/clear_chat | delete recent messages |
/help | grouped command reference |
Commands are accepted only from the single chat ID in the config; updates from any other chat are dropped before parsing.
The agent can update itself from GitHub Releases, and the verification is not optional:
checksums.txt and its detached checksums.txt.sig.rename), keeping the previous binary as .prev..prev automatically if the new
binary keeps dying, and consumes it so versions cannot ping-pong.Automatic update checks are off by default and opt-in at install time. Full details are in SECURITY.md.
/etc/statix-agent/config.toml, written atomically
with 0600 permissions./update_confirm, /firewall) require an explicit confirmation.NoNewPrivileges, ProtectSystem=full,
ProtectHome=read-only, PrivateTmp, a narrow ReadWritePaths, and
MemoryMax=128M.See SECURITY.md for the full threat model, the privilege model, and the distinction between what is implemented today and future hardening.
curl -fsSL https://raw.githubusercontent.com/eliau2005/statixagent/main/install.sh | sudo bash
The one-time TUI wizard asks for your bot token (from @BotFather) and chat ID, lets you toggle monitor categories and thresholds, then:
/etc/statix-agent/config.toml (0600),/usr/local/bin/statix-agent,Restart=always).The TUI runs only at install time. Everything afterward is done through the
bot. Piping a script to sudo bash runs it as root — you are encouraged to read
install.sh first; it is short.
The agent runs on Linux and is released for:
linux/amd64linux/arm64It reads /proc, /sys, the auth log (journalctl / /var/log/auth.log),
utmp (with a loginctl fallback for utmp-less distros such as Ubuntu 24.10+),
and the Docker Engine socket when present. Optional integrations degrade
gracefully when the underlying tool is absent (ufw, Docker, journalctl).
Development and the full test suite run on any OS (Linux, macOS, Windows) — every parser is a pure function tested against fixtures.
Requires Go 1.25+.
go test ./... # full suite (14 packages), green on any OS
go vet ./...
make build # cross-compile linux amd64 binaries into bin/
make dist # all release artifacts + checksums
See CONTRIBUTING.md for setup, code-quality expectations, and how to structure a change, and docs/ARCHITECTURE.md for the design.
Generate a signing key once with go run ./tools/sign keygen, store the private
half as the STATIX_SIGNING_KEY repository secret, then push a v* tag — CI
builds, signs, and publishes the release.
Early open-source release (v0.x). The MVP described in mvp.md is built and covered by tests, and the project has iterated through several UX rounds (inline keyboards, live mode, button-driven watch management, alert action buttons, trends, and a first remediation action). It is a working project with a strong foundation, now opened to the community.
It is not yet declared production-ready: it has not been through broad real-world deployment across many distros, and there is no published security audit. Treat v0.x accordingly, and please report what breaks.
The decentralized design has deliberate costs:
See ROADMAP.md for what is done, what is stabilizing, and what is planned. Everything beyond the current release is clearly marked as future work and is not a commitment.
Contributions are welcome — this is exactly the stage where they have the most impact. Good first areas include Linux distro compatibility, hardware/sensor coverage, SSH/security detection, tests, and documentation. Start with CONTRIBUTING.md.
Please do not open a public issue for security problems. Report privately via a GitHub Security Advisory. See SECURITY.md for the disclosure process.
StatixAgent is released under the MIT License. By contributing, you agree that your contributions are licensed under the same terms.
52 commits
Go
99.2%
Monitor a Linux server or laptop from your phone, with nothing running in the middle.
StatixAgent is a single static Go binary that watches one machine and talks to your own private Telegram bot. It samples the system, watches sshd, and pushes alerts straight to your chat. There is no central server, no dashboard to host, and no third party in your data path — the agent talks only to Telegram's Bot API and to GitHub Releases when you ask it to update.
Everything after installation happens in Telegram: type /status for a live
dashboard, get a push message the moment someone logs in over SSH or the power
cord is pulled, and tap buttons to drill in.
curl -fsSL https://raw.githubusercontent.com/eliau2005/statixagent/main/install.sh | sudo bash
Project status: early open-source release (v0.x). The core is built, tested, and running; the project is now opened to the community. See Project status and ROADMAP.md.
Most monitoring stacks assume you are running a fleet and want a time-series database, a query language, and a dashboard. For a single VPS or a home laptop, that is a lot of moving parts to install, secure, and keep alive — often heavier than the thing you are trying to watch.
StatixAgent takes the opposite trade-off:
| Prometheus / Grafana-style | StatixAgent | |
|---|---|---|
| Components to run | exporter + TSDB + dashboard + alertmanager | one binary |
| Where your data goes | scraped into a central store | stays on the machine; only alerts you request leave |
| How you interact | a web UI you host and secure | a private Telegram bot you already carry |
| Footprint | designed for fleets | designed for one box (MemoryMax=128M) |
| Setup | compose files, config, reverse proxy | one command, a one-time TUI wizard |
It is deliberately not a fleet tool. Each install is fully isolated: one agent, one bot, one chat. That buys simplicity and a small attack surface, at the cost of cross-server correlation (see Trade-offs).
Reach for StatixAgent when you want to know your one box is okay — and hear about it the moment it is not — without standing up an observability stack.
/ping).SSH visibility is a first-class feature, not an afterthought:
authorized_keys change alerts — the agent hashes root's and every home
user's key files and alerts when one changes.Alerts arrive as push messages — you never have to ask for them:
Each alert carries one-tap action buttons for the obvious next step (jump to the relevant metric view, list SSH sessions, open the firewall control) and a 🔕 button to snooze that alert for an hour while you handle it.
Remediation is intentionally minimal and always gated behind an explicit confirmation:
/ssh./firewall — open or close SSH port 22 via ufw, behind a mandatory
confirmation screen.Commands are registered for autocomplete, and every metric view carries an inline keyboard so you can navigate by tapping instead of typing.
| Command | Result |
|---|---|
/status | full snapshot: CPU, RAM, disks, net, temps, battery, uptime |
/cpu /mem /disk /net /temp /battery | one metric in detail, with sparkline trends on /cpu and /mem |
/top | heaviest processes by CPU and memory |
/digest | the day's recap — also auto-sent every morning |
/services | systemd units, processes, ports, healthchecks |
/http | endpoint checks · /http add <url> [status] · /http remove <url> |
/ping <host[:port]> | TCP connect latency from the server |
/docker | containers with CPU/RAM and restart counts |
/ssh | live sessions with disconnect buttons · /ssh history · /ssh fails |
/ssl | certificate expiry · /ssl add <host> · /ssl remove <host> |
/firewall | open/close SSH port 22 via ufw |
/watching | everything watched, managed with buttons |
/settings | alert thresholds and digest schedule, tuned with buttons |
/services_scan /ports_scan | discover candidates to watch |
/update | check for a new release · /update_confirm installs it |
/clear_chat | delete recent messages |
/help | grouped command reference |
Commands are accepted only from the single chat ID in the config; updates from any other chat are dropped before parsing.
The agent can update itself from GitHub Releases, and the verification is not optional:
checksums.txt and its detached checksums.txt.sig.rename), keeping the previous binary as .prev..prev automatically if the new
binary keeps dying, and consumes it so versions cannot ping-pong.Automatic update checks are off by default and opt-in at install time. Full details are in SECURITY.md.
/etc/statix-agent/config.toml, written atomically
with 0600 permissions./update_confirm, /firewall) require an explicit confirmation.NoNewPrivileges, ProtectSystem=full,
ProtectHome=read-only, PrivateTmp, a narrow ReadWritePaths, and
MemoryMax=128M.See SECURITY.md for the full threat model, the privilege model, and the distinction between what is implemented today and future hardening.
curl -fsSL https://raw.githubusercontent.com/eliau2005/statixagent/main/install.sh | sudo bash
The one-time TUI wizard asks for your bot token (from @BotFather) and chat ID, lets you toggle monitor categories and thresholds, then:
/etc/statix-agent/config.toml (0600),/usr/local/bin/statix-agent,Restart=always).The TUI runs only at install time. Everything afterward is done through the
bot. Piping a script to sudo bash runs it as root — you are encouraged to read
install.sh first; it is short.
The agent runs on Linux and is released for:
linux/amd64linux/arm64It reads /proc, /sys, the auth log (journalctl / /var/log/auth.log),
utmp (with a loginctl fallback for utmp-less distros such as Ubuntu 24.10+),
and the Docker Engine socket when present. Optional integrations degrade
gracefully when the underlying tool is absent (ufw, Docker, journalctl).
Development and the full test suite run on any OS (Linux, macOS, Windows) — every parser is a pure function tested against fixtures.
Requires Go 1.25+.
go test ./... # full suite (14 packages), green on any OS
go vet ./...
make build # cross-compile linux amd64 binaries into bin/
make dist # all release artifacts + checksums
See CONTRIBUTING.md for setup, code-quality expectations, and how to structure a change, and docs/ARCHITECTURE.md for the design.
Generate a signing key once with go run ./tools/sign keygen, store the private
half as the STATIX_SIGNING_KEY repository secret, then push a v* tag — CI
builds, signs, and publishes the release.
Early open-source release (v0.x). The MVP described in mvp.md is built and covered by tests, and the project has iterated through several UX rounds (inline keyboards, live mode, button-driven watch management, alert action buttons, trends, and a first remediation action). It is a working project with a strong foundation, now opened to the community.
It is not yet declared production-ready: it has not been through broad real-world deployment across many distros, and there is no published security audit. Treat v0.x accordingly, and please report what breaks.
The decentralized design has deliberate costs:
See ROADMAP.md for what is done, what is stabilizing, and what is planned. Everything beyond the current release is clearly marked as future work and is not a commitment.
Contributions are welcome — this is exactly the stage where they have the most impact. Good first areas include Linux distro compatibility, hardware/sensor coverage, SSH/security detection, tests, and documentation. Start with CONTRIBUTING.md.
Please do not open a public issue for security problems. Report privately via a GitHub Security Advisory. See SECURITY.md for the disclosure process.
StatixAgent is released under the MIT License. By contributing, you agree that your contributions are licensed under the same terms.
52 commits
Go
99.2%