This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
ScopeLock is a side-hustle tool for freelancers and small agencies who keep losing money to scope creep.
You paste your statement of work and a client thread (or import Slack JSON, or drop a voice memo). ScopeLock:
- Labels each client ask as in-scope vs out-of-scope
- Cites language from your SOW
- Drafts a professional boundary reply
- Runs a Side hustle cockpit: scope-creep score, TabPFN-estimated change-order hours, rush-fee math, and a client-ready change order you can export as Markdown
Who would pay? Solo devs, designers, and fractional engineers billing fixed-fee or milestone projects — anyone who needs receipts before saying yes to “just one more thing.”
Demo
Live app: https://scopelock.smriad.tech
Quick path on the demo: load samples → Index SOW → Analyze scope → open the change-order panel → Listen (ElevenLabs reads the suggested reply).
Production smoke test (Apple Sign-In creep sample): Mastra mode, high risk, TabPFN 15.3h, change-order ~$1,913 at $125/hr, voice MP3 generated, history stored in MongoDB.
curl -s https://scopelock.smriad.tech/api/health
Code
ScopeLock
Local-first AI that turns freelance scope creep into paid change orders.
Built for Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle.
Production (Render + smriad.tech)
- Deploy with
render.yaml→ servicescopelock - DNS: CNAME
scopelock→*.onrender.com -
export RENDER_API_KEY=rnd_... && npm run sync:render(reads.env.local)
Live URL: https://scopelock.smriad.tech
Local dev
cp .env.example .env.local # fill partner keys
npm install
npm run dev
Optional: docker compose up -d for local pgvector; local Ollama for embeddings.
Open http://localhost:3000 — samples preloaded.
How it works
- Paste your statement of work and optionally Index into pgvector (embeds chunks with Ollama + stores in Postgres).
- Paste a client thread.
- Analyze scope — Ollama returns structured JSON: verdicts, SOW citations, reply draft, change-order line items.
If Ollama is offline, the app uses a demo analysis so you can still record a video (set DEMO_MODE=true on cloud hosts).
Stack
Layer
Tech
MIT licensed. render.yaml Blueprint, GitHub Actions CI, and npm run smoke against production.
How I Built It
Open Gemma 3 (google/gemma-3-4b-it) is the reasoning core — on Render it runs via OpenRouter; locally you can point at Ollama instead. Mastra orchestrates the scope agent and workflow so analysis stays structured (verdicts, citations, reply, line items).
| Layer | Tech |
|---|---|
| Host |
Render (free tier Blueprint, /api/health) |
| LLM | Gemma 3 (open weights via OpenRouter / Ollama) |
| Agents | Mastra agent + workflow |
| RAG | Tiger Data (pgvector + hybrid FTS on SOW chunks) |
| History / fallback | MongoDB Atlas |
| Hours model | TabPFN 3.5 regression on bundled project history CSV |
| Voice in / out | ElevenLabs transcribe + TTS on the reply |
| Market context | SerpApi rate snippets |
| Memory | Backboard for recurring scope patterns |
| Tone polish | Tinker sampler on the boundary reply |
| Tracing | Sentry spans on the analyze path |
| CI | GitHub Actions (Copilot-friendly workflow) |
| URL |
smriad.tech — scopelock.smriad.tech via Cloudflare Worker → Render |
The analyze path: index SOW → retrieve chunks → agent JSON → TabPFN hours → optional Tinker pass → persist to /history.
Why Does Open Innovation Matter?
Freelancers cannot paste client threads into random closed chatbots and hope for enforceable output. Open-weight Gemma keeps the model swappable (cloud API today, laptop tomorrow). TabPFN turns your historical projects into hour estimates without training a custom regressor. Tiger + Mongo keep SOW and analysis history under infrastructure you control — important when the product’s whole job is contractual evidence.
A closed API could draft an email; it would not give me a credible, reproducible stack for “show me the SOW clause and the dollars” that I can self-host and audit.
My Agent Session
Full session on DEV — build, Render deploy, Cloudflare Worker DNS, live smoke test. Make Public on the session page if the embed is blank in preview.
Prize Categories
Featured: Best Use of Render · Gemma · TabPFN · Tinker
Partner: Backboard · ElevenLabs · Entire · GitHub Copilot · Mastra · MongoDB Atlas · Sentry Agent Tracing · SerpApi · Tiger Data · Best Use of a .tech Domain
(Not entered: Arduino, DigitalOcean, Temporal — no hardware or second long-running worker in this build.)
Thanks for reading — try the sample thread and tell me if the change-order math matches how you would bill.

Top comments (1)
Scope creep is a huge issue for freelancers—love seeing more side-hustle tools built around contract protection!