Two tiny tools that replaced our error-monitoring stack with a text file.
Most apps don't need a golden-plated logging pipeline or a full Sentry/SaaS setup to know what's breaking. For the small-to-mid, self-hosted stuff we run, that's all weight: SDK sprawl, an agent to babysit, a bill, and data leaving the box.
So we built two zero-dependency siblings that emit one JSON line per event — and let you decide where it goes:
🛩 flightlog — records what broke inside your app (uncaught exceptions, manual captures) in-process, to a JSONL file. The flight recorder.
🩺 pulselog — the outside sibling: scheduled health checks (HTTP/TCP/SSL/disk/systemd), a weekly stats digest, and rotated backups — silent when green, emails you on a real signal.
What it actually solves:
- JSONL is the interface. Every event is one jq-able line — tail, grep, or pipe it straight into PostHog, ClickHouse, BigQuery, or whatever you already run. No proprietary format, no lock-in.
- Zero production dependencies. Node built-ins only. Nothing to CVE-scan, nothing to upgrade-treadmill.
- No daemon, no SaaS, no telemetry. Runs from cron or a systemd timer. It never phones home — your data stays on your box until you ship it.
- One dialect across both tools. Errors, health, stats, and backups share the same core shape, so a single reader spans all four streams.
- The refusals are the product. No dashboard, no agent, no alert-routing platform — it does the boring 90% well and hands the rest to tools that already exist.
- Shipping a payload off-box is a separate, consent-gated step — not baked in. Observability you can actually reason about.
Sometimes the right answer isn't a bigger platform. It's a text file and a cron job.
Both Apache-2.0, on npm. 🔗 in comments.
flightlog: https://github.com/hamr0/fl...
pulselog: https://github.com/hamr0/pu...