Inspiration

On a college campus, it's sometimes hard to make friends and find people to attend all types of events with. We wanted to solve this general problem.

What it does

Gatherly is an event-based matching platform that helps attendees connect with the right people, not just anyone in the room. Users can browse others attending the same event, see compatibility scores based on shared interests and personality, and mutually match before or during the event. By turning networking into an intentional experience, Gatherly helps people build meaningful connections instead of leaving conversations up to chance.

How we built it

  • Frontend: Next.js (app router), React 19, TypeScript, TailwindCSS, and lucide-react for icons.
  • Backend (mock): json-server serving src/data/db.json on port 3001 for REST endpoints.
  • State: UserContext and EventContext to hold current user and events; user persisted to localStorage.
  • Matching: simple scoring based on common interests (70%) and personality match (30%).
  • Flow: events listing, event details, create event, profile editing, and matching pages.

Challenges we ran into

  • We used json-server to allow for rapid prototyping, but it introduced significant friction. We faced "strict-equality" bugs because IDs were inconsistently stored as strings and numbers, and we had to manage port collisions and environment instability to keep the dev environment running.

  • We implemented a full mutual-approval flow, where both users must "Accept," which is difficult with a flat JSON file. We had to design creative workarounds to simulate real-time matching and approvals without a high-performance database.

  • A major design challenge was learning how to hide or explain matching features when an event only has one attendee so the user never feels like the app is "broken."

Accomplishments that we're proud of

  • Interactive Matching UI: We successfully built a "Mutual-Approval" system with distinct visual states for "Pending," "Approved," and "Mutual Match," creating a satisfying and reactive social loop.

  • Weighted Compatibility Algorithm: We engineered a logic system that parses user data to provide a nuanced compatibility percentage, moving beyond simple keyword matching to a more intentional 70/30 weighted score.

  • Seamless "Optimistic" Interaction: We implemented "Optimistic UI" patterns for RSVPing and profile editing. By updating the interface instantly before the server confirms, we made a local mock-server feel like a high-performance production environment.

  • Data Normalization & Integrity: We overcame a major hurdle by engineering a normalization layer that resolved type-mismatch bugs between our frontend and the JSON database, ensuring stable relational logic across the entire app.

What we learned

  • Data Discipline Matters: Even in a small project, inconsistent data types can break an entire feature. We learned to standardize our data schemas early to avoid technical debt.

  • UX Over Latency: We learned that users care more about perceived speed than actual backend speed. Good UI feedback (like "Saved!" toasts) can mask almost any backend limitation.

  • Adaptive Design: We discovered the importance of designing for "empty states"--ensuring that the app remains helpful and intuitive even before a community has fully grown.

What's next for Gatherly

  • Real-time Chat: Moving beyond the "Match" to allow users to message each other once a mutual approval is reached.

  • Production Backend: Migrating from json-server to a PostgreSQL or Firebase backend to support real-time updates and global scaling.

  • AI-Enhanced Compatibility: Using LLMs to analyze user bios for even deeper, more nuanced personality matching.

Built With

Share this project:

Updates