07 / Four-sided marketplace
Dalinus Travels
Study-abroad and travel platform: students apply and track programmes, travellers book tours, recruiters earn referrals and partner universities get their own portal.
- Role
- Sole engineer
- Status
- Client project
- Period
- 2026
- Type
- Four-sided marketplace
- user types, one platform
- 4
- shared schema package, FE ↔ BE
- 1
A / Architecture
TypeScript monorepo on a shared contract
A Next.js app and a NestJS API share one package of Zod schemas and DTOs, so four user types, payments and an admin CMS all agree on every payload.
00 Clients
- Student portal
- Traveller booking
- Recruiter portal
- University portal
- Admin + CMS
01 Edge
- Auto-HTTPS proxy
- i18n routing
02 API
- Auth · DB sessions
- Applications
- Bookings
- Referrals
- Analytics
03 Async
- Payment time-outs
- Abandoned checkouts
- Transactional email
04 Data
- PostgreSQL 18
- Prisma 7
- Shared Zod package
Engineering notes
- 01
Roles checked on every request
Students, travellers, recruiters and partner institutions each get their own surface. Revoking a role signs the person out immediately — sessions are database-backed, httpOnly and bounded.
- 02
Defensive by default
Rate limits per IP and per person, one-time tokens scrubbed from stored emails, and background jobs that expire unpaid checkouts.
- 03
One contract
Zod schemas and DTOs live in a shared package, so the Next.js frontend and NestJS API can’t disagree about a payload.
- 04
Run by the business
A full admin console and CMS, funnel analytics and CSV exports, so staff run the business from one place.
B / Infrastructure & delivery
How it ships, scales and stays up.
- Runtime
- Docker Compose: PostgreSQL, a migrate job, API, web and Caddy for automatic HTTPS.
- Sessions
- Database-backed httpOnly sessions with a bounded lifetime; role revocation signs users out instantly.
- Abuse
- Rate limits per IP and per account; one-time tokens scrubbed from stored emails.
- Payments
- Flutterwave with background jobs that expire unpaid checkouts.
- Data
- Prisma 7 migrations on PostgreSQL 18; funnel analytics with CSV exports.
- Dev loop
- Local email captured in Mailpit; latest stable majors with documented upgrade holds.