Concert Radar
Connects to your Spotify and watches four ticketing platforms, then emails you when an artist you actually listen to announces a show near you.
- Next.js 15
- TypeScript (strict)
- Tailwind CSS
- Prisma
- SQLite
- NextAuth v5
- Spotify OAuth
- Vercel Cron
- Resend
- Vitest

01 / Context
Concert announcements are scattered across Instagram, venue pages, and ticketing platforms that each only know their own listings, so following an artist means following four services and still missing the show announced somewhere else. Concert Radar watches Ticketmaster, Bandsintown, Songkick, and Billetto, which carries many of the smaller Nordic venues, and lets you say “tell me when any of my Spotify artists plays within 100 km of Bergen.”
02 / My role
I designed and built the whole thing: the Spotify-native visual direction, the dashboard and concert flows, the data model, the multi-source aggregation backend, and the daily notification pipeline. I shipped the MVP one working feature at a time, then followed up with a v2 redesign and a dedicated mobile port with a bottom tab bar.
03 / Problem
Four independent APIs disagree with each other. The same show appears on several of them, free-text artist search matches “The 1975” to a “1975 Anniversary Concert,” and a user tracking 200 artists across four APIs could fire 800 calls at once. The dashboard had to feel like a native companion to Spotify, big artist imagery instead of a bare table, and stay fast. And it could never email the same person about the same concert twice.
04 / Approach
Each source sits behind a shared SourceAdapter interface, unit-tested against recorded JSON fixtures. CI never touches the network. Songkick and Billetto ship behind feature flags, so a misbehaving source can be switched off without a deploy. Cross-source duplicates collapse into one card with a badge per source, grouped on normalized artist, venue city, and event date, with diacritic-stripped names and Spotify popularity as a confidence signal. A daily Vercel cron job syncs every user instead of fanning out on demand, writes a SyncLog row per source so one failure never aborts the run, and sends a Resend digest; a unique (userId, concertId) constraint makes double-emailing impossible. Spotify OAuth tokens are AES-256-GCM encrypted at rest behind a custom NextAuth adapter, distances use an inline Haversine, and concert times render in the venue’s local time zone.
05 / Result
The MVP shipped with 29 of its 30 planned scope items: 14 routes on a clean production build, 123 tests across 17 files. It then got a marketing landing page, a hero-card dashboard, light and dark themes, and the mobile port.
More screens

