This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
Kintsugi (金継ぎ) is a manual-grounded AI appliance repair assistant for technicians, repair shops, and repair-café volunteers. A technician enters a brand and model number, describes the symptom, and Kintsugi answers using only that model’s service manual. Every technical claim carries a [Page X] citation. If the manual is missing, if retrieval scores fall below a calibrated threshold, or if the procedure involves mains voltage, natural gas, or sealed refrigerants, Kintsugi refuses deterministically before calling the LLM.
The problem it solves is not “technicians lack information.” It is that a generic chatbot is confidently wrong about safety-critical procedures. A fabricated torque spec strips threading. A guessed electrical test creates a shock or fire hazard. A made-up error-code meaning sends the technician to replace a $180 control board that was never faulty.
Who pays: Independent appliance technicians and small repair shops. A single avoided misdiagnosis pays for a month of access. Repair-café volunteers are a secondary, non-paying group who get the offline Ollama path.
Demo
Video
Demo site
Code
Repo: https://github.com/Lakshay-Deol/kintsugi
Reproduce locally
git clone https://github.com/Lakshay-Deol/kintsugi.git
cd kintsugi
pip install -e .
cp .env.example .env # insert MONGODB_URI and LLM_API_KEY
python scripts/gate_phase0.py
python scripts/gate_phase1.py
python scripts/gate_phase2.py
python scripts/gate_phase3.py
python scripts/gate_phase4.py
python -m uvicorn kintsugi.api.app:app --host 127.0.0.1 --port 8080
How I Built It
Kintsugi is built around three deterministic gates and a hybrid retrieval layer, with open-source and open-weight models doing the synthesis.
The three gates (all before or after the LLM, never inside it):
Query (model + symptom)
→ Gate 1: Hazard filter → REFUSE: HAZARD_REFERRAL (no DB/LLM) →
MongoDB Atlas hybrid retrieval
→ Gate 2: Retrieval gate → REFUSE: LOW_RELEVANCE / MODEL_NOT_FOUND
→ Gemma synthesis
→ Gate 3: Citation verifier → strip ungrounded pages
→ Verified answer with [Page X]
Gate 1 and Gate 2 run before the LLM call. Refusals cost zero tokens.
MongoDB Atlas — Hybrid search.vector_indexstores 384-dimensional dense vectors on kintsugi.chunks with pre-filters on brand and model, so a Bosch query cannot retrieve a Whirlpool chunk. bm25_index is an Atlas Search full-text index tuned for alphanumeric error codes (F5E2, E18) and component IDs that dense embeddings handle poorly.
The two ranked lists are fused in the application layer with
Reciprocal
Rank Fusion : score = 1/(60 + rank_vector) + 1/(60 + rank_bm25).
Google Gemma — bounded synthesis. The primary reasoning engine is a Gemma model served via Google AI Studio through the google-genai SDK. Prompts are bounded to retrieved excerpts and require structured output with [Page X] citations. An offline open-weights path (gemma3:12b via Ollama) is benchmarked for rural repair cafés and air-gapped workshops.
Embeddings. 384-dimensional embeddings are precomputed offline at ingestion time. The query embedder is a lightweight ONNX path. A warm transformer is not loaded in the Render web service — the free tier cannot afford it.
Render. Declarative render.yaml, /health endpoint that checks database connectivity and demo-mode status, and proxy-aware rate limiting (proxy_headers=True, forwarded_allow_ips="*") so limits apply per client IP behind Render’s edge proxy.
Why Does Open Innovation Matter?
Because the alternative is a closed chatbot that guesses, and a technician has no way to see that a claim was never grounded.
Open models and open infrastructure made two things possible that a closed API would not:
An offline path. The Ollama gemma3:12b route lets a repair café in a basement with no internet run the same grounding and refusal logic. A closed API cannot be shipped to an air-gapped workshop.
A refusal path that costs nothing and can be inspected. Because the gates are local code, not a vendor policy, anyone can read them, calibrate the thresholds, and audit the citation verifier. The safety behavior is open source, not a black box.
Measured cost, per query:
Customer Story
A technician traced an intermittent fault on an OEM diagnostic reader. The fix itself was small; the problem was that the reader needed the vendor's server to confirm it. No internet in the bay, no confirmation, no repair that day.
He said the thing that stuck: if a tool could do that daily, offline, he'd pay for it not a flat fee, but a share of what it earned him. Two percent of profits, because a flat subscription is a cost whether or not the work comes in, and a percentage only costs him when the tool actually pays.
That is the constraint Kintsugi is built around. Not "works when the network works" works in a basement repair café with no signal, on a laptop with gemma3:12b running locally. The refusal gates and the citation check run in the same offline path as the cloud path. A tool that only works online fails exactly when a technician is standing in front of an open appliance.
Prize Categories
Gemma: Gemma is the synthesis engine behind every grounded answer, and the Ollama gemma3:12b path makes Kintsugi usable offline in repair cafés.
MongoDB Atlas: Atlas Vector Search and Atlas Search are fused with RRF, so semantic retrieval and error-code keyword matching reinforce each other.
Render: Kintsugi ships as a declarative render.yaml Blueprint with a /health endpoint and proxy-aware rate limiting on Render’s free tier.

Top comments (0)