A pre-bid estimating engine for millwork shops, usable from a browser or conversationally
The takeoff, what-if pricing, and bid math that happen before a job exists.
A focused tool that owns the takeoff, what-if pricing, and bid math that happen before a job exists. It exposes both a web UI/REST API and an MCP server, so estimates can be built in a browser or driven through a chat assistant, sharing one calculation engine.
A look at the interface.
Representative UI — abstracted, never a client's real data.- Python
- FastAPI
- MCP
- Neon Postgres
- Vanilla JS
Estimating must stay separate from shop operations while sharing live data. The system shares its database and material catalog with the companion shop-ops product but keeps its calculation engine, editable constants, and estimates in its own tables.
How it
works
One calculation module computes material, burdened labor, small-parts, direct cost, and overhead into a grand total, with every constant editable from the browser. The MCP re-reads constants on each call so a change in the UI instantly affects the assistant's next estimate, and line items auto-pull live material prices. Saving an estimate snapshots the constants onto the row so later edits never move a quoted bid.
What I built
(03) Inside the buildSingle-source calc engine
One module computes material subtotal, burdened labor, small-parts, direct cost, and overhead into a grand total, with every constant editable from the web UI.
Live-config MCP
The MCP re-reads constants on every call, so changing a value in the browser immediately affects the assistant's next estimate, with line items auto-pulling live material prices.
Frozen bid snapshots
When an estimate is saved, the current constants are snapshotted onto the row so later settings edits never move an already-quoted bid.
The
receipts
- Dual interface: web UI + REST API and an MCP server over one engine
- Multi-tenant, sharing a database and material catalog with the shop-ops product
- Settings-snapshot-on-save guarantees bid integrity over time
- Zero-build vanilla-JS frontend