Serverless uptime monitoring & status page on Cloudflare's edge network
Monitor your services, display real-time status to visitors, and get notified when things go down — all running on Cloudflare Workers + Pages + D1 with zero ops.
Quick Deploy · Local Dev · Documentation · Contributing
English | 中文
- Zero ops — No servers, containers, or databases to manage. Runs entirely on Cloudflare's free/paid tiers.
- Edge-native — Monitoring probes run from Cloudflare Workers; your status page is served from the CDN edge.
- One-click deploy — Push to
mainand GitHub Actions handles everything: D1 migrations, Worker deployment, Pages build. - Full-featured — HTTP/TCP checks, incident management, maintenance windows, webhook notifications, admin dashboard.
Monitoring
- HTTP(S) probes with custom headers, body, status code & keyword assertions
- TCP port connectivity checks
- Configurable timeouts, retry thresholds, and flapping control
- Automatic state machine: UP / DOWN / MAINTENANCE / PAUSED / UNKNOWN
Status Page
- Public-facing status page with real-time aggregate status
- Per-monitor uptime percentage and latency charts
- Active incidents and maintenance windows
- Multi-language support (en, zh-CN, zh-TW, ja, es)
Incident Management
- Create, update, and resolve incidents with timeline
- Schedule maintenance windows
- All visible on the public status page
Notifications
- Webhook notifications to Discord, Slack, ntfy, or any HTTP endpoint
- Customizable message & payload templates with magic variables
- Optional HMAC-SHA256 signature verification
- Idempotent delivery with deduplication
Admin Dashboard
- Monitor CRUD with live status overview
- Notification channel management with test button
- Analytics with uptime/latency charts and CSV export
- System settings (site title, timezone, thresholds, retention)
┌──────────────────────────────────────────┐
│ Cloudflare Network │
│ │
Visitors ──────►│ Pages (React SPA) │
│ │ │
│ ▼ │
Admin ─────────►│ Workers (Hono API) │
│ │ │ │
│ ▼ ▼ │
│ D1 DB Cron Triggers │
│ (scheduled probes) │
│ │ │
└─────────────────────┼────────────────────┘
│
▼
Target Services (HTTP/TCP)
│
▼
Webhooks ──► Discord / Slack / ntfy
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, TypeScript, Tailwind CSS, TanStack Query, Recharts |
| Backend | Cloudflare Workers, Hono, Zod |
| Database | Cloudflare D1 (SQLite), Drizzle ORM |
| Hosting | Cloudflare Pages (frontend), Workers (API) |
| CI/CD | GitHub Actions |
| Package Manager | pnpm (monorepo) |
Deploy your own Uptimer instance without touching any code or config files:
Click the Fork button at the top-right of this repository to create your own copy.
- Go to Cloudflare Dashboard → API Tokens
- Click Create Token → use the Edit Cloudflare Workers template
- Add the following permissions:
Account / Cloudflare Pages / EditAccount / D1 / EditAccount / Account Settings / Read
- Copy the generated token
Go to your forked repo → Settings → Secrets and variables → Actions → New repository secret, and add:
| Secret Name | Value | Required |
|---|---|---|
CLOUDFLARE_API_TOKEN |
Token from Step 2 | Yes |
UPTIMER_ADMIN_TOKEN |
Any strong string (this is your admin dashboard password) | Yes |
CLOUDFLARE_ACCOUNT_ID |
Your Cloudflare Account ID | Recommended |
Go to Actions → Deploy to Cloudflare → Run workflow (or simply push a commit to main/master).
The workflow automatically:
- Creates the D1 database and runs migrations
- Deploys the Worker (API + cron-based monitoring)
- Builds and deploys the Pages frontend (status page)
- Injects the admin token as a Worker secret
Once the workflow succeeds (usually ~2 min for first deploy):
- Status page →
https://<your-repo-name>.pages.dev - Admin dashboard →
https://<your-repo-name>.pages.dev/admin - API →
https://<your-repo-name>.workers.dev/api/v1/public/status
Log in to the admin dashboard with the UPTIMER_ADMIN_TOKEN you set, and start adding monitors.
Staying up to date — Since you deploy from your own fork, you can sync with upstream at any time. The deploy workflow will run automatically after each sync.
For advanced options (custom domain, resource naming, admin path), see the Deployment Guide.
Click to expand local development setup
- Node.js >= 22.14.0
- pnpm >= 10.8.1
# 1. Clone and install
git clone https://github.com/<your-username>/Uptimer.git
cd Uptimer
pnpm install
# 2. Set up local secrets
cp apps/worker/.dev.vars.example apps/worker/.dev.vars
# Edit .dev.vars and set ADMIN_TOKEN=your-secret-token
# 3. Start development servers (auto-initializes D1)
pnpm devDefault addresses:
- Status page: http://localhost:5173
- Admin dashboard: http://localhost:5173/admin
- API: http://localhost:8787/api/v1
For the full local development guide (seed data, API testing, troubleshooting), see Develop/LOCAL-TESTING.md.
| Document | Description |
|---|---|
| Deployment Guide (中文) | Full GitHub Actions deployment walkthrough |
| Configuration Reference (中文) | All configurable parameters (secrets, variables, settings) |
| Notification System (中文) | Webhook setup, templates, signatures, troubleshooting |
| Local Development | Local setup, seed data, testing procedures |
pnpm lint # ESLint across all packages
pnpm typecheck # TypeScript strict checks
pnpm test # Unit tests
pnpm format:check # Prettier formatting checkContributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project is licensed under the MIT License — see the LICENSE file for details.
Built with Cloudflare Workers + Hono + React