Billboard — Security, Vibe2 Design, Edit/Delete Watches, Auto-Deploy

billboard / 08 Apr 2026 / 1 min read

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_TOKEN unset
  • 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> and POST /api/update-watch/<id>
  • my-alerts now 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
  • Footer: Instagram @dropwatcher321 + LinkedIn Simon HG with SVG icons

Auto-Deploy Webhook

  • POST /api/deploy verifies 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/.env as BB_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)

All Posts