A personal notebook about running small services well: Node.js, Linux, and tools that do one job and do it reliably. New posts whenever I break something interesting.
Oct 18, 2026 · nodeops
The built-in test runner and the stable --watch mode removed two dev dependencies from my stack overnight. The one change that actually mattered for uptime, though, was boring: handling shutdown properly instead of letting the platform kill the process mid-request.
for (const sig of ['SIGTERM', 'SIGINT']) {
process.on(sig, async () => {
await server.close();
process.exit(0);
});
}
Deploys stopped dropping in-flight requests the same day. Sometimes the fix really is ten lines.
Oct 2, 2026 · sqlitedesign
Three of my side projects outgrew their JSON files this year, and all three landed on SQLite instead of a database server. One file, no daemon, backups are a copy operation. The trick is knowing the ceiling: a few hundred writes a second and one host. Below that ceiling, boring wins every time.
Sep 19, 2026 · linuxsystemd
Restart=on-failure, RestartSec=3, a sane TimeoutStopSec, NoNewPrivileges=true, and journal tags I can actually grep. None of this is clever, and that is the point: the units I configured this way are the ones I never think about anymore.
Sep 5, 2026 · bashbackups
It is fourteen lines of bash, it keeps seven daily snapshots, and it has restored real work twice. The secret is not the script — it is the monthly reminder to actually test a restore.
#!/bin/sh
set -eu
tar -czf "/backups/app-$(date +%F).tgz" -C /srv app
ls -t /backups/app-*.tgz | tail -n +8 | xargs -r rm