public uptime monitoring + (soon) observability with events saved to PDS
1# cuteuptime
2
3Cute uptime monitoring using your PDS to store events.
4Demo: [https://uptime.wisp.place](https://uptime.wisp.place)
5
6
7## Project Structure
8
9- **`worker/`** - Background Bun worker that monitors services and publishes uptime checks
10- **`web/`** - Static web svelte dashboard that displays uptime statistics
11- **`lexicon/`** - AT Protocol lexicon definitions for the uptime check record type
12
13## Quick Start
14
15### 1. Configure the Worker
16
17```bash
18cd worker
19cp config.example.json config.json
20```
21
22Edit `config.json`:
23
24```json
25{
26 "pds": "https://bsky.social",
27 "identifier": "your.handle.bsky.social",
28 "password": "your-app-password",
29 "checkInterval": 300,
30 "services": [
31 {
32 "groupName": "Production",
33 "name": "API Server",
34 "url": "https://api.example.com/health",
35 "method": "GET",
36 "timeout": 10000,
37 "expectedStatus": 200
38 }
39 ]
40}
41```
42
43**Important:** Use an app password, not your main account password. Generate one at: https://bsky.app/settings/app-passwords
44
45### 2. Run the Worker
46
47```bash
48cd worker
49bun install
50bun run dev
51```
52
53The worker will:
54- Check each service at the configured interval
55- Publish results to your AT Protocol PDS
56- Continue running until you stop it
57
58### 3. Configure the Web Dashboard
59
60```bash
61cd web
62cp config.example.json config.json
63```
64
65Edit `config.json`:
66
67```json
68{
69 "pds": "https://bsky.social",
70 "did": "did:plc:your-did-here"
71}
72```
73
74To find your DID, visit: https://bsky.app/profile/[your-handle] and look in the URL or use the AT Protocol explorer.
75
76### 4. Build and Deploy the Web Dashboard
77
78```bash
79cd web
80npm install
81npm run build
82```
83
84The built static site will be in `web/dist/`. Deploy it to any static hosting:
85
86- **Wisp Place**: Drag and drop the `dist` folder
87- **GitHub Pages**: Push to `gh-pages` branch
88- **Netlify**: Drag and drop the `dist` folder
89- **Vercel**: Connect your repo and set build directory to `web/dist`
90- **Cloudflare Pages**: Connect your repo
91
92## Configuration
93
94### Worker Configuration
95
96| Field | Description |
97|-------|-------------|
98| `pds` | Your PDS URL (usually `https://bsky.social`) |
99| `identifier` | Your AT Protocol handle |
100| `password` | Your app password |
101| `checkInterval` | Seconds between checks (e.g., 300 = 5 minutes) |
102| `services` | Array of services to monitor |
103
104### Service Configuration
105
106| Field | Description |
107|-------|-------------|
108| `groupName` | Optional group name (e.g., "Production", "Staging") |
109| `name` | Service display name |
110| `url` | URL to check |
111| `method` | HTTP method (GET, POST, etc.) |
112| `timeout` | Request timeout in milliseconds |
113| `expectedStatus` | Expected HTTP status code (optional) |
114
115### Web Configuration
116
117| Field | Description |
118|-------|-------------|
119| `pds` | PDS URL to fetch records from |
120| `did` | DID of the account publishing uptime checks |
121
122**Note:** The web config is injected at build time, so you need to rebuild after changing it.
123
124## Features
125
126- ✅ Looks cute
127- ✅ No database required just use your pds
128- ✅ Service grouping support
129- ✅ Response time tracking
130- ✅ Auto-refresh every x configurable minutes
131
132## Development
133
134### Worker Development
135
136```bash
137cd worker
138bun run dev
139```
140
141### Web Development
142
143```bash
144cd web
145npm run dev
146```
147
148Visit http://localhost:5173 to see the dashboard.
149
150MIT