Billboard — Security, Vibe2 Design, Edit/Delete Watches, Auto-Deploy
What We Built
Security Hardening
- Added
import html+html.escape()on verify token response (XSS) hmac.compare_digest()for admin token comparison (timing attack fix)- Startup check: app refuses to start if
BB_ADMIN_TOKENunset - Added missing DB tables to schema:
seen_feeds,discord_sent,pageviews - Removed duplicate
get_watcher_by_verify_token()definition
Dead Source Auto-Disable
- Web watcher now auto-disables sources after 10 consecutive fetch failures
- Re-enables after 2h backoff, resets failure count
- Knife Art was at 2800+ consecutive failures — disabled within 10 hits of restart
Edit/Delete Watches (#1 Feature)
- Dashboard now shows each watch as its own card (users can have multiple watches per email)
- Keyword chips have ✕ to remove inline
- Add keyword input per watch card
- Delete watch button with confirm
- New API endpoints:
DELETE /api/watch/<id>andPOST /api/update-watch/<id> my-alertsnow aggregates all watches for the same token (was only showing first watch — silent bug)
Vibe2 Design (Bebas Neue + DM Sans)
- Google Fonts: Bebas Neue headings + DM Sans body
- Gate: centered, square input, full-width Bebas "LET ME IN →" button
- Dashboard: new top-bar with 3px border, Bebas name heading
- Stat cards: 3-column grid — Matches / Emails Sent / 10 MIN in large Bebas numbers
- Identity bar: left ember border strip
- Drop cards: left ember border, hover slides right + flame color + fadeUp animation
Ozzy Placements
- Gate: 48px Ozzy silhouette + "PRINCE OF BARKNESS" below passcode form
- Onboarding: Ozzy next to THE BILLBOARD brand
- Dashboard top-bar: already present
- Footer: bumped to 36px, name + title now visible
Social Links
- Footer: Instagram @dropwatcher321 + LinkedIn Simon HG with SVG icons
Auto-Deploy Webhook
POST /api/deployverifies GitHub HMAC-SHA256 signature- Runs
git pull origin main, copies HTML/SVG to/var/www/html/ - Restarts supervisor services if Python files changed
- Secret in
/etc/billboard/.envasBB_DEPLOY_SECRET - GitHub webhook configured, tested and working
Key Paths
- Code:
~/billboard/ - Config:
/etc/billboard/.env - DB:
/var/lib/billboard/billboard.db - Live HTML:
/var/www/html/billboard.html - Logs:
/var/log/billboard/ - Webhook endpoint:
https://billboard.instockornot.club/api/deploy
State
- 6 watchers total, 5 active
- Real user: [email protected] (Brompton bikes), [email protected] (Trek ebike)
- gibson.simon1 getting real H. Moser + CRK alerts
- All commits pushed to GitHub, auto-deploy live
Author: Claude (Stark)