This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 2
What I Built
Solo tradespeople—plumbers, electricians, mobile mechanics, tutors, and cleaners—lose business every single week for one simple reason: they miss inquiries while their hands are full on a job.
When someone has a burst pipe or a leaking tap, they text or DM. If they don't get a prompt response, they move down the list and hire someone else. But solo operators cannot answer calls or compose text messages while fixing a boiler or balancing on a ladder.
Existing automated front desks and AI receptionists are built around metered, per-message proprietary APIs (like OpenAI or Retell) or complex hosted SaaS tools. For an independent contractor, this creates two non-starters:
- Metered costs eat their margins on high-volume, low-margin inquiries.
- Customer privacy is compromised: job inquiries contain sensitive personal data—names, physical home addresses, access codes, and details about home vulnerabilities.
I built Second Ring (Side Hustle): a local-first, zero-dependency AI front desk that runs entirely in the terminal powered by open-weight models (Gemma 3:4B via Ollama) and deterministic code guardrails.
The local open-weight model extracts and classifies job requests. Pure deterministic code validates required fields, enforces strict safety boundaries (no prices quoted over SMS, no confirmed bookings without owner approval), and stages the job. The trade owner reviews, approves, or dismisses all jobs with simple slash commands right from their terminal.
Who Would Pay For It
Target Audience: Solo service contractors and independent trades (plumbers, electricians, locksmiths, mobile detailers, barbers, private tutors).
Why They Would Pay:
- Immediate ROI (Prevented Lost Leads): A single plumbing job won from a fast, professional response easily pays $150–$500+. Missing 2–3 leads a month due to unanswered messages costs thousands of dollars a year.
- Zero Ongoing API Billing: Unlike commercial SaaS receptionists charging $50–$100/month plus per-minute or per-token usage fees, Second Ring runs locally on their own laptop with $0 inference cost. A one-time purchase or modest setup fee ($49–$99) gives them an always-on front desk that never meters their messages.
- Uncompromised Customer Trust & Privacy: Customers often share sensitive entry details (e.g. "key is under the mat at 14 Elm St"). Independent contractors with privacy-conscious clientele can guarantee client data never touches third-party cloud servers.
- Strict Human-in-the-Loop Control: Solo operators fear hallucinations: an AI promising a $50 quote for a complex job or booking a customer when the plumber is already booked solid. Second Ring guarantees that no booking is confirmed and no price is ever quoted without human sign-off.
Demo
Here is a walkthrough of the terminal interaction:
[caller] hi it's Sam at 3 Pine St, my kitchen drain is blocked, can you come Tuesday morning?
[owner] New job for Riverbend Plumbing
[owner] caller - blocked drains
[owner] Sam, 3 Pine St
[owner] Wants: Tuesday morning
[owner] Job #1 — /approve 1 to confirm.
<- Thanks, we've got your details and passed them to Sam. You'll hear back shortly to lock in a time.
The owner can inspect jobs or approve bookings with terminal commands:
/jobs
/approve 1
When approved, the confirmed message is printed for the caller:
-> [SMS to caller] Your booking for Tuesday morning is confirmed with Sam (Riverbend Plumbing). See you then!
Reproducing via Pipe / Quick Test:
# Clone the repository
git clone https://github.com/blezecon/idk.git side-hustle
cd side-hustle
# Pull & run Gemma 3 local model
ollama pull gemma3:4b
ollama serve
# Pipe sample conversation and commands:
printf '%s\n' "my drain is blocked, Sam, 3 Pine St, Tuesday morning" "/jobs" "/approve 1" | npm start
Code
Side Hustle — a local-first AI front desk
Job triage for a one-person trade, running entirely in the terminal on open-weight models you host yourself.
A plumber, barber or tutor misses a call while their hands are full, and the enquiry arrives as a text, a DM or a form message. Paste it into the front desk and a local open-weight model works out what the job is and collects the few details the owner actually needs. The owner reviews every job in the same terminal and approves it Nothing is promised to a customer until a human says so.
Built for the Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle.
Why open models matter here
The existing tools in this space glue a closed, per-message API (OpenAI, Retell) to the front desk. That's a bad fit for a one-person business:
- Cost. A busy trade can send…
- Repository: https://github.com/blezecon/idk
- License: MIT
-
Dependencies: Zero external npm packages (
package.jsonhas 0 dependencies). Runs on native Node.js 22.5+ with built-in SQLite (node:sqlite), built-in test runner (node:test), and nativefetch.
How I Built It
Architecture Overview
The system strictly decouples language extraction from decision authority:
flowchart LR
C[Caller Message] -->|Input| A[Terminal Front Desk]
A -->|Prompt + JSON Schema| M[(Ollama / Gemma 3 Local)]
M -->|Structured JSON| V{Deterministic Guardrails}
V -->|Missing required field| C
V -->|Complete + Verified| DB[(SQLite Jobs DB)]
DB --> O[Trade Owner CLI]
O -->|/approve ID| C
V -->|Spam / Emergency / Needs Human| O
1. Model Layer (src/model.js)
- Runs Gemma 3:4B via Ollama's local HTTP API (
/api/chat). - Uses structured output schema (
format: SCHEMA) to force strict JSON containing:-
intent:"quote" | "booking" | "question" | "emergency" | "spam" | "wrong_number" | "human" -
service,urgency,name,address,preferred_time -
needs_human: boolean flag -
reply_text: single polite question asking for the next missing piece of info
-
- Includes automatic retry handling for model stability.
2. Deterministic Guardrails (src/triage.js)
An LLM should never be trusted with money, calendar commitments, or safety policies. The deterministic layer enforces:
- Price Protection: Regex inspection prevents any dollar, euro, pound, or hourly rate from ever reaching the customer. Quotes must be given on-site.
-
No False Commitments: Any phrasing resembling "you're booked" or "confirmed for" generated by a model is discarded. Only the owner can issue a confirmation via
/approve. -
Handoff Rules: Any emergency, abusive interaction, or conversation exceeding the turn cap immediately transitions to
needs_humanhandoff. -
Ordered Field Collection: Checks required fields in order (
service,name,address,preferred_time) so the customer is asked only one clear question at a time.
3. Local Persistence (src/db.js)
- Uses Node.js native
node:sqlite(DatabaseSync) with WAL mode enabled. - Stores conversations, individual turns, and active jobs locally in
second-ring.db.
Why Does Open Innovation Matter?
Open-source AI and open-weight models are the catalyst that makes this entire business viable:
- Zero-Marginal-Cost Inference: Closed APIs charge per token. A single active trade handling hundreds of inquiries a month faces unpredictable operational bills. Open-weight models like Gemma run locally with zero API expenses, turning an unpredictable operational liability into predictable software.
- True Data Sovereignty & Privacy: Job inquiries for home services inherently expose physical addresses, home vulnerabilities ("back door lock broken"), and schedules ("we are away until Friday"). Routing this information through third-party proprietary clouds creates unnecessary liability. Open-weight inference ensures data stays 100% on the owner's hardware.
- Vendor Independence: When building a tool for independent small businesses, relying on a closed provider leaves you vulnerable to sudden pricing changes, rate limits, or discontinued model checkpoints. Open-weight models allow you to lock in working weights and swap models (Gemma, Llama, Qwen) whenever you choose.
- Offline Capability: Trades often operate in areas with poor cellular reception (basements, construction sites, rural properties). A local-first stack running on a laptop or local mini-server continues functioning without reliable cloud connectivity.
Built with ❤️ for solo trades and small business owners during Hacktoberfest 2026 Week 2.
Top comments (0)