Inspiration

We were driven by the way people connect on a deep level through music taste.

What it does

Resonate matches you with people nearby who have similar music taste. You sign in with Google, pick your favorite artists, and we match you with people within 75 miles. We weight rare shared artists more than popular ones, and also count artists that sound alike. Once two people are both interested, they can break the ice with music prompts, choose to share their socials, and find concerts near them that fit both their tastes. Going to the same show also boosts a match.

How we built it

-Frontend: Next.js and Tailwind, with dark mode, designed mobile-first so people can scan a QR code and be in.

  • Backend: Next.js API routes on Vercel, with Supabase (Postgres) as the database. All data goes through our own API, and row-level security means the browser can't read the database directly.
  • Sign-in: Google through Supabase Auth.
  • Music data: Deezer for artist search, photos, and similar artists, which we fetch automatically for every artist someone picks.
  • Concerts: Apify scrapes Bandsintown and Songkick every morning, and a secured webhook feeds the results into our database. Ticketmaster fills in shows anywhere in the US: when someone opens the app in a new city, we fetch shows near them on the spot.
  • Matching: our own scoring. Each shared artist is weighted by how rare it is, similar artists get partial credit, and shared genres and shows going to together add a bonus. Only people within 75 miles whose age ranges fit are shown.

Challenges we ran into

  • Merging two codebases. Two of us built separate versions in parallel, with different database layouts. We combined them partway through, which meant resetting the database and re-loading all our data.
  • The same concert from three sources. Ticketmaster, Bandsintown and Songkick list the same show with different names and time formats, so we built deduplication: one show per artist per day.
  • Bugs that hid data silently. Supabase returns at most 1,000 rows by default, which quietly dropped artists. Accounts without city coordinates also disappeared from each other's matches.
  • Sign-in. Texting codes to everyone would have cost money, so we switched to Google. We also tracked down a redirect bug that logged people out right after signing in.
  • Privacy. Early on, anyone who knew a user's ID could have read their socials. We added a secret token that every request has to carry, and socials stay hidden until both people opt in.

Accomplishments that we're proud of

  • Real people are using it: 20 users and counting signed up during the hackathon.
  • Shows work anywhere in the country, fetched for wherever you are, not just one city.
  • Matching that goes beyond exact overlap: rare artists count more, and similar artists still connect people.
  • A fully automated data pipeline: Apify, then a webhook, then the database, every morning.
  • We tested the privacy rules directly: forged requests, other people's socials, and fake sign-ins are all blocked.

What we learned

  • Real data is messy: duplicate events, missing coordinates, names spelled differently, and "12:00 AM" meaning "time not announced yet".
  • Building backend and frontend at the same time takes agreeing on the data format early and talking constantly. Every merge conflict taught us that.
  • Small product rules make a big difference: a 75-mile limit and weighting rare artists changed matches more than any amount of polish.

What's next for Resonate

  • Import concert history from Gmail ticket emails, so you can match with people who were at the same show.
  • Learn from activity: rank people higher when they're similar to those you've already matched with.
  • Group plans, so a few matches can go to a show together.
  • A native mobile app with notifications when a match RSVPs to a show near you.
  • Licensed concert data in place of scraping, for a public launch.

Built With

Share this project:

Updates

Submission history