This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle.
What I Built
A client asks for a small website. The email also mentions a newsletter, unfinished copy, and online ordering “eventually.” Which of those things belong in the quote?
That ambiguity is a real cost of independent work. A freelancer can spend an evening writing a proposal and still leave the boundaries unclear. A quote that looks profitable can become a project full of unpaid extras.
ScopeCraft turns that messy brief into a proposal workspace. An open model drafts the deliverables, exclusions, questions, and scope risks. The freelancer reviews every estimate, sets their own rate, and exports the client version.
It is aimed at independent web designers, developers, and small creative studios. The person who would plausibly pay is someone writing proposals every week, who wants a useful first draft without putting client emails into another company's AI service.
The commercial hypothesis is a modest one-time purchase for a polished local tool, perhaps $19, rather than a subscription built around metered API calls. That is a hypothesis, not a claim of revenue or validated demand. The challenge build itself is MIT licensed.
Demo
Try the interactive workspace. No account required.
The hosted frontend includes clearly labeled editable examples and an editable replay of the recorded Qwen response. Click New proposal, then Explore the recorded Qwen draft. The replay loads saved output rather than running inference. It demonstrates scope editing, live quote calculations, private risk checks, status tracking, browser persistence, backups, and PDF/Markdown export. GitHub Pages does not run a model; new AI generation is available when running the complete app locally.
Open a proposal in the demo to edit its scope and pricing, inspect the private risks, and export a client document. A recorded real inference response includes the synthetic pottery brief, generated scope, model name, and measured generation time.
The sample café, maker, and studio are fictional. None is presented as a customer.
Code
harshalranjhani
/
scopecraft
Private, open-model proposals for independent freelancers. Hacktoberfest 2026 Week 2.
ScopeCraft
Good work starts with a clear scope.
A private proposal workspace for independent designers and developers. Turn a client brief into an editable scope, catch the unknowns, put a fair price on your time, and export a proposal you can stand behind.
Built from scratch during Hacktoberfest 2026 Week 2: Side Hustle. MIT licensed.
Try it
- Interactive demo — editable examples, a labeled replay of a real Qwen response, pricing, scope checks, backups, and PDF/Markdown export. GitHub Pages serves the frontend; it does not run inference. Examples are clearly labeled.
The model generates a new scope. Saved examples let someone inspect the rest of the workflow without downloading weights. There is no template fallback disguised as AI generation.
Run the complete app locally
Requires Node.js 22.12+.
npm ci
npm run dev
Open http://localhost:5173. Examples work before a model is connected. Drafts and proposals stay in browser…
I built this project from an empty workspace during the challenge window and committed the foundation, inference backend, workspace, and reliability improvements separately. The commit history shows those stages.
How I Built It
The frontend is React and TypeScript. A small Node HTTP server serves the production app and connects to Qwen3-0.6B through llama.cpp. Both the model and inference runtime are open, and the model is the component that interprets a new brief. There is no canned generator silently taking over when inference fails.
The request asks for structured JSON. Zod checks the incoming brief and the model response before the result becomes a proposal. If the model is offline, busy, timed out, or returns invalid output, the app tells you and keeps your brief.
The useful separation is between language and arithmetic. The model suggests the scope and hours. Ordinary code calculates prices in integer cents, using the freelancer's rate and contingency. A person can edit either before exporting. Private risk notes stay out of the client document, while the questions and exclusions are included.
Building on a 4 GB shared server forced a practical constraint. Downloading several gigabytes of weights was not a sensible default. The setup explicitly downloads 640 MB of verified source weights, converts them to a roughly 391 MB Q4 model, and removes the larger copy. On this Linux host, inference has a 900 MB memory ceiling, a one-core CPU budget, and one worker. Idle weights are unloaded after a minute.
The first runtime attempts were too slow. Reducing the memory footprint and disabling CPU busy-waiting made the small-model setup usable. That was also a reminder to test the whole HTTP path, rather than treating a model benchmark as proof that the app works.
The small model has real limitations. It can underestimate effort or misread an optional feature. I iterated on the instructions, kept every output editable, and made review part of the flow. This build does not claim calibrated estimates or autonomous client communication. A stronger open model can be substituted through the server configuration without changing the workspace.
Automated checks cover quote rounding, validation, error handling, concurrency, export privacy, and backups. Browser checks cover the complete editing and export workflow, responsive layouts, and keyboard interactions. The repository includes unit and API tests and a browser verification script.
Why Does Open Innovation Matter?
For this product, the choice of model changes the business and the privacy boundary.
Client briefs can stay on the freelancer's own machine. Once dependencies and weights are downloaded, the locally served app and inference can run without internet. The frontend even bundles its fonts, and it has no analytics.
There is no per-proposal API bill in the default setup. Hardware and electricity still cost money, but another provider does not meter each draft or set the price of the core operation. That makes a one-time local-tool pricing idea plausible enough to test.
The model is replaceable. A freelancer with better hardware can use a stronger open model. Someone working in a particular niche can change the prompt or adapt the model. The scope workflow, editable document, and pricing calculation remain under their control.
Open does not automatically mean private: configuring a remote inference endpoint sends briefs there. ScopeCraft documents that boundary explicitly. Local inference is the default, and the hosted example workspace does not pretend to provide it.
The part I care about is the control this gives a small business. A proposal should reflect the freelancer's judgment, rate, and boundaries. The model supplies a starting point; the person still owns the commitment.
Credits and licenses for Qwen, llama.cpp, React, Vite, TypeScript, Zod, Lucide, and the bundled fonts are in the repository. I am entering the overall challenge; no unused partner technology or invented customer feedback is claimed.


Top comments (0)