Digital study & quoting tool for ventilation projects
A full-stack product that digitizes the technical study and quoting of ventilation projects, led end to end: team coordination, API and data architecture, frontend foundations and DevOps setup.
- Role
- Team Lead: architecture, backend, delivery
- Client
- Soler & Palau
- Stack
- NestJS, Next.js, TypeScript, PostgreSQL, Prisma ORM, TanStack Query, TanStack Form + Zod, next-intl, NextAuth, Sentry, AWS S3, Puppeteer, Docker
Problem
Soler & Palau needed a digital tool to carry out technical studies and produce quotes for ventilation projects. Beyond the features, the engineering challenge was delivering a maintainable full-stack product on time while keeping a cross-functional team aligned with stakeholders.
Architecture
The backend is a modular NestJS REST API: JWT authentication with refresh tokens, role-based access control, explicit validation layers, and integrations for real-time data, AWS S3 file storage, transactional email and PDF generation via Puppeteer. The data layer is PostgreSQL modeled through Prisma, with entity relationships and a migration strategy built on Prisma Migrate. The frontend is Next.js 15 (App Router) structured on atomic design principles: TanStack Query owns server state, TanStack Form with Zod handles validation at the boundary, next-intl provides i18n and NextAuth protects routing.
Engineering decisions
Modular API with explicit validation layers
Each domain lives in its own NestJS module with validation at the boundary. New features extend a module instead of spreading conditionals across the codebase, and invalid data is rejected before it reaches business logic.
Prisma Migrate as a deliberate migration strategy
Schema changes are versioned, reviewable migrations rather than ad-hoc SQL. The data model can evolve with the product without risky manual interventions on environments.
Server state and forms as separate concerns
TanStack Query handles caching and synchronization with the API; TanStack Form + Zod validates user input where it enters the system. Keeping the two apart avoids the classic tangle of fetch logic inside form components.
Docker Compose from day one
Reproducible environments made onboarding and release cycles predictable: the same stack runs identically for every developer.
Quality & reliability
Validation layers at the API boundary, RBAC on every protected resource, and Sentry observability in production. Reproducible Docker environments keep development and deployment behavior consistent.
Outcome
Delivered on time by a cross-functional team, with priorities and stakeholder expectations managed throughout. The modular architecture and migration strategy keep the product maintainable as it grows.
- NestJS
- Next.js
- TypeScript
- PostgreSQL
- Prisma ORM
- TanStack Query
- TanStack Form + Zod
- next-intl
- NextAuth
- Sentry
- AWS S3
- Puppeteer
- Docker