A home Ollama box fails quietly: the service crashes after an update, the GPU drops off the bus, a model gets evicted and the next request takes a minute. Here's how to hear about it in Discord, Slack, Teams or Telegram within minutes, without opening a port.
curl, no sign-up).If the heartbeats stop, or the script reports Ollama as unreachable, you get one alert. When it comes back, you get one more. That's it.
curl -X POST https://pawpulse.dougalpaw.workers.dev/v1/monitors \
-H 'content-type: application/json' \
-d '{"name":"home-ollama","grace_seconds":600,
"webhook_url":"https://discord.com/api/webhooks/…"}'
Use any webhook URL you like: Discord, Slack, Microsoft Teams, Google Chat, a Telegram bot
sendMessage URL with ?chat_id=, or any endpoint that accepts JSON (n8n, Home Assistant).
The response contains id, ingest_token and manage_token. Save them now; they're shown once.
grace_seconds is how long Paw Pulse waits without a heartbeat before calling it down.
With a 5-minute schedule, 600 (two missed beats) avoids false alarms from one slow run.
sudo curl -o /usr/local/bin/pawpulse.sh https://pawpulse.dougalpaw.workers.dev/pawpulse.sh
sudo chmod +x /usr/local/bin/pawpulse.sh
It's a POSIX sh script that needs only curl; read it first, it's short.
Each run it asks your local Ollama for /api/tags and /api/ps, then posts ok/fail,
the loaded model names and, if you turn it on, tokens/sec. It never sends your hostname, IP or prompts.
Test it by hand:
PAWPULSE_ID=<id> PAWPULSE_TOKEN=<ingest_token> pawpulse.sh
cron (crontab -e):
*/5 * * * * PAWPULSE_ID=<id> PAWPULSE_TOKEN=<ingest_token> /usr/local/bin/pawpulse.sh
systemd timer, if you prefer:
# /etc/systemd/system/pawpulse.service
[Service]
Type=oneshot
Environment=PAWPULSE_ID=<id>
Environment=PAWPULSE_TOKEN=<ingest_token>
ExecStart=/usr/local/bin/pawpulse.sh
# /etc/systemd/system/pawpulse.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload && sudo systemctl enable --now pawpulse.timer
A box that answers but generates at 2 tokens/sec is broken in practice (often it has fallen back from GPU to CPU). Turn on the speed probe and set a threshold:
# in the cron line or systemd unit
MEASURE_TPS=1 MEASURE_MODEL=llama3.2:3b
# on the monitor (manage token)
curl -X PATCH https://pawpulse.dougalpaw.workers.dev/v1/monitors/<id> \
-H 'authorization: Bearer <manage_token>' -H 'content-type: application/json' \
-d '{"slow_tps_threshold":10}'
The probe runs one tiny generation per beat, so pick a small model that's normally loaded.
Anything with an OpenAI-compatible /v1/models endpoint works. Set
LLM_KIND=openai and LLM_BASE_URL, for example http://127.0.0.1:8080 for
llama.cpp's server or http://127.0.0.1:8000 for vLLM.
Paw Pulse isn't the only option. A fair summary:
Do I need an account? No. Monitors are anonymous: a random id plus two tokens. See Privacy.
Can I get alerts without Paw Pulse holding my webhook? Yes: leave webhook_url out and poll
/v1/monitors/<id>/status from your own tooling, or embed the status badge.
Can my AI agent set this up? Yes. Point it at https://pawpulse.dougalpaw.workers.dev/mcp; it can
create the monitor and give you the exact commands to run.