Skip to content
Projects

Kentucky-ai/opentakeoff has 782 GitHub stars and 171 forks. GitHot measured +8 stars in 24 hours and +39 in 7 days. Last checked 2026-11-10 01:11 UTC. Last push 2026-10-29.

How these counts are measured

Open-source (AGPL-3.0) PDF takeoff for construction & flooring — the first engine an AI agent drives natively over MCP, not bolted on. Rooms measured on the wall faces, symbol sweeps, materials + quantities with full provenance, built for preconstruction. Runs entirely in your browser.

Measured star growth

in 24h
+8
in 7 days
+39
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

README.md

Original

OpenTakeoff: the scan star beside the wordmark, and an agent tracing two rooms of a floor plan on their wall faces

Measure construction plans in your browser, or hand the same engine to your AI agent.
Free, open source and local. Nothing uploads, and nobody has to sign up.

GitHub stars npm npm downloads MCP registry CI License: AGPL-3.0 Sponsor

▶ Try it now  ·  🔌 Plug in your agent  ·  🛠 Send your first PR

日本語 · 한국어 · 简体中文


A takeoff is the measuring that every construction bid starts with: how much floor, how much wall, how many fixtures, at what scale and on which sheet. OpenTakeoff is an open-source engine for that job. It has two front ends:

  • 🧑‍🔧 A browser canvas for people. Drag in a plan set, set the scale, trace rooms, and export a report and a marked-up planset.
  • 🤖 An MCP server for agents. It offers 58 tools over stdio. An agent drives the same engine with the same math and the same scale gate as the canvas, and its work stays a dashed proposal until a person accepts it.

Both front ends share one takeoff format, so you can open an agent's takeoff in the canvas, check it and fix it. Every shape records the scale it was measured at, the method that drew it, and whether a person or an agent drew it.

[!NOTE] One-Click Area is temporarily gated while the flood engine is re-validated on a wider plan corpus. Trace rooms with Area (A) in the canvas and measure_polygon over MCP. Every other tool works as normal. See docs/design/ONE_CLICK_GATE.md.

Pick your door

You are… Start here Time
🧑‍🔧 An estimator with a bid due Open the canvas, click Guided first takeoff, then read the user manual 5 min
🤖 An AI agent, or the person wiring one up Run npx -y opentakeoff-mcp (see Plug it into your agent), then read the agent manual 1 min
🛠 A developer Read AGENTS.md for the repo map, FEATURES.md for where each feature lives in the code, then Contribute 10 min
🏗 A crew that wants its own copy Fork it. Any static host will run it, and nothing phones home 5 min

Plug it into your agent

The server needs Node 20 or newer. You don't need to clone or build anything. Pick your client:

Client Install
Claude Code claude mcp add opentakeoff -- npx -y opentakeoff-mcp
Codex CLI codex mcp add opentakeoff -- npx -y opentakeoff-mcp
Cursor Install in Cursor
VS Code Install in VS Code
Claude Desktop Double-click opentakeoff-mcp.mcpb
Docker (from a clone) docker build -f mcp/Dockerfile -t opentakeoff-mcp . && docker run --rm -i opentakeoff-mcp
Any other stdio client Use the JSON below
{
  "mcpServers": {
    "opentakeoff": { "command": "npx", "args": ["-y", "opentakeoff-mcp"] }
  }
}

If you've cloned the repo, the root .mcp.json, .cursor/mcp.json and .vscode/mcp.json register the server when you open the folder, so there's nothing else to set up.

Your first prompt. Paste this once the server is connected:

Load demo/sample-finish-plan.pdf from the OpenTakeoff repo, read the scale note on the floor plan, set the scale, trace room 134 on its wall faces under its finish tag from the schedule, check your ring with view_sheet, and export the marked-up PDF.

The step-by-step walkthrough for each client is in Connect OpenTakeoff to your AI. The server can also describe itself: read the takeoff://wiki resource before you load a plan.

All 58 tools, grouped by stage
Stage Tools
Open and orient load_plan · sheet_info · sheet_context · get_sheet_vectors · read_sheet_text · find_text · view_sheet
Scale set_scale
Measure measure_polygon · cut_out · measure_line · measure_surface · place_count · count_marks
Repeat and derive symbol_sweep · sweep_schedule_row · derive_base · derive_transitions · apply_rules
Read the drawing set sheet_graph · resolve_tag · find_schedule
Edit and audit list_shapes · edit_shape · edit_condition · edit_materials · duplicate_condition · split_condition · delete_shape · undo_last · scope_duplicates · scope_merge
Propose for review propose_takeoff · revise_proposal · withdraw_proposal · propose_condition_edit · withdraw_condition_edit
Mark and sign annotate · list_annotations · edit_annotation · link_annotation · mark_verdict · delete_verdict
Ask the architect create_rfi · list_rfis · resolve_rfi · delete_rfi
Price set_pricing · set_estimate_settings · estimate_summary · export_estimate · export_proposal
Hand off takeoff_summary · export_takeoff · export_report · export_marked_pdf · export_dxf · import_takeoff

The generated reference, with the required arguments for each tool, is docs/MCP_TOOL_INDEX.md. The full tool reference is mcp/README.md.

How a takeoff runs

Open the plan, set the scale, trace rooms on the wall faces, derive base and transitions, deliver a marked-up planset PDFA real run at 3× speed: an AI agent in a terminal takes off three patient rooms on a VA medical center finish plan over MCP. Each export lands in the web app as dashed pencil proposals, and the operator accepts them, 743.64 SF in all.

A real run at 3× speed. The agent takes off patient rooms 161–163 on a federal finish plan and exports after each commit. Each shape lands in the canvas as a dashed proposal and becomes ink only when the operator clicks Accept. Watch it live and uncut: autonomous agent run (2:47) · finish plan to report in about a minute (1:14) · canvas walkthrough (1:10)

The rules that make it safe to hand to a model

  1. Scale is a gate, not a default. The engine reads the scale note but never applies it on its own. Measuring an unscaled sheet is refused.
  2. The ring sits on the wall faces. Rooms are traced on the innermost wall-face strokes. Doors are crossed on the wall centerline, and the agent checks each ring on a rendered overlay before it moves on.
  3. Agent work stays pencil until a person inks it. An agent can sign its own work with an AGENT diamond. Only a person at the canvas can apply the green APPROVED seal.
  4. Withheld is an answer. When a sweep or a derivation can't be sure, it says why and hands back coordinates. It doesn't return a plausible number.
  5. The deliverable is a marked-up planset, not JSON. export_marked_pdf burns the work into the drawings behind a legend cover with totals.

The full contract, with the reasoning behind each rule, is in the tour.

What's new

October 2026

  • ✨ The scan star. OpenTakeoff has a new mark for its AI. The star ripples while the agent works and shows up in the Work panel, the Agent tab and the watermark on exported PDFs (#571, #576).
  • 💲 Estimate and proposal. You can now price a takeoff by hand (unit, material and labor, tax, overhead and profit), export it to Excel and download a letter-size bid proposal PDF. Agents get the same features through five new verbs: set_pricing, set_estimate_settings, estimate_summary, export_estimate and export_proposal. Prices always come from the estimator, and nothing fills one in for you (#558–#562, MCP 0.9.99).
  • 🪟 Reference split-screen. You can now keep a read-only second sheet open beside the one you're tracing (#570, by @knmurphy).
  • 🗂 Sheets as a tree. Multi-page PDFs show up as folders, and each row is labeled with the sheet number from its title block (#523).
  • ⚡ A faster room engine. Exact grid indexes replace quadratic scans. On a 24-sheet replay, all 548 room probes came back identical, and buildNet time dropped by 2.4× to 2.5× on the slowest sheets (#540, #547, #550).
  • 🔐 Security refresh. The MCP SDK and Zod 4 were upgraded without changing the tool set or the takeoff payloads (#566, MCP 0.9.100).

September 2026: on-device OCR for scanned sheets, plan-set text search, Copy text, schedule import from raster pages, the annotation toolbar, Pin references and a guided first takeoff. Everything is in the CHANGELOG, and the older highlights are in the tour.

What's in the box

Area What you get
Ingest PDFs, images and whole .zip plan sets, unpacked in the browser, with up to 4 sheets side by side
Scale Detects the drawn scale note, calibrates from a known dimension, and grades a dimension check, all per sheet
Measure Area, Rectangle, Linear, Curved Line, Surface Area (walls), Count, Cut Out, ⟂ Transitions and Zone check, in imperial or metric
Conditions A color and CAD hatch for each finish, waste %, ×N multiplier, height, thickness, and import from the finish schedule
Materials Coverage rate × basis gives rounded order quantities. Includes a grout calculator and the figured seam LF
Roll goods Lanes, seams, multi-roll splits and to-scale cuts with drag-to-reorder nesting
Multi-sheet A sheet tree with title-block numbers, a gallery, levels, stitching across a match line, PDF layer roles and a reference split
Estimate Unit prices, tax, overhead and profit, an Excel export and a bid proposal PDF
Report and export SF, SY, LF and EA per condition, with and without waste. Exports CSV, JSON, Excel, DXF and a Marked Set PDF
Review Revisions with quantity deltas, markups, approval seals, an RFI register, and agent proposals you accept or reject
MCP server 58 tools, sheet resources, a packaged wiki and multi-document sessions (mcp/)
Privacy Runs only in the client. Work is stored in IndexedDB and localStorage and is never uploaded

You'll find every feature in depth in the tour, every feature mapped to its code in FEATURES.md, and every click in the user manual.

Contribute

OpenTakeoff merges evidence, not promises. It is used on real commercial bids, so a pull request has to show that it works. It doesn't need to be big. People and agents are held to the same bar, and a PR that clears it merges fast.

1 · Find something. Pick an open issue, an RFC, a flagship challenge, a good first issue, or a bug you hit on your own plans. If it's still an idea, start in Discussions.

2 · Build it.

git clone https://github.com/<you>/opentakeoff && cd opentakeoff/web
npm ci && npm run dev    # http://localhost:5173
npm run check            # the exact CI gate

3 · Prove it.

Your change The evidence it carries
Visible (a panel, a tool, an export) A screenshot of each surface you changed, and a short recording for a flow
Engine (geometry, totals, MCP, readers) An exact-output gate, a before/after table with its conditions, and the command that reproduces it
Any PR Notes for the reviewer: coordinate spaces, limits you chose on purpose, and anything you didn't verify

Two merged PRs show the bar well. #346 covers a UI feature with a screenshot of each surface, a recording and the reviewer's notes. #547 covers an engine change with 548/548 identical room probes and a before/after retime table. Both come from @knmurphy. The PR template walks you through the same structure, and CONTRIBUTING.md has the ground rules, including the one-comment contributor agreement.

🤖 Agents are welcome contributors. Point yours at AGENTS.md. PRs from forks run the full CI with a read-only token, and an agent's PR merges under the same evidence bar as anyone else's. Engine work that lands ships to every agent that pulls opentakeoff-mcp.

Fork it

OpenTakeoff is AGPL-3.0. You can fork it, change it, and ship it to your own crew or as the base of your own product. If you run a modified copy for other people, including as a hosted service, publish your changes under the same license.

  1. Fork on GitHub, then clone your fork.
  2. Run it: cd web && npm ci && npm run dev. npm run check is the exact CI gate (typecheck, lint, test and build).
  3. Put it on your own URL. The repo includes a netlify.toml, so importing your fork into Netlify deploys it with no settings. Any static host works, and docs/SELF_HOSTING.md covers the one nginx gotcha.

Deploy to Netlify

The geometry libraries have no React or DOM code, so you can lift them straight out: oneclick.ts (flood fill, face extraction, corner snap), sheets.ts (scale, polygon area), totals.js (waste, SY, order quantities) and rollgoods.js (lanes and seams).

The data layer — why this engine exists

Every finished takeoff is a set of expert decisions: this region gets this finish, at this waste. If you record those decisions, you get a labeled dataset (plan geometry paired with the finish an expert assigned to it) that doesn't exist today. The thesis, stated so it can be attacked, is that markup is label.

OpenTakeoff is the instrument that produces that corpus. Collection is opt-in and auditable. The Contribute button builds a payload that contains only derived data. It never includes the PDF, file names, client names or scale values, and a whitelist in contribute.js enforces that. The contract is docs/CONTRIBUTION_SPEC.md, and the bundled capture server banks the rows on your own machine. If you don't run it, nothing is captured. The engine is free because a corpus is only as good as the number of real takeoffs that flow through it. The research program behind this, including the model work and the evaluation method, is in the tour. OpenTakeoff Academy scores agents on operating this engine against geometry they don't control.

Star history

If OpenTakeoff saved you an afternoon, a ⭐ helps the next estimator find it.

Who's building this

I run estimating for a commercial flooring company, and the takeoff tool I bid with is one I wrote. OpenTakeoff is the open half of that work: a measuring engine for anyone, person or agent, who needs to read a building. The models trained on our own estimating archive stay ours, and the boundary is drawn in public so it can be held to account.

— Michael · Kentucky AI

NVIDIA Inception Program member badge

Kentucky AI is a member of the NVIDIA Inception program.

Contact: for research collaborations, data questions, press, or anything that isn't a bug, write to [email protected]. Bugs and feature requests go in issues. Security reports follow SECURITY.md, through private vulnerability reporting.

Contributor credit

Thanks to @knmurphy (Kevin Murphy) for the reference split-screen, the room-engine speedups, the sheet tree, image captures, drawing styles and sharper overlays. The Pin reference tool builds on his image-capture work. The roll-goods layout engine was contributed by Michael Hartman.

License

GNU Affero General Public License v3.0 (AGPL-3.0-only). You can use it, fork it, ship it and build on it, as long as you share your changes when you run a modified copy for others. Through commit 84c7f48e (tag apache-2.0-final) OpenTakeoff was Apache-2.0, and that code stays Apache-2.0 for everyone who already has it. See NOTICE for attribution, the relicensing note and the section 7(b) attribution term. Contributions are accepted under the CLA. For commercial terms outside the AGPL, contact Kentucky AI.

Privacy Policy · Terms of Service · Shared wiki for people and agents

© 2026 NVIDIA, the NVIDIA logo, and NVIDIA Inception are trademarks and/or registered trademarks of NVIDIA Corporation in the U.S. and other countries.

Explore related projects