A hiring platform serving three distinct audiences from one API — job seekers, employers and an internal admin team — with real-time messaging, subscriptions and queue-backed notifications. A Next.js web app and an Expo client for candidates on the move.
- Role
- Fullstack — Express/Prisma API, Next.js app, Expo client
- Timeline
- 2024 — Present
- Platforms
- Web, API, iOS, Android
- Status
- Shipped
What went into it
- 01
Three role-scoped surfaces — seeker, employer and admin — built as parallel slices through the same four layers, so a route table never touches Prisma and a service never touches req or res.
- 02
Authorisation mounted once at the admin router rather than per sub-route. The previous arrangement left every admin endpoint authenticated but unauthorised — any signed-in job seeker could reach a user-deletion route.
- 03
Background work moved off the request path onto BullMQ and Redis — transactional email, notification fan-out and scheduled sweeps run as jobs, not as blocking handlers.
- 04
Real-time messaging between employers and applicants over Socket.IO, alongside a REST surface validated with Zod at every boundary.
- 05
An admin console covering user management, listings, subscriptions, broadcast and analytics, with trend figures computed from real data rather than hardcoded into the stat cards.
- 06
A separate Expo client for candidates, sharing the same API and auth model as the web app.
Built with
Have something you need built?
Tell me what you're working on and what it needs to do. I'll come back within two days with an honest read on scope, approach and timeline.