*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

Code

GitHub logo Bientechsavvy / quote-desk

A SYSTEM THAT TAKE OVER YOUR CLIENTS QUOTATION NICELY

Quote Desk

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.py recognises the services, reads quantities (including "three" and ranges like "2-3 bedroom"), looks prices up in the owner's prices.json and 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.5b runs 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)*

What I Built

Demo

Code

How I Built It

Why Does Open Innovation Matter?

My Agent Session

My First User

Prize Categories