Skip to content

Repository files navigation

Pulse

Public Cron / API Monitoring — by Blitz (blitzlabx/pulse)

License: MIT C++17 Docker Render

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.


How monitoring ownership works

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).


Features

  • 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
  • /ping and /health for external uptime tools
  • SQLite persistence, Docker + Render ready
  • Created by Blitz (blitzlabx)

Architecture

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

API

Health

Method Path Notes
GET /ping Plain text pong
GET /health JSON status

Auth

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).

Monitors

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

Create body

{
  "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
}

curl examples

# 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'

Configuration

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

Local development

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)
./pulse

Open http://localhost:8080 and http://localhost:8080/docs.html


Docker

docker build -t pulse .
docker run --rm -p 8080:8080 -v pulse-data:/app/data -e PORT=8080 pulse

Render

  1. Connect blitzlabx/pulse (or your fork).
  2. Use the Dockerfile; health check /health or /ping.
  3. Persist /app/data with a disk so monitors survive restarts.
  4. PORT is injected automatically.

render.yaml is included as a Blueprint.


Security notes

  • 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/https targets; TLS verification enabled for checks.

Limits

  • 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)

Credits

Pulse is created by Blitz (blitzlabx).

Repository: github.com/blitzlabx/pulse

MIT License — see LICENSE

About

Public & private HTTP/HTTPS uptime monitoring tool. Schedule checks, track latency & uptime, open incidents, and share proof pages.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages