# QuoteCraft: an offline AI that turns messy client WhatsApps into instant quotations and scopes

> Source: <https://dev.to/vikram_rautela_vr/quotecraft-an-offline-ai-that-turns-messy-client-whatsapps-into-instant-quotations-and-scopes-2ka1>
> Published: 2026-10-19 05:44:32+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*

If you do any freelance work, consulting, or run a small service business, you know this exact message. It arrives on WhatsApp or Instagram DM at 10 PM:

*"hi vikram! need a landing page for our boutique bakery in dehradun with menu, photo gallery, online order enquiry form connected to whatsapp, and google maps location. we have logo and photos ready. how much will this cost and can we get it before diwali? also need 3 revisions and basic seo."*

Clients don't send neat requirement specifications. They send messy, conversational thoughts.

And that puts freelancers in a bad dilemma:

Quoting tools like PandaDoc or HoneyBook charge **$19 to $49 every single month**. For a solo freelancer starting out, that is a huge recurring bill. Worse, pasting confidential client ideas, client phone numbers, and private business budgets into third-party cloud AI APIs can violate client NDAs and privacy.

So I built **QuoteCraft**: a small, fast local web app that turns messy client WhatsApp messages into an itemized quotation, a scope-of-work, and a ready-to-send WhatsApp reply in about 15 seconds.

It runs **100% on a laptop** using a local open-weight model (**Llama 3.2 via Ollama**). Zero cloud APIs, zero per-token cost, and confidential client details never leave your machine.

Here is how QuoteCraft handles that real WhatsApp message for a boutique bakery in Dehradun:

QuoteCraft parses the message and builds a clean deliverables table with realistic timelines and pricing:

| Deliverable | Estimated Days | Estimated Cost (INR) | 
|---|---|---|
| **UI/UX Design & Responsive Layout** — Mobile-first modern design matching bakery aesthetic | 3 Days | ₹ 7,500 | 
| **Digital Menu & Photo Gallery** — Filterable categories with high-res photo showcase | 2 Days | ₹ 5,000 | 
| **WhatsApp Order Integration & Maps** — Direct one-tap ordering & Google Maps embed | 2 Days | ₹ 4,500 | 
| **On-Page SEO & Speed Optimization** — Local search optimization & 90+ Lighthouse speed | 1 Day | ₹ 3,000 | 
| **Total Estimated Investment** | **8 Days** | **₹ 20,000** | 

Every row is **interactive and editable**. If you want to change a price, adjust days, or add a custom task, you can edit it right in the table, and the total recalculates automatically.

This is what freelancers usually forget to write, and what costs them money later. QuoteCraft automatically specifies what is **not** included:

Freelancers don't want to copy a rigid 5-page PDF into a chat. QuoteCraft generates a polite, friendly WhatsApp message pre-formatted with bold tags (`*text*`) and emojis:

```
Hi Anita! 🧁 Thanks so much for reaching out.

I'd love to build the landing page for your bakery in Dehradun! Here is a quick quotation and timeline:

*Scope:*
• Custom mobile-friendly design with your logo & photos
• Interactive menu & photo gallery
• Direct WhatsApp ordering button (customers tap to order)
• Google Maps location & local SEO
• 3 review rounds included

*Timeline:* 8-10 business days (well before Diwali! 🪔)
*Total Investment:* ₹20,000 (40% advance to start)

Does this work for you? If yes, I can share the invoice and get started this Wednesday! 🙌
```

You hit **"Copy WhatsApp Reply"**, paste it into your chat, and you are done in 30 seconds.

For formal corporate clients who need a paper trail, hitting **Print** renders an elegant, print-ready quotation sheet with quote reference ID, date, your business header, payment terms, and signature line.

**Turn messy client WhatsApp messages into professional quotations, scope-of-work, and ready-to-send replies in seconds.**

*A local, privacy-first AI tool built for freelancers, solo agencies, and small service businesses.*

Every freelancer, solo developer, designer, photographer, and local business owner knows this pain:

A client sends a rambling, messy message on WhatsApp or Instagram at 10 PM:

*"hey bro need website for my bakery in dehradun with online menu, photo gallery, online order enquiry form connected to whatsapp, and google maps location. we have logo ready. how much will this cost and can we get it before diwali? also need 3 revisions and basic seo."*

Responding takes **30 to 60 minutes** of tedious work:

Because writing…

The entire app is **one Python file** (`app.py`), using only Flask and Python's standard library (` urllib`, `json`, `re`). It requires **zero API keys** and zero external services.

**The stack:**

| Part | What I used | 
|---|---|
| Brain / Extraction & Pricing | **Llama 3.2 (3B)** running**locally** via[Ollama](https://ollama.ai) | 
| Web Application | Python 3.10 + Flask (single file, lightweight) | 
| Structured Output | Strict JSON schema enforced by Ollama's `format` parameter | 
| UI & Offline Export | Clean vanilla HTML5, CSS3 responsive grid, print stylesheet | 
| Local Storage | Local `quotes.json` file for private history log | 

I built and tested all of it on a normal laptop: **Ubuntu, 15 GB RAM, and no GPU.**

Smaller open models can sometimes add conversational chatter (*"Sure, here is your quotation:"*) or hallucinate keys. To make the UI 100% reliable, I used Ollama's structured output format:

```
payload = {
    "model": "llama3.2",
    "messages": [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": user_message}
    ],
    "format": QUOTE_SCHEMA,  # Enforces exact JSON keys
    "options": {"temperature": 0.2}
}
```

Setting `temperature: 0.2` keeps the pricing estimates and deliverable breakdown consistent and grounded.

In the system prompt, I made "Out of Scope" a mandatory output field. If the client asked for a website, Llama 3.2 proactively flags domain hosting, photo shoots, and extra revisions as out of scope. That single design decision transforms the app from a generic text generator into a real business tool.

`timeout=300` on the HTTP request so it never aborts prematurely during the first load. Once in memory, subsequent queries run much faster (~15-20s).`format: json`, some model variations wrap output in
```` ``` json ... ``` ````
. I added a small regex cleaner to strip markdown code blocks before calling `json.loads()`.`@media print` style. The entire app loads instantly even with airplane mode turned on.
For QuoteCraft, open-source AI is not just a nice feature — **it is the only reason this tool makes commercial sense**:

**Client Confidentiality & Privacy (No NDA Breaches)**:

When freelancers quote for startups or local businesses, clients share unreleased product details, secret business ideas, customer figures, and personal phone numbers. Uploading that to third-party cloud AI APIs creates legal and privacy risks. With open weights running locally, **not a single byte leaves the freelancer's machine**.

**$0.00 Running Cost Makes the Side Hustle Viable**:

Closed quoting platforms charge \$20 to \$50 per month. If a freelancer is just starting out or only bids on 3 projects a month, paying \$300+/year in SaaS fees is painful. Open models like Llama 3.2 cost **nothing to run**. 1 quote or 1,000 quotes costs \$0.00.

**Total Independence from Cloud Pricing & Changes**:

Closed API providers frequently deprecate model versions, hike pricing, or impose rate limits. Open-weight models are permanent assets: they will run on this laptop today, tomorrow, or 5 years from now.

**100% Offline Capability**:

Freelancers frequently work from trains, cafés, or places with spotty internet. Because Llama 3.2 runs locally through Ollama, QuoteCraft works with zero internet connection.

Clone the repo, run `python3 app.py`, and test it with your own messy client chats:

👉 [GitHub Repository: VIKRAM-009/quotecraft](https://github.com/VIKRAM-009/quotecraft)

Thanks for reading! If you have ever lost a weekend to client scope creep, give local open-weight AI a shot. 🚀
