Back to projects

Music Taste Algorithm + Group Event Voting

VibeCheck

A full-stack web application that helps friends discover upcoming music events tailored to their music preferences and vote on which to attend, making it easier to plan their next concert together.

VibeCheck landing page introducing live music matching and group voting

Idea

Choosing a live music event gets complicated when everyone has different tastes. Groups need a relevant shortlist and a shared way to make a decision without an endless back-and-forth in the group chat.

Implementation

Built an Angular and Spring Boot application that imports Last.fm music profiles, scores nearby Ticketmaster events against group preferences, and guides members through voting to a winning event.

Project Details

VibeCheck was developed by a nine-member team for FSCJ's CEN4940 Application Development Capstone in Summer 2026. The application brings music preferences, event discovery, and collaborative decision-making into one workflow, from connecting a Last.fm account to revealing the group's winning event.

Core Features

  • Music profiles: Members connect Last.fm to import listening preferences and tag data. Stored profiles provide the musical context for personalized and group event matching.
  • Private groups: Users create or join groups and invite friends, giving each group a shared space to coordinate its next event.
  • Event matching: When a voting session starts, the backend retrieves nearby Ticketmaster events, maps Last.fm tags to Ticketmaster genres, and scores the options against the group's combined preferences.
  • Group voting and results: Group leaders launch sessions with a curated event shortlist. Members vote on multiple options, and completed sessions produce a winning event and results.
  • Authenticated access: Registration and login lead to protected profile, group, and voting screens. Spring Security validates JWTs on the backend, while Angular route guards and an HTTP interceptor support authenticated navigation and requests.

User Flow

  • Register or log in, then connect a Last.fm account and import a music profile.
  • Create a group or join friends who are planning an outing.
  • Start a voting session to retrieve and score nearby Ticketmaster events.
  • Review the matched events and vote on the options that appeal to you.
  • See the winning event and group results when the session ends.

Screenshots

VibeCheck landing page with an introduction to shared music preferences and group voting
Landing Page
VibeCheck login screen
Sign In
VibeCheck dashboard after signing in
Dashboard
User profile showing account information, a connected Last.fm account, and password settings
Profile and Last.fm Connection
VibeCheck group management screen
Groups - Created groups are given a unique code to share with friends, who can then join the group by entering the code here
VibeCheck voting session setup screen
Voting Session Creation - Set parameters for the voting session, including location, data range, and amount of time to keep the session active
Event voting cards showing artists, venues, dates, and group match scores
Matched Events - Events that better fit the group's combined music preferences are scored higher and appear first in the voting flow, vote on as many events as you'd like
Completed voting session showing the winning event, vote summary, and ticket link
Winning Event - The event with the highest score and most votes is revealed when the voting session ends
Ticket page for the selected event
Tickets - Clicking 'buy tickets' on the winner screen redirects to the ticketmaster page for the selected event

Architecture and Stack

  • Client: Angular and TypeScript power the single-page application. Route guards protect authenticated screens, and an HTTP interceptor attaches JWTs to API requests.
  • API: Java and Spring Boot separate controllers, business services, repositories, and response models so authentication, groups, music imports, event scoring, and voting can be maintained independently.
  • Persistence: Supabase-hosted PostgreSQL stores users, music profiles, groups, memberships, event details and occurrences, scores, voting sessions, votes, and winners. Spring Data JPA handles persistence, with direct SQL for simultaneous vote updates.
  • Integrations: Last.fm supplies listening preferences and tags; Ticketmaster supplies nearby event data. The backend translates between the two services to build the group's voting options.
  • Security and configuration: BCrypt hashes passwords, Spring Security authorizes requests with JWTs, and environment variables supply database credentials, API credentials, callback configuration, and the JWT signing key. Foreign keys and unique constraints protect relationships and prevent duplicate memberships, profiles, and votes.

External API Integrations

We integrated two external APIs, Last.fm and Ticketmaster, to connect the group's music preferences with live events they could attend together.

  • Last.fm API: Imports listening preferences and music tags from connected accounts to build each member's music profile.
  • Ticketmaster API: Retrieves nearby events for the group's voting session, providing the event options that members review and vote on.

The two APIs describe music differently, so their data could not be compared directly. We normalized the tag and genre data in the Spring Boot backend, mapping Last.fm tags to corresponding Ticketmaster genres before scoring events. This gave us a consistent basis for comparing the group's music preferences with available events and turning the results into a ranked shortlist for voting.

Our approach combined automatic matching with manual curation: standardize capitalization and whitespace, match tags against Ticketmaster's genre and subgenre names, then account for simple punctuation and spacing differences such as "synthpop" and "Synth Pop." Ambiguous labels needed curated mappings rather than text cleanup alone. Non-genre tags such as "seen live" and "bookmark" were excluded from genre matching to avoid misleading recommendations.

Future Enhancements

Potential next steps beyond the MVP include AI-assisted recommendations and explanations, song previews in voting cards, versioned database migrations through the Supabase CLI, and a native mobile experience with push notifications and location-based discovery.

Contributors

  • Lauren Knotts: Full-Stack Developer, Team Lead, Front-End Lead • Branding & UX Design, Group Voting, Landing Page
  • Dewey Mccrary: Full-Stack Developer, Co-Lead, Security Engineer • User Authentication & Security
  • Ricardo "Ricky" Serrano: Full-Stack Developer, Back-End Lead • Group Voting, Event Matching, Ticketmaster Integration, Database Design & Administration
  • Shawn "Hayden" Sullivan: Full-Stack Developer, Lead Database Engineer • Group Voting, Event Matching, Ticketmaster Integration, Database Design & Administration
  • Dayne Allen-Wright: Full-Stack Developer, Security Engineer • User Authentication, & Security, App Color Themes
  • Ta'tyana Wells: Full-Stack Developer, Backend Integration Engineer • Last.fm Integration, Music Profile Management
  • Anthony Greene: Full-Stack Developer, Backend Integration Engineer • Last.fm Integration, Music Profile Management
  • Tamia Jenkins: Full-Stack Developer • Group Creation & Invitation System
  • Baudelaire Messago Ngumouo: Full-Stack Developer • Group Creation & Invitation System