Every service has a handful of addresses that simply must keep working: the homepage, an API health route, a redirect that old links depend on. There are monitoring services for this, but they usually mean another account, another dashboard, and handing your list of endpoints to someone else.
pulse takes the opposite approach. It is one Python file that uses only the standard library. You list your endpoints in a small config file, run it, and it tells you, through a single exit code, whether everything is healthy.
01What a check looks for
A check passes only when every rule you set for it holds. For each endpoint you can require:
- A status code. 200 by default, or, say, 301 for a redirect that must stay permanent.
- A keyword in the response. A page can return 200 and still be broken; checking for a word on it catches that.
- A response-time limit. Slow is a kind of broken too.
- A timeout and retries. So a brief network blip doesn't count as an outage.
pulse · 2026-08-23 14:00:00 OK website 200 142ms OK api-health 200 318ms FAIL legacy-redirect 200 105ms └─ got status 200, expected 301 2/3 healthy
02How one round works
The important part is that exit code: 0 when every endpoint is healthy, 1 when at least one check failed. It's the language cron, CI systems and shell scripts already speak, so pulse plugs into them with no glue code. Configuration mistakes also exit with an error and a message, so it's safe to block a deploy on it.
When something fails and a webhook is configured, pulse also posts a JSON summary of the failures, which can go straight into a Slack or Discord channel.
One exit code is a language every pipeline already speaks.
03Where it fits
- A cron job on a small server or a Raspberry Pi, checking every minute and logging the result.
- A smoke test after each deploy in a GitHub Actions workflow: if the new release doesn't answer correctly, the pipeline goes red.
- Continuous monitoring with
--loop, at an interval you choose. - Feeding other tools with
--jsoninstead of a table.
04Decisions I made, and why
- Standard library only. Nothing to
pip install, so nothing breaks when a dependency changes, and it runs anywhere Python 3.11 does. - Retry only what is worth retrying. Timeouts, connection errors and 5xx or 429 responses are retried with exponential backoff, random jitter and a 30-second cap. A wrong status or a missing keyword fails immediately, because retrying won't fix it.
- Private by design. The config file is ignored by git, so your list of endpoints stays on the machine that runs the checks.
- Small enough to read. The whole tool is under 300 lines. You can audit it before trusting it with your alerts.
05Known limits
pulse is a checker, not a monitoring platform. There is no history, no graphs and no dashboard: results live in your logs, exit codes and webhook messages. The project's roadmap lists stored history and a Prometheus metrics endpoint as next steps.
Try it or read the code
Open source under the MIT licence. Needs Python 3.11 or newer:
git clone https://github.com/Rodzman/pulse.git && cd pulse cp pulse.example.toml pulse.toml python3 pulse.py