QuoteForge: Messy Job Notes Customer-Ready Quotes, Powered by a Local Open-Weight Model A developer built QuoteForge, a zero-dependency Node.js CLI that converts a tradesperson's handwritten jobsite notes into formatted, priced customer quotes and invoices. The tool runs local inference through Ollama with an open-weight model (Gemma 3 by default) and falls back to a deterministic parser when no model is available, keeping per-quote cost at zero and client data off the cloud. The project ships with 24 passing tests, though its model path was validated against a stubbed Ollama API rather than a real GPU-backed model. This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle https://dev.to/challenges/hacktoberfest-week2-2026-10-12 QuoteForge is a zero-dependency Node.js CLI that turns the notes a solo tradesperson scribbles on a jobsite into a clean, priced, customer-ready quote or invoice: Labor 2.5 hrs @ $85 Disposal unit 1/2 HP: $189 Trip charge $45 Remove and haul away old faucet …becomes a formatted quote with a polished scope of work, line items, tax, total, and a deposit schedule — in one command, on the laptop they already own, with no cloud account and no per-quote cost. Who pays for it: one-person handyman, cleaning, and repair businesses. They don't usually lose jobs on price — they lose them on speed and polish. The quote that goes out tonight, looking professional, beats the handwritten estimate that goes out Thursday. Their current options are quoting SaaS at $20–$50/month that wants their entire client list in someone else's cloud, or a notes app and hand math. QuoteForge is priced like a tool instead of a subscription — possible only because the AI costs $0 to run see below . QuoteForge running on the bundled example examples/job-notes.txt , offline engine: ---------------------------------------------------------------- Payne Relief Handyman Services QUOTE / ESTIMATE ---------------------------------------------------------------- Prepared for: Dana W. — kitchen faucet + disposal Date: 2026-10-18 Job: Kitchen faucet replacement + disposal swap SCOPE OF WORK - Remove and haul away old faucet and disposal unit - Install customer-supplied faucet, test for leaks LINE ITEMS Labor 2.5 hrs @ $85.00 $212.50 Disposal unit 1/2 HP $189.00 Supply lines and fittings $36.00 Trip charge $45.00 Subtotal: $482.50 Tax 9.5% : $45.84 TOTAL: $528.34 Deposit to book: $158.50 Balance on completion: $369.84 This quote is valid for 30 days. Work is scheduled on deposit receipt. Prepared with QuoteForge · engine: deterministic parser offline ---------------------------------------------------------------- With a local model running ollama pull gemma3 && ollama serve , the same command produces the same numbers, but the model does the extraction and rewrites the scope in customer language — "Remove and haul away old faucet" becomes "We will remove your old faucet and disposal and haul them away." Every quote's footer names the engine that produced it, so there's never a silent quality change. Honesty note: QuoteForge was developed in an environment without a GPU, so the model path was exercised end-to-end against a local stub implementing Ollama's HTTP API with canned responses, and the client is unit-tested against stubbed responses — the code path is identical with a real model; npm test and the run above are fully real. Repo: https://github.com/payne-muse/quoteforge https://github.com/payne-muse/quoteforge — the code is complete, tested 24/24 , and committed; the repo flips public tonight as the account email verification clears. The project is four small modules with zero dependencies: src/parse.js deterministic note parser , src/pricing.js cent-exact money math , src/ollama.js local-model client , src/render.js + src/cli.js document + CLI . 24 tests, all passing, run with npm test Node's built-in test runner — still zero dependencies . QuoteForge is built around local inference with an open-weight model — Gemma 3 by default — served by Ollama https://ollama.com : quoteforge.config.json . Labor 2.5 hrs @ $85 , Faucet: $189 , 4 @ $6 outlet covers , Materials: section headers and produces the same document. Every model call fails soft to this path. The model is swappable with --model llama3.2 , qwen2.5 , anything Ollama serves and the host respects OLLAMA HOST , because the point of open weights is that no vendor decision can break the tool. Three concrete reasons, not ideology: ollama pull something else and keep working. QuoteForge was designed and built in a single session with an AI coding assistant on October 18, 2026 — spec, implementation, test suite, and this write-up — which is itself the side-hustle pattern the tool is for: one operator, open tools, no team, no budget. No DevRelay capture for this session.