nightsitter
The watchdog for agents that stopped talking.
An agent that needs you will tell you. Claude Code's Remote Control pushes a notification when a session asks for approval or input, and if you use it, that case is already covered.
The failure that costs you the night is the opposite one: the agent that stops saying anything at all. Wedged mid-task. Looping on the same three tool calls. Killed by an OOM at 3am. The process is either healthy and doing nothing, or gone — and nothing is coming to tell you, because the thing that would tell you is the thing that broke.
nightsitter watches from the outside, so it still works when the agent can't speak for itself.
pipx install nightsitter
nightsitter run -- python nightly_agent.py # dead-man wrapper for ANY command
nightsitter watch # watch local Claude Code sessions
nightsitter status # one-shot fleet snapshot
nightsitter daemon install # keep watching after you close the terminal
Any command, not just Claude Code
The wrapper is a first-class citizen, not an afterthought — cron'd agents, LangChain scripts, scrapers, nightly jobs, anything with an exit code:
nightsitter run --label nightly-report --max-minutes 45 \
--heartbeat-url https://hc-ping.com/<uuid> -- python nightly.py
- alerts on failure, and on the kill switch firing (SIGTERM → SIGKILL)
--max-minutesbounds the runaway case that burns tokens until morning- pings your healthchecks.io check on success,
/failon failure - passes stdio through untouched, exits with the child's code
What it detects in Claude Code sessions
nightsitter watch reads Claude Code's local transcripts — no hooks, no SDK,
no config inside the agent — and classifies every session by progress, not
process health:
| State | Meaning | Who else catches this |
|---|---|---|
| 🟡 stalled | process alive, mid-task, no activity — alive but stuck | nobody: a wedged agent has no reason to notify you |
| 🔴 dead | process gone mid-task | nobody: the notifier died with it |
| 🟠 waiting | turn closed — waiting on your approval or answer | Remote Control does this well; kept for setups without it |
| 🟢 active | transcript moving | — |
| ⚪ done | finished cleanly (silent by default) | — |
The two rows that matter are the ones nothing else covers. They are also the hard ones: transcripts carry no PID, so deciding which live process owns which session is a heuristic, and this tool shipped three wrong ones in two days before the current approach (count live processes per working directory, rank transcripts by last conversational event, top-N are alive).
How this differs from Remote Control
| Remote Control | nightsitter | |
|---|---|---|
| Agent asks you something | ✅ push, and you can answer from your phone | ✅ alert only |
| Agent silently stops making progress | ❌ | ✅ |
| Agent process dies | ❌ (the reporter dies too) | ✅ |
| Non–Claude Code jobs (cron, scripts) | ❌ | ✅ |
| Runaway kill switch | ❌ | ✅ --max-minutes |
They compose well: Remote Control for conversation, nightsitter for silence. If you only ever want to be pinged for approvals, use Remote Control — it does that better than this ever will.
Notifications
Zero-signup default: ntfy.sh. Set a topic and install the ntfy app:
export NIGHTSITTER_NTFY_TOPIC="your-secret-topic"
nightsitter test-notify
Telegram and desktop notifications are also supported — see
~/.nightsitter/config.toml:
[notify]
ntfy_topic = "your-secret-topic"
# telegram_token = "..."
# telegram_chat_id = "..."
# desktop = "on"
If ntfy is slow or blocked on your network, use Telegram. ntfy.sh is the
default because it needs no account, but on some networks (measured from a
Korean ISP) publishes take 20–30s and time out — sometimes after the server
accepted the message, which looks like a failure and costs you a duplicate
ping on the retry. nightsitter test-notify tells you which channels actually
work from where you are. Configure more than one: alerts fan out to every
channel, a channel that keeps failing is dropped once another has delivered,
and a channel that fails three times in a row is skipped for a few minutes —
so a flaky channel can neither spam you nor slow the watcher down.
Run it as a service
The watcher only helps if it outlives your terminal:
nightsitter daemon install # macOS launchd (KeepAlive) / Linux systemd --user
nightsitter daemon status
nightsitter daemon uninstall
Re-run install with different flags (--stall-after 20) to update in place.
Status
v0.2 — local CLI, free forever (MIT).
Most of the work since v0.1 went into not alerting: repeats decay, a channel that keeps failing is skipped rather than retried into duplicates, and alert history survives a restart so a reboot does not re-announce everything. The detection was the easy half.
Cloud (founding users)
A hosted version is coming: alert history, multi-machine fleet view, and a mobile app. Founding users lock in $12/month forever — fully refundable any time before cloud ships, no questions asked.
→ Preorder nightsitter cloud · or join the free waitlist — no payment, just a ping when it ships.
The local CLI stays free forever; preorders fund the hosted version.
Metadata
Release files for nightsitter 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nightsitter-0.2.1.tar.gz | 175.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nightsitter-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 207.5 kB
Release files / nightsitter-0.2.1.tar.gz
| Download URL | nightsitter-0.2.1.tar.gz |
|---|---|
| Size | 175.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d76796485a4d5a9b08e75a124bd5de128c0e60325093d4d31c43926fd122863b
|
|
BLAKE2b-256 checksum How to use checksums |
6ae9e8c27eca4ae78d724fe00a8bf0c5f08c4acd684c910cf37a646778b3ade0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / nightsitter-0.2.1-py3-none-any.whl
| Download URL | nightsitter-0.2.1-py3-none-any.whl |
|---|---|
| Size | 32.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d2e17034adde36d026ceb845d803324c11e4197ee89a10454fd0514c1e44b8fb
|
|
BLAKE2b-256 checksum How to use checksums |
a1995776ade307662f6bf44661ca8c30b85e717c340786be1804765071604b2b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|