One howl becomes a pack.
Add a machine and it simply starts howling too. No wolf talks to another wolf - every howl goes to the same moon. That is the whole topology.
The moon is the server.
Howl is a tiny log-shipping fleet. Every machine runs a small agent that reads its own log files and pushes them out. Nothing ever connects to a machine - no open ports, no VPN, works from any network.
A ~56 MB process tailing log files with byte-exact checkpoints. Measured at 0.2% of one core.
Batches ship within about a second. If the moon is unreachable, the log file itself is the buffer.
A Cloudflare Worker + D1 + R2. It lives outside your house on purpose - the monitor never shares fate with the monitored.
Wolves never talk to each other. Adding a machine is registering a token and letting it howl.
Read, ship, then move the cursor.
The agent keeps a byte cursor in every file it watches. It reads what is past the cursor, ships it, and waits for the receiver to say OK - and only then does the cursor move. That ordering is the whole delivery guarantee.
writea process appends bytes to the file
Why the pause matters. The cursor moves only after the receiver acknowledges. Crash in between and the same batch simply goes again - duplicates are possible, gaps are not. If the receiver is unreachable, the cursor stops advancing and the log file itself becomes the buffer.
How the data flows.
Data pushes out; code pulls in. Agents checkpoint after every acknowledged batch, so crashes and restarts re-send instead of losing. The receiver classifies, stores hot, rolls cold, and watches for silence.
Small agent, serious guarantees.
Never loses a line
Checkpoints advance only after the server acknowledges. Rotation, deletion, truncation, even in-place rewrites - drained and fingerprinted, proven by a zero-loss test harness.
Alerts that respect you
One push per incident, not five hundred. Errors buzz in seconds; a machine going quiet buzzes once; a source that stops shipping while its machine looks healthy gets caught too.
Updates itself
Push to main and every wolf is running it within fifteen minutes. Failed builds keep the old agent alive. Restarts are lossless by construction.
of one CPU core, measured on a live machine. 56 MB of memory. Under 2 MB of network a day when idle.
from a line hitting a log file to it being queryable at the receiver, classified and stored.
of always-on servers. The receiver is a Cloudflare Worker; a home fleet fits comfortably in free tiers.
A new wolf in four lines.
# on the new machine git clone [email protected]:you/howl.git ~/howl cd ~/howl/agent && npm ci && npm run build node dist/agent.js init --endpoint https://your-moon.example --token howl_... # install the service units - and it howls forever