Original Reddit post

I keep a Claude Code session running on a Debian VPS as a resident admin. At one point a polling loop inside that session ate about 100M tokens in a single day, while nothing on the server was wrong. Atlas is what I built after that. It’s a watchdog for one Linux server, stdlib Python and bash on cron and systemd, with no LLM inside. It snapshots what the machine is supposed to look like (services, timers, listening ports, accounts, sudoers, crontabs, packages, setuid binaries, firewall, apt sources, vhosts) and diffs it every 30 minutes. A small daemon follows the journal in real time for SSH logins from unknown IPs, sudo by unexpected users, failed units, OOM kills, and web requests for things like .env or .git . How Claude Code fits in: The session arms the Monitor tool on session-sensor.sh , which prints one line per state change and nothing in between. A quiet day costs no tokens. On a wake-up Claude reads the alert and probes the real system state. Then it fixes the problem within its mandate (restart a failed unit, free disk), or blesses a change it can explain ( atlas.py bless makes the current state the new baseline), or leaves the alert unacknowledged so it escalates to me. Raw logs only go through a quarantined log-reader subagent with read-only tools, because request paths and usernames are text written by strangers. There’s an optional taint gate hook on PreToolUse, PostToolUse and UserPromptSubmit. After the session reads an untrusted source, every tool call outside a read-only allowlist is denied until I type a fresh prompt. The hook is plain Python, so no model takes part in that decision. It ships as a plugin: claude plugin marketplace add /opt/atlas/agent , then claude plugin install atlas-resident@atlas . The alarm path never runs through Claude. If the session is dead, rate limited, or was talked into something by a log line, Atlas mails me anyway. Critical events go straight to me when no resident is alive, and a timer checks every 10 minutes for a dead resident, a silent patrol or an alert nobody acknowledged. The quickstart goes from a blank Debian/Ubuntu server to a resident session you talk to from the Claude phone app through Remote Control (Pro or Max). Atlas alone is fine on 1 vCPU and 768 MB of RAM; with Claude Code on the same box the guide asks for 4 GB. I built it with Claude Code, test-first: each change lands as a failing test commit and then the fix. Claude is co-author on 101 of the 194 commits and the suite has about 1,100 tests. MIT licence, signed release tags. https://github.com/NovaSeth/Atlas If you run Claude Code unattended on a server, how do you keep it from acting on something it read in a log? submitted by /u/Se4h

Originally posted by u/Se4h on r/ClaudeCode