A full-stack MVP for real-time networking event matching.
networkMatch/
├── backend/ # Node.js + Express + Socket.io + PostgreSQL
├── admin/ # Next.js admin dashboard (port 3001)
└── user/ # Next.js mobile-first user app (port 3000)
# Create PostgreSQL database
createdb networkmatch
# Copy backend env
cp backend/.env.example backend/.env
# Edit backend/.env with your DATABASE_URL, JWT_SECRET, etc.
# Init schema
cd backend && npm install && npm run db:initcd backend
npm run dev
# Runs on http://localhost:4000cd admin
npm install
npm run dev
# Runs on http://localhost:3001cd user
npm install
npm run dev
# Runs on http://localhost:3000- Go to
http://localhost:3001 - Register with invite code (
admin123by default, set in.env) - Create an event
- Share the QR code / join link with participants
- Use the Start Round button when everyone has joined
- Use End Round to stop a round early (or timer auto-ends it)
- Scan QR code → lands on
http://localhost:3000/join/{eventId} - Fill in profile (name, role, company, looking_for, offering, interests)
- Enter lobby and wait for admin to start the round
- Receive real-time match with reason + conversation starter + live timer
- Save connections and copy LinkedIn follow-up messages after round ends
- Real-time matching: WebSockets push matches to all users instantly
- Server-controlled timer: Countdown synced across all clients
- Smart matching algorithm: Complementary skills → shared interests → role/company → random
- No repeat matches: Algorithm avoids previously matched pairs
- Odd number handling: Creates groups of 3 when needed
- LinkedIn message generation: Template-based follow-up message per match
- QR code generation: Each event gets a scannable join QR
POST /api/admin/register— Register (requires invite code)POST /api/admin/login— LoginGET /api/admin/me— Get profile
POST /api/events— Create eventGET /api/events— List your eventsGET /api/events/:id— Event details + participantsGET /api/events/:id/qr— QR code data URL
POST /api/users/join— Join event (creates profile if new)GET /api/users/me— My profilePUT /api/users/me— Update profilePOST /api/users/linkedin-message— Generate LinkedIn message
GET /api/events/:id/public— Public event infoGET /api/events/:id/my-match— My current matchPOST /api/events/:id/save-connection— Save a connectionGET /api/events/:id/saved-connections— My saved connections
| Event | Direction | Description |
|---|---|---|
join_event |
Client → Server | Join an event room |
start_round |
Admin → Server | Start a round (triggers matching) |
end_round |
Admin → Server | End the current round |
round_started |
Server → All | Round began, with duration |
match_assigned |
Server → User | User's specific match data |
timer_tick |
Server → All | Every-second countdown update |
round_ended |
Server → All | Round ended notification |
participant_count |
Server → All | Updated participant count |
event_state |
Server → Client | Current state on join (for late joiners) |