DEV Community

Cover image for ScopeLock: open-weight AI that turns freelance scope creep into paid change orders
S. M. Riad
S. M. Riad

Posted on AI-assisted

ScopeLock: open-weight AI that turns freelance scope creep into paid change orders

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

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

ScopeLock production UI

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
Enter fullscreen mode Exit fullscreen mode

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)

See docs/RENDER-SMRIAD.md.

  1. Deploy with render.yaml → service scopelock
  2. DNS: CNAME scopelock → *.onrender.com
  3. 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
Enter fullscreen mode Exit fullscreen mode

Optional: docker compose up -d for local pgvector; local Ollama for embeddings.

Open http://localhost:3000 — samples preloaded.

How it works

  1. Paste your statement of work and optionally Index into pgvector (embeds chunks with Ollama + stores in Postgres).
  2. Paste a client thread.
  3. 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

ScopeLock HF26 Week 2 — Render deploy, Cloudflare Worker, live smoke test
You

Implement ScopeLock for Hacktoberfest Week 2 Side Hustle: open-weight AI that turns freelance scope creep into paid change orders.

Agent

Scaffolded Next.js app with Mastra agent, Gemma via OpenRouter on Render, Tiger pgvector RAG, MongoDB history, TabPFN hours, ElevenLabs voice, and side-hustle cockpit UI.

You

Custom domain scopelock.smriad.tech was not resolving via registrar CNAME while Cloudflare nameservers were authoritative.

Agent

Deployed a Cloudflare Worker proxy (same pattern as 29.smriad.tech) with custom_domain=true. Removed conflicting DNS rows, added Worker DNS record, verified HTTPS.

You

Draft DEV submission post for Week 2 challenge.

Agent

Created DEV draft with live demo link, partner stack table, and prize categories; production URL https://scopelock.smriad.tech

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)

Collapse
 
diusazzad profile image
Sazzad Hossain •

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