DWG RG-004 · SIDE PROJECT · PRIVATE

Family
Concerts

Weekly concert picks for my family, based on what we actually play on Spotify.

STATUS: PRIVATE · BUILT 2026

DETAIL B — SHOWN IN THE PROJECT'S OWN FINISH

private · family use
Family Concerts
  • Cloudflare Worker
  • Cron Triggers
  • D1
  • Access
  • Email Routing
  • Spotify
  • Ticketmaster
  • Claude
Family Concerts system Parents reach the Worker's dashboard through Cloudflare Access; kids use a public one-time invite link. Cron triggers run four stages that call Spotify, Ticketmaster, Claude and Email Routing. Everything is stored in D1. Dashboard parents, any browser picks, dismiss, run now QR invite kids scan on their phone one use, 24 hours Cron triggers 5 11,23 * * * twice daily: poll 5 12-14 * * 1 Mondays, one stage per hour Access bypass Worker fetch() dashboard + invites GET /dashboard POST /api/run/:stage POST /api/recs/:id/dismiss POST /api/people/:id/invite GET /connect/:tokenpublic GET /oauth/callbackpublic scheduled() the weekly pipeline pollplays + top artists refreshSTL calendar, 40 mi outoftownChicago + KC recommendmatch, write, email Spotify Accounts OAuth code → refresh token Web API recently played (last 50) top artists, ~4 wk and ~6 mo Ticketmaster Discovery API, music only next 180 days Claude one call a week, JSON out Email Routing Monday digest, new picks only read / write D1 · SQLite people plays top_artists events checks recs request or call public path, no Access login Cloudflare Access gate
Parents reach the dashboard through Cloudflare Access. Only the one-time invite and the Spotify callback are public. Cron triggers run everything else.

SECTION C–C · SCOPE

Every Monday the family gets an email of concerts in St. Louis worth going to. Each pick comes from music someone is actually listening to, not from what a ticketing site wants to sell.

Twice a day the Worker records what each of us has played on Spotify and refreshes our top artists. On Monday morning it pulls the next six months of St. Louis shows from Ticketmaster and checks Chicago and Kansas City for favorite artists who aren't coming here. Then it hands everything to Claude to write the picks up.

Each pick is labeled as one of four kinds: an artist you have on repeat, a connected act, something that sounds similar, or a road trip. A show is only ever emailed once, and "not interested" on the dashboard hides it for good.

DESIGN DECISIONS

  1. ONE STAGE PER HOUR

    The free plan allows 50 outbound requests per run, so the Monday pipeline is four cron runs an hour apart. The dashboard's Run now buttons call the same stages.

  2. CODE MATCHES, CLAUDE WRITES

    Direct matches are worked out in code. One Claude call a week writes the headlines and suggests related shows from the rest of the calendar.

  3. TRUST THE PROSE, CHECK THE IDS

    Every show and person Claude returns is checked against what it was sent. If the call fails, the direct matches still go out in plain wording.

  4. TWO SIGNALS FOR TASTE

    Spotify only returns the last 50 plays, so recent plays are combined with Spotify's own top-artist rankings to decide who's a fan of whom.

  5. ROAD TRIPS FOR FAVORITES ONLY

    Chicago and Kansas City shows count only for heavy-rotation artists who are skipping St. Louis.

  6. KIDS NEVER LOG IN

    Access guards the whole site except a one-use invite link that expires in 24 hours. A kid scans a QR code, connects Spotify, and is done.

FULL SIZE · DRAG TO PAN