Engineering report · Technical Xperts Group (TXG)

Four products built for TXG, May to November 2026

TXG Vision Suite (built in two parts: first a field desktop app with the Maximo upload, then, once that was complete, a centralised database and web platform), Revit AI, Measura and Senku. This report covers what each one does, how it is built, what was measured on real client data, what went wrong along the way, and what is still open. Every figure comes from the project repositories: code, hand-off notes, case-study files and git history.

Built by Livewires Digital Solutions Period 23 May – 14 Nov 2026 Clients served KAFD (Riyadh), KSIA T6, a second HVAC client Report date 14 Nov 2026
Overview

Executive summary

The four projects form one line of work. It starts with photo verification and Maximo uploads for asset tagging, then moves into BIM: model building in Revit, quantity takeoff in AutoCAD, and coordination and takeoff in Navisworks. The later three share one architecture, first built for Revit AI, which is why Measura and Senku each reached a working pilot in a matter of days.

4
products (5 deliverables: Vision Suite shipped in two parts)
174
git commits across the four repositories
~88k
lines of source (C#, Java, Python, TypeScript)
130
AI-callable tools (54 Revit, 21 AutoCAD, 55 Navisworks)
5
host platforms: Windows desktop, web, Revit, AutoCAD, Navisworks
1
system live in production (vs.txgksa.com)
Project 1 · May–Oct

TXG Vision Suite

Part 1: a desktop app that turns Autodesk Forma issue-detail PDFs into QR-verified collages, files them by status and uploads them to the client's IBM Maximo. Part 2 (after Part 1): a centralised database and web dashboard that track everything.

Live in productionPythonSpring BootNext.js
Project 2 · Sep–Nov

Revit AI

A licensed Revit 2024/2026 add-in that builds native models from AutoCAD plans, MEP drawings, point-cloud scans and JSON specs, writes KAFD asset codes, makes BOQs, runs clash checks, and has an in-Revit AI assistant with 54 tools.

Test builds (0.1.x)C# .NET 10 + 4.8FastAPI
Project 3 · Nov

Measura

An AutoCAD 2027 plugin for bill-of-quantities takeoff from DWGs, comparable to PlanSwift but inside AutoCAD: rule-based and manual takeoff, several drawings into one BOQ, a colour-legend BOQ for containment and ducting, and an AI panel.

Working pilotC# .NET 10AutoCAD API
Project 4 · Nov

Senku

A Navisworks Manage 2026 add-in for BOQ takeoff, clash management (xlsx/HTML/BCF), property export templates, model checks and TimeLiner, with 55 AI tools, a headless batch driver and a PostgreSQL model-data export.

Working pilotC# .NET 4.8Navisworks API
The rule the three BIM products share AI decides intent; deterministic, tested code produces every coordinate and every quantity. In Revit AI the assistant can run importers and set parameters, but no wall position ever comes from a language model. In Measura and Senku the assistant picks tools, maps layers and tags objects, but every number in a BOQ comes from the measuring code. Model-changing actions wait for the user's Allow.
Delivery

Timeline

Bars run from first to last commit. Vision Suite was delivered in two parts, one after the other: Part 1 (the desktop app and Maximo push) was completed first, and only then did Part 2 add the centralised database and web dashboard. The desktop app still received integration updates and fixes during Part 2 (shown faded).

MayJunJulAugSepOctNov
Vision Suite · Part 1Desktop app + Maximo push
23 May – 12 Jun · completed
Vision Suite · Part 2Central DB + API + web dashboard
13 Jun – 6 Oct
Revit AIRevit add-in + licence server
24 Sep – 10 Nov
MeasuraAutoCAD plugin
8 – 12 Nov
SenkuNavisworks add-in
12 – 14 Nov
ProjectFirst commitLatest commitCommitsStatus today
Vision Suite · Part 1
Desktop app + Maximo push
23 May 2026 · “Working maximo login version”12 Jun 2026 · category rules + versioned saving; development plan for Part 227Completed, in field use
Vision Suite · Part 2
Central DB + API + dashboard
13 Jun 2026 · “Phase 1 of web dashboard”6 Oct 2026 · Maximo not_pushed state67Live, auto-deploys from main
Revit AI24 Sep 2026 · hot-reload loader10 Nov 2026 · tagging on cropped views760.1.x builds to testers
Measura8 Nov 2026 (project created)12 Nov 2026 · no-legend duct mode1Pilot, used on a real KAFD job
Senku12 Nov 2026 (project created)14 Nov 2026 · “Working Pilot Version”3Pilot, 55 live checks

Measura and Senku were committed in bulk at pilot stage, so their commit counts understate the work. Their hand-off notes (CLAUDE.md) hold the dated log.


Project 1 · Two parts

TXG Vision Suite

From an 800-page tagging PDF to a verified photo on the right asset in Maximo.

Client
KAFD (King Abdullah Financial District), Riyadh
URL
vs.txgksa.com (sign-in required)
Part 1 · Desktop app
23 May – 12 Jun 2026 · 27 commits
Part 2 · Central DB + web
13 Jun – 6 Oct 2026 · 67 commits
Applications
Desktop app, REST API, web dashboard
External systems
IBM Maximo MAS 9.1, Autodesk Forma / ACC, Google Gemini (fallback)
Code size
Python 4,044 · Java 4,835 · TS/TSX 5,875 lines

The problem

KAFD's asset-tagging contractors record their work in Autodesk Forma. Forma exports “issue detail” reports as PDFs of several hundred pages: one issue per physical asset or location, each carrying 2–5 photos of the installed QR tag. KAFD needs each photo checked (does the QR code in the photo match the asset it is supposed to be on?) and then filed as the asset's image in IBM Maximo, its asset system of record.

Done by hand, that means opening an 800-page PDF, pulling out every photo, reading every QR code, sorting the results, and uploading each verified photo into Maximo one record at a time, for around 12,000 assets and 700+ locations per parcel. Vision Suite automates the whole chain.

INPUTForma PDF exportHundreds of pages; one issue per asset with 2–5 photos
PART 1Extract & verifyDesktop app parses text, pulls photos, builds collages, reads QR codes
PART 1QA/QC & sortMatch / no match / unreadable; filed into status folders V1, V2…
PART 1Push to MaximoOIDC login, find record, upload collage as the asset image
PART 2Sync & trackResults POSTed to the API; MySQL; dashboard for the client and PM
Part 1 · 23 May – 12 Jun · completed first

Desktop app + Maximo push

A standalone Windows tool the field engineer runs on a laptop. It parses the PDF, extracts photos, builds collages, reads QR codes, sorts results into folders and uploads verified photos to Maximo. At this stage everything lived on the laptop: output folders, CSV and Excel reports.

Part 2 · 13 Jun – 6 Oct · after Part 1

Centralised database + web platform

Once Part 1 was complete, Part 2 was planned (plan.md, 12 Jun) and built: a MySQL database behind a Spring Boot API, so results no longer lived on one laptop's disk, plus a web dashboard so the client and PM could see progress. The desktop app gained an optional backend sync, and was built to degrade gracefully: leave the Backend URL blank and it works exactly as in Part 1.

Part 1 · The desktop app (“Forma Photo Extractor”) 23 May – 12 Jun

A Python 3.11 / Tkinter application, kept deliberately as one ~4,000-line file (desktop-app/app.py) so PyInstaller packages it into a single FormaPhotoExtractor.exe with no Python install on client machines. The only runtime dependency outside the exe is Poppler's pdftotext.exe, shipped alongside it. The landing page opens two modules: Extract & Validate and Push to Maximo.

Extraction pipeline (run_extract)

#StageHow it works
1Parse issue textpdftotext per page → build_issues() splits issues and reads description, issue ID, tag type (Asset / Location), asset status, assigned-to and parcel/location.
2Extract photosPyMuPDF pulls every embedded image per issue, across page breaks (5-photo issues span pages). Filters drop the Forma banner (is_banner), thumbnails below a minimum size (is_small) and soft-mask layers (is_smask).
3Build collagesOne JPEG per issue, description as a header, max 3 photos per row. Runs on min(32, cpu_count × 2) threads with a de-dup lock so two issues with the same description never overwrite each other (the second becomes Description_(2).jpg). Issues with no photos still get a labelled placeholder so output count = issue count.
4Read QR codesAn 11-strategy pipeline (below), then an optional Google Gemini Vision fallback (gemini-2.5-flash-lite, at most 4 concurrent calls) for photos that stay unreadable.
5Matchqr_match(): QR text vs. issue description, trimmed and case-insensitive → match, no_match or not_extracted.
6Categorise & versionget_category() (rules below) picks a folder; output goes into versioned sub-folders (V1, V2, …) so a re-run never mixes with an earlier batch. A “Maximo pushed” CSV can be supplied so already-pushed assets are versioned correctly. Results are re-sorted into stable PDF order after the parallel stage (fixes a count-inflation bug on re-runs).
7Review & exportQA/QC window: sortable table (Description, QR Text, Tag Type, Asset Status, Assigned To, Folder, QR Match Status), summary strip, CSV export.
8Validaterun_validate: every expected collage present, no unexpected files, every file decodes, duplicate descriptions flagged.
9Sync (optional, added in Part 2)If a backend URL and API key are set, the run is POSTed to /api/extractions/batch against the chosen parcel.

QR detection strategies (first hit wins)

#StrategyWhy
1zxing-cpp, originalBest general decoder
2GrayscaleRemoves colour noise
32× upscaleSmall or soft codes
4CLAHE contrastLow-contrast codes
5–8Four quadrant cropsTag often in a corner
9–10Gamma 0.5 / 1.8Over/under-exposed shots
11InvertedWhite-on-black stickers
12OpenCV detectorLast local resort
+Gemini VisionOptional cloud fallback

Roughly 50–60% of single photos give a readable code; because each issue has 2–5 photos, the per-issue rate is higher.

Category rules (get_category, in priority order)

ConditionFolder
Status “Additional”Additional
Status “Missing”Missing
Status “No Access”, or Installed with no photosNo Access
Any other status (e.g. “Double Height”)Its own folder
Installed + QR matchTag Installed and Matching
Installed + wrong QRTag Installed QR Unreadable
Installed + no QR readTag Installed QR Unreadable

Location tags get the prefix “Location Tag …”. Only the two “… Installed and Matching” folders are eligible for Maximo.

Packaging

build.py creates a clean virtual environment, installs only pymupdf, pillow, opencv-python-headless, zxing-cpp and pyinstaller, builds the exe, then finds Poppler on the build machine and copies pdftotext.exe and its DLLs into dist\. The clean venv matters: building from a global Python with TensorFlow or PyTorch installed produced multi-gigabyte executables; the clean build is about 80 MB.

Maximo integration: the hardest part of Part 1

KAFD runs IBM Maximo Application Suite 9.1 behind OIDC single sign-on, with customised classic-UI applications for tagging (zzassettag for assets, zzloctag for locations). There is no simple API path for “attach this image as the record's picture”, so the upload was built by recording the browser's traffic (HAR files) and replaying the classic UI's exact request sequence in MaximoSession.

Login (MaximoSession.login)

  1. GET /maximo/oslc/whoami → redirected into the OIDC flow.
  2. POST credentials to the identity server's j_security_check; follow the callback chain back to Manage.
  3. GET /maximo/oslc/login?csrf=1 → start the OSLC session, capture the CSRF token.
  4. GET /maximo/oslc/whoami → confirm the signed-in user.

The maxauth header does not work on this deployment; every request without a session is pushed into OIDC.

Upload (upload_image)

  1. Open a fresh classic-UI session (uisessionid + UI CSRF token).
  2. Load the app list, set the search value and filter rows.
  3. Poll longopquerycheck for results; click row 0 to open the record.
  4. Fire the ITEMIMAGE event to open the upload dialog.
  5. GET then POST uploadfile.jsp with the JPEG bytes.
  6. POST dialogok to commit; verify through OSLC.

Production problems found and fixed

The first three were solved during Part 1. The rest surfaced in production use and were fixed in the desktop app while Part 2 was under way (July–August).

ProblemCauseFix
Uploads failed at firstThree separate replay errors: wrong app name, wrong navigation path, wrong DOM focus IDsFound by comparing HAR traces of a manual upload with the script's requests
CSRF token not found on MAS 9.xToken appears as an unquoted JavaScript key in the pageExtraction handles both quoted and unquoted forms; UI CSRF bootstrap step
Retry after a partial failure silently skipped assetsThe code trusted the record page it landed on without checking it was the asset it searched for, so it read another record's “already has image”Assert the asset number appears in the loaded page before trusting its image state; ALREADY_HAS_IMAGE sentinel separates “skipped” from “failed”
Batches failed on exactly the 11th recordThe server caps classic-UI sessions at 10 per login (reproduced on asset and location batches)Fresh OIDC login every 4 UI sessions (_UI_SESSION_REFRESH_EVERY = 4), well under the cap
Second search in a session came back degradedA classic-UI session reliably opens only the first record searched in itEvery upload_image call starts its own UI session; retry with backoff (4 s, 10 s) kept as a safety net
Same asset pushed twice across runsNo memory of earlier pushes on a different laptopLocal pushed-asset cache plus backend lookup of pushed codes (/pushed-asset-codes) before each push

Every push writes an Excel report of pushed, failed and skipped records (with file size and push time) and, with the backend on, POSTs each result so the dashboard's Maximo status stays current.

Part 2 · Centralised database and web platform 13 Jun – 6 Oct

Part 2 started only after Part 1 was complete. It added a central source of truth (MySQL behind a REST API) and a client-facing view. The plan was written on 12 June, the day Part 1 wrapped up; the first phase of the dashboard, the backend services and the Excel import all landed on 13 June.

Desktop app (field laptop)POSTs extraction batches and Maximo push results; reads parcel list and already-pushed codes. HTTPS + X-API-Key.
▼
nginx + Let's Encrypt/ → Next.js on 127.0.0.1:3100 · /backend/ → Spring Boot on 127.0.0.1:8100. Neither app is exposed directly.
▼
Spring Boot APIJava 21, Spring Boot 3.3.5, Spring Security (JWT for users + API key for machines), Spring Data JPA with Specifications for filtering, Flyway migrations, Apache POI (streaming SAX import for large master files), async import jobs with progress polling.
▼
MySQL 8parcels, parcel_assets, parcel_locations, extraction_records (append-only log), maximo_push_results, parcel_asset_maximo_status, users.
▲
Next.js dashboardNext.js 16, React 19, TypeScript, AG Grid, Recharts, Lucide icons; server actions and route handlers for imports and CSV export; cookie-gated by proxy.ts; Playwright end-to-end tests.

Data model

A parcel's master file is the client's asset register: for Parcel 2.12, 11,949 rows in the master sheet (11,222 assets over 29 levels, BF5 to RF1) and 727 location codes. Each asset carries up to 36 fields (asset code, drawing tag, system/equipment codes, zone/parcel/tower/level/unit/room, location code, documentation references, progress). The dashboard grid shows a standard set of 19; older documentation fields stay in the database.

API surface

AreaEndpointsPurpose
AuthPOST /api/auth/loginJWT login; ADMIN and VIEWER roles
ParcelsGET /api/parcels, /{id}, /{id}/assets, /{id}/master, /{id}/master/stats, DELETE /{id}Parcel list, master data grid with server-side filters and stats
ImportPOST /api/parcels/import, GET /import/progress/{jobId}, POST /{id}/assets/anomaliesAsync Excel import with progress, anomaly detection before commit
ExtractionPOST /api/extractions/batch, GET /parcels/{id}/records, /records/stats, /summary, /dashboardDesktop runs in; records grid and QA/QC summary out
MaximoPOST/GET /api/extractions/{id}/maximo, POST /{id}/assets/{assetCode}/maximo, POST /{id}/maximo-status, GET /{id}/pushed-asset-codesPush results, direct per-asset status, bulk status upload, de-dup lookup
ProgressPOST /{id}/issue-summary, POST /{id}/assets/progress-syncACC Issue Summary import → asset progress
ReportingGET /api/dashboard/aggregated, GET /{id}/closeout, GET /api/healthCross-parcel stats, closeout summary, health check

Dashboard features

Dashboard

  • Progress, QA/QC and Maximo summary tabs
  • All parcels or one parcel
  • Totals, installed vs pending, donut and bar charts with percentages
  • Maximo pushed / pending / failed / not pushed, with date-range filter

Parcel page

  • Extraction Records, Master Data and Closeout tabs
  • Filters: folder, area, level, QR status, progress, version, Maximo status, date range
  • “Not in master” count for records with no matching asset
  • CSV export of records and master data

Admin

  • Upload parcel master Excel; anomaly modal before import
  • Help modal listing supported columns; downloadable template
  • Upload Issue Summary (ACC progress)
  • Upload Maximo Status (bulk, from 15 Sep)
Two rules every count follows

Latest record per asset. extraction_records is an append-only log, so an asset re-extracted three times has three rows. A bug report (“2 no match, but only 1 shows when filtered”) traced back to the dashboard counting raw rows while the grid filtered differently. Both now de-dup to each asset's latest record first (ParcelService.latestRecordsByNormalizedCode) and ignore records that resolve to no real asset.

One Maximo eligibility rule. Only assets filed under “Tag Installed and Matching” or “Location Tag Installed and Matching” are pushed, so Maximo Pending = those assets by latest record, minus the ones already pushed. It lives in one class (MaximoEligibility) that every stat uses. Several August fixes were about stats that had used a different definition.

Import robustness

ExcelImportService maps columns by header text, not position, after a client file with a different column order silently scrambled every field. Header aliases live in AssetSheetHandler / LocationSheetHandler, and the help modal and template file are kept in step with them. Large master files are read with POI's streaming SAX reader rather than loading the workbook into memory.

ACC progress sync: four designs, one kept

The goal was to bring the “Asset Status New” attribute from Autodesk Construction Cloud into each asset's progress. Three automated approaches were built and dropped before a simpler one was kept.

#ApproachResult
1Replay Autodesk's login over plain HTTPDead Login endpoints require an hCaptcha token only a real browser can produce.
2Server-side Playwright (first in the JVM, then a separate Node sidecar)Dead In the JVM it crashed with SIGABRT; as a sidecar it worked, but Autodesk served a visible hCaptcha puzzle almost every time, even headed and even from a developer laptop's home IP.
3Browser-extension bridge: the user signs in themselves; an unpacked extension reads issues from their tab and posts them backWorked, shelved Proven end to end, but the one-time developer-mode install was too much friction.
4Upload the “Issue Summary” .xlsx that ACC already exportsDeployed No login, no automation, no captcha. Checked on KAFD's real export: 4,785 rows, 4,751 of 4,757 unique asset codes matched (99.87%); the 6 misses were placeholder text in the source.

Deployment and CI/CD

Production

  • Shared Hostinger VPS; two pm2 processes (txg-vision-backend, txg-vision-frontend) bound to localhost only, other tenants' processes left alone.
  • nginx reverse proxy, TLS from Let's Encrypt with auto-renewal.
  • MySQL local to the VPS; Flyway runs migrations on backend start.
  • A Docker Compose file (MySQL, backend, frontend, nginx) exists as an alternative full-stack setup.

GitHub Actions (since 13 Sep)

  • Push to main deploys; dorny/paths-filter rebuilds only the app whose folder changed.
  • Dedicated ed25519 deploy key, because the root password on the shared box rotates without notice.
  • Health checks poll instead of sleeping; ssh-keyscan retries on network flakiness.
  • Found and repaired a corrupted authorized_keys file (several keys glued onto one line by another tenant's pipeline), validating each key with ssh-keygen -l.

Milestones

  • 23 MayMaximo OIDC login working; CSRF handling for MAS 9.x over the next week
  • 29 MayImage upload through the classic UI (ITEMIMAGE event, message-box detection)
  • 7–11 JunExe releases; Excel export of pushed records; “Assigned To”; location tagging (zzloctag)
  • 11–12 JunVersioned output folders; category rules reworked · Part 1 complete; Part 2 plan written
  • 13 JunPart 2 starts: centralised MySQL database, backend services, Excel parcel import, dashboard phase 1, Playwright
  • 8 Jul“Final Working Version” of the combined system
  • 11–12 JulUI refresh; push de-dup (local cache + backend); per-asset Maximo status table
  • 28 JulHelp modal, master-data template, deployment guide
  • 4–23 AugACC sync attempts 1–3, then the Issue Summary upload (23 Aug)
  • 9 AugMaximo session hardening: fresh UI session per upload, backoff, proactive re-login
  • 26 Aug–3 SepArea/level filters, closeout summary, aggregated dashboard, date and version filters, eligibility fixes
  • 13–14 SepCI/CD auto-deploy with path filtering
  • 15 Sep–6 OctMaximo status upload, stats endpoints, folder filters, “not in master”, not_pushed state

Screens

Captured from a local run on synthetic demo data (one demo parcel, 274 demo assets). No client data.

Vision Suite dashboard, progress summary tab
Dashboard · Progress Summary: totals, installed vs pending, charts
Vision Suite Maximo summary
Dashboard · Maximo Summary: pushed, pending, failed, not pushed
Extraction records grid with filters
Parcel · Extraction Records with the full filter bar and CSV export
Master data grid
Parcel · Master Data: the client's asset register
QA/QC summary
Parcel summary: category folders, QR status and Maximo status
Upload master data page
Admin · Upload parcel master data

Status and open items

  • Live at vs.txgksa.com; deploys on every push to main.
  • Data issue Parcel 212's extraction records use a different numbering scheme from its own master file (e.g. …-3500014 vs …-2500001), so none of them resolve to a master asset. This is a data problem, not a code bug: either the wrong PDF was extracted against that parcel, or the master file needs re-importing. Flagged, not yet resolved.
  • Option kept If live ACC sync is ever needed, the browser-extension bridge (attempt 3) is the proven fallback.

Project 2

Revit AI

Native Revit models from AutoCAD plans, MEP drawings and laser scans, with no AI-drawn geometry.

Host
Autodesk Revit 2026 (.NET 10) and 2024 (.NET Framework 4.8)
Period
24 Sep – 10 Nov 2026 · 76 commits
Code size
C# ~39,000 · Python ~6,100 · TSX ~1,750 lines
Tests
290 xUnit tests + pytest for the server + eval baselines
AI tools
54, reachable from the chat, the ribbon/forms and MCP
Status
0.1.x test builds; licence server built, not yet deployed

Revit AI started as one command, Create Room, that turned a sentence into one rectangular room. Over seven weeks it grew into a licensed product: importers for architectural DWGs, MEP drawings and point clouds; KAFD's asset-coding workflow; BOQ, clash, sheet and parameter tools; an in-Revit AI assistant; and a licence and update server with an admin console. The pane carries TXG branding.

Design rule AI produces design intent only. Coordinates come from parsers, scans or people, never from a language model. Every element is built by deterministic, tested C#. The BuildingSpec JSON rejects unknown fields, so an invented LLM field fails loudly instead of silently.

Architecture

Everything converges on one intermediate format, BuildingSpec (JSON, metres, relative to Revit's internal origin), and one builder turns it into native elements inside a single undoable transaction group.

INPUTSDWG/DXF · MEP sheets · scans · JSONACadSharp; .rcs/.rcp via Revit; .e57/.las/.ply/.xyz/.pts via own readers
EXTRACTWorker processLayer roles, wall faces → centrelines, doors, rooms, stairs, MEP runs, scan walls
SPECBuildingSpecLevels, grids, walls, openings, slabs, rooms, columns, MEP, annotations
CLEANValidator + RegulariserSnap, cluster, merge, join, de-overlap, fit openings
REVIEWAI PanelCounts, issues, low-confidence items; exact-size types option
BUILDModelBuilderOne TransactionGroup; one Ctrl+Z undoes the import

Solution layout

ProjectRole
RoomAILoaderThe DLL Revit loads and locks. Kept thin: assembly resolver, dockable-pane host, Worker launcher, ribbon built from the payload's ribbon.json through 60 fixed slot commands, licensing (activation, token store, background renew and update).
MinimalRoomAI (payload)All Revit API code, byte-loaded on each click so it hot-reloads without restarting Revit: the AI Panel (Import / Tools / Assistant tabs), every tool handler, ModelBuilder, ModelExporter, Annotator, the ExternalEvent bridge.
RevitAI.CoreNo Revit reference, fully unit-tested: BuildingSpec + validator, Regulariser, TypeMatcher, DWG layer-role rules, SpecComparer (scoring), LabelPlacer, dependency-free XLSX writer/reader, BOQ workbook, clash run/report, Smart Select rules, renumbering, AIR codes, tool catalogue, LLM clients, agent loop, MCP server.
RevitAI.WorkerSeparate exe for heavy or native work: DWG parsing (ACadSharp), point clouds including an own ASTM E57 reader, scan-based MEP extraction, MCP server. A crash here is a restart, not lost work.
RevitAI.EvalCLI that scores importers against known-answer specs exported from the real Revit models, with a regression baseline (fails if any score drops more than a point).
server/ + dashboard/Licence and update server (FastAPI, SQLite, Caddy) and its admin console (Next.js 16).

Regulariser, in order

1Snap anglesLength-weighted median of a mod-90° histogram; curtain walls don't vote
2Cluster thicknessesGroup near-equal wall widths
3Merge collinearExcept where a third wall crosses (keeps X-junctions)
4Join endsL/T/X joins; never moves a wall to a curtain wall
5Resolve overlapsDrop a double only if less confident and within 70% of thickness
6Fit openingsClear of wall ends and of walls joining part-way

DWG import: the KAFD Parcel 1.08 hotel

The main test case was KAFD Parcel 1.08, a 27-level hotel in Riyadh (BF4 to RF1), with as-built architectural DWGs per level and the client's Revit models as ground truth. The DWGs sit about 148° rotated from the Revit model, so the comparer does a rigid alignment before scoring.

19,076
walls built for the whole building (Revit 2024, 13 Oct)
1,413
doors
1,357
rooms
761
columns
105
stairs
45
slabs with shaft and stair holes

Accuracy against the client's Revit model (mean over 23 regular levels)

Wall recall
~82%
Wall precision*
~78%
Wall thickness
~89%
Door recall
~85%
Door precision
~93%
Rooms
~93%
Columns
~80%

*Precision is a lower bound: the DWGs also contain other models' walls (the façade model), which count against it. Four small levels (01I, 16M, 16N, RF1) are too small to align and are left out of the mean. RF1 was refused at build time: it sits in another frame, 104 km away.

What real drawings taught the importer

  • Revit-exported DWGs nest the model inside blocks, and ACadSharp's explode gave nested inserts the wrong rotation (fixed in DwgPrimitives).
  • KAFD stacks 215/240/320 mm walls on one line and overlaps 100 mm linings onto block walls, and each is hatched. Removing more “duplicates” lowered recall against the real model, so two hatched walls both stay.
  • Long façade glass on level 016 pulled the snapped building directions round (wall recall 93.1 → 87.5) until curtain walls were excluded from the angle vote.
  • After a commit, Revit's failure handling may delete elements. The first real build died with “referenced object is not valid”; every element is now checked with IsValidObject across commits and build errors name their stage.
  • Imports carry the drawing's notes and tag what was built, using a label placer that tries on-element, beside, then on a leader, and never overlaps (level 005: 113 architectural tags + 5 notes; 225 HVAC tags + 110 notes; 0 overlaps).

MEP from drawings

All 245 KAFD MEP sheets extract (electrical, ELV, fire fighting, fire life safety, HVAC, plumbing). Ducts come from centrelines, cable trays from outline pairs, terminals, fixtures and equipment from blocks. Runs are joined into a network and built with real fittings (elbows, tees, crosses, transitions) from the template's routing preferences.

Scores

Ducts (level, recall)
100%
Ducts (precision)
99.6%
Pipes (recall)
98.4%
Pipes (precision)
97.4%
Air terminals, sprinklers
~100%

Across all sheets: ducts 95–99%, pipes 98–99% where drawn. Low scores are what a sheet leaves out.

The coordinate problem

MEP sheets are not in one frame: KAFD's plumbing sheet sits 123 m off its siblings, and the ground-floor HVAC sheet −125.26 m. Each MEP extraction therefore also returns its architectural background, and the importer lines the sheet up with the model's walls before building. Every MEP build opens its own uncropped coordination plan, because the template's plans showed none (or half) of the 505 ducts on level 005.

Second client, HVAC ducting check (7 Oct). A QA list of reported ducting discrepancies for basements B1 and B2 was checked against the client's model and IFC drawings with check_mep_discrepancies.py: B2 all 13 issues resolved; B1 6 resolved and 7 unverifiable until the B1 ducting DWGs are supplied.

Point clouds (Phase 3)

Readers for .las, .ply, .xyz, .pts and .e57 (an own E57 reader, no libE57) plus ReCap .rcs/.rcp sampled through Revit. Large scans are voxel-thinned while reading and cached. The extractor finds levels, walls (paired, or one-sided with a known face), columns, doors, and MEP runs and equipment, with trust tiers so low-confidence guesses are flagged rather than built silently. Define element lets a user click an object in a linked scan, name it, and have the add-in measure and place it.

CaseResult
KAFD 506 BF5 grey-water plant room (.rcs)Walls 79.9% recall / 92.6% precision; doors 3/9; columns 11/14; services 38.9% found / 77.3% real; pipe sizes 71% right. Built in Revit 2026.
LivingBIM public dataset, L1_HWWalls 53.1% / 43.6%; doors 2/11
Point-device classifier experimentAUC 0.82 for lights/sprinklers; not shipped

Open: ducts fitted as pipes (square sections read as circles), trays tight under the slab, small pipes read twice, thresholds tuned on one scan only.

AIR codes: KAFD asset information

A from-scratch port of the client's asset-coding workflow (previously a separate tool). The modeller enters seeds (System Code and Equipment Code on assets, Unit Number and Number on rooms/spaces); everything else is derived from the client's AIR workbook (tabs 07–15, found by number and header text) and written across every category.

FieldRule
Location CodeLF-108-HOTL-<floor>-<unit>-<room number>; the room number is used verbatim (the old tool double-prefixed it, e.g. MCRMCR31)
Asset CodeSYS-EQP-<parcel prefix><5 digits>, numbered per system+equipment by level elevation, location, row, id. Existing valid codes are kept; new ones continue after the max.
Parent Asset CodePer family:type, registry stored in the model (Extensible Storage on Project Info)
Host room/spaceSpace, then room, at the element's point, then 1 m above its level, then linked rooms; own level first, never below (the old tool's probe found the floor below)
DisciplineLearned from the model where coded assets agree; defaults only fill gaps
Missing parametersBound to every category (the old tool stopped after Mechanical Equipment, so Parent Asset Code was never written)

Seven tools (setup, rooms, units, assets, clear, audit, export) on their own ribbon panel. Run on the MEP model MEP-AIM-00001 in Revit 2026: the client's existing codes were kept, and a re-run made 0 changes. Four client data issues were found to report (duplicate numbering, a type coded two ways, and others), plus 242 of 244 MEP spaces with no area.

BOQ, clash, sheets and model tools

BOQ (checked on the KSIA T6 airport model)

create_schedule makes a Revit schedule per category; export_boq writes itemised and count workbooks plus a summary, laid out like the client modeller's own. Walls: 12,931 in 44 types matched the reference workbooks per type; plumbing fixtures matched too.

Clash

Revit has no Interference Check API, so run_clash_check probes solids with ElementIntersectsSolidFilter. Runs are saved for refresh and diff, reviewed in a 3D view, and exported as an HTML report. 3,280 × 3,280 elements took 121 s.

Views and sheets

Plan sheets at the right scale (overall and part plans), sheets from an Excel list, place views, batch PDF/DWG export, tag any plan with the overlap-free placer.

Model data

Parameter export → edit in Excel → import with preview and Apply; Smart Select (text rules); Renumber rooms/doors/sheets by level; Purge Unused; IFC export; open/save/reload links without blocking Revit.

AI assistant and MCP

The Assistant tab is a chat with the open model. It can use all 54 tools, the same ones behind the ribbon buttons and forms. Tools that change the model show an Allow / Deny card in the chat (with an optional per-chat auto-approve), and each change is one undo step.

Providers

  • Anthropic API key
  • OpenAI or any OpenAI-compatible server (Ollama, LM Studio, llama.cpp)
  • “Claude Code”: the user's own claude.exe, with shell and file tools disabled and only the Revit MCP server allowed

Guard rails

  • Keys encrypted per Windows user (DPAPI), never in settings or logs
  • Default spend cap: $0.50 per chat, 8 tool steps, 1,024-token replies
  • Saved chats, Markdown replies, model and effort picker

Outside Revit

  • Local bridge on a named pipe, current user only, token-protected, off by default
  • MCP server (stdio) so Claude Code or Claude Desktop can drive Revit
  • A Claude skill describing the build-from-drawings workflow

The 54 tools

Group#Tools
Read the model7
get_model_infolist_elementsget_elementget_warningsget_selectionpick_pointselect_elements
Import & build9
extract_dwgimport_dwgimport_mep_dwgimport_point_clouddefine_elementbuild_specundo_last_buildget_last_build_reportexport_model_spec
Views & sheets10
list_viewsopen_viewopen_3d_viewcapture_viewcreate_plan_sheetscreate_sheetplace_view_on_sheettag_elementssheets_from_excelexport_sheets
BOQ & coordination5
create_scheduleexport_boqrun_clash_checkshow_clashexport_clash_report
Model edits & data10
set_parameterdelete_elementslist_templateslist_typesexport_parametersimport_parametersselect_by_filterrenumberpurge_unusedexport_ifc
Documents5
new_projectopen_documentclose_inactive_documentssave_documentreload_links
AIR codes7
air_setupair_roomsair_unitsair_assetsair_clearair_auditair_export
Developer1
reload_pane

The licensing product

Revit AI is built to be sold under licence. A client install is one double-click on install.bat; after that, the loader activates, renews and updates itself in the background.

Licence and update server

  • FastAPI + SQLite behind Caddy (no Docker).
  • Tokens are base64url(JSON).base64url(RSA-SHA256 signature); two RSA key pairs (licence, release), private halves never in the repo.
  • Routes: activate, deactivate, refresh, updates, release download, admin licences and releases.
  • Releases install only if the SHA-256 and release signature match. A 401/403 on refresh locks immediately; a network error doesn't (offline grace until expiry).

Admin console (Next.js 16)

  • Overview, licences (bulk modules, access, seats, revoke), licence detail, new licence, releases, activity log, users, account.
  • scrypt passwords + TOTP authenticator; roles; sensitive actions ask for the password again.
  • Session in an httpOnly cookie, relayed by a backend-for-frontend route with an Origin check.
ModuleWhat it unlocksStandardProInternal
ImportDWG, MEP drawings, point clouds, BuildingSpec✓✓✓
DataExcel parameters, schedules, BOQ, IFC✓✓✓
ModelSmart Select, Renumber, Purge, parameter edits✓✓✓
Views & SheetsPlan sheets, sheets from Excel, batch export✓✓✓
CoordinationClash checks, review, reports✓✓
AIR codesAsset and location codes, audit✓✓
AssistantChat with the client's own key or a local model✓✓
MCP connectorClient's Claude Desktop / Code uses the tools✓✓
Claude sign-inChat on the user's own Claude subscription✓ only

The Claude sign-in provider is restricted to Internal licences: Anthropic restricts third-party products from offering claude.ai login, so for clients the API-key providers are the supported path. The server refuses it on client licences and strips it from client tokens.

Two Revit versions from one codebase

Revit 2026 runs on .NET 10, Revit 2024 on .NET Framework 4.8. Loader, payload and Core multi-target both; missing .NET APIs are shimmed in src/Compat and only true Revit API differences use #if REVIT2024. The installer finds every Revit 2024/2026 on the PC and refuses a Revit 2026 that isn't on .NET 10 (seen on a modeller's PC on 2 Nov).

Milestones

  • 24 SepHot-reload loader and the original Create Room command
  • 28 SepRoadmap (DWG → point cloud → local AI → MEP); BuildingSpec builder closed in Revit 2026; eval tool
  • 29–30 SepReal KAFD DWGs: lining walls from hatches, curtain walls, exact-size types, RoomPlacer, rotation-aware scoring
  • 3–4 OctMEP extraction and network connectivity; Anthropic/OpenAI clients; Claude Desktop integration
  • 6 OctRevit 2024 MEP exporter; second-client ducting discrepancy check
  • 11–12 OctTXG theme; Claude Code provider + MCP server; Markdown chat and history; approval system; sheet tools
  • 13 OctSlabs with holes, Revit 2024 support, whole hotel built, point-cloud processing
  • 16 OctBOQ and clash, checked on the airport model
  • 17–18 OctLicensing and tools; AIR codes on the ribbon; purge, sheets from Excel, export sheets
  • 19–27 OctKnown-face walls, scan MEP, define element, trust tiers, ReCap density, own E57 reader
  • 2 NovRevit 2026 / .NET 10 installer check
  • 8–10 NovAIR change tracking; notes and overlap-free tags on imports

Screens

Revit AI panel import tab next to a 3D model
AI Panel · Import tab beside the sample two-storey building it built
Revit AI assistant chat
Assistant · chat with suggested questions and the approval badge
Revit AI assistant settings
Assistant · Settings: provider, model, effort and per-chat limits
Revit floor plan built by Revit AI
Level 2 plan built from a spec: walls, doors, windows, grids

Status and next steps

AreaStatus
Foundations, BuildingSpec builder (Phases 0–1)Done checked in Revit
DWG import (Phase 2)Done whole KAFD hotel built; follow-ups listed below
MEP from drawingsDone 245 sheets; not yet: terminals connected to runs, circuits, heights from drawings
Point clouds (Phase 3)In progress working on BF5; needs more scans to tune
AIR codesIn progress MEP-AIM-00001 done; 00002–00004 and ASI models next
BOQ, clashChecked in Revit 2024; clash against linked models untested
Licence server + consoleBuilt checked locally end to end; not deployed
Local AI (Phase 4)Planned benchmark a 27B model against a 4–8B one on the office hardware
  1. AIR: fix spaces without area, finish the remaining MEP and ASI models, report four client data issues.
  2. Round 1 test in Revit of every form, drop-down, Excel round trip, Smart Select and Renumber; then server mode against a local server.
  3. Deploy the licence server and console on a VPS; choose the product name; obfuscate the payload; code-signing certificate.
  4. Round 2: remote MCP relay (claude.ai connector with OAuth), metered AI proxy per licence, payments → licence.
  5. Install Revit 2024 build on a tester's PC; clash against linked models; point-cloud tuning; KAFD DWG follow-ups.

Project 3

Measura

Bill-of-quantities takeoff from DWG drawings, inside AutoCAD.

Host
AutoCAD 2027 (.NET 10); full AutoCAD and verticals
Period
8 – 12 Nov 2026 (pilot on 10 Nov)
Code size
C# ~11,000 · Python ~800 lines
Tests
65 unit tests; headless and live AutoCAD scripts
Commands / tools
13 AutoCAD commands · 21 AI tools
First real job
KAFD hotel level 005: 10 drawings → one BOQ

Measura reads a drawing's geometry (polylines, hatches, blocks), measures areas, lengths and counts, tags each measurement with a BOQ item, and exports the bill of quantities to Excel. A side panel shows the live BOQ and hosts an AI assistant. The architecture is a port of Revit AI's, which is why it reached a working pilot in about three days.

Design ruleQuantities come only from deterministic code (DrawingReader → TakeoffEngine). The assistant chooses tools, maps layers to items and tags entities; it never estimates a quantity and cannot draw.

Commands

CommandWhat it does
MEASURA / MCHATOpen the side panel (Takeoff / Assistant tab)
MSETUPShow, switch or edit the BOQ item master and its rules (items.json)
MAUTOMeasure every entity that matches the rules; print the BOQ and per-class read timings
MPICKInteractive takeoff: pick an item, then select objects or click inside areas (boundary trace)
MREVIEWList and select what the BOQ doesn't cover, plus issues
MEXPORTExcel export: BOQ, Takeoff, Unmatched and Issues sheets
MBATCHSeveral drawings → one BOQ, read from disk without opening them
MLEGENDColour-legend BOQ for containment, cable tray and duct layouts
MSAMPLE · MHELLODraw a sample plan · smoke test (versions, units, bridge)
MBRIDGE · MRELOADLocal bridge on/off · load the newest build without restarting AutoCAD

A Measura ribbon tab (Takeoff, Setup and Assistant panels) runs the same commands. Its icons are drawn from Segoe Fluent glyphs at run time, so there are no image files to ship.

The takeoff engine

Measurement rules

EntityQuantity
Closed polyline, hatch, circle, regionArea
Open polyline, line, arc, splineLength
Block referenceCount (dynamic blocks resolved, attributes read)

Rules can turn length into area (height: wall length × height), apply a factor (both wall faces = 2), filter by entity type or drawing name, skip marker crosses and short pieces. One entity can feed several items (wall centreline → wall length and plaster area).

Tags and de-duplication

Manual tags from MPICK are stored as XData on the entity, so they survive save and reopen. Tags win: a tagged entity is measured only for its tagged items.

Every entity gets a geometry signature rounded to 1 mm (line ends, arc centre and radius, polyline vertices and bulges, block name and position including Z, rotation and scale, hatch extents, area, pattern and loops). A signature already counted for an item is a duplicate. This matters: Revit's DWG export draws every pipe centreline twice and adds “+” markers. On KAFD level 005, pipe lengths were 2.1–2.3× the model until de-duplicated.

{ "code": "WL-002", "description": "Wall plaster, both faces", "unit": "m2", "rate": 0,
  "rule": { "layer": "M-WALL-*", "measure": "length", "height": 3.0, "factor": 2 } }

items.json is strict: unknown fields are rejected, codes must be unique, and height only goes with length or perimeter, so typos fail loudly. Units come from INSUNITS; a unitless drawing is read as mm and flagged everywhere.

Several drawings, one BOQ

MBATCH, the ribbon's Combine drawings button, or a plain request to the assistant (“open all the 005 drawings and export the BOQ as one”). Drawings are found by folder and file-name pattern and read as side databases straight from disk, never shown and never written. The workbook has a BOQ sheet whose totals are live SUM formulas over one column per drawing, plus Drawings, Takeoff, Unmatched (grouped by Revit family) and Issues sheets. Headless, 10 drawings take about 19 s.

Colour-legend BOQ

For drawings that colour each service and show a colour legend (typical of Revit-exported ICT containment layouts), the legend itself becomes the item list, so no items.json is needed. Built and checked on a KSIA T6 ICT containment tile.

How runs and fittings are measured

  • Each centreline is a run; its service is the colour of the fill it is the middle of; width is measured rail to rail.
  • Runs cut where they pass under crossing runs are bridged; a run whose centreline is fully hidden is rebuilt from its visible fill.
  • Runs stacked under another service for their whole length are found from loose ends and followed along the covering service's route (Dijkstra over runs, fittings and vertical drops).
  • Fittings (bends, tees, reducers) counted per type, width and angle; the centreline length through each is added to its run.
  • Hatch background colour is part of a swatch's identity: four government services shared one hatch colour and differed only by background.

Result on KSIA T6 tile 035

14
legend rows, all distinct
105
centrelines
552.0 m
all accounted for (Check difference 0)
177.5 m
of runs hidden under other runs, now measured

A no-legend duct mode (12 Nov) reads duct tags (“W x H mm SYS”) to name colours: on a ventilation tile it found ~1,550 m of duct, 686 fittings and 150 equipment/accessory items. The Check sheet must always balance to 0.

Validation on a real job: KAFD hotel level 005

The first real job combined the 10 level-005 sheets (architecture, electrical, ELV, fire fighting, fire life safety ×2, HVAC, plumbing ×2, security) with a 32-item rule file, then compared the result with the client's Revit model exports from the Revit AI project.

ItemMeasura (DWG)Revit modelNote
Sprinklers125125exact
Air terminals105105exact
Data outlets1616exact
Windows44exact
Electrical equipment6465one panel inserted twice at one spot
Fire alarm devices151155
Security devices4445
Ducts430 m401 mdrawing centrelines run through fittings; the model's pipe/duct list doesn't
Fire pipe573 m543 m
Plumbing pipe821 m748 m
Chilled water172 m157 m
Cable tray96.8 m94.0 m4 outline lines per run ÷ 4; pieces < 0.2 m skipped

The same job through the AI panel (“open all the 005 drawings and export the BOQ as one”) called takeoff_files then export_boq_files, showed the Allow card, and produced identical quantities to the MBATCH file.

Performance fix: 10.6 s → 0.1 sThe level-005 architectural plan (4 MB, 5,333 entities, 768 hatches) froze AutoCAD with the panel open, because every drawing switch ran a full takeoff on the main thread. Two changes: slow areas (hatches ~14 ms each, regions, splines) are computed only when a rule or tag needs an area, and the panel reads in ~40 ms slices at background priority. Takeoff dropped from 10.6 s to 0.1 s and AutoCAD stayed responsive, even with a stress rule measuring all 768 hatches.

Assistant and tools

The Assistant tab can read the BOQ, find unmatched layers, map a layer to an item, tag entities and export. Anything that changes the drawing or writes a file waits for Allow. Providers match Revit AI's (Anthropic, OpenAI, local OpenAI-compatible, Claude Code). Measura.Mcp.exe exposes the same tools to Claude Code or Claude Desktop through the local bridge.

Group#Tools
Drawing8
get_drawing_infolist_layerslist_blocksget_entityget_selectionselect_entitiesselect_unmatchedcapture_view
BOQ7
list_itemsget_takeoffget_unmatchedget_issuesset_itemremove_itemexport_boq
Tagging2
tag_entitiesuntag_entities
Multi-drawing2
takeoff_filesexport_boq_files
Colour legend2
legend_takeoffexport_legend_boq

Testing approach

  • Unit tests (65): wildcards, units, config, takeoff maths, export, tool catalogue, MCP, agent loop, legend takeoff; a harness re-runs a dumped legend scene.
  • Headless AutoCAD (acad_smoke.py, core console): loads Measura, draws the sample, runs MAUTO, MEXPORT, MPICK (boundary and selection), MREVIEW, and checks every quantity (FL-001 36 m², WL-001 30 m, WL-002 180 m², SK-001 17.1 m, DR-001 2, WN-001 3).
  • Live AutoCAD (acad_live.py, a separate instance): panel, bridge, 16 tool checks, MCP exe, screenshot. Neither script touches the user's own AutoCAD, and both restore the one profile setting they change.

Screens

Measura takeoff panel
Takeoff tab: live BOQ, items not in the BOQ, issues
Measura assistant after a combined BOQ
Assistant after combining the 10 level-005 drawings into one BOQ

Status and next steps

Builds clean 65 tests green Pilot Checked headless and in a separate AutoCAD. Not yet checked: the API-key providers, keyboard typing in the palette, undo of tags from the panel, the light theme, and the release installer on a clean PC.

  1. Hands-on checks in AutoCAD (chat typing, API-key chat, Allow card, Pick, undo, dialogs, light theme).
  2. Reinstall the loader on the user's AutoCAD so MBATCH and MLEGEND are available as commands.
  3. Legend BOQ: other T6 tiles as one batch, edge overlap between tiles, line-style legends, legend override file.
  4. KAFD: other levels, an ignore list for annotation layers, items by block family, vertical runs (model 3D pipe length is ~1.7× plan length), client rates.
  5. Saved chats; per-drawing items file; measurement-standard deductions (IS 1200 / POMI); AutoCAD 2025/2026 build (.NET 8); licensing like Revit AI.

Project 4

Senku for Navisworks

Takeoff, clash, model data and TimeLiner on federated models, with 55 AI tools.

Host
Navisworks Manage 2026 (.NET Framework 4.8)
Period
12 – 14 Nov 2026 · pilot on 14 Nov
Code size
C# ~13,500 · Python ~870 lines
Projects
7 (loader, payload, core, MCP, driver, DB, compat)
AI tools
55, each with a live check
Reference model
KSIA T6 (13,944 and 33,455-object models)

Senku is the third product on the shared architecture, this time for Navisworks, where federated models from many disciplines come together. It reached a working pilot in about two days.

Features

BOQ takeoff

Rules in items.json map objects by category, family, type, level, system or any property, and measure by count, length, area, volume or from the mesh. Excel export with BOQ, By level, Takeoff, Unmatched and Issues sheets. Also colours the model by item, saves search sets, tags objects, and syncs to Navisworks Quantification.

Clash

Create and run tests, group results by level and other fields, set status, export xlsx, HTML (with images) and BCF reports, and measure minimum clearance. Grouping handles 16k results in about 6 s.

Property export templates

The Export tab lists every property in the model. Tick, reorder and rename columns, save as a named template, reuse on any model. One sheet, or one per category, level, type, family, file, system or property, plus a Summary. Numbers in SI units.

Model data and TimeLiner

Model checks; import of filled-in Senku/… columns back into the model; snapshots and comparisons; TimeLiner tasks generated by level and category, with costs from the BOQ.

Assistant and MCP

Chat in the side panel with all 55 tools. Defaults to Claude Code (the user's own sign-in, no key needed); also Anthropic, OpenAI, Ollama, LM Studio. Model-changing tools ask first. With the bridge on, Claude Code or Claude Desktop use the same tools through Senku.Mcp.exe.

Headless batch driver

Senku.Driver.exe starts a hidden Navisworks, opens files (or a folder + pattern), runs tools in order and writes JSON results. A headless batch BOQ export takes about 16 s. --each processes one file at a time and restarts Navisworks every 10 files or after a failure.

BOQ that leaves nothing out

Every object in the model ends up in the BOQ. Objects no rule covers get an automatic item per category (AUTO-01, AUTO-02…), measured as length when most objects have one, area for walls, floors, ceilings and roofs, and count otherwise. They are noted on the Issues sheet but not saved; Draft items from model turns them into real items with rates. "cover_all": false switches this off.

1ReadEvery object into a LiveElement, in main-thread slices
2WarmPre-read only the properties and meshes the rules need
3TakeoffTags first, then rules → lines, measured, unmatched, unmeasured, issues
4CoverDraft AUTO items for what's left, run again on just those objects

The KSIA model sits about 2.2 million feet from the origin, so mesh maths runs relative to each object's centre to keep precision. Open meshes get no volume rather than an estimate.

Performance on the KSIA T6 models

OperationModelTime
Read the modelKSIA T6, 13,944 objects~4 s
Group clash results16,000 results~6 s
Headless batch BOQ exportKSIA T6~16 s
Read the modelT6 ICT, 33,455 objects, 5 categories~11 s
Full takeoffT6 ICT~40 s
Export every property of every objectT6 ICT~3 s
Property discovery (sampling up to 2,000 objects)30k+ objects~1 s
Full model dump (5.39 M property rows, 33 MB)T6 ICT41 s

PostgreSQL model-data export (in progress)

The aim is every NWC file under a root folder (subfolders = disciplines) in a local PostgreSQL 18 database (schema nw), so model data can be queried across files.

PhaseWhatStatus
1 · File namesSenku.Db scan: records each file, splits its name into 8 codes + revision + description, re-hashes only changed files, lists naming issues in a viewDone
2 · Dumpsdump_model tool + Driver --each: per file, objects.tsv.gz and props.tsv.gz in COPY format, written as .partial then renamedDone
3 · LoadSenku.Db load: one row per element across files keyed by Item/GUID; reloading a changed file = delete its rows + insertNext

Solution layout

ProjectTargetRole
Senku.Loadernet48The DLL Navisworks loads and locks: startup, dock pane, ribbon, automation add-in. Forwards by name to the payload.
Senkunet48Payload, byte-loaded: all Navisworks API code, the panel, the tools, the bridge server.
Senku.Corenet48 + net10.0No Navisworks reference: BOQ rules and takeoff, xlsx, clash reports and BCF, snapshots, LLM clients, agent loop, MCP. Unit-tested.
Senku.Mcpnet48stdio MCP server forwarding to the bridge pipe (net48 so client PCs need no extra runtime)
Senku.Drivernet48Headless batch runner through the Automation API
Senku.Dbnet10.0PostgreSQL loader (Npgsql), embedded SQL migrations; never loaded by Navisworks

The 55 tools

Group#Tools
Model & selection13
get_model_infolist_categorieslist_typeslist_propertiesget_objectfind_objectsget_selectionselect_objectsisolate_objectshide_objectscolor_objectscolor_byreset_view
Views5
capture_viewlist_viewpointssave_viewpointshow_viewpointsection_box
BOQ13
list_itemsget_takeoffget_unmatchedget_issuesselect_item_objectsset_itemremove_itemauto_itemstag_objectsuntag_objectsexport_boqsave_search_setsquantification_sync
Clash9
list_clash_testscreate_clash_testrun_clash_testsget_clash_resultsshow_clashset_clash_statusgroup_clashesexport_clash_reportmin_clearance
Model data11
check_modelexport_propertieslist_model_propertieslist_export_templatessave_export_templatedelete_export_templateimport_propertiesset_user_propertysave_snapshotcompare_snapshotdump_model
TimeLiner2
list_taskscreate_tasks
Files2
append_filessave_model

Status and next steps

Pilot 0.1.0 Packaged as Senku-0.1.0.zip with a per-user install.bat (no admin rights). Live checks run in a separate Navisworks and never in the user's own.

  • Phase 3 of the PostgreSQL export (load dumps into the database).
  • 2D-sheet takeoff is not built yet.
  • Known limits: grid lines show in view captures (the API can't hide them); BCF cameras use Navisworks coordinates, with elements matched by IfcGuid and Revit element ID.

Across projects

Shared architecture

Revit AI established a pattern for building AI-assisted add-ins inside Autodesk products. Measura and Senku reused it file for file where they could, and a fix in one is worth mirroring to the others.

Thin loaderThe only DLL the host (Revit, AutoCAD, Navisworks) loads and locks. Registers commands, ribbon and dock pane; resolves dependencies; forwards everything else by name. Changing it means closing the host app, so it changes rarely.
▼ reads as bytes, never locked
PayloadAll host-API code, the side panel (code-only WPF, because compiled XAML breaks under byte loading), the tool handlers and the bridge. Rebuild and press Reload: hot reload without restarting the host. Core gets a new assembly version on every build so a reload never binds to the old copy.
▼ calls
Core libraryNo host-API reference, so it is unit-testable: rules and takeoff maths, specs, XLSX writer (no dependencies), tool catalogue, LLM clients, agent loop with spend cap, MCP server.
▲ same tools ▲
Three front ends, one toolA tool is one definition in the catalogue plus one handler. The ribbon/form, the in-app chat, and external clients (Claude Code / Desktop via MCP over a local named-pipe bridge) all call the same handler. Tests check the catalogue, handlers and ribbon stay in step.

Threading discipline

Host APIs are single-threaded. Revit calls go through an ExternalEvent queue, AutoCAD through a dispatcher bridge with document locks, Navisworks through NwBridge.Run. Long jobs are sliced so the host stays responsive (Measura's 10.6 s → 0.1 s fix is the clearest case).

Safety by default

Change-making tools need Allow in chat. The external bridge is off unless ticked, reachable only by the current Windows user, and token-protected. Keys are DPAPI-encrypted. Tests never run in the user's own host instance.

Measured against ground truth

Revit AI scores importers against the client's own Revit models with a regression baseline; Measura's BOQ was compared item by item with the same exports; Senku checks every object is covered (measured_objects == objects).

Simple client installs

Each ships as a zip with a double-click install.bat and uninstall.bat, matching the team's preference for Python and batch files over PowerShell, on dev machines and client machines alike.

Across projects

Side-by-side comparison

Vision Suite · Part 1Vision Suite · Part 2Revit AIMeasuraSenku
Runs inWindows desktopBrowser + VPSRevit 2024 / 2026AutoCAD 2027Navisworks Manage 2026
Language / runtimePython 3.11, TkinterJava 21, TypeScriptC# .NET 10 + 4.8, PythonC# .NET 10C# .NET 4.8 + 10
Main jobPDF photos → QR check → MaximoCentral DB + dashboardDrawings/scans → native modelDWG → BOQModel → BOQ, clash, data
AI roleGemini QR fallbackNoneAssistant, 54 toolsAssistant, 21 toolsAssistant, 55 tools
MCP / bridge——YesYesYes
Data storeLocal folders, cacheMySQL 8JSON in %APPDATA%; SQLite on licence serveritems.json, XDataitems.json; PostgreSQL export
TestsValidate stepPlaywright e2e290 xUnit + pytest + eval baselines65 + headless + liveUnit + 55 live checks
DistributionSingle exe (~80 MB)CI/CD auto-deploySigned releases via licence serverBundle zip + install.batZip + per-user install.bat
StatusIn useLiveTestersPilotPilot

Code volume

Revit AI
~47k
Vision Suite
~14.8k
Senku
~14.4k
Measura
~11.8k

Source lines (C#, Java, Python, TypeScript) excluding generated and build output.

Across projects

Lessons learned

Reuse what the user already has

Three automated ACC integrations were built before the team noticed the client already exported the exact file needed. The Excel upload took a fraction of the effort and matched 99.87% of codes.

Verify where you landed

The Maximo retry bug and the dashboard count mismatch had the same shape: trusting a page or a row without checking it was the right one. Both were fixed by asserting identity (asset number on page, latest record per asset).

Real data beats sample data

Rotated DWGs, sheets 123 m apart, doubled centrelines, stacked hatched walls, 2.2-million-foot coordinates: none of these showed up in sample files. Every importer was tuned on client drawings and scored against client models.

Keep counts on one definition

Several Vision Suite fixes were stats using slightly different rules for “pending”. Putting the rule in one class (MaximoEligibility) stopped the drift.

A good architecture compounds

Revit AI took seven weeks. Measura reached a pilot in about three days and Senku in about two, because the loader, bridge, MCP server, chat providers and approval flow carried over.

Never block the host's main thread

A takeoff that ran on every drawing switch froze AutoCAD. Slicing work and computing expensive values only when needed fixed it, and the rule now applies to all three add-ins.

Across projects

Open items and roadmap

ProjectItemType
Vision SuiteParcel 212 extraction records don't resolve to its master file (numbering mismatch): re-import master or re-extractData
Revit AIFinish AIR coding of MEP-AIM-00002–00004 and the ASI models; report four client data issuesDelivery
Revit AIRound 1 hands-on test in Revit 2024 of every form; Revit 2024 on a tester's PCTesting
Revit AIDeploy licence server and console; product name; payload obfuscation; code-signing certificateProduct
Revit AIRemote MCP relay (claude.ai connector), metered AI proxy per licence, paymentsProduct
Revit AIClash against linked models; point-cloud tuning on more scans; local AI benchmark (Phase 4)Feature
Revit AISecond client: get the B1 ducting DWGs and re-run the discrepancy checkWaiting on client
MeasuraHands-on checks in AutoCAD; loader reinstall for MBATCH/MLEGEND on the user's PCTesting
MeasuraOther T6 tiles as one batch; other KAFD levels; client rates; deductions (IS 1200 / POMI)Feature
MeasuraAutoCAD 2025/2026 build (.NET 8); licensing like Revit AIProduct
SenkuPostgreSQL phase 3 (load); 2D-sheet takeoffFeature
Appendix

Full commit logs

Oldest first, straight from each repository's git history.

TXG Vision Suite · 94 commits
  • 2026-05-23Working maximo login version
  • 2026-05-23Refactor code structure for improved readability and maintainability
  • 2026-05-24Enhance MaximoSession with logging functionality and CSRF token handling
  • 2026-05-29Add UI session handling and CSRF token management for image uploads in MaximoSession
  • 2026-05-29Enhance MaximoSession with improved CSRF token extraction and logging for UI interactions
  • 2026-05-29Enhance MaximoSession with UI CSRF token bootstrap method for improved session handling
  • 2026-05-29Enhance CSRF token extraction in MaximoSession to support unquoted JS key format for improved compatibility with MAS 9.x
  • 2026-05-29Enhance MaximoSession with image upload handling and CSRF token management for improved UI interactions
  • 2026-05-29Enhance MaximoSession image upload handling with improved logging and verification checks
  • 2026-05-29Enhance MaximoSession image upload handling with ITEMIMAGE event registration and improved logging
  • 2026-05-29Enhance MaximoSession image upload handling with msgbox detection and improved logging
  • 2026-05-29Refactor code structure for improved readability and maintainability
  • 2026-06-04Refactor code structure for improved readability and maintainability
  • 2026-06-07Update FormaPhotoExtractor.exe to the latest version with improvements and bug fixes.
  • 2026-06-07Update FormaPhotoExtractor.exe and refine regex patterns for asset status and QR matching
  • 2026-06-08Add Excel export functionality for uploaded records in MaximoSession
  • 2026-06-08Update FormaPhotoExtractor.exe to the latest version
  • 2026-06-10Add 'Assigned To' field to issue processing and update FormaPhotoExtractor.exe
  • 2026-06-10Add debug logging for Excel export and Maximo push processes; update FormaPhotoExtractor.exe
  • 2026-06-10Add 'File Size' column to Excel export and update pushed records handling
  • 2026-06-10Add location-tagging HAR file for enhanced geolocation tracking
  • 2026-06-11Enhance location handling and upload reporting in Forma Photo Extractor
  • 2026-06-11Enhance Maximo upload process with location handling and update FormaPhotoExtractor.exe
  • 2026-06-11Refactor code structure for improved readability and maintainability
  • 2026-06-11Implement versioned saving for "Installed and Matching" records and enhance logging for processed entries
  • 2026-06-12Refactor category handling in get_category function and enhance versioned saving logic in run_extract
  • 2026-06-12Add master data Excel file and development plan documentation
  • 2026-06-13Phase 1 of web dashboard
  • 2026-06-13feat: Add ExtractionService and MaximoResultService with corresponding DTOs and repositories
  • 2026-06-13feat: Implement backend API integration for extraction records and Maximo results
  • 2026-06-13feat: Implement core features for TXG Vision Suite
  • 2026-06-13feat: Implement parcel import functionality with Excel file upload
  • 2026-06-13feat: add Playwright for end-to-end testing and update deployment scripts
  • 2026-06-17Refactor code structure and remove redundant changes
  • 2026-06-18feat: Enhance parcel master data API with QR status and Maximo push information
  • 2026-06-19Add .gitignore; stop tracking build artifacts (dist/, target/)
  • 2026-06-21Latest code
  • 2026-06-24feat: Enhance run_extract function to support Maximo pushed CSV for versioning
  • 2026-06-25Fixed the file upload error
  • 2026-07-08Final Working Version
  • 2026-07-10Fixed Vision Suite Application exe
  • 2026-07-10fix: update backend URL and server port configurations
  • 2026-07-11Made some changes to the UI for better looks
  • 2026-07-11Fixed UI
  • 2026-07-11feat: enhance asset handling and deduplication in Maximo integration
  • 2026-07-12feat: implement local asset caching and backend deduplication for Maximo pushes
  • 2026-07-12feat: implement backend toggle for connection management and enhance export functionality
  • 2026-07-12feat: add ParcelAssetMaximoStatus model and repository for direct Maximo push status tracking
  • 2026-07-17Refactor code structure for improved readability and maintainability
  • 2026-07-25fix: update total count calculation to use unique results in QA/QC window
  • 2026-07-25feat: enhance deduplication logic and update total file count display in QA/QC window
  • 2026-07-25feat: add percentage display to legend in ParcelCharts for QR and Maximo data
  • 2026-07-25feat: enhance folder name display in ParcelCharts to prevent label duplication
  • 2026-07-28feat: add HelpModal component and integrate help functionality in UploadForm
  • 2026-07-28feat: update asset column definitions and enhance HelpModal with additional supported columns fix: add deployment guide and update .gitignore for sensitive files
  • 2026-07-28feat: update .gitignore to exclude HAR files and add vps-credentials.local.md
  • 2026-08-04feat: Implement ACC sync functionality and enhance parcel dashboard
  • 2026-08-04Refactor ACC sync process: remove legacy code, implement bookmarklet bridge for user-driven sync, and update frontend components accordingly
  • 2026-08-04feat: Replace bookmarklet with browser extension for ACC sync, update related documentation and components
  • 2026-08-09feat: Enhance asset record loading with retry logic for stale sessions and improved CSRF handling
  • 2026-08-09feat: Add diagnostic logging for location resolution in Maximo uploads
  • 2026-08-09feat: Ensure fresh UI session for each upload_image call to prevent stale session issues
  • 2026-08-09feat: Implement retry logic with backoff for Maximo UI session initialization to handle transient failures
  • 2026-08-09feat: Implement proactive re-authentication for classic-UI sessions to manage session cap and enhance reliability
  • 2026-08-09feat: Enhance Maximo session handling with improved search response validation and diagnostic logging for OSLC location retrieval failures
  • 2026-08-23Remove ACC sync functionality and related components; introduce Issue Summary upload feature
  • 2026-08-26feat: Enhance Parcel management with area and level filters, progress tracking, and dashboard updates
  • 2026-08-30fix: consolidate duplicate asset codes with summed quantities in closeout summary
  • 2026-08-30fix: group by truncated asset code to consolidate similar codes in top assets
  • 2026-08-30fix: maximo summary should count extraction records with installed progress, not parcel_assets
  • 2026-08-30fix: maximo summary counts extraction records with installed asset status
  • 2026-08-30fix: dashboard maximo pending should count only installed extraction records, not all records
  • 2026-08-31fix: maximo summary should count only installed extraction records with matching QR status
  • 2026-08-31feat: add dashboard aggregated stats panels, date picker for maximo pushed dates, and date range filtering
  • 2026-09-01fix: populate QAQC summary data in aggregated dashboard
  • 2026-09-01debug: add logging for date filter in getMasterData
  • 2026-09-02feat: enhance QAQC summary with dynamic category rendering and improved asset status counting
  • 2026-09-03feat: add version filtering to parcel data retrieval and enhance dashboard with version values
  • 2026-09-13feat: enhance master data grid with new QR status option and improve grid layout
  • 2026-09-13feat: add GitHub Actions CI/CD for auto-deploy on push to main
  • 2026-09-14fix: replace fixed-sleep health checks with polling in deploy workflow
  • 2026-09-14chore: update README formatting and add backend README file
  • 2026-09-14fix: retry ssh-keyscan against transient network flakiness
  • 2026-09-14fix: neutralize set -e killing the frontend health-check retry loop
  • 2026-09-14fix: remove apostrophe that broke the frontend deploy script's quoting
  • 2026-09-15feat: implement Maximo status upload functionality with backend integration
  • 2026-09-20feat: add Maximo status filtering and enhance export functionality in the dashboard
  • 2026-09-26feat: enhance extraction and parcel services with new filtering options and stats endpoints
  • 2026-09-26feat: remove StatsPanel component to streamline frontend code
  • 2026-09-26feat: enhance stats and filtering options across various components and services
  • 2026-09-28feat: add folder filtering to parcel master data and stats endpoints
  • 2026-09-30feat: enhance Maximo eligibility checks and streamline pending asset calculations
  • 2026-10-03feat: enhance dashboard and stats components to include notInMaster count and improve data handling across services
  • 2026-10-06feat: enhance Maximo status handling across backend and frontend components to include not_pushed state and improve color coding
Revit AI · 76 commits
  • 2026-09-24Initial Revit AI add-in with hot-reload loader
  • 2026-09-24Enhance documentation and setup scripts for Revit AI add-in
  • 2026-09-24Enhance room specification and building logic in Revit AI add-in
  • 2026-09-28Add roadmap for auto-modelling from DWG and point cloud, outlining phases and architecture
  • 2026-09-28Add unit tests for mapping, regularisation, and specification validation
  • 2026-09-28Enhance installation and export processes with new scripts and configurations
  • 2026-09-28Enhance build process by adding zip functionality for packaged output
  • 2026-09-28Enhance installation script to check folder existence correctly and update build logic to track family types for better error handling
  • 2026-09-28Update hand-off notes to reflect confirmation of door fix and clarify next steps for Phase 1 completion
  • 2026-09-28Add evaluation functionality for comparing building specifications
  • 2026-09-28Enhance Layer Role Classification and Regularisation Logic
  • 2026-09-29Enhance validation logic to handle non-numeric values and improve error reporting in SpecValidator and DwgPlanExtractor. Add tests for empty column blocks and non-numeric specifications.
  • 2026-09-29Enhance evaluation and extraction processes
  • 2026-09-29Enhance door handling logic in DwgPlanExtractor and Regulariser. Update tests to validate door width extraction and wall extension behavior beside corners.
  • 2026-09-29Enhance wall handling logic to account for gaps between hatched walls. Add tests to validate behavior with ducts between walls.
  • 2026-09-29Enhance wall extraction logic to identify lining walls from their hatches. Add tests to validate detection of walls without visible lines between them.
  • 2026-09-29Enhance error handling in ModelBuilder to manage invalid elements during build stages. Improve exception messages to indicate failure points.
  • 2026-09-29Refactor ImportPane to enhance error and warning display. Introduce copyable lists for issues, low-confidence items, and Revit messages. Add functionality to copy review and report text.
  • 2026-09-29Enhance handling of curtain walls in DwgPlanExtractor and LayerRoleClassifier. Update tests to reflect changes in layer role mappings and validate door dimensions.
  • 2026-09-29Enhance ImportPane and ModelBuilder to support exact-size types for elements. Introduce checkbox for creating types with precise dimensions and update build options accordingly. Add logic to duplicate and adjust sizes for walls, doors, and windows based on project specifications.
  • 2026-09-29Enhance room placement logic to move tags drawn outside their rooms into the correct enclosed spaces. Introduce RoomPlacer class with options for label movement and area matching. Update tests to validate new behavior for room labels.
  • 2026-09-30Enhance SpecComparer to improve alignment scoring by evaluating both predicted and expected wall lengths. Add logic to account for rotations in shared coordinates and refine fit calculations to handle discrepancies in wall counts.
  • 2026-09-30Enhance Regulariser to handle overlapping walls and improve door placement logic. Introduce options for overlap tolerance and maximum shift for openings. Update DwgPlanExtractor to ignore duplicate hatch exports and add tests for new behavior.
  • 2026-10-02Enhance Regulariser to snap grids close to 45° multiples and update tests to validate this behavior. Add logic to rebuild walls removed by Revit with unjoined ends and ensure proper handling of wall types.
  • 2026-10-03Add Anthropic and OpenAI client implementations with associated types and settings
  • 2026-10-03Enhance DwgPlanExtractor to improve handling of curtain walls and add logic for identifying attached runs. Update DwgTests to validate behavior for glass elements far from buildings. Modify revit_bridge.py to ensure UTF-8 encoding for console output.
  • 2026-10-03Add MEP extraction functionality and related specifications
  • 2026-10-03Enhance MEP import functionality: align MEP sheets with model walls and add extraction logic for ducts, pipes, and fixtures. Update BuildReports to include MEP counts in summaries.
  • 2026-10-03Enhance MEP functionality: add support for communication, data, and security devices in layer classification and extraction. Update tests to validate new layer roles.
  • 2026-10-04Enhance MEP Network Connectivity and Reporting
  • 2026-10-04Enhance MEP extraction and alignment: add support for plain shift during wall alignment, improve duct extraction from outlines, and update tests to validate new functionality.
  • 2026-10-04Add Revit AI integration for Claude Desktop
  • 2026-10-04Add schedule creation and IFC export functionality to RevitTools
  • 2026-10-05Enhance build process and documentation for release packages: add version stamping, README for testers, and update install/uninstall scripts for better user experience.
  • 2026-10-05Update vendor information to reflect new branding: change VendorId and VendorDescription in add-in manifest and README.
  • 2026-10-06Add Revit 2024 MEP Exporter Add-In
  • 2026-10-06Add alongside detection for model ducts in MEP discrepancy checks
  • 2026-10-11Add Theme class for UI styling and Revit 2024 project configuration
  • 2026-10-11Add Claude Code integration and MCP server for Revit tools
  • 2026-10-11Add Markdown rendering and chat history management features
  • 2026-10-12Add approval system for model edits and auto-approval features
  • 2026-10-12Add new tools for creating drawing sheets and placing views in Revit
  • 2026-10-13Implement FloorOutline functionality and related classes for slab generation and hole detection
  • 2026-10-13Enhance Revit 2024 support: update installation scripts, README, and build process for compatibility with Revit 2024 and 2026
  • 2026-10-13Add scoring and export functionality for columns and stairs; enhance evaluation metrics
  • 2026-10-13Add point cloud processing functionality
  • 2026-10-16Add BOQ and Clash reporting functionality
  • 2026-10-16Enhance Revit 2024 compatibility: update BOQ and clash detection logic, improve handling of categories and solid geometry checks
  • 2026-10-16Refactor code structure for improved readability and maintainability
  • 2026-10-17Add ToolCommand and tests for licensing and tools functionality
  • 2026-10-17Add test plan for Round 1 in Revit 2024, covering new tools and workflows
  • 2026-10-17Ignore Revit model files
  • 2026-10-17Add AIR asset and location codes to the ribbon
  • 2026-10-17Allow email addresses as console usernames
  • 2026-10-17Add Purge Unused, Sheets from Excel and Export Sheets
  • 2026-10-18Add point cloud visualization and export functionality
  • 2026-10-18Refactor code structure for improved readability and maintainability
  • 2026-10-18Enhance AIR parameter handling and save options for workshared models
  • 2026-10-18Enhance AIR handling by refining parameter management, adding discipline learning, and improving equipment variant selection
  • 2026-10-18Add reload links functionality to manage unloaded Revit links and improve asset location accuracy
  • 2026-10-19Enhance wall handling by introducing known face management, improving project creation logic, and refining evaluation metrics for one-faced walls
  • 2026-10-19Enhance wall handling by implementing known face management for one-faced walls, updating scoring logic, and adding related tests for validation
  • 2026-10-19Add unit tests for MEP scan extraction and evaluation script
  • 2026-10-19Enhance output formatting in ScanMep to include strip indication for horizontal elements
  • 2026-10-19Implement point selection and element definition from scan data, adding new tools for user interaction and measurement analysis
  • 2026-10-20Enhance scan import validation by adding trust tiers and a new scan check tool for element verification
  • 2026-10-21Enhance ReCap scan processing by adjusting point spacing defaults, adding conversion scripts, and improving scan density handling
  • 2026-10-21Add candidate blob processing and evaluation scripts for scan data analysis
  • 2026-10-22Update README-testers.txt for clarity and consistency; add AIR codes guide reference
  • 2026-10-27Add E57Reader and evaluation tools for scan data processing
  • 2026-10-27Refactor README.md to update project description, structure, and clarify components and usage instructions
  • 2026-11-02Update hand-off notes and installation script for Revit 2026 compatibility with .NET 10
  • 2026-11-08Enhance AIR Codes Modeller: Add change tracking and documentation
  • 2026-11-09Add annotation and label placement functionality
  • 2026-11-10Enhance tagging functionality: Add support for cropped views and improve handling of empty tags and overlaps
  • 2026-11-10Update hand-off notes: Clarify tagging and annotation processes for MEP and architectural builds
Measura · 1 commit
  • 2026-11-10Working Pilot Version
Senku · 4 commits
  • 2026-11-14first commit
  • 2026-11-14Working Pilot Version
  • 2026-11-14Update tool count in documentation to reflect 55 tools available in the assistant
  • 2026-11-14Add database migration script and verification tool

Sources

  • TXG Vision Suite: OVERVIEW.md, Readme.md, CLAUDE.md, DEPLOYMENT.md, plan.md, case-study folder, desktop-app/app.py, backend controllers and services, frontend routes.
  • Revit AI: README.md, CLAUDE.md (status as of 9–10 Nov), roadmap, case-study folder, ToolCatalog.cs, server/app/modules.py, server README.
  • Measura: Readme.md, CLAUDE.md (status as of 11–12 Nov), ToolCatalog.cs, smoke-test screenshots.
  • Senku: README.md, CLAUDE.md (14 Nov), ToolCatalog.cs.
TXG Projects · Engineering report · Livewires Digital Solutions for Technical Xperts Group · 14 November 2026