The free, open-source takeoff canvas for flooring — open a plan, trace your areas, export your quantities.
Open the plan. Set the scale. Trace the rooms. Read the report. Export the quantities. No account. No upload. No install. It runs in your browser.
▶ Try the live demo · Quick start · Features · Deploy it · Build on top · Contributing
Until now there has been no open-source, web-based takeoff canvas at all — let alone one built for flooring. OpenTakeoff is that tool: a free, open-source alternative, given to the trade.
It started as the takeoff module of a private flooring estimating app, then got carved out, cleaned up, and released. This is the real measuring engine, not a demo — including One-Click Area, the flood-fill room tracer the $300/mo tools gate behind a subscription.
Built for flooring, useful for any takeoff. The measuring engine is general — area, linear, count, and deduct work on anything you'd scale off a plan (drywall, paint, concrete, sitework). What makes it flooring's tool is the finish-aware layer on top: conditions with CAD hatches, per-condition waste %, square-yard output, and a coverage-rate materials buy list nobody else hands the trade for free.
And there's nothing to set up. Open the page, drag in a plan, start measuring. Your PDFs and your takeoffs never leave your machine — there is no server in the loop.
You don't need to install anything to use it — just open the live demo, drag in a plan, and go.
To run it yourself:
cd web
npm install
npm run dev # http://localhost:5173Drag demo/sample-plan.pdf onto the canvas. The scale auto-detects; pick a condition, hit One-Click Area, and click inside a room. Open Report to see the breakdown and export CSV / JSON.
Drag in a plan PDF, an image (a scan or a screenshot), or a whole .zip plan set straight off a bid platform. Zips are unpacked and images wrapped to PDF in your browser — multi-page and multi-sheet, with up to 4 sheets side-by-side. No upload step, no conversion service, no account.
One-Click Area is the headline: click inside a room and the linework bounds it, the polygon traces itself, and the vertices snap to true corners. Plus the full manual kit — Area, Rectangle, Linear, Surface-Area (walls), Count, and Deduct (for columns, voids, and openings). This is the same engine pulled out of a commercial estimating app, not a toy reimplementation.
Auto-detects the drawn scale note off the sheet, or calibrate from any known dimension (click two points, type the real length). Scale is remembered per sheet — because plan sets are never one uniform scale, and tools that assume they are get the numbers wrong.
A condition is one finish (LVP, carpet, tile, base, …). Each carries a line/fill color and a CAD hatch pattern (plank, herringbone, tile, terrazzo) so the canvas looks like the real drawing — plus a per-condition waste %, an ×N multiplier for repeated identical units, a default height for wall traces, and a thickness that turns a linear run into border/feature-strip SF.
Per condition, list the consumables that actually go on the order: adhesive, sealer, polyurethane, thinset, grout, cove-base adhesive. Each has a coverage rate and a basis (floor SF / linear LF / each), and the order quantity derives automatically — measured ÷ coverage, rounded up to whole units. Adhesive lines get a trowel picker that fills the spread rate from the notch size. This is the layer most takeoff tools punt on. It's shipped here.
A per-condition breakdown — Floor / Wall / Border SF, LF, EA, total SF, SY, with and without waste — plus a combined materials buy list. Export to CSV or JSON, or print it. Waste is applied only in the report (the order quantity), never to the live measured number, so your takeoff and your buy list stay honest about which is which.
Zoom in and the linework stays razor-sharp: past ~1.15× the visible region re-renders straight from the PDF vectors at your current zoom — Bluebeam/AutoCAD-style — instead of magnifying a fixed bitmap, so fine callouts and hatching never blur. It overlays just what's on screen, so there's no giant full-sheet bitmap to hold. Plus a visual gallery (G) to pick and open sheets, Regroup to restore a side-by-side composition in one click, per-sheet Hi-Res base rendering, Snap (beta) to plan lines and corners, and a separate markup layer (revision clouds, callouts, text notes) that's never counted in the totals.
Every drawing, scale, condition, and markup autosaves to your browser (IndexedDB + localStorage). Nothing is uploaded, there's no account, and there's no server in the default build. Host the static build yourself and it stays exactly that way.
| Area | What you get |
|---|---|
| Ingest | PDF, image, or .zip plan set — unpacked in-browser, multi-page, up to 4 sheets side-by-side |
| Scale | Auto-detect the drawn scale note, or calibrate from a known dimension — per sheet |
| Measure | One-Click Area (flood-fill), Area, Rectangle, Linear, Surface-Area (walls), Count, Deduct |
| Conditions | Color + CAD hatch per finish, waste %, ×N multiplier, height, thickness → border SF |
| Assemblies | Per-condition supporting materials with coverage rates → rounded order quantities, trowel picker |
| Report | Per-condition Floor/Wall/Border SF, LF, EA, SY, with/without waste + materials buy list |
| Export | CSV, JSON, print |
| Markups | Revision clouds, callouts, text notes — separate layer, never counted |
| Storage | IndexedDB + localStorage — client-only, nothing uploaded |
| Deploy | One static build, hostable on Netlify, Vercel, GitHub Pages, S3, or any static host |
To use it, all you need is a browser. To self-host, it's one static build you can drop anywhere — there's no backend, no database, no environment to stand up.
cd web
npm install
npm run build # → web/dist/ (static; host it anywhere)The repo ships a root netlify.toml, so the button above is genuinely one-click. The same web/dist/ works on Vercel, GitHub Pages, Cloudflare Pages, S3 — anywhere that serves static files.
OpenTakeoff is Apache-2.0: fork it, change it, ship it — for your own crew or as the base of your own product. The codebase is deliberately small and readable so you can add the features you want:
- Geometry & measurement —
web/src/lib/oneclick.ts,web/src/lib/sheets.ts(typed and tested) - Totals & materials math —
web/src/lib/totals.js - State & persistence —
web/src/lib/store.js - UI —
web/src/pages/TakeoffCanvas.jsxandweb/src/components/
Run npm run typecheck && npm test && npm run build before a PR; keep the geometry libs pure and tested; never commit real plans. See CONTRIBUTING.md and the user guide.
- Frontend: React 18 + Vite, plain JSX
- Drawing: raw HTML5 Canvas + SVG (no charting/canvas frameworks)
- Geometry: TypeScript (
oneclick.ts,sheets.ts) - PDF rendering: pdf.js
- Plan-set ingest: fflate (zip) + pdf-lib (image → PDF), lazy-loaded
- Storage: IndexedDB + localStorage — no backend required
- Tests:
node --test+tsx - No paid dependencies. See THIRD-PARTY-NOTICES.md.
OpenTakeoff is a working tool, not a preview. The measuring engine — One-Click Area, conditions, assemblies, the report and exports — is the production engine carved out of a commercial flooring estimating app. Snap is marked beta. It's used on real commercial flooring bids; issues and pull requests are welcome.
I run estimating for a commercial flooring company. Every takeoff tool I've used costs four figures a year — so I built the one I actually wanted, and I'm giving it to the trade.
This is the real measuring engine, not a teaser. One-Click Area is the same flood-fill room tracer the expensive tools gate behind a subscription. Open a plan, trace your rooms, hand off a clean report — free, and nothing ever leaves your computer.
— Michael · Kentucky Ai
Apache License 2.0 — use it, fork it, ship it, build on top of it. Given to the flooring community. See NOTICE for attribution.
