Skip to content
Back to projects

Pierre

A restaurant ordering app. Customers browse the menu, place orders and follow them live, and staff manage everything from an admin panel.

Screenshot of Pierre

Overview

Pierre has a NestJS API and a Next.js frontend. Each backend module is split into controller, service and repository layers, which keeps database code out of the business logic. Requests are validated with Zod, and the same schemas generate the Swagger docs.

What it does

  • JWT login with access and refresh tokens. Refresh tokens rotate, reused tokens are detected, and passwords are hashed with Argon2id.
  • Role-based access control. Every route is protected unless it's marked as public.
  • PostgreSQL with Drizzle ORM. Prices are stored as whole cents to avoid rounding errors.
  • Redis for caching, rate limiting and token storage.
  • Orders move through a state machine. Status changes go to BullMQ queues and to clients over Socket.IO.
  • Next.js frontend with menu, cart, checkout, order tracking and an admin dashboard.
  • Runs on Docker Compose behind Nginx with Let's Encrypt, with CI on GitHub Actions.

Built with

NestJSTypeScriptPostgreSQLDrizzle ORMRedisBullMQSocket.IONext.jsTailwind CSSJWTSwaggerDockerNginx