Inspiration
What we like most about hackathons isn't the code, it's the people. But with hundreds of participants, you end up meeting the teammates you were assigned, the people at your table, and whoever you happen to stand next to in line. The person who shares your obsession with graph neural networks, or who interned at the same company, or who knows three of your friends without you realizing it, is probably in the same room and you'll never find them.
ConnectNow makes the whole room visible. It compares every participant to every other participant and shows you who you would click with, and why.
What it does
ConnectNow turns everyone at HackGT into an interactive map of connections:
- Heat map: every participant compared with every other, ordered so that communities appear as visible blocks.
- Constellation view: a 2D map where similar people sit close together. Selecting someone highlights their best matches.
- Live weight sliders: shift emphasis between interests, internships, school, year, and mutual friends, and watch the map reorganize instantly.
- Three modes: Similar (people like you), Complementary (same interests, different skills, good for finding teammates), and Serendipity (people you'd click with but are far from in your social graph).
- Explainable matches: click any pair to see exactly why they match, with a plain-English explanation and an icebreaker.
- Hidden bridges: the people who connect otherwise separate communities.
How we built it
Stack: Python and FastAPI for the ML backend, Next.js and TypeScript for the frontend, D3 on Canvas for rendering, SQLite for storage, and the Claude API for language understanding.
Each signal gets its own N × N similarity matrix, and the final score is a weighted blend:
$$S_{ij} = \sum_{k} w_k \, S^{(k)}_{ij}, \qquad \sum_k w_k = 1$$
- Interests: free-text answers are embedded with a sentence-transformer (
all-MiniLM-L6-v2) and compared with cosine similarity, cos(u, v) = (u · v) / (‖u‖ ‖v‖). Claude also extracts structured interest tags, skills, and domains from the text, which we compare with Jaccard similarity. - Internships: Jaccard overlap on companies, blended with embedding similarity on industries and roles.
- Mutual friends: we treat the friend network as a graph and score pairs with the Adamic-Adar index, Σ (1 / log|N(z)|) over shared neighbors z, which weights rare shared connections more than popular ones. A bonus rewards friends-of-teammates on other teams.
- University and year: structured matching with partial credit.
To surface structure, we run hierarchical clustering with optimal leaf ordering (SciPy) so similar people sit next to each other on the heat map, UMAP for the 2D constellation, and community detection with LLM-generated cluster labels. Betweenness centrality across communities gives each person a "bridge" score.
The per-feature matrices are quantized to 8 bits and sent to the browser once, so the sliders recombine them client-side with no server round trip. Every LLM call requests structured JSON, is validated, and is cached by content hash. Pair explanations are grounded only in facts from the data, so the model can't invent details about anyone.
Since we couldn't use real registration data, we built a generator for [400] synthetic participants with realistic archetypes, teams, and friend networks, clearly flagged as synthetic. Because we know each person's hidden archetype, we could check whether the clustering recovers it.
Challenges we ran into
- No real data. We couldn't get participant data, so we had to design a synthetic dataset that was realistic enough to have real structure without hardcoding the answer.
- Making a similarity score mean something. A single number isn't useful, so every score can be broken down by feature and explained.
- Speed. Rendering an N x N heat map with live re-weighting is heavy, so we used Canvas rendering and client-side recombination of quantized matrices.
- Hallucinated explanations. We constrained the LLM to cite only facts present in the data.
- Privacy. Matching people is sensitive, so the design is opt-in only, with consent on intake and no scraping.
What we learned
Different similarity signals disagree in interesting ways. Two people can share nothing on paper but sit close in the friend graph, and those disagreements are the most interesting connections. We also learned that explainability changes how much people trust a match, and that ordering a matrix well (seriation) can reveal structure that a plain grid hides.
What's next
Opt-in live intake at events, a team builder that picks 4-person teams with complementary skills and shared interests, and shareable match cards so people can actually go meet each other.
Log in or sign up for Devpost to join the conversation.