Home/Work/Case 04

Investor
Day App

An invite-only networking engine for 300 founders, VCs and LPs at Willis Tower, Chicago. One question per person: who should I talk to right now?

RoleArchitect & builder
WhenApr–Jul 2026 · Decasonic
StackExpo · React 19 · Express 5 · Postgres
Shipped asiOS, Android, PWA + admin
300attendees, live, in one day
~60Klines of hand-written TypeScript
124API operations from one OpenAPI spec
188unit tests on the parts that decide
01 / The problem

Not a conference app.
A room-reader.

About 300 people, eight hours, and a theme: investing in adoption. Every attendee wants the same thing from a day like that: the handful of people in the room worth meeting, and something to say when they get there.

The agenda alone was 21 sessions and 47 speakers, but the hard part wasn't the agenda. It was being fair to everyone, protecting the people who asked to stay private, and moving real people around a lunch hall on time.

An LLM picking matches is untestable and unfair.
Big funds crowd out everyone else.
Private attendees leak through generated text.
Imports the night before break printed QR codes.
Deterministic matching, privacy in the architecture, imports you can trust.
02 / How the day runs

Match. Explain.
Move. Protect.

The four systems that ran the room.

Step 01 · Match

Pure code decides who meets.

scorePair is a pure, tested function with no LLM in it. On top sit fairness rules: colleagues never match, small boosts for people with no matches yet, caps per company, and a floor so nobody ends with zero.

Step 02 · Explain

Emma tells you why.

The AI concierge gets a context assembled per request: the people most relevant to you, the speakers, the live agenda and the venue. Claude answers, with OpenAI as fallback through one gateway.

Step 03 · Move

Software that moves people.

Nine portfolio companies at numbered tables, nine timed rounds, and every attendee routed so they meet every company. A draft, published, locked state machine keeps a live rotation from being corrupted mid-lunch.

Step 04 · Protect

Privacy in the architecture.

Hidden attendees are masked on the server, on every surface, including inside LLM prompts. Emails never enter a prompt. Responses are shaped so that "not published" and "not grouped" look identical.

03 / The tempting version

Why the LLM
doesn't match.

Left: what most people would ship. Right: what ran in Chicago.

Temptingask the model to pick
const picks = await llm( `Here are 300 attendees. Who should ${me} meet?`);// untestable, unfair, and private people// are now inside a prompt
Shippedcode decides, the model explains
function scorePair(a, b) { if (sameCompany(a, b)) return -Infinity; let s = fit(a, b) + fit(b, a); s += fairness(b); // +8 at zero, −4 at 10+ return s;}// caps, a starvation floor, then one line of "why"
04 / Decisions worth explaining
01How do you import data the night before without breaking anything?

Upload a spreadsheet, stage the rows, let the server recompute the diff, preview it, then publish in one transaction guarded by a staged-status check. Two admins publishing at once get a 409. Session IDs survive re-imports, so printed QR codes never break, and ambiguous rows go to a human.

02What stops someone scanning a QR and pretending to be you?

A QR code only names a target. Who you are always comes from your session token. Check-ins are idempotent, so scanning twice can't double-count.

03Why is it invite-only?

Attendee records are created on the first authenticated request, only for invited people. Signing up on your own grants nothing.

04What happens on a fresh production database?

It boots lunch-ready. Startup reconcilers seed the invitation template, the nine rounds and nine tables, idempotently, without overwriting anything an admin changed. One switch, event mode, moves the whole app through before, live and after.

Expo SDK 54React 19 + Vite 7Express 5PostgreSQL + DrizzleOpenAPI 3 → OrvalClerkVitestClaude → OpenAI

Need something like this? I build these end to end, as a full-time engineer, on contract, or with SKAI Group.

Book a 30-min call
Next case · 05Dubljly
Contact

Let's build

Running an event, a community or a marketplace that needs fair matching? I've done it live.