Problem
Air-conditioning installers quote on paper or WhatsApp, size the units by rule of thumb and lose sales because they cannot tell who saw the proposal and who went cold.
My role
Personal project: product, design, code and tests.
Solution
- Per-room heat-load calculator (BTU/h) used on site.
- Quote with the installer’s own prices, sent as a link; the customer approves with their name and sees the deposit Pix code (BR Code) made with the installer’s key.
- Dashboard showing who opened, who stalled and which maintenance visits are due.
How it was built
Next.js 16 (App Router), React 19, strict TypeScript, Tailwind 4, shadcn/ui-style components, Auth.js, Drizzle + Postgres (PGlite in demo mode), Stripe Billing with an idempotent webhook, Resend, Zod, Vitest and Playwright.
Results
Runs end to end in demo mode with pnpm dev, no keys needed. Lighthouse 100 on desktop and an end-to-end test from sign-up to approval and plan upgrade. It is a demo: no server is deployed.
Stack
- Next.js 16
- React 19
- Drizzle
- Postgres
- Auth.js
- Stripe
- Playwright


