{"id":51146296,"url":"https://github.com/ibuilder/modelmaker","last_synced_at":"2026-06-29T03:00:37.180Z","repository":{"id":365287896,"uuid":"1269449119","full_name":"ibuilder/ModelMaker","owner":"ibuilder","description":"Open, self-hosted, IFC-native AEC platform: a web BIM viewer + modeling, a 73-module GC portal (RFIs, pay apps, CPM schedule, TRIR), and a development proforma — one model from acquisition to turnover. Generate a building from a zoning envelope, then coordinate, draw, schedule \u0026 underwrite it. Built on That Open + IfcOpenShell. $0 to run.","archived":false,"fork":false,"pushed_at":"2026-06-26T02:40:21.000Z","size":9480,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T03:14:36.244Z","etag":null,"topics":["aec","bcf","bim","bim-viewer","clash-detection","construction","construction-management","fastapi","gc","ids","ifc","ifc-viewer","ifcopenshell","openbim","proforma","real-estate","self-hosted","tauri","thatopenengine","three-js"],"latest_commit_sha":null,"homepage":"https://ibuilder.github.io/ModelMaker/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ibuilder.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-14T18:18:29.000Z","updated_at":"2026-06-26T02:40:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ibuilder/ModelMaker","commit_stats":null,"previous_names":["ibuilder/modelmaker"],"tags_count":81,"template":false,"template_full_name":null,"purl":"pkg:github/ibuilder/ModelMaker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibuilder%2FModelMaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibuilder%2FModelMaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibuilder%2FModelMaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibuilder%2FModelMaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ibuilder","download_url":"https://codeload.github.com/ibuilder/ModelMaker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibuilder%2FModelMaker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34911134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aec","bcf","bim","bim-viewer","clash-detection","construction","construction-management","fastapi","gc","ids","ifc","ifc-viewer","ifcopenshell","openbim","proforma","real-estate","self-hosted","tauri","thatopenengine","three-js"],"created_at":"2026-06-26T03:00:41.367Z","updated_at":"2026-06-29T03:00:37.169Z","avatar_url":"https://github.com/ibuilder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AEC BIM Platform — viewer · GC portal · proforma\n\n![AEC BIM Platform — one IFC model from acquisition to turnover](docs/img/og-image.png)\n\n[![CI](https://github.com/ibuilder/ModelMaker/actions/workflows/ci.yml/badge.svg)](https://github.com/ibuilder/ModelMaker/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/ibuilder/ModelMaker?label=release\u0026color=4a8cff)](https://github.com/ibuilder/ModelMaker/releases/latest)\n[![Downloads](https://img.shields.io/github/downloads/ibuilder/ModelMaker/total?color=33d17a)](https://github.com/ibuilder/ModelMaker/releases)\n![Platforms](https://img.shields.io/badge/desktop-Windows%20%C2%B7%20macOS%20%C2%B7%20Linux-555)\n![IFC-native](https://img.shields.io/badge/IFC-native-4a8cff)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Live demo](https://img.shields.io/badge/demo-in%20browser-33d17a)](https://ibuilder.github.io/ModelMaker/app/)\n\n\u003e **Open, self-hosted, IFC-native AEC platform.** A web **BIM viewer + modeling**, a **80-module GC\n\u003e portal** (RFIs, pay apps, CPM schedule, TRIR), and a **development proforma** — **one model, from\n\u003e acquisition to turnover.** Generate a building from a zoning envelope, then coordinate, draw,\n\u003e schedule \u0026 underwrite it. Built on **That Open + IfcOpenShell**. **$0 to run.**\n\n**What it is** — three pillars on one IFC-keyed model, switched by a Model / Construction / Finance bar:\n\n- 🧊 **BIM platform** — stream + author IFC in the browser (That Open Fragments), QA, IDS, BCF, 2D drawings + **PDF takeoff** (calibrated measure / area / count); **layer \u0026 align multiple models** (Navisworks-style) with **federated cross-discipline clash**; also opens **meshes \u0026 point clouds** (OBJ/STL/PLY/glTF · PCD/XYZ/**LAS/LAZ**) and **GIS / topography** (**GeoJSON** vectors · **GeoTIFF** DEM terrain) as georeferenced reference overlays, with **QR sharing**\n- 🏗 **GC portal** — config-driven modules: RFIs, submittals, change orders, pay apps (G702/G703), CPM schedule, safety/TRIR, closeout (COBie); **contract \u0026 change-order documents** (AIA-style generate · Exhibit A scope · redline · per-party + **PAdES digital** e-sign); **Report Center** (executive / cost / EVM / logs → PDF + Excel)\n- 💵 **Development proforma** — sources \u0026 uses, S-curve draws, XIRR/NPV, JV waterfall — seeded straight from the model\n\n![Generate a building from a zoning envelope, then underwrite the deal](docs/img/generate-build.gif)\n\n**[▶ Live demo](https://ibuilder.github.io/ModelMaker/app/)** · **[⬇ Download (Win/macOS/Linux)](https://github.com/ibuilder/ModelMaker/releases/latest)** · **[📚 Guides](https://ibuilder.github.io/ModelMaker/guide.html)** · **[📄 Project page](https://ibuilder.github.io/ModelMaker/)**\n\n### Quickstart — self-host the full stack\n\n```bash\ndocker compose --profile full up --build      # web → http://localhost:8080 · api → http://localhost:8000\ndocker compose --profile full --profile seed run --rm seed   # optional: a demo project across every module\n```\n\nOr install the signed desktop app (single-project, auto-updating) from the [latest release](https://github.com/ibuilder/ModelMaker/releases/latest).\n\n**Built on** [That Open](https://github.com/ThatOpen) (Fragments + web-ifc, MIT) · [IfcOpenShell](https://ifcopenshell.org) (LGPL) · [three.js](https://threejs.org) · [FastAPI](https://fastapi.tiangolo.com) · [Tauri](https://tauri.app). IFC is the source of truth — no proprietary format, no per-seat license.\n\n## The whole lifecycle, on one model\n\nThe market is a patchwork of point tools — feasibility in one, BIM in another, construction\nmanagement in a third. This spans **acquisition → turnover** on a single IFC-keyed model, where\ncompetitors each cover only one slice:\n\n![Lifecycle coverage — one IFC model spans acquisition, feasibility, design, preconstruction, construction and turnover](docs/img/lifecycle.svg)\n\n| Capability | **This** | Procore | Autodesk Forma¹ | TestFit | ARGUS / proforma |\n|---|:--:|:--:|:--:|:--:|:--:|\n| Feasibility + underwriting (proforma, S\u0026U, memo) | ✅ | – | partial | – | ✅ |\n| Generative massing + Test Fit | ✅ | – | ✅ | ✅ | – |\n| BIM authoring + clash/IDS | ✅ | view | ✅ | – | – |\n| Construction mgmt (RFIs, COs, pay apps, 4D) | ✅ | ✅ | ✅ | – | – |\n| Turnover (COBie, as-built, closeout) | ✅ | ✅ | ✅ | – | – |\n| IFC-native / open / self-hostable | ✅ | – | – | – | – |\n| Free desktop app · no per-seat license | ✅ | – | – | – | – |\n\n\u003csub\u003e¹ Autodesk Construction Cloud was rebranded **Autodesk Forma** in 2026. Comparison reflects typical product scope; competitors are strong within their slice — the difference is *whole-lifecycle on one open model*.\u003c/sub\u003e\n\n## What it does (vs. Bonsai / Revit / Navisworks)\n\nFull mapping in [docs/capability-matrix.md](docs/capability-matrix.md). Highlights, all **built\nand verified** in this repo unless noted:\n\n- **Web viewer** — Three.js + Fragments, streams large models, runs fully offline (local WASM).\n- **Navigation \u0026 review** — select→properties, spatial tree, layers, isolate/hide, ghost,\n  section planes, measure, color-by-data, set-origin/CRS.\n- **Coordination** — model federation; **clash detection** (AABB broad phase + mesh\n  boolean narrow phase, exact penetration volume) → BCF clash topics.\n- **Issues** — BCF-modeled topics/RFIs/punch/clash, viewpoints, comments, attachments,\n  pins; `.bcfzip` import/export (round-trips with Solibri/ACC/BIMcollab).\n- **QA** — **IDS validation** (ifctester) with failing-element highlighting.\n- **4D / 5D** — schedule↔element mapping; quantity takeoff + cost mapping (geometry fallback).\n- **Data export** — QTO, COBie, space schedules → XLSX.\n- **2D documentation** — dimensioned grid **plans** (grid derived from columns), **sections**,\n  **elevations** (N/S/E/W) with level lines, and composed **PDF sheets** with title blocks.\n- **Authoring round-trip (in-viewer modeling)** — a full toolbar of authoring ops, each a\n  server-side `ifcopenshell` recipe → background republish (reconvert + reindex). GUID-stable,\n  so pins/RFIs/clashes survive. **Create:** walls, slabs, columns, beams, roofs (sketch on the\n  model/grid). **Openings:** doors/windows void the host wall + fill it. **Edit:** delete,\n  move, rotate, copy, per-element Pset edit. **Drafting aids:** grid + corner snap, a 6-face\n  section box, a storey-levels overlay. Verified live end-to-end (upload IFC → add wall →\n  republish → updated `.frag` + reindex). Desktop GUI authoring is the Blender + Bonsai bridge.\n- **Generative design — zoning → a fully-developed IFC building + proforma** — the IFC-native\n  answer to TestFit/Forma: enter a municipal zoning envelope (lot, FAR, coverage, setbacks, height\n  limit, floor-to-floor) and the platform computes the buildable program (footprint, floors, GFA,\n  units, **binding constraint**) and **generates a real IFC4 model** in one call — optionally with a\n  **concrete structural frame** (columns + beams on a bay grid), **per-apartment unit layout**, a\n  **facade envelope** (walls + ribbon windows at a WWR, feeding the energy model), and a **service\n  core** (elevator + stair + MEP risers) — then publishes it and solves a **starter acquisition\n  proforma**. Because the output is openBIM, the generated building flows straight into the viewer,\n  drawings, energy, QTO, the **assembly-based estimate** (+ GFA benchmark) and underwriting — one\n  chain from lot → deal → turnover. Driven end-to-end through a full lifecycle harness (63/63).\n- **Furnish \u0026 equip (starter IFC family library)** — a curated 16-family catalog (furniture /\n  sanitary / appliances / plants) generated parametrically, placeable into *any* model (incl. a\n  generated massing) as real, **GUID-stable, typed** IFC occurrences via `type.assign_type`.\n- **Sign-in (SSO) + free tier, no admin** — log in with **Google / Microsoft / Procore** (OAuth2);\n  SSO users are plain **free-tier** accounts and there's **no admin tier for end users** (project\n  owners manage their own teams; platform config is ops/env). A `tier` seam (`entitlements.py`)\n  makes the eventual paid plans a one-place change.\n- **First-run onboarding + AI assistant** — a skippable welcome + coach-mark tour for new users, and\n  an **\"Ask AI\"** box that answers natural-language questions about a project (open RFIs, overdue,\n  cost) grounded in a live snapshot (Claude when keyed; graceful no-key fallback).\n- **Field/mobile capture (offline-first)** — a mobile bottom-sheet quick-capture: snap a photo →\n  punchlist / safety observation / progress photo in a couple taps. Captures queue offline (photo\n  included) and **auto-sync on reconnect** (queued-count badge); pairs with the PWA/Capacitor build.\n- **Turnover** — a one-click **closeout package** (`/closeout/package.zip`: as-built IFC +\n  COBie/QTO/spaces + status PDF + closeout manifest), **module-log PDFs** (RFI/submittal/CO\n  registers), **multi-period pay apps** (period advance + auto **lien waivers**), **COBie tabs**\n  enriched with warranties/assets/commissioning, and **warranty-expiry** tracking.\n\n## General Contracting Portal\n\nA construction-management portal on top of the viewer — full writeup in\n[docs/gc-portal.md](docs/gc-portal.md). Highlights:\n\n- **Module engine** — every process (RFIs, Submittals, PCO/Change-Order chain, Daily\n  Reports, …) is a `module.json` → its own auto-created table. **80 modules / 16 sections**,\n  no per-module code. Each gets CRUD, role-gated workflow, comments, CSV/PDF, pins, timeline.\n- **Two role dimensions** — capability roles (viewer→admin) + party roles\n  (GC/Owner/OwnersRep/Consultant/Subcontractor) that gate workflow transitions.\n- **Change-order chain** — PCO ▸ NOC ▸ Directive ▸ Proposal ▸ COR ▸ eTicket, linked and\n  audit-logged; approved CORs flow into the contract sum.\n- **Financials** — AIA **G702/G703** pay apps (+ PDF), **Cost Summary** roll-up, **eTicket\n  T\u0026M builder** priced from rate tables.\n- **Schedule** — Gantt + Empire-State **Line-of-Balance** charts.\n- **Role-tailored dashboard** — per-party KPIs + \"ball-in-your-court\" action items.\n- **Model pins** — any anchored record (RFI/PCO/COR/punchlist/inspection/…) shows on the\n  3D model; clicking selects the element and opens the record. Same GUID keys geometry,\n  BCF, and GC records.\n\n## Real-Estate Development \u0026 Feasibility (Finance workspace)\n\nA developer/owner platform that goes **lot → building → deal → investor package**, all IFC-native.\n\n**Generative design \u0026 Test Fit** (TestFit-style, but openBIM — every fit is a real IFC model):\n- **Generate from zoning** — lot + zoning envelope (FAR, setbacks, height, coverage) → a buildable\n  program + a from-scratch **IFC4** model (structural frame, per-unit spaces, facade + windows,\n  service core) + a solved acquisition proforma, one click. Real **lot polygons** (shoelace area).\n- **Test Fit** — fit a unit mix on a **double-loaded corridor** (real units + corridor), a **parking\n  solver** (stalls/unit → count/area/cost), **scheme compare** (units/efficiency/NSF/parking ranked),\n  and **generative optimize** that sweeps unit-mix × parking and ranks by **yield-on-cost** (\"find the\n  deal that pencils\"). `POST /test-fit/{compare,optimize}`.\n\n**Developer cost portal** — the institutional underwriting facets:\n- **Line-item hard/soft cost budgets** (description × $/unit × qty + per-category contingency) that\n  roll into the proforma cost tree.\n- **Sources \u0026 Uses** — grouped uses vs sized senior debt (LTC capped by LTV/DSCR/debt-yield) + equity.\n- **Property \u0026 tax assumptions** — parcel/areas/purchase + tax table → OPEX; per-SF ratios.\n- **Specialty assets** — on-site **energy** (solar/wind/battery/rainwater → capex + energy offset) and\n  **vertical-farm/PFAL** (tower count → produce revenue + lighting opex), flowing into the deal.\n- **Investment memo (PDF)** — a confidential memorandum (exec summary, S\u0026U, cost budget, returns,\n  risk) generated from live project data: the \"presentation with financials.\"\n\n**Underwriting engine:**\n- **Sources \u0026 uses** with construction-loan **interest-reserve circularity** solved to a fixed point.\n- **S-curve draws**, **XIRR / NPV / equity multiple / yield-on-cost**, a **JV waterfall** (pref +\n  promote tiers, American/European, clawback), **debt sizing** (LTC/LTV/DSCR/debt-yield), **sensitivity**\n  tables and **Monte Carlo** risk.\n- **Underwriting realism** — specialty/operating revenue is **risk-adjusted** (not booked as de-risked\n  rent), and **guardrails** flag returns outside market bands (IRR / equity-multiple / dev-spread /\n  DSCR) so the IRR is credible, surfaced on a sticky returns bar.\n- **Actuals/draws bridge** → re-forecast IRR + AIA G702/G703 pay apps off the *same* cost tree.\n- **Multi-deal portfolio** roll-up (true XIRR) and **LP-shared** read-only scenarios.\n\nThe Finance workspace is organized into sub-tabs — **Feasibility · Budget \u0026 Capital · Underwriting ·\nDeliverables** — with a sticky live-solved returns bar.\n\n## Recent platform work\n\n- **Operate · capital · payroll · drawings · assistant · ITB (latest, v0.1.89)** — six gaps from a\n  competitive/open-source scan: an **operating rent roll** (leases → occupancy/WALT/expirations,\n  feeding the appraisal income approach), an **investor cap table** with pro-rata capital calls \u0026\n  distributions, **WH-347 certified payroll** from timesheets, a controlled **drawing-set register**\n  (current vs superseded revisions), a whole-project **AI assistant**, and **ITB** invitation/coverage\n  tracking. (See [docs/competitive-plan.md](docs/competitive-plan.md).)\n- **Model intelligence, field verification \u0026 embeddability (v0.1.88)** — **Ask the model** in\n  plain English (`/ask`, grounded in the property index; degrades to a data snapshot without an AI key);\n  **field verification** — mark elements installed/verified/deviation vs design (photo-anchored) with an\n  **install-coverage** dashboard + deviation log for the ops handover; an **`?embed=1`** chrome-less,\n  read-only viewer for `\u003ciframe\u003e`/Teams embeds; and **outbound webhooks** on workflow transitions\n  (Power Automate / Zapier). Adapted from Argyle + Flinker to the open, self-hosted posture.\n- **Workflow engine upgrades (v0.1.87)** — config-driven modules engine gains **transition\n  field-gating** (`requires: [field]` — RFI can't be Answered without an answer), a **Company/Contact\n  directory** with first-class `reference` lookups (e.g. a subcontract's vendor), a cross-module\n  **due/overdue SLA feed** (\"⏰ Deadlines\" on the portal home), and an **in-app workflow map** on the\n  record view — adopted from an emanager gap analysis (see [docs/emanager-gap-analysis.md](docs/emanager-gap-analysis.md)).\n- **Disposition \u0026 valuation (v0.1.86)** — close the loop from build to **sell/lease**: a\n  `listing` module that **auto-fills from the model + proforma** (areas/NOI/cap/asking price), a\n  one-click **marketing fact sheet** + a signed **public link/QR** to share off-plan, and a\n  **tri-approach appraisal** (cost + income + sales-comparison, reconciled) with a Valuation tab and\n  PDF/Excel report. RESO-aligned so listings can later push to an MLS / the WPRealWise suite. See\n  [docs/realestate-marketing.md](docs/realestate-marketing.md).\n- **Production readiness (v0.1.85)** — a DB-pinging `/ready` (+ `/readyz`) readiness probe\n  (503 when the DB is down) alongside the cheap `/health` liveness check; the login brute-force lockout\n  now shares its counter across workers via `AEC_REDIS_URL` (the API runs multi-worker), fail-open to\n  in-process; `docker-compose.prod.yml` is hardened by default (RBAC, require-secret, HSTS, secure\n  cookie, strict CSP, rate limit + a `redis` service) and `.env.example` documents every flag; and the\n  additive startup schema-sync (vs Alembic — it fits the config-driven module tables) is documented in\n  [SECURITY.md](SECURITY.md) and covered by `test_migrate.py`.\n- **Security hardening (v0.1.84)** — a defense-in-depth RBAC gate (anonymous blocked from\n  project/finance/admin surfaces when `AEC_RBAC=1`) + `require_role` on every project-scoped endpoint;\n  hardening response headers + opt-in strict CSP; request body-size cap; storage path-traversal +\n  upload-filename sanitization; attachment-download IDOR fix + member-scoped project list; login\n  brute-force lockout, `Secure` auth cookie, and fail-fast on a default signing secret; **signed/expiring\n  download URLs** for `model.frag` + attachments. See [SECURITY.md](SECURITY.md).\n- **Charts \u0026 graphs (v0.1.83)** — a dependency-free, theme-aware SVG chart kit drives\n  construction/RE best-practice visuals: a **capital-stack** donut, **JV-distribution** donut, equity\n  cash-flow bars and a one-way **IRR tornado** on the Underwriting tab; **NOI vs net-income** and\n  **cash-flow-by-year** charts on Statements; **progress bars** + a **budget vs committed vs actual vs\n  EAC** grouped bar in the GC portal; and charts embedded in the Report Center PDFs (cost bar, EVM\n  S-curve, financials line).\n- **Financial statements \u0026 tax (v0.1.82)** — the Finance proforma gains a **Statements** tab\n  (and a Report-Center PDF/Excel): a stabilized **income statement** (PGR → EGI → NOI → depreciation →\n  net income), a **balance sheet** that ties to the dollar every year, a GAAP three-section\n  **cash-flow statement**, a **tax** schedule (27.5/39-yr straight-line depreciation, annual income\n  tax, and at sale **§1250 recapture** + **capital gains** + NIIT → an **after-tax IRR**), and the\n  development budget as a two-sided **Uses ∣ Sources** view. `POST /proforma/financials`,\n  `GET /projects/{pid}/financials`, `GET /projects/{pid}/budget/two-sided`.\n- **Inspection, intel \u0026 robustness (v0.1.81)** — a rebuilt **element properties panel**:\n  structured **Attributes / Quantities / Property Sets** (IFC quantities now surfaced), value\n  formatting, a live **filter**, click-to-copy + **Copy all**, and a collapsible-tree fallback.\n  **Interchangeable municipal permit open data** — a Socrata feed across **NYC · SF · Chicago · LA ·\n  Austin** (one entry to add a city), normalized to one shape; query near a site, a **GeoJSON GIS\n  overlay**, and a one-click **import into the GC permit log** (source-tagged, deduped). A rule-based\n  **schedule-acceleration advisory** (crash / fast-track / near-critical off the CPM critical path), a\n  **project risk digest** (cost + schedule + open items + safety), a **Report Center** (every report →\n  PDF **and** Excel), **PDF digital signatures (PAdES)** + AIA-style contract / exhibit / change-order\n  documents, **GIS/topography** (GeoJSON + GeoTIFF DEM) · **PDF takeoff** · **GAEB X83** · **AI text→BOQ**,\n  Navisworks-style **model federation** (per-model transforms + **federated clash**), **mesh + point-cloud\n  (LAS/LAZ) reference overlays** with **QR share**, and reliability hardening — **Sources \u0026 Uses now\n  reconciles to the dollar**, **BCF pins round-trip with their GUID tie + anchor**, and the backend suite\n  grew to **47**. See the [CHANGELOG](CHANGELOG.md).\n- **One relational model — schedule · budget · 5D · capital** — the GC `schedule_activity`\n  records now drive the Gantt / Line-of-Balance / CPM **and** the 3D 4D scrub (per-activity dates,\n  element/trade links), with **lookahead** + **milestone** views and editable P6 `.xer` import. A\n  first-class **Budget** destination assembles the agreed **GMP** from every cost code \u0026 bid package\n  + General Conditions / Requirements (incl. **staffing** projections) + overhead / fee / contingency\n  — each budget vs committed vs actual vs **EAC**, with buyout savings, change-orders→revised-GMP,\n  owner **SOV from the budget**, a **cash-flow S-curve**, and a baseline; it reconciles to the\n  developer proforma's hard cost. The capital chain closes the loop: **GMP↔hard-cost sync**, an\n  **actuals loop** (owner invoices → re-forecast IRR), **construction-loan draws** (equity-first,\n  interest accrual, lender draw-request PDF), a cross-pillar **Portfolio** (GC status + developer\n  returns), and **on-schedule/on-budget** executive bands. **5D**: click an element → its activity +\n  cost-code budget; colour the model by %-complete or cost variance; scrub the 4D timeline with live\n  cost burn; **QTO by floor \u0026 discipline**. Plus **multi-user** (members → role-scoped persona\n  views), bulk site-photo + camera capture, and an optional **paid Revit (.rvt)→IFC bridge** (APS,\n  feature-flagged with a cost gate; IFC stays the source of truth). One click (lot→building→deal)\n  seeds all three pillars. See the [CHANGELOG](CHANGELOG.md) (v0.1.53→v0.1.94).\n- **Rendering, families \u0026 computational design (M-theme)** — a viewer **render mode** (directional\n  sun + soft shadows, ACES/PBR, IBL), a NOAA **sun-\u0026-shadow study** (date · time · lat/long), and a\n  Matterport-style first-person **walkthrough**; Revit-style **`IfcMaterialLayerSet` assemblies** on\n  walls/slabs/roofs; the family library grown to **37 parametric types** (Lighting/MEP/Structural/\n  Transport added) with **type-variant sizing** and **import of external/manufacturer IFC families**\n  (`project.append_asset`); and **Studio**, a visual **computational node graph** (Dynamo/Hypar-style)\n  that runs the server compute engine — wire zoning → structure → schedule → cost → yield with no code.\n- **Hardening \u0026 ops** — distributed **Redis-backed rate limiting** (multi-worker, fail-open), a\n  faster **dashboard** (GROUP-BY counts, JSON parsed only for active records), an **accessibility**\n  pass (tab roles/`aria-selected`, labels, live region), a **stored-XSS** sweep of the admin modals,\n  and `main.ts` modularization (the connections UI is now a lazily-loaded chunk). COBie handover gains\n  model-derived **areas / manufacturer / warranty / asset-id** fields + an **Attribute** sheet; the\n  pitch deck gains **Market** + **Timeline** slides. Library interop evaluated (IFClite / pyRevit /\n  FreeCAD / Pascal) — see `docs/roadmap.md` §L and the dependency/update ADR.\n- **Built-world techniques (research-grounded)** — direction from Carol Willis (*Form Follows\n  Finance*, *Building the Empire State*), Salvadori (*Why Buildings Stand Up*), and CM/RE research:\n  **form-follows-finance** massing (daylight-limited rentable depth + core efficiency), a\n  **structural-system advisor** (flat-plate · shear-core · outrigger by height/span + member sizing),\n  **takt / line-of-balance** scheduling with a JIT delivery plan, **4D sequencing** with a viewer\n  scrub, **lean / Last-Planner PPC**, and citable **benchmarks + comparables**.\n- **Underwriting realism + Finance revamp** — specialty/operating revenue is now risk-adjusted before\n  it hits the deal, and `underwrite.guardrails()` flags returns outside market bands (the\n  vertical-farm scenario's once-inflated IRR is now credible). The Finance view is reorganized into\n  sub-tabs with a sticky returns bar that carries a live guardrail badge.\n- **Developer portal + Test Fit** — line-item hard/soft **cost budgets**, **Sources \u0026 Uses**,\n  **property/tax** assumptions, **specialty assets** (on-site energy + vertical-farm revenue), an\n  **investment-memo PDF**, plus **Test Fit** (corridor unit-mix layout, parking solver, scheme\n  compare, generative yield-on-cost optimize) and **real lot polygons** — see the\n  \"Real-Estate Development \u0026 Feasibility\" section. Each backed by tests in the CI gate.\n- **AI assistant** — natural-language **\"Ask AI\"** over a live project snapshot (Claude when keyed,\n  graceful rules fallback) alongside AI risk summaries + AI-drafted RFIs.\n- **Accounts \u0026 onboarding** — **SSO** (Google / Microsoft / Procore), a no-admin free-tier model,\n  first-run **welcome + skippable tour**, and **field capture** (offline photo → punchlist/observation,\n  syncs on reconnect) for the mobile/jobsite path.\n- **Generative massing + family library** — `aec_data.massing` turns a zoning envelope into a\n  buildable program + a from-scratch **IFC4** model (`POST /projects/{id}/generate/massing`, plus a\n  stateless `/generate/massing/preview`) and seeds a solved acquisition proforma; `aec_data.families`\n  generates a 37-family parametric type library (`GET /families/catalog`) placed via the `add_family`\n  authoring recipe. Both render in the viewer (fixed two web-ifc gotchas surfaced en route: generated\n  models now use **metre** units, and every `IfcProfileDef` carries a `Position` — without it web-ifc\n  silently skips the geometry). Gated by `test_generate` in the CI suite.\n- **4-zone UI** (top chrome + Model/Construction/Finance workspaces + left icon rail + bottom\n  settings bar) with a **lazy-loaded 3D viewer** — the ~6 MB three/@thatopen bundle loads only\n  when the Model workspace opens, so portal/finance users get a ~16 KB-gzip first load.\n- **Module relations** — `reference` fields + reverse lookups + numeric **rollups** wire the\n  domain chains across the portal (RFI/Submittal→Drawing, RFI→ChangeEvent→PCO→COR→Subcontract,\n  budget/SOV/timesheet→CostCode cost-coding, Meeting→ActionItems, Inspection→NCR/Deficiency,\n  bidding, daily/field, closeout, …) — 44 references + 16 rollups, all config-driven so the\n  form record-picker, \"related\" panel, and rollups come for free. Plus a **kanban board**,\n  **cross-module search**, **bulk actions**, **inline list editing**, **saved views**, and\n  real-time **SSE notifications** — all engine-level, so every module gets them.\n- **Background conversion** — IFC convert/reindex runs off-thread; clients poll a publish status.\n- **In-viewer modeling** — 18-tool authoring toolbar (walls/slabs/columns/beams/roofs,\n  doors/windows, delete/move/rotate/copy, Pset edit) + grid/corner snap, section box, levels\n  overlay — all server-authored via `ifcopenshell` and proven live.\n- **Interoperability** — a data-source **Connections** framework: register external\n  **Postgres/Supabase** (read-only table browse + a guarded SELECT console), **Procore**\n  (two-way sync — import RFIs/submittals/change-events into the portal, push resolved RFI\n  status/answers back, scheduled auto-sync), **Autodesk Construction Cloud** (project/issue read),\n  and **accounting/ERP** — **QuickBooks** + generic-REST **Sage/Viewpoint** (read accounts /\n  vendors / bills) — all behind one adapter pattern. An admin **field-mapping editor** remaps each\n  external field → module field per connection; secrets are write-only and masked on read; admin-gated.\n- **Construction \u0026 financial depth** — **CPM scheduling** (forward/backward pass, total+free\n  **float**, critical path); **model-based estimating \u0026 takeoff** (IFC quantities × unit rates →\n  priced estimate); **model→proforma** (areas seed hard cost + rent); **bid leveling**; a **risk\n  register** + cross-project **construction program portfolio** with cost-overrun flagging;\n  **TRIR/DART safety analytics**; **reusable templates** (save a module's records, apply to any\n  project); and **model version history + diff** (GUID snapshot per publish). The GC portal +\n  proforma run on a **blank project — no IFC required**; model-derived tools light up once an IFC\n  is opened.\n- **Free single-project desktop app (.exe)** — the whole platform in **one process** (FastAPI\n  serving the API + SPA, SQLite + local files, single-operator local mode, no login), packaged\n  self-contained with PyInstaller (`services/api/desktop.py`, `build-desktop.ps1`) — a\n  Bluebeam-style local app; data lives under `%LOCALAPPDATA%\\AEC-BIM`, uninstall = delete the\n  folder. Projects are portable **`.mmproj` bundles** (geometry + all data + attachments) via the\n  Open/Save menu. The Tauri 2 shell spawns this backend as a sidecar for a **native window**;\n  mobile (Capacitor/Tauri-mobile) is next.\n- **UX** — the ⚙ Tools panel is a collapsible, **persona-ordered**, state-aware accordion with\n  **readable result modals** (cost/energy/IDS/clash); the **80-module portal catalog** gains ★\n  favorites + collapsible persona-aware sections + a filter; the viewer toolbar is grouped. The\n  project picker tags each project's model type (`.frag`/`.ifc`). (See `docs/ux-findings.md`.)\n- **Installable + offline** — PWA (manifest + Workbox service worker; lean ~97 KB precache,\n  viewer libs/WASM/tiles runtime-cached).\n- **Authentication** — username/password accounts (PBKDF2-hashed) + signed bearer tokens\n  (stdlib, dependency-free) at `/auth/{register,login,me}`. The token is the identity the RBAC\n  layer trusts (replacing the dev `X-User` header); per-project authorization stays in\n  `ProjectMember`. First account bootstraps as admin. Web app has a sign-in control + token\n  store. Login also sets an **httpOnly cookie** so the SSE notification feed and\n  direct-download links (which can't set a header) authenticate same-origin via the `/api`\n  proxy; `/auth/logout` clears it. *(Dev cross-origin `:5173→:8000` uses the header path;\n  the cookie applies to the deployed same-origin stack.)*\n- **Identity \u0026 RBAC management** — admin user management (create / list / set role / activate /\n  deactivate / reset password) with a last-active-admin guard; **self-service password reset**\n  via an admin-issued single-use token (no email infra); deactivation invalidates existing\n  tokens immediately. The web UI **gates per project role** — authoring tools, the authoring\n  panel, \"+ RFI\", and the portal \"+ New\" hide above the caller's role (the API still enforces).\n- **Risk + debt sizing (Proforma)** — **Monte Carlo** simulation (sample drivers → P5–P95,\n  P[IRR ≥ target], histogram) alongside the deterministic sensitivity table, and debt sized to\n  the lesser of **LTC / LTV / DSCR / debt-yield** constraints.\n- **Drawings** — element **callouts with leader lines** on plans (doors/windows by default),\n  complementing room tags (`plan.svg?callouts=true`).\n- **Ops \u0026 observability** — `/metrics` (Prometheus: request counts/latencies by route template,\n  in-flight, uptime) + structured JSON access logs; **email digests** of per-member work queues\n  (stdlib SMTP, no-op-but-logged when unconfigured); a **backup/restore runbook** + scripts\n  (`scripts/backup.sh` / `restore.sh`: pg_dump + MinIO/IFC volumes).\n- **Desktop release CI** — tag-driven GitHub Actions builds signed Win/macOS/Linux Tauri\n  installers (`.github/workflows/desktop.yml`); each runner first builds the Python backend\n  sidecar (PyInstaller) so the installer ships the full app, not just the viewer. A viewer-only\n  **GitHub Pages** demo deploys from `pages.yml`.\n- **CI gate** — `services/api/run_tests.py` runs all Python suites (incl. interop/bundle/desktop/\n  local-mode); GitHub Actions runs it + the web build (tsc + vitest + prod build).\n\n## Gallery\n\n**Generative design — lot → IFC model → acquisition proforma** (the TestFit/Forma differentiator,\nbut openBIM): a zoning envelope generates a real IFC massing you can then furnish from a starter\nfamily library. (Vector renders of the redesigned UI; numbers are an actual solve.)\n\n| Generate from zoning → IFC + proforma | Furnish \u0026 equip (starter IFC family library) |\n|---|---|\n| ![generate from zoning](docs/img/massing_generate.svg) | ![furnish library](docs/img/furnish_library.svg) |\n\nGenerated directly from the IFC by the data service (BIM), plus GC schedule charts:\n\n| Dimensioned grid plan | Composed sheet (A3) | North elevation (HLR) | Room tags |\n|---|---|---|---|\n| ![plan](docs/img/plan_grid.png) | ![sheet](docs/img/sheet.png) | ![elevation](docs/img/elevation_north.png) | ![rooms](docs/img/room_tags.png) |\n\nThe dimensioned plan derives the structural grid from column positions (no `IfcGrid` needed),\nadds numbered/lettered bubbles and grid-spacing dimensions; the sheet composes per-storey\nplans + a section under a title block (also exported as PDF).\n\nGC portal schedule visuals (from the `schedule_activity` module):\n\n| Gantt | Line of Balance |\n|---|---|\n| ![gantt](docs/img/gantt.png) | ![lob](docs/img/lob.png) |\n\nPlatform interface (vector renders of the redesigned UI — see the [live demo](https://ibuilder.github.io/ModelMaker/app/) for the running app):\n\n| Tools panel + readable results | 80-module portal catalog |\n|---|---|\n| ![tools panel](docs/img/ui-tools-panel.svg) | ![portal catalog](docs/img/ui-portal-catalog.svg) |\n\nThe ⚙ Tools panel is a persona-ordered, collapsible, state-aware accordion (secondary tools fold\nunder \"More tools\"; analysis opens in a readable modal); the GC-portal catalog tames 80 modules\nwith ★ favorites, collapsible persona-aware sections, and a filter.\n\n## Architecture\n\n```\n            IFC  (source of truth)\n   author ▲                       │ convert + tile\n          │                       ▼\n  Blender + Bonsai         services/converter (Node)   IFC → .frag tiles\n  (Bonsai-MCP)                    │\n  services/data (Python, ifcopenshell)                 props index · QTO/COBie/4D/5D ·\n    clash · IDS · drawings/sheets · authoring recipes   exports · validation · 2D drawings\n          │                       │\n          └──────► services/api (FastAPI) ◄──────► apps/web (Vite + TS, Three.js + Fragments)\n             BCF issues · pins · viewpoints · properties · exports · clash · validate ·\n             drawings/sheets · edit/publish      (Postgres/SQLite + MinIO/local storage)\n```\n\n## Layout\n\n```\napps/web/            Vite + TS viewer (Three.js + @thatopen/*), integrated app shell\napps/editor-bridge/  Bonsai-MCP config + authoring recipes (desktop path)\nservices/converter/  IFC→.frag (Node) + optional RVT→IFC via APS (paid, flagged)\nservices/api/        FastAPI: BCF, properties, exports, clash/validate, drawings, edit/publish,\n                       GC portal (modules, cost, schedule, dashboard)\nservices/api/modules/  80 module.json definitions (GC portal — one table each)\nservices/data/       IfcOpenShell: index, QTO, COBie, spaces, schedule, clash, IDS, drawings, edit,\n                       massing (zoning→IFC), families (starter IFC type library)\npackages/            shared types\nfamilies/            IFC type libraries (versioned) — curated/manufacturer content drop-in\ndocs/                status, capability matrix, gc-portal, deploy, images\n```\n\n## Run the full stack (Docker — easiest)\n\n```bash\ngit clone https://github.com/ibuilder/ModelMaker.git \u0026\u0026 cd ModelMaker\ncp .env.example .env            # set secrets + AEC_RBAC=1 for anything but local dev\ndocker compose --profile full up --build      # web → http://localhost:8080  (api → :8000)\n\n# optional: fill a demo project across all relation chains\ndocker compose --profile full --profile seed run --rm seed\n```\n\nThe web container reverse-proxies `/api` to the API (same-origin, no CORS), serves the\nviewer with the cross-origin isolation web-ifc needs, and persists Postgres/MinIO/IFC volumes.\nSee [`.env.example`](.env.example) for every knob and [docs/roadmap.md](docs/roadmap.md)\nfor the desktop (Tauri/Electron) and mobile (Capacitor) packaging plan.\n\n## Quick start (dev)\n\n```bash\n# 1. web viewer (offline; copies WASM automatically)\ncd apps/web \u0026\u0026 npm install \u0026\u0026 npm run dev          # http://localhost:5173\n\n# 2. backend API (prefer Python 3.11+; 3.10 works)\ncd services/api \u0026\u0026 python -m venv .venv \u0026\u0026 .venv/Scripts/activate\npip install -r requirements.txt\nPYTHONPATH=src uvicorn aec_api.main:app --reload    # http://localhost:8000\n\n# 3. convert an IFC to Fragments (Node converter)\nnode services/converter/src/cli.mjs model.ifc model.frag\n\n# 4. data exports / drawings (CLI)\ncd services/data \u0026\u0026 pip install -r requirements.txt\nPYTHONPATH=src python -m aec_data.cli qto model.ifc qto.xlsx\n```\n\nSeed a project, then the web app auto-connects: `POST /projects` with `source_ifc`, upload\nthe props index, and open the viewer. See [docs/status.md](docs/status.md) for the verified flow.\n\n## API surface (selected)\n\n```\nPOST   /projects                              create project (name, source_ifc, origin)\nGET    /projects/{id}/elements[/{guid}]       properties index (Phase 1 data)\nGET/POST /projects/{id}/topics ...            BCF topics/RFIs/pins, comments, viewpoints, attachments\nGET/POST /projects/{id}/bcf/export|import     .bcfzip round-trip\nGET    /projects/{id}/exports/{qto,cobie,spaces,schedule}.xlsx\nPOST   /projects/{id}/clash                   clash detection (→ BCF clash topics)\nPOST   /projects/{id}/validate                IDS validation\nGET    /projects/{id}/drawings/{plan,section,elevation}.svg\nGET    /projects/{id}/drawings/sheet.{svg,pdf}\nPOST   /projects/{id}/edit | /publish         authoring round-trip (recipes incl. add_family)\nPOST   /projects/{id}/generate/massing        zoning → IFC massing model + acquisition proforma\nPOST   /generate/massing/preview              stateless zoning → program + proforma (no model written)\nGET    /families/catalog                      starter IFC family library (furnish \u0026 equip)\n\n# GC portal (full list in docs/gc-portal.md)\nGET    /modules                               module catalog\nGET/POST /projects/{id}/modules/{key}[/{rid}] config-driven CRUD (+ /transition /link /comments /pdf /export.csv)\nGET    /projects/{id}/module-pins             anchored records → viewer overlay\nGET    /projects/{id}/cost/{g703,g702,summary} financials (+ g702.pdf, POST /cost/tm)\nGET    /projects/{id}/schedule/{gantt,lob}.svg  Gantt + Line-of-Balance\nGET    /projects/{id}/schedule/{cpm,alerts,optimize}  CPM · predictive alerts · acceleration advisory\nGET    /projects/{id}/{risk-digest}           cost+schedule+open-items+safety risk digest\nGET    /reports · /projects/{id}/reports/{report}.{pdf,xlsx}   Report Center (PDF + Excel; incl. appraisal · listing_factsheet)\nGET    /opendata/permit-cities · /projects/{id}/opendata/permits[.geojson]   municipal permit feed\nPOST   /projects/{id}/opendata/permits/import   seed the GC permit log from a city's open data\nGET    /projects/{id}/dashboard · /due-feed    role-tailored dashboard · cross-module due/overdue SLA feed\nPOST   /projects/{id}/ask · /assistant         Q\u0026A over the model index · over the whole project (modules/schedule/budget)\nGET    /projects/{id}/verification/coverage    install coverage (verified/installed %) + PUT .../{guid} · /deviations\nGET    /projects/{id}/rent-roll · /cap-table   operating rent roll (occupancy/WALT) · investor cap table\nPOST   /projects/{id}/capital-call · /distribution   pro-rata investor allocations\nGET    /projects/{id}/payroll[/wh347.pdf]      weekly certified payroll (WH-347) from timesheets\nGET    /projects/{id}/drawing-set              controlled drawing set (current vs superseded revisions)\nGET    /projects/{id}/bidding/itb · POST .../packages/{id}/invite   ITB coverage tracking · invite bidders\n# disposition \u0026 valuation (real estate)\nGET/POST /projects/{id}/appraisal             tri-approach valuation (cost · income · sales-comparison, reconciled)\nGET    /projects/{id}/listings/autofill        listing fields pre-filled from the model + proforma\nGET    /projects/{id}/listings/{lid}/reso      RESO Data Dictionary export (MLS / WPRealWise bridge seam)\nPOST   /projects/{id}/listings/{lid}/share · GET .../public   signed, read-only public listing link (QR share)\n\n# interoperability + portability\nGET/POST /connections[/{id}]                  data-source connections (Postgres/Supabase/Procore/ACC)\nGET    /connections/{id}/tables | POST .../query   read-only browse + SELECT (SQL sources)\nGET/PUT /connections/{id}/mappings            admin field-mapping editor (external → module fields)\nPOST   /projects/{id}/sync/procore[/push]     Procore import + two-way push (+ /sync/schedules)\nGET    /connections/{id}/acc/projects/{pid}/issues   Autodesk Construction Cloud issue read\nGET    /projects/{id}/bundle | POST /projects/import-bundle   portable .mmproj save / open\nDELETE /projects/{id}                          delete a project (rows + geometry + attachments)\n```\n\n## Verification\n\nEvery feature here was run against the sample model. The latest end-to-end proof: IDS flagged\n299 slabs missing `LoadBearing` → the authoring round-trip edited them → republish → IDS\nre-validated **PASS (299/299)** with the slab's pin GUID unchanged. Regressions: web `tsc`,\nAPI smoke test, and Python compile all green.\n\n## Licensing\n\nOpen stack (That Open MIT-style, IfcOpenShell LGPL). The Blender + Bonsai desktop editor is\n**GPL** — kept a separate process you *use*, not linked in. Optional Autodesk APS RVT→IFC is\npaid/flagged. See [LICENSE-NOTES.md](LICENSE-NOTES.md).\n\n## Author\n\nCreated by **Matthew M. Emma** — built with [Claude Code](https://claude.com/claude-code) as AI assistant.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibuilder%2Fmodelmaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fibuilder%2Fmodelmaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibuilder%2Fmodelmaker/lists"}