<- cd ~/home
$ cat ./projects/university-career-fair.md

University Career Fair

NEXT.JSPOSTGRESQLEXPOEVENTTECHUNDER NDA

Client under NDA. The name is withheld and every screenshot is obscured — the interface palette alone would identify them.

ROLE
Solo Architect & Full-Stack Engineer
YEAR
2026
TYPE
Event Platform
STATUS
SHIPPED
REGISTRATIONS
33,193
Student registrations, 7,735 of them verified.
PARTNER COMPANIES
72
Onboarded across five sponsorship tiers.
SITE VISITORS
~160K
Visitors to the public site over the campaign.
University Career FairDrop main screenshot
// 01

OVERVIEW

The official platform for a Saudi university's career fair — a public registration site, a role-scoped dashboard, student and company portals, and an Android check-in app, all served from one Next.js and PostgreSQL backend. The client is under NDA, so the name is withheld and the screenshots are redacted.

// 02

THE PROBLEM

The fair ran on paper forms, spreadsheets, and physical attendance sheets. Queues were slow, attendance data was unreliable, and organizers had no visibility until the event was over. Expected load: ~5,000 students and ~200 companies across four days.

University Career Fair screenshot 1Screenshot 1
University Career Fair screenshot 2Screenshot 2
// 03

THE SOLUTION

One Next.js and PostgreSQL backend serving a public registration site, a role-scoped dashboard, a student and company portal, and an Android check-in app. Registration issues a QR token distinct from the primary key, emailed as a scannable ticket. Check-in is single-entry — a student attends exactly one of the four days — enforced by a UNIQUE constraint and a P2002 catch rather than read-then-write, so concurrent scans at multiple doors cannot race. Every event-day, registration-window, and scanner-activation decision is computed server-side in KSA time; the device clock is never trusted.

Notable decisions

Check-in runs on Honeywell handhelds in HID keyboard-wedge mode instead of camera scanning — about 150ms per scan against roughly 2s, and it works in bad lighting without asking for camera permissions.

Rate limiting is an in-memory LRU rather than Redis, because a four-day event on a single container does not need a second moving part.

Workshop certificates render from a designer-owned SVG template through resvg into a print-resolution PDF, so typography lives in Figma and the code only does string substitution — with Arabic fonts bundled for deterministic shaping.

FEATURES

  • Bilingual student & company registration
  • QR ticketing
  • Time-and-date-locked check-in
  • Jobs board with shortlisting
  • Company & specialty explorer
  • Workshops with QR posters
  • Auto-issued certificates
  • Resumable email campaigns
  • Excel exports by day & workshop
  • 18 audited admin actions

STACK

  • Next.js 15
  • React 19
  • TypeScript
  • PostgreSQL 16
  • Prisma 6
  • Zod 4
  • next-intl
  • jose
  • bcrypt
  • React Email
  • nodemailer
  • ExcelJS
  • pdf-lib
  • resvg
  • Expo
  • Docker
  • Dokploy
  • Traefik

OUTCOMES

  • 62 API endpoints across 235 TypeScript modules, 19 tables and 30 migrations
  • Built in 5 weeks — 101 commits from the first line to the live event
  • 5 authenticated surfaces on one backend: admin, viewer, hardware scanner, student, company
  • Arabic-RTL-default bilingual throughout — site, dashboard, scanner, 9 email templates, PDF certificates
  • Ran live through the full four-day event
BACK TO HOME