OpenTakeoff – open-source construction takeoff your AI agent can drive OpenTakeoff, a free open-source web-based construction takeoff canvas that both humans and AI agents can use, launched with a new MCP server in July 2026 that lets AI agents drive the measuring engine natively. The tool, built for flooring but applicable to any takeoff, features One-Click Area room tracing, provenance tracking for every measurement, and runs entirely in the browser with no account or upload required. The first takeoff canvas built for people and AI agents. Open a building plan and measure it — trace the rooms yourself, or point an AI agent at the same engine . Every measurement carries its scale and how it was made . Free, open-source, and it runs in your browser — no account, no upload, no install. ▶ Try the live demo https://opentakeoff.netlify.app · Quick start quick-start · Features features · For AI agents /Kentucky-ai/opentakeoff/blob/main/mcp · Deploy it run-it--deploy-it · Own your data own-your-data--the-capture-layer · Build on top build-on-top-of-it · Contributing /Kentucky-ai/opentakeoff/blob/main/CONTRIBUTING.md New — July 2026: MCP server — your AI agent can drive the takeoff engine npx opentakeoff-mcp , on the official MCP registry /Kentucky-ai/opentakeoff/blob/main/mcp — and browse the plan set natively : sheets, title-block text, and rendered pages as MCP resources /Kentucky-ai/opentakeoff/blob/main/mcp/ resources--browse-before-you-measure v0.2.0 · Provenance — every shape records how it was measured its scale, one-click or hand-drawn, and person or agent · One-Click Area traces hatched rooms and scanned plans · Marked Set PDF export — full changelog /Kentucky-ai/opentakeoff/blob/main/CHANGELOG.md OpenTakeoff is a free, open-source canvas for measuring quantities off a building plan — a takeoff . What makes it different is who can run it: a person or an AI agent, on the same engine . You click inside a room and it traces itself; an agent calls the same tool over MCP /Kentucky-ai/opentakeoff/blob/main/mcp and gets the same number. And every measurement records how it was made — its scale, whether it was one-click or hand-drawn, and whether a person or an agent made it. The proof travels with the number. That makes OpenTakeoff the first place an AI agent can measure a real building the way an estimator does — and it's still a genuinely great tool for the person at the canvas. 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 https://opentakeoff.netlify.app , drag in a plan, and go. To run it yourself: cd web npm install npm run dev http://localhost:5173 Drag 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. It reads the drawing the way an estimator does — hatching and poché don't fool it : tile grids, plank lines, and section fills are classified as pattern, not wall, so a click inside a fully hatched room still traces the room and a misread can never make the result worse than the strict fill — it escalates only when the strict pass comes back trapped . Scanned plans work too : when a sheet is a scan no vector linework , the engine reads the rendered pixels instead — adaptive thresholding with a gap-bridging pass — and the same flood/trace machinery runs on the scan ink; the result is badged so you verify the edges before Create. 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. Manual tracing gets a real drafting aid: 45°/90° angle lock . Come within a few degrees of square or diagonal and the segment you're drawing locks onto the axis — the click commits the locked point, so walls come out dead square hold ⇧ to force the lock at any angle . On the canvas the crosshair is the cursor: the OS pointer hides, a star marks the crossing, and in-progress work draws in the instrument's own cobalt committed shapes wear their condition color . The lock reads quietly — the star swells, the preview thickens, and a chip by the cursor shows the locked angle plus the live segment length . No extra chrome on your sheet. 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: a free-text labor type glue-down, float, nail-down, … and subfloor type ply, concrete slab, OSB, … , plus the consumables that actually go on the order — adhesive, sealer, polyurethane, thinset, grout, cove-base adhesive. Each material 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 and mortar lines get coverage presets trowel notches, rollers that fill the spread rate, and grout lines get a calculator that derives SF/bag from tile size, thickness, joint width, and bag weight. 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 , JSON , or a real Excel workbook Summary, By-sheet, Materials, and Shapes-audit tabs — full-precision cells, formula-shaped names stay inert text , 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. And when the numbers need to leave the app: Marked Set PDF . One click builds a distribution-ready PDF entirely in your browser — every sheet with the work burned in as drawn condition colors, hatches, quantity chips, count markers, markups behind a legend cover with the full totals and a by-sheet breakdown. Send it to a GC who will never install anything. When the addendum lands: Revisions . Save the takeoff as a named revision at each bid revision, then compare any two — or a revision against the live takeoff — as quantity deltas per condition, per sheet, and on the buy list, with a compare CSV. Restore auto-banks the live takeoff first, so it's never a one-way door. Zoom in and the linework stays razor-sharp : past ~1.15× zoom times your display's pixel ratio so it kicks in sooner on a 2×/Retina screen than a 1× monitor 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 engages after a brief pause in scrolling/pinching rather than on every frame, so a continuous zoom stays on the fast base layer until you stop moving. It overlays just what's on screen, so there's no giant full-sheet bitmap to hold. Plus a dark view ☾ that inverts the sheet itself — a true negative print, white linework on black, not a CSS filter — with hatches retuned so takeoffs read as well at night as they do at noon. And 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. Everything above is the default, and it's unchanged: open the page and you're an anonymous, local-only user — no account, no upload, nothing to configure. A team on Google Workspace can optionally sign in to unlock a shared mode instead: projects live as folders in the team's own Google Drive , the project list is deep-linked from your existing Glide app, and material costs come from a synced pricing.json . It's strictly additive — turn it off set nothing and the app is exactly the local tool it always was. The security posture stays honest: still a plain static site, no secrets in the bundle , team-only because the Google OAuth app is Internal to your domain, and your data sits in your own Drive . To set it up, see docs/GOOGLE SETUP.md /Kentucky-ai/opentakeoff/blob/main/docs/GOOGLE SETUP.md and . A cloud deployment can also opt into /Kentucky-ai/opentakeoff/blob/main/docs/GLIDE INTEGRATION.md docs/GLIDE INTEGRATION.md local-first sync VITE CLOUD SYNC=1 : annotations stay canonical in the browser and sync to Drive in the background, so the canvas is instant and survives a flaky network — see . /Kentucky-ai/opentakeoff/blob/main/docs/SYNC ARCHITECTURE.md docs/SYNC ARCHITECTURE.md | 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, Eraser deduct , Zone check per-region breakdown — imperial or metric m²/m, 1:50-style scales | Drawing aids | 45°/90° angle lock with ⇧ hard-lock, live angle + segment-length readout at the cursor, endpoint Snap beta | Conditions | Color + CAD hatch per finish, waste %, ×N multiplier, height, thickness → border SF | Supporting Materials | Per-condition labor type + subfloor type free text , plus supporting materials with coverage rates → rounded order quantities, per-material coverage presets + grout calculator | Report | Per-condition Floor/Wall/Border SF, LF, EA, SY, with/without waste + materials buy list | Export | CSV, JSON, Excel .xlsx , print, Marked Set PDF sheets + burned-in takeoff + legend cover, built in-browser | Revisions | Save the takeoff at each bid revision, compare what moved — quantity deltas per condition, per sheet, and on the buy list; guarded restore | Markups | Revision clouds, callouts, text notes — separate layer, never counted | View | Light or dark negative print — sheet pixels inverted at draw time, persists per browser | Storage | IndexedDB + localStorage — client-only, nothing uploaded | Capture opt-in | Bundled | MCP server /Kentucky-ai/opentakeoff/blob/main/mcp/README.md mcp/ Provenance Deploy 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. Here's the part of a takeoff nobody talks about: every one you finish is a set of expert decisions — this region gets this finish, at this waste %, yielding these quantities. Done once, that's a bid. Banked every time, it's a labeled dataset nobody else has — the exact raw material for training a takeoff model on your trade and your market. Today that data evaporates the moment the bid goes out. It doesn't have to. OpenTakeoff ships an optional capture layer so you can keep it: - The Contribute button in the Report builds a derived-only payload — condition labels, shape roles, quantities, normalized geometry, and per-shape provenance hand-traced vs. machine-proposed, and whether a human corrected it . Never the PDF, file names, project/client names, markups, absolute coordinates, or scale values. The builder is ~150 audited lines:; the normative wire contract is web/src/lib/contribute.js . docs/CONTRIBUTION SPEC.md - The bundled capture server — one stdlib-only Python file, no pip install — receives it on localhost and banks one training row per labeled shape, hash-gated so re-contributions never duplicate. v2 rows distinguish what the machine got right from what an expert had to fix — the exact signal a takeoff model trains on. Point it at a synced folder with capture/ --mirror and the corpus rides your existing OneDrive/SharePoint/Dropbox sync into company storage, atomically, ready to train on. python3 capture/capture server.py then, in the app's browser console: localStorage.opentakeoff contribute endpoint = "http://localhost:8787/contribute" Run OpenTakeoff as-is and none of this exists for you — nothing is captured, nothing leaves your machine. Install it and every takeoff you choose to contribute compounds into an asset you own. This is the open edition of the capture layer inside Spline https://spline.quisutdeus.io , the commercial Division-9 estimating system OpenTakeoff was carved from, where capture runs far deeper — ambient on autosave and commit, no button: provisional rows bank while you draw, certified rows land on commit with the exploded materials assembly, edits carry a decision trail, and each job's corpus files itself into that GC's folder on the company share. The full pitch, the row schema, and the training angle live in capture/README.md /Kentucky-ai/opentakeoff/blob/main/capture/README.md . OpenTakeoff is the open half of an applied-research program run by a working commercial flooring estimator who builds the AI his own department uses Kentucky AI https://kentucky-ai.com . The boundary is deliberate, and it's the same one the best open-core scientific software draws: the measurement engine — rendering, scale, geometry, exports, the MCP server — is Apache-2.0 and stays open. The AI models we train on our own estimating archive are proprietary. You get a real tool with no seat licenses; we keep the part that only our data can build. The research side runs like a lab, not a demo reel: Markup-as-label training data patent pending . Every takeoff an estimator saves in professional takeoff software stores the drawn regions as vector geometry, and reconstructing those polygons reproduces the recorded quantities exactly. Two decades of estimating work is an exact, verifiable training corpus — that's the thesis the whole program tests. Parameter-efficient tuning, not pretraining. The models are QLoRA adapters on open-weights bases ~0.1% of parameters trained , specialized from a verified bid archive — cheap enough to retrain when the data says retrain, small enough to ship. The flagship adapter predicts bid totals at 12.3% median absolute percentage error on a 51-project temporal holdout , against 62.8% for the untuned base — full method and honest caveats on the model card https://huggingface.co/Kentucky-ai/div9-flooring-estimator-gemma4-31b . Verified labels in, verified rulers out. Before any historical bid becomes training data it passes a dual-document verification gate: totals must reconcile between the bid workbook and the separately filed proposal, change orders only count when corroborated by an actual change-order document, and line-item arithmetic is recomputed and forensically checked. Unverifiable projects don't train. Frozen holdouts and verifiable rulers. Every model is scored against temporally held-out projects it never trained on — future bids, not a random split — with a geometry scorer whose own error floor is measured 0.4% , so we know when a number is model error versus measurement error. Multi-seed replication. No result is promoted from a single training run; promotion requires seed replication with paired bootstrap confidence intervals — and the cross-seed spread gets published, not just the best seed. Negative results are kept. The experiment ledger records what failed and why — an unfreeze recipe that destroyed detection, a vertical-specialist model that lost to the generalist's cross-vertical transfer — alongside what worked. Leak-audited before release. Identifiers are replaced before training the weights never see a real name , and every public artifact passes a differential red-team: adversarial extraction probes against the tuned model with the untuned base as control. Sanitized research artifacts — model cards, benchmark specs, papers — are published as they clear review: Hugging Face https://huggingface.co/Kentucky-ai · kentucky-ai.com https://kentucky-ai.com . OpenTakeoff can ask a vision model you provide to read things off the plan — starting with the drawn scale when a sheet's text doesn't state one scans, rotated notes, image title blocks . Click AI in the toolbar and point it at an OpenAI-style endpoint the default — local runtimes on your own machine speak it and need no key or an Anthropic-style endpoint, plus a vision-capable model id. What's sent, and only when you click an AI button: one snapshot of the sheet region in question, plus the question — to your endpoint. Never the whole plan file, file names, project names, or your takeoff. Nothing configured = nothing exists. Unconfigured builds add zero UI beyond the button and make zero AI network calls. No telemetry either way.- The model's answer is only ever a suggestion — it lands in the same confirm-to-apply flow as the text-detected scale, and the calibrated guide bar shows on acceptance so you can sanity-check it. - The key if any is stored in this browser's localStorage — use one you can revoke. Deployers: VITE AI ENDPOINT / VITE AI MODEL / VITE AI PROVIDER can bake defaults into a team build, but never set — Vite inlines it into the shipped bundle. VITE AI KEY on a public deploy The same engine speaks MCP https://modelcontextprotocol.io : mcp/ /Kentucky-ai/opentakeoff/blob/main/mcp/README.md is a stdio server your MCP client can drive, one command away — npx -y opentakeoff-mcp — with load plan , read sheet text , set scale , one click , takeoff summary , export takeoff and friends. An agent opens a plan, reads the title block, adopts the scale never applied silently , clicks the rooms, and exports the exact payload the app autosaves — same math, same provenance receipts, same scale gate. Setup and a full example transcript: . /Kentucky-ai/opentakeoff/blob/main/docs/MCP.md docs/MCP.md 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 typed and tested web/src/lib/sheets.ts Totals & materials math — web/src/lib/totals.js State & persistence — web/src/lib/store.js UI —and web/src/pages/TakeoffCanvas.jsx web/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 /Kentucky-ai/opentakeoff/blob/main/CONTRIBUTING.md and the user manual /Kentucky-ai/opentakeoff/blob/main/docs/USER GUIDE.md — the complete zero-to-exported-takeoff guide. Every open issue is a real need, not a manufactured chore, and there's a rung for wherever you're starting from: First PR: issues labeledare small, fully specified, and point at the exact files. Claim one in a comment and go. good first issue The flagship: 29 — expose plan sheets as MCP resources https://github.com/Kentucky-ai/opentakeoff/issues/29 is an open design-and-build challenge. Multiple entries welcome; the best one merges with credit in the release notes, and it ships to every client that pullsoff npm. opentakeoff-mcp Ground rules live in CONTRIBUTING.md /Kentucky-ai/opentakeoff/blob/main/CONTRIBUTING.md . Tested PRs with green CI merge fast — the last three external PRs did. 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 https://github.com/mozilla/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 /Kentucky-ai/opentakeoff/blob/main/THIRD-PARTY-NOTICES.md . OpenTakeoff is a working tool , not a preview. The measuring engine — One-Click Area, conditions, supporting materials, the report and exports — is the production engine carved out of a commercial flooring estimating app. The same engine answers to a person at the canvas or an AI agent over MCP, and every measurement it makes carries its scale and origin. 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 — and I build the AI that runs my department. OpenTakeoff is the open half of that work: the measuring engine a person or an agent drives the same way, given free to the trade. The models I train on our own estimating archive stay ours. I built the tool I actually wanted: open a plan, trace your rooms or let an agent do it , hand off a clean report — and every number tells you how it was made. — Michael · Kentucky AI Apache License 2.0 /Kentucky-ai/opentakeoff/blob/main/LICENSE — use it, fork it, ship it, build on top of it. Given to the flooring community. See NOTICE /Kentucky-ai/opentakeoff/blob/main/NOTICE for attribution.