A production-style monitoring system that tracks university course seat availability on JavaScript-heavy registration pages and notifies users when seats change.
Built as a backend worker + API + dashboard UI, not a browser extension, to ensure reliability on dynamically rendered pages.
- ✅ Reliable scraping using a headless browser (Playwright)
- 🔁 Periodic monitoring with configurable intervals
- ⏸ Pause / ▶ Resume / ⛔ Stop monitors
- 🧠 Clear separation between user intent and system health
- 📬 Email notifications on seat changes (per monitor)
- 📜 Persistent notification history per monitor
- 💾 Disk-backed persistence (monitors survive restarts)
- 📊 Live dashboard with timestamps and status indicators
This system intentionally separates what the user wants from what the system observes:
| Category | Meaning |
|---|---|
| Mode | User intent: active, paused, stopped |
| Health | System state: healthy, stale, error |
This distinction makes the UI easier to understand and avoids ambiguous "status" labels.
- User builds a schedule in BearTracks
- User copies the resulting URL
- Tracker loads the page in a headless browser
- JavaScript executes fully
- Seat values are extracted from the DOM
- Changes are detected and persisted
- Notifications are sent (if enabled)
The web UI allows users to:
- Add monitors using BearTracks URLs
- Specify email addresses for each monitor
- See current seat counts
- View last checked and last changed timestamps
- Pause / resume monitors without losing state
- View notification history in a modal
- Understand system health at a glance
- Backend: FastAPI, asyncio
- Scraping: Playwright (Chromium)
- Frontend: Vanilla HTML/CSS/JS
- Persistence: Atomic JSON file storage
- Notifications: SMTP (Gmail App Password)
For the easiest setup, use Docker. See the Setup Guide for detailed instructions.
For local installation without Docker, see the Setup Guide.
After starting the application, open: http://localhost:8000
This project is for educational and personal use. Always respect your institution's terms of service.
- Multi-user support
- Auth + per-user email settings
- Database-backed persistence
- Rate limiting & backoff
- Deployment-ready worker model
Built by Roshan as a backend-focused system demonstrating:
- async workers
- stateful monitoring
- UI ↔ API coordination
- real-world scraping challenges