Tools
Tools: I Built a $9/mo Uptime Monitor in a Day — Here's What I Learned
2026-02-10
0 views
admin
The Problem ## The Build ## The Core API ## Background Checking ## What I Learned ## 1. Simple beats feature-rich ## 2. API-first is underrated ## 3. Pricing is a feature ## Try It I got tired of paying $50+/month for uptime monitoring on side projects that make $0. So I built my own. Every uptime monitoring service I tried was either: I built OwlPulse in a single day using: That's basically it. Create a monitor, get an API key, start checking. Pro plan gets 1-minute checks. Free gets 5-minute checks. I was tempted to add: But none of that matters if the core is solid. Ship simple, iterate later. Most monitoring tools force you into their dashboard. I wanted something I could integrate anywhere — Slack bots, CLI tools, custom dashboards. REST API with webhook callbacks = maximum flexibility. $9/mo unlimited monitors. That's it. No per-monitor pricing, no hidden fees, no enterprise upsells. Indie devs shouldn't need to do math to figure out their monitoring bill. OwlPulse is live at owlpulse.org. The whole thing is ~500 lines of Python. Sometimes the best solution is the boring one. What's your uptime monitoring setup? Anyone else built their own? Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse COMMAND_BLOCK:
@app.post("/monitors")
async def create_monitor(monitor: MonitorCreate): api_key = secrets.token_urlsafe(32) # ... create monitor with API key return {"id": monitor_id, "api_key": api_key} Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
@app.post("/monitors")
async def create_monitor(monitor: MonitorCreate): api_key = secrets.token_urlsafe(32) # ... create monitor with API key return {"id": monitor_id, "api_key": api_key} COMMAND_BLOCK:
@app.post("/monitors")
async def create_monitor(monitor: MonitorCreate): api_key = secrets.token_urlsafe(32) # ... create monitor with API key return {"id": monitor_id, "api_key": api_key} COMMAND_BLOCK:
async def check_monitor(monitor_id: int): async with httpx.AsyncClient() as client: start = time.time() response = await client.get(url, timeout=10) response_time = (time.time() - start) * 1000 # Log the check, update status, fire webhook if changed Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
async def check_monitor(monitor_id: int): async with httpx.AsyncClient() as client: start = time.time() response = await client.get(url, timeout=10) response_time = (time.time() - start) * 1000 # Log the check, update status, fire webhook if changed COMMAND_BLOCK:
async def check_monitor(monitor_id: int): async with httpx.AsyncClient() as client: start = time.time() response = await client.get(url, timeout=10) response_time = (time.time() - start) * 1000 # Log the check, update status, fire webhook if changed - Too expensive for indie projects (Pingdom, Datadog)
- Too complex with features I don't need
- Ugly dashboards that made me not want to use them - Check if my site is up
- Tell me if it goes down
- Don't charge me $50/month for it - FastAPI for the backend (~500 lines)
- SQLite for zero-config storage
- APScheduler for background checks
- Cloudflare Tunnel for deployment - Multi-region checks
- Fancy charts
- Team management
- SSL monitoring - Free tier: 3 monitors, 5-min checks
- Pro: $9/mo unlimited, 1-min checks, webhooks
how-totutorialguidedev.toaipythonssl