*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2:
What I Built
Quote Desk helps a small trades business answer customers faster. The owner pastes a messy customer message, in English or Pidgin, and gets back a quote built only from his own price list, the questions to ask the customer, and a polite message ready to send on WhatsApp.
Who would pay:
A small shop or tradesperson who loses time typing quotes by hand and sometimes quotes the wrong price. I built it for a small electrical services business, where requests range from "my socket is sparking" to "wiring for a 2-3 bedroom flat".
What it will not do:
Invent a price. Anything the owner has not priced says "to be confirmed". Fire and shock words raise a safety flag and add "switch off at the main breaker" advice from code, not from the model.
Demo
- Live demo (sample prices, not real ones): [https://quote-desk-3lp0.onrender.com/]
- The first load can take about a minute because the free plan sleeps.
- Screenshots:
Code
Bientechsavvy / quote-desk
A SYSTEM THAT TAKE OVER YOUR CLIENTS QUOTATION NICELY
Quote Desk
LIVE URL - https://quote-desk-3lp0.onrender.com
A quote and WhatsApp-reply desk for a small trades business (built first for a small electrical services business) The owner pastes a messy customer message (English or Pidgin) and gets:
- the services it recognised and the questions to ask the customer (owner view),
- a quote built only from the owner's own price list,
- a polite message ready to send on WhatsApp, and a print view.
Rules decide, the model phrases, a guard checks. Services, quantities, prices and totals are plain code. An open-weight model only rewrites the finished text. The guard throws the model's text away if it changes a number, adds a price, discount, link or service, drops the total or the safety advice. Then the app shows the rules text. Python standard library only. No packages.
Features
Quote engine (plain code, tested)
- Recognises 9 services from English or Pidgin keywords, reads…
How I Built It
- Rules decide, the model phrases.
quote.pyrecognises the services, reads quantities (including "three" and ranges like "2-3 bedroom"), looks prices up in the owner'sprices.jsonand adds up the total. The model never chooses a service, a quantity or a price. Open-weight model for the wording. Locally,
qwen2.5:1.5bruns through Ollama, offline. On the public demo, a hosted model runs through one Backboard API key. Switching between them is one environment variable.A guard checks the model. It rejects any text that changes a number, adds a price, discount, link or service, drops the total, forgets "to be confirmed", or drops the breaker safety advice. Then the app shows the rules text instead. If the model is down, the quote still works.
Privacy by design. The model only sees the finished quote text. The customer's raw message, name and phone number stay on the owner's side.
Dashboard. Two-panel page with example messages, an owner view (services, urgency, questions to ask), a printable quote with number and date, WhatsApp send, copy, download, and a recent-quotes list with CSV export saved only in the browser.
Python standard library only, automated tests, deployed on Render. Hosted calls are cached and capped per hour to protect my credits.
What my own tests caught
I ran nine sample customer messages and read the output like a customer would. Three bugs showed up. A "burnt" pump also got house-wiring questions. "2-3 bedroom" was quoted for 3 without saying so. And when a customer asked for both the premium and the regular ATS, only one price appeared. I fixed all three, added tests, and kept both outputs in the repo (tests/results-v1.txt and results-v2.txt).
Why Does Open Innovation Matter?
- Customer data stays put. With a local model, names, numbers and addresses never leave the owner's laptop. A closed API would receive every message.
- No cost per quote on the local path, so it still makes sense for a business that quotes many small jobs.
- I can control the behaviour. I read and changed every part, including the guard that stops a small model from inventing prices, and I swapped models with one setting.
- Honest limits: matching is keyword based, the demo uses sample prices, Pidgin from a 1.5B model is rough, and I did not build payments, accounts, photo reading or fine-tuning.
My First User
My first user tried it today to get real quotations for their own jobs.
Prize Categories
- Best Use of Render: the demo is hosted on Render.
- Best Use of Backboard: the live demo calls a hosted model through one Backboard API key.
](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*




