Back to projects

Live Music + Group Planning

VibeCheck

A full-stack application that helps friends discover nearby live music, match events to their shared listening preferences, and choose where to go through group voting.

VibeCheck landing page introducing 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 or expired sessions produce a winning event and results. A scheduled backend task closes expired sessions and saves the winner.
  • 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.

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.