1

RomConsult — Consultant Booking Marketplace

A full marketplace where clients browse digital marketing and cloud consultants, book them across timezones, and pay — a Next.js 16 front end on an accessibility-first component layer, backed by a NestJS API with background queues, TOTP two-factor auth, and a production self-hosted deployment.

Technology Stack

Front end — Next.js 16, React 19, TypeScript, Tailwind CSS 4, Untitled UI, React Aria Components, TanStack Query, Zustand, Axios, Motion, Recharts, next-themes, Embla Carousel

Back end — NestJS, Prisma, PostgreSQL, Redis, Bull, Passport, argon2, Speakeasy, Swagger, Pino, Sentry, Resend, Handlebars, nestjs-i18n

Operations — Docker, PM2, Nginx, Certbot, GitHub Actions, Vercel

Overview

Duration: 4/2026 - 5/2026

RomConsult is a booking marketplace for digital marketing and cloud consulting. Clients browse services, pick a consultant, book a slot, and pay; consultants apply to join and manage their own work; both sides get a dashboard. This is the full system — front end, API, and deployment — not a single layer of it.

The domain has two constraints that drive most of the design. Bookings cross timezones, so the client and the consultant have to see the same slot in their own local terms without either of them doing arithmetic — the single most common source of disputes in any booking product. And money moves through the platform, which is why the site carries a complete legal surface — terms, refund policy, disclaimer, acceptable use, and an AML/CFT policy — as first-class routes rather than footer afterthoughts.

Application Surface

Four route groups under the App Router:

There is also a live component gallery route — an in-repo showcase of the design system, which is how a component library this size stays reviewable without paying for a separate Storybook deployment.

Front-end Architecture

The data layer is split cleanly in three, so nothing reaches for fetch from a component:

Components follow a consistent convention — foundations, base, application, marketing, shared assets — around 290 files in total, built on React Aria Components. That choice is the accessibility story: keyboard interaction, focus management, and ARIA semantics for menus, dialogs, and comboboxes come from the library rather than being reimplemented per component, which is exactly what decays first on a build this size.

Timezone and country tables feed the booking UI directly, so a slot always renders in the viewer's own zone.

Session Handling

The API client is small but does the thing most token setups get wrong:

Two-factor authentication is real rather than decorative: the API issues TOTP secrets and renders enrolment QR codes, which the front end pairs with proper QR rendering and a dedicated one-time-code input.

Backend Services

The NestJS API is organised by domain — booking, cart, order, product, consultant application, support ticket, contact message, user — over Prisma and PostgreSQL, with Redis for caching. Beyond CRUD:

Deployment

The system ships with a deliberately hybrid production topology rather than pushing everything into containers:

This is the broadest system in the portfolio — a real marketplace with money, identity, and scheduling in it — and the parts worth pointing at are the unglamorous ones done properly: a token refresh that cannot loop, an accessibility layer that comes from the component library instead of good intentions, and background queues you can actually look inside once it is running.