UWBHacks 2026 · 24h Build

AFFINITI

You walk into a room full of strangers — Affiniti figures out who you should meet.

Affiniti generates a conversation starter and shows you who's open to chat right now. Every match runs through a local LLM and on-device vector search: no cloud GPUs, no API calls, no data leaving your machine. Built at UWBHacks 2026 as a ~24-hour MVP on two iPhones and one local server.

Timeline2026 · 24h Build
RoleFull-Stack + ML
TeamHackathon — UWBHacks
PlatformiOS · SwiftUI

The Challenge

Events and hackathons put the right people in the same room, then leave them to find each other through an alphabetical attendee list and awkward small talk. The valuable connections — someone who shares your niche interest and is free to talk right now — stay invisible. Surfacing them requires understanding both who people are and what they're looking for, in real time.

The Solution

When you RSVP, Affiniti runs your profile through a local LLM to produce a semantic summary, embeds it into a 768-dimensional vector, and does the same for your stated intent. At match time it blends profile and intent similarity (60/40) via pgvector cosine search, applies a skill-diversity constraint, and generates a personalized icebreaker for each match — all on-device.

01

Affinity Match Engine

Each attendee's profile and intent are embedded into 768-d vectors. Matching blends profile similarity and intent similarity in a 60/40 split using pgvector cosine search over an HNSW index, with a skill-diversity constraint so you don't get four ML engineers in a row.

  • 768-d profile + intent embeddings
  • 60/40 similarity blend
  • Skill-diversity constraint
02

On-Device LLM Icebreakers

For every match, a local LLM (Gemma 4 via mlx-lm on Apple Silicon) generates a personalized conversation starter grounded in what you actually have in common — no generic prompts, and no data ever leaves the device.

  • Gemma 4 via mlx-lm
  • Context-grounded openers
  • Zero cloud inference
03

Live Discovery & Status

Inside each event the iOS app surfaces four tabs: a ranked discovery feed, your top-4 AI matches with icebreakers, a bookmarks list, and a live status broadcaster ("Open to Chat", "Deep in Work") so you can see who's actually available right now.

  • Ranked discovery feed
  • Top-4 matches + icebreakers
  • Real-time availability

iOS App

Swift · SwiftUI

Backend

FastAPI (async) · SQLAlchemy + asyncpg · Auth0 JWT · ngrok

ML & Vectors

Gemma 4 (mlx-lm) · sentence-transformers · PostgreSQL + pgvector

Search

pgvector HNSW · Cosine similarity

768 Embedding dimensions per vector
60/40 Profile-vs-intent blend
0 Cloud API calls
4 In-event tabs
01

Local LLMs Are Viable

Running Gemma 4 via mlx-lm on Apple Silicon delivered fast-enough, private inference without a single API call — proving a privacy-preserving networking app can ship on consumer hardware.

02

Blended Similarity Beats Raw

Ranking on profile similarity alone produced echo-chamber matches. Blending in intent (60/40) plus a diversity constraint made recommendations feel genuinely useful rather than redundant.

03

pgvector for Fast Search

An HNSW index over pgvector kept cosine search snappy across all attendees, letting the backend re-rank on demand without a separate vector database.

04

Shipping on Real Devices

Wiring two iPhones to one local server over ngrok surfaced JWT and threading issues a simulator hid — a reminder that real-device testing is where hackathon demos are won or lost.

Next project Frustration Detector