DEV Community

Bhumika Sudarshani
Bhumika Sudarshani

Posted on

Van-to-Quote

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle*

What I Built

Van-to-Quote is a local app that turns a tradesperson's spoken job notes into a priced PDF quote.

Plumbers, electricians and other tradespeople finish a job and then spend an evening typing up quotes. Cloud quoting apps charge a monthly fee, need a signal, and keep customer data on someone else's server. With Van-to-Quote you hold a button and say "replaced two radiators, three hours, forty meters of pipe". A draft quote appears with the right items, quantities, labour and VAT. You fix anything that looks off, then download the PDF.

Who would pay: solo tradespeople and small trade businesses who quote on site, often with poor signal. Because there is no per-quote cost, it could be sold as a one-time license or a small flat fee.

Demo

See the demo GIF and screenshots in the README: [PASTE REPO LINK]

Code

Van-to-Quote 🔧

Talk about a job, get a priced PDF quote. Runs fully offline once models are downloaded.

Setup

  1. Install Ollama (https://ollama.com), then: ollama pull qwen2.5:7b (or qwen2.5:3b for small laptops)
  2. pip install -r requirements.txt
  3. Edit prices.json with your business name, rates, VAT and price list
  4. python app.py and open http://localhost:5000

Mic access works on localhost. To use from a phone on your wifi, serve over HTTPS or use the text box.

How it works

Whisper (faster-whisper) transcribes -> a local LLM extracts items, quantities and hours as JSON -> your own price list supplies every price and all maths is plain code. The model never makes up a price. Config via env vars: LLM_MODEL, WHISPER_MODEL, OLLAMA_URL.




How I Built It

The whole pipeline runs on a laptop:

  1. faster-whisper (open-source speech recognition) transcribes the recording.
  2. Qwen2.5 3B, running locally through Ollama, extracts the customer, items, quantities and labour hours as JSON.
  3. Plain Python matches items against the tradesperson's own prices.json, calculates VAT and totals, and builds the PDF with ReportLab.
  4. A small Flask web page shows an editable draft. Items that aren't in the price list are flagged orange so a price can be set by hand.

The key design choice: the model never sets a price. It only decides what was done. The price list and ordinary code decide what it costs. A small model can mishear a number, but it can't invent a price or get the maths wrong, and every mistake is visible on the draft screen before anything is sent.

I tested the full flow end to end on my own laptop with spoken job descriptions.

Why Does Open Innovation Matter?

  • Private by design. Customer names, addresses and prices never leave the laptop. A cloud API can't offer that.
  • Works with no signal. Basements, new builds and rural jobs are exactly where tradespeople quote.
  • Costs nothing per quote. There is no API bill, so a flat price for the tool still leaves real margin however many quotes someone writes.
  • Swappable and adaptable. Changing the model is one setting, and the price list and prompt are plain files. A plumber, a painter and an electrician can each have their own setup, and nobody's pricing or terms can change under them.

Top comments (0)