The gap between a drawing and a number
A contractor bidding a job starts with a set of drawings and needs to end with a price. In between sits takeoff: measuring every length, area and count that the job implies, then turning those quantities into materials, labour and a number you’re willing to be held to.
Done by hand it’s a scale ruler, a highlighter and an afternoon. Done wrong it’s the reason a job loses money. The established tools in this space — STACK and its peers — had a decade of head start. I had 15–20 hours a week.
That constraint did something useful: it forced the product down to the one thing that actually had to be excellent, and made everything else negotiable.
Constraints that shaped the design
The scale calibration carries the whole product. Every measurement downstream is a multiplication of a pixel distance by a scale factor. Get the factor wrong by 4% and every quantity, every material, every line of the estimate is wrong by 4% — and nothing anywhere will look broken. This is not a feature among features; it is the load-bearing element, and it deserved a disproportionate share of a very limited budget.
Errors are silent. A crashed app tells you it crashed. A takeoff that measured a wall as 31 feet instead of 34 gives you a confident, well-formatted, wrong estimate. The product’s real job is not measuring — it’s making a mistake visible before it reaches a bid.
One engineer, part-time, against incumbents. Feature parity was never available. The only viable strategy was to be complete along one narrow path — upload, calibrate, measure, price, export — and genuinely finished at every step of it, rather than partially good at twenty things.
Decisions and trade-offs
Canvas, not the DOM
Takeoff means hundreds of overlaid shapes on a large raster, panned and zoomed continuously, edited by hand. That is a rendering problem, and the DOM is the wrong tool for it — it gives you accessibility and layout you don’t need, in exchange for the frame budget you do.
I built the workspace directly on HTML Canvas with its own scene model, hit-testing and spatial index. The cost is honest and large: no free hit-testing, no free accessibility, no free text rendering, and a pointer-interaction layer written from scratch. What it buys is a workspace that stays responsive with a real drawing on it, which is the difference between a tool someone uses all day and a demo.
Scale calibration as an explicit, verifiable step
The tempting design is to read the scale from the drawing’s title block and get on with it. Title blocks lie — drawings get rescaled on printing, plotted to fit, or scanned at an angle.
So calibration is a deliberate act: the user draws along a dimension they know, types the real length, and the app derives the factor. Two things made it trustworthy rather than merely present. It’s stored per sheet, because a drawing set routinely mixes scales across pages, and a single project-level scale silently corrupts every page that disagrees with it. And it’s always re-checkable — the user can measure any known dimension and see whether the answer matches reality.
That’s the “make the mistake visible” principle in its most concrete form: the product can’t prevent a bad calibration, but it can make verifying one take five seconds.
Separate geometry from meaning
A shape on the canvas is just geometry — a polyline with a length, a polygon with an area. What it means — exterior wall, drywall, footing, fixture count — is a separate layer of interpretation attached to it.
Keeping those apart is what lets the same measured polygon feed several material rules at once, lets a user reclassify without re-measuring, and lets pricing evolve without touching the measurement engine. Collapsing them is faster to build and produces a product where changing your mind means starting over.
Rules between quantity and cost, not a formula
Quantities don’t become costs directly; they become materials via assembly rules, and materials become money via a pricing catalogue. Separating those two hops means a rate change is a data edit rather than a code change, and waste factors and labour rates stay adjustable per project.
The trade-off is a layer of indirection that a pure spreadsheet wouldn’t need. It’s the layer that lets one estimate be re-priced for a different market without redoing the takeoff.
Ship the narrow path, finished
Upload a drawing, calibrate it, measure off it, classify what you measured, price it, export it. Every one of those steps works end to end in the demo below. No plugin ecosystem, no collaboration, no mobile app, no BIM import.
For a solo part-time build, “complete along one path” beats “partial across five” — a contractor can actually produce a bid with it, and that’s the only threshold that counts.
What I’d do differently in 2026
Assisted detection, with the human still holding the pen. Modern vision models are genuinely good at proposing walls, rooms and repeated fixtures from a drawing. I’d use them to propose measurements and have the estimator confirm or correct — never to produce a quantity nobody looked at. The failure mode of silent, plausible, wrong numbers is exactly the one this domain punishes hardest, and an unattended model makes it worse, not better.
Vector-first where the source allows it. Many construction PDFs carry real vector geometry underneath the raster. Reading it directly turns snapping and edge detection from heuristics into exact operations, and makes the whole calibration problem smaller.
A regression corpus from day one. A fixed set of drawings with known correct quantities, measured on every change. In a product whose bugs are silently wrong numbers rather than crashes, that harness is worth more than any amount of unit testing around it.