MastroPreventivo
AI quotes for tradespeople: you describe the job, the app writes it in your own style.
The problem
A tradesperson spends the day on site. Quotes get written in the evening, piecing together photos, voice notes and chats with the client, often with no one to help with the paperwork.
Quoting software makes you fill in forms and turns out documents that all look the same and don't feel like yours. What was missing was something that starts from how they already work: talking about the job, then sending a quote with their own letterhead and their own wording.
The solution
MastroPreventivo learns from the tradesperson. The first time, you upload your letterhead and one or two old quotes: the app finds where to write on the letterhead and picks up your fixed texts, typical phrases and font.
Then, for each job, you describe out loud what needs doing, or send photos, chat screenshots or text. The AI drafts the client, subject, intro and line items, written the way you would write them. If something is missing, it asks a few questions.
Prices you didn't mention stay empty: you fill them in, and only what you confirm goes into the total. In the end the PDF comes out on your letterhead, numbered and dated, ready to send to the client as a link.
My role
- I built MastroPreventivo with the help of AI, using skills and workflows I created myself.
- Here AI is also inside the product, which made the work harder. I wrote the instructions it gets, defined the format of its answers and check them before they're used.
- I decided what the AI must not do: it doesn't make up prices, it doesn't copy client data from old quotes, and nothing goes into the total without the tradesperson's confirmation.
- I planned for when the AI isn't enough or doesn't answer: questions for missing details, the draft kept safe with "Retry", a request limit and a log of every call.
- I built the part that learns from the tradesperson: it reads the letterhead and old quotes (PDF or Word), finds the space for the text and suggests the fixed texts to check.
- I made the PDF on the server: once issued it stays the same, with a number and versions. I also made the page where the client accepts or declines.
- I designed the database with its security rules: each tradesperson sees only their own data.
Stack and timeline
It's built with Next.js and React, in TypeScript. Data, sign-in and security rules live on Supabase (a PostgreSQL database).
The interface uses Tailwind CSS and shadcn/ui components on Base UI, with Framer Motion for animations; forms use React Hook Form and Zod, which also checks the AI's answers. The PDF is generated with React-PDF; PDF.js reads the letterhead and old quotes; Tesseract.js reads the text in screenshots on the phone. Serwist handles the PWA side, Web Push the notifications, Sentry the errors. Tests with Vitest and Playwright.
The work went project by project: first the full flow, then the PDF that never changes once issued, the letterhead as background, structure and tone taken from old quotes, and finally fonts.
Result
MastroPreventivo is online and the whole flow works: sign-in, company setup, new quote, review, PDF, sending and the client's reply.
The video shows a quote being made from start to finish, on the real app, with real AI answers that weren't prepared in advance. That quote took 3 AI calls, and each answer came back in under 8 seconds.
The screens
Here's MastroPreventivo on a phone: what it does, how it learns from the tradesperson's quotes, before and after on the same letterhead, and the path from voice to prices. The company, client and prices are made up for the example. Scroll to see them all, tap an image to enlarge it.
Video music: "Wallpaper" by Kevin MacLeod (incompetech.com), licensed under CC BY 4.0. The track was shortened and faded.



