Inspiration

I run a one-person software company in Belgium, and most of my small jobs are fixed-price. The usual way to quote one is to put a single number next to each task, add twenty percent and hope. When one task blows up, the overrun is mine: I work the difference for free. I wanted a quote I could actually stand behind, with a price that says how sure it is.

What it does

Scopecast turns a client's feature list into a fixed-price quote with a confidence level you choose.

  • Paste the list. Each line becomes a task; bullets and numbering are cleaned up.
  • Give every task a range, not a number. Type the likely hours and say how familiar the work is (Known, Some unknowns, New territory), or set best, likely and worst hours yourself.
  • Choose how sure you want to be. Scopecast simulates the project 10,000 times. At 80% confidence the sample project reads: "in 8,000 of 10,000 runs this project took 142 hours or less, so the price is €12,050." Drag the dial and you see exactly what certainty costs, in money and in working days.
  • Fit the budget honestly. When the client's budget is lower (€9,500 in the sample), Scopecast does not shave hours. It finds the smallest set of non-essential tasks to move to a phase 2 so the quote still holds at the same confidence (€9,400 at 80%, with two tasks deferred). Tasks you pin as must-haves are never deferred.
  • Send the quote. It writes a one-page client quote: scope, fixed price, delivery in working days, phase 2 as an option, and one plain paragraph on how the price was estimated. Print it or save it as a PDF.

Everything runs in the browser. The project is saved in local storage and nothing is sent anywhere: no accounts, no servers, no API keys.

Who it's for

Solo freelance developers and tiny studios quoting small fixed-price jobs for small businesses. The sample project is a (fictional) bakery that wants online ordering, which is exactly the kind of job I quote.

How I built it

I planned before writing any code, using the Devpost Learn Skill Pack in Claude Code:

  • devpost/scope.md fixes the kernel (a quote at a confidence level you choose; when the budget is short, defer scope, never hours) and the cut list.
  • devpost/prd.md describes a seven-step core journey with 28 acceptance criteria, including every empty and error state.
  • devpost/spec.md covers the stack, the data model, the failure modes and one useful unknown.
  • devpost/checklist.md splits the build into five slices, each with its own verification.

The app is React, TypeScript and Vite. The engine is plain TypeScript:

  • Each task is sampled from a PERT (beta) distribution with a seeded random generator. Every task has its own fixed seed, so the same inputs always give the same quote, and removing a task removes exactly its share from every simulated run.
  • The price is the hours at the chosen percentile times your hourly rate, rounded up to the next €50.
  • The budget fitter searches the optional tasks in order of expected hours removed and checks each candidate set against the real simulated runs rather than an approximation.

It is verified by 28 unit tests (Vitest) and a 16-step browser check (Playwright) that walks the whole journey: paste, hours, familiarity, confidence, budget, phase 2, reload, quote, a one-page PDF, and a 390 px phone layout.

Challenges I ran into

"Defer as little as possible" sounds simple. It only became a real requirement when a test compared the budget fitter against every possible subset of optional tasks. That test caught two plausible-looking versions of the fitter that deferred more than they needed to.

What I learned

The one useful unknown in the spec was whether 10,000 runs is enough. A test answers it: the 80th percentile moves by less than 1% across random seeds, so the price does not wobble between runs. More generally, writing the acceptance criteria and the failure modes down before the code meant that every slice had a clear "done", and the tests could check the claims the app makes on screen.

Limits, stated plainly

Tasks are simulated as independent, so a risk that hits several tasks at once (a client who is slow to give feedback on everything) is under-represented. And the ranges are only as honest as the person typing them.

What's next

Tracking actual hours against the estimates to learn a personal estimation bias, a read-only quote link for clients, and VAT lines on the quote.

Tools and credits

  • Code and planning: Claude Code (AI coding agent) with the Devpost Learn Skill Pack.
  • Demo video: real screen capture of the app, composed with HyperFrames. The background images were generated with Google Flow (Nano Banana Pro), the narration is synthetic speech (Microsoft Edge neural text-to-speech) and the music is generated by a Python script. None of the generated images are used inside the app.
  • Fonts: Fraunces and IBM Plex Sans (SIL Open Font License).
  • Licence: MIT. Built by Rui Codex (ruicodex.com).

Built With

  • claude-code
  • devpost-learn-skill-pack
  • google-flow
  • hyperframes
  • microsoft-edge-tts
  • playwright
  • python
  • react
  • svg
  • typescript
  • vite
  • vitest
Share this project:

Updates

Submission history