Public Cron / API Monitoring — by Blitz (blitzlabx/pulse)
Pulse watches HTTP/HTTPS endpoints on a schedule, records uptime and latency, opens and resolves incidents, and gives you shareable proof pages. You can use it anonymously (public monitors) or with an account (private monitors).
Live example (community deploy): see your Render URL after deploy.
| Mode | Who can see it on the dashboard | Who can edit / delete | Share proof link |
|---|---|---|---|
| Public (not signed in when creating) | Everyone | Anyone | Yes — /s/{token} |
| Private (signed in when creating) | Only the owner (“My monitors”) | Only the owner | Yes — read-only proof for anyone with the link |
- Private monitors never appear in the public list or public stats.
- Proof pages are read-only. Having the link does not grant edit/delete rights.
- Non-auth users create public monitors; temporary share links can be shared by anyone.
In-app guide: open Docs on the dashboard (/docs.html).
- Scheduled HTTP/HTTPS checks (interval, timeout, retries, expected status / body)
- Uptime %, latency, check history, automatic incidents
- Public dashboard + private “My monitors” for signed-in users
- Shareable proof pages (
/s/{token}) and JSON (/api/share/{token}) - Optional email/password accounts (PBKDF2-SHA256, session tokens)
- Rate limiting, validation, request size limits
/pingand/healthfor external uptime tools- SQLite persistence, Docker + Render ready
- Created by Blitz (
blitzlabx)
Browser / curl
│
▼
┌─────────────────────┐
│ ApiServer │ cpp-httplib · REST + static UI · auth · share pages
│ (public/ + /api) │
└─────────┬───────────┘
│
├──────────────► Database (SQLite)
│ users · sessions · monitors · checks · incidents
│
└──────────────► MonitoringEngine (background thread)
due monitors → libcurl checks → stats / incidents
| Component | Role |
|---|---|
MonitoringEngine |
Polls due monitors, retries, updates uptime, opens/resolves incidents |
Database |
SQLite schema, migrations, ownership (user_id), share_token |
ApiServer |
Routes, CORS, rate limits, auth, public vs private access rules |
auth |
PBKDF2 password hashing, session tokens |
| Dashboard | public/ SPA-style UI · Docs at /docs.html |
| Method | Path | Notes |
|---|---|---|
| GET | /ping |
Plain text pong |
| GET | /health |
JSON status |
| Method | Path | Notes |
|---|---|---|
| POST | /api/auth/signup |
{ "email", "password" } → user + token |
| POST | /api/auth/login |
Same body |
| POST | /api/auth/logout |
Clears session |
| GET | /api/auth/me |
Requires Authorization: Bearer <token> or cookie |
Password: min 8 chars, at least one letter and one number. Registration is capped server-side (not displayed in the UI).
| Method | Path | Access |
|---|---|---|
| GET | /api/monitors |
Public monitors only |
| GET | /api/monitors?mine=1 |
Owner’s private monitors (auth required) |
| POST | /api/monitors |
No auth → public; with auth → private |
| GET | /api/monitors/:id |
Public: anyone; private: owner only |
| PUT | /api/monitors/:id |
Public: anyone; private: owner only |
| DELETE | /api/monitors/:id |
Public: anyone; private: owner only |
| POST | /api/monitors/:id/check |
Same visibility rules as GET |
| GET | /api/monitors/:id/checks |
Same |
| GET | /api/stats |
Aggregates over public monitors |
| GET | /api/share/:token |
Public JSON proof |
| GET | /s/:token |
Public HTML proof page |
{
"name": "API Health",
"url": "https://example.com/health",
"method": "GET",
"interval_seconds": 60,
"timeout_ms": 10000,
"retries": 1,
"expected_status": 200,
"expected_body_contains": "",
"follow_redirects": true
}# Public monitor (no auth)
curl -X POST https://your-host/api/monitors \
-H 'Content-Type: application/json' \
-d '{"name":"API","url":"https://example.com/health","interval_seconds":60}'
# Sign up / login
curl -X POST https://your-host/api/auth/signup \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"secret99"}'
# Private monitor (pass token)
curl -X POST https://your-host/api/monitors \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-d '{"name":"Private API","url":"https://example.com/health","interval_seconds":60}'
# List only your monitors
curl -H 'Authorization: Bearer YOUR_TOKEN' \
'https://your-host/api/monitors?mine=1'| Variable | Default | Description |
|---|---|---|
PORT |
8080 |
Listen port (Render sets this) |
HOST |
0.0.0.0 |
Bind address |
PULSE_DB_PATH |
data/pulse.db |
SQLite path |
PULSE_STATIC_DIR |
public |
Static files |
PULSE_LOG_LEVEL |
info |
debug / info / warn / error |
sudo apt-get update
sudo apt-get install -y build-essential cmake pkg-config \
libsqlite3-dev libcurl4-openssl-dev libssl-dev
git clone https://github.com/blitzlabx/pulse.git
cd pulse
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . -j$(nproc)
./pulseOpen http://localhost:8080 and http://localhost:8080/docs.html
docker build -t pulse .
docker run --rm -p 8080:8080 -v pulse-data:/app/data -e PORT=8080 pulse- Connect blitzlabx/pulse (or your fork).
- Use the Dockerfile; health check
/healthor/ping. - Persist
/app/datawith a disk so monitors survive restarts. PORTis injected automatically.
render.yaml is included as a Blueprint.
- Public monitors are intentionally open — do not put secrets in public fields.
- Private monitors require a valid session for list/get/edit/delete by ID.
- Share links are capability URLs: treat them like unlisted links.
- Auth uses PBKDF2-HMAC-SHA256; rate limits apply to auth and create endpoints.
- Only
http/httpstargets; TLS verification enabled for checks.
- API ~120 req/min per IP; create ~10/min; auth ~20/min
- Max monitors (global) and max users are enforced server-side
- Check history cleaned periodically (default ~30 days)
Pulse is created by Blitz (blitzlabx).
Repository: github.com/blitzlabx/pulse
MIT License — see LICENSE