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-reactfor icons. - Backend (mock):
json-serverservingsrc/data/db.jsonon port 3001 for REST endpoints. - State:
UserContextandEventContextto hold current user and events; user persisted tolocalStorage. - 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
- figma
- json
- next.js
- react
- tailwind
- typescript
Log in or sign up for Devpost to join the conversation.