Author the model. Carry the whole job on it.
An IFC-native BIM authoring tool and AEC lifecycle platform — model a building from scratch, take it to a permit-ready construction set, check it against the adopted code, and hand it over field-verified. One model, keyed by GlobalId. Open, self-hosted, no per-seat license.
Recently shipped
The checks became the thing being checked
This wave went looking for the gap between what the platform reports and what it does — and found most of it in the instruments. A coverage score that rated an empty document 100%. A dead-code gate counting its own prose as a caller. Twenty functions that were built, tested, and reachable by nothing in production. Each is now held by a check that was made to fail against the real defect before it was trusted.
Built, tested, and wired to nothing
Twenty public functions were referenced only by their own tests — passing, and unreachable from the product. Four were real capabilities nobody could get to, three had been reimplemented by their callers rather than called, and the rest were misclassifications worth naming. A test suite counts as a caller, which is why no coverage number could ever have shown this.
v0.3.1114 · v0.3.1118An empty document scored 100%
Coverage was computed as answered-over-asked. Ask nothing and you score perfectly — so the least complete assumption set in the system reported the most confidence. The metric now refuses to report a percentage it cannot ground, because a number a reader trusts is worse than no number when it is backwards.
v0.3.1118The spec manual answered nothing
For every model this project ships, the 3-part MasterFormat manual came back empty — and a section keynote on a drawing now names the spec section that governs it, so the sheet and the manual point at each other instead of being assembled separately and hoped about.
v0.3.1107 · v0.3.1108It could not run offline, and nothing said so
The viewer is required to work fully offline — local WASM, self-hosted tiles. It was reaching a CDN, and the failure was silent rather than loud, which is the version of this bug that survives. Now it is held by a check rather than by intent.
v0.3.1111Analyses go through the queue
Clash, IDS, cost and energy stop being requests you hold a browser tab open for. Each becomes a durable Run with an identity, a role check and a place to land — and a job kind that needs to know who you are now says so instead of believing the caller.
v0.3.1057 · v0.3.1060Resuming is the same request as starting
A content-addressed handshake identifies a file by its size and chunk hashes, so resuming an interrupted upload and beginning a fresh one are one call — and deduplication falls out of it. Every chunk is verified on arrival, so a corrupt byte is refused by index before conversion runs.
v0.3.1069A register you can group
“Cost by discipline”, “RFIs by month”, “hours by trade” had no expression at all — the answer was an export into a spreadsheet. An aggregate route now takes the same filters the register takes, through the same parser, so a report and the list it came from cannot disagree about which rows they describe.
v0.3.1088Mark up the sheet you are looking at
Markup lands on the drawing in view rather than on an abstraction of it, a pin on a wall is that wall and raises an RFI against it, the level list says which cut height will actually pass through the building, and plans can be coloured by discipline.
v0.3.1033 · v0.3.1048 · v0.3.1071Plugin code leaves the API process
Third-party plugin code runs behind a process boundary instead of inside the service. Alongside it the supply-chain scan grew the half it had been skipping — every npm advisory was in the part it never read — and the spatial tree became an actual tree.
v0.3.1055–1058 · v0.3.1081Sign-in, and the flags that govern it
Sign in through massing.cloud and open your cloud library. Then the harder half: 32 environment flags were read by the services and documented nowhere, two of them deciding who may sign in at all. A gate now checks both directions — a flag the code reads must be documented, and a name on the internal list must actually be read.
v0.3.1084–1089Earlier · v0.3.988–1018
A mark on the paper is the element, and the phone stops being a shrunken desktop
This wave pushed identity down into the 2D surfaces and gave field work its own shape. A pin dropped on a generated sheet now carries the IFC GlobalId of the linework under it, so the mark survives the element moving — and an RFI raised from that pin lands on the wall, not on a coordinate. Field mode stops presenting a desktop at phone size, and the numbers on screen say where they came from.
A pin on a wall is that wall
Generated sheets already carried data-guid on their linework; the drawings room was dropping coordinate-only pins, so a wall that moved left the markup pointing at empty paper. Pins now persist the GlobalId, promote to an RFI against that element, and select it in the 3D viewer. Symbol takeoff followed the same idea: box one symbol on the sheet and the rest are found by matching it, not by guessing a count.
The phone gets its own shape
Field mode hides the seven-room spine rather than shrinking it, lands on capture instead of a dashboard, and the action button no longer covers the thing it acts on. Keyboard journeys are asserted end to end — Tab reaches a room’s actual job and lands there — so the shortest path through a room is a test rather than a claim.
v0.3.1004–1008Numbers that say where they came from
Series colour stopped borrowing the discipline palette, so a chart line no longer reads as a trade. A readiness strip sits on every home, the Gantt shows this week rather than a month of bars, and report packages assemble off the request thread. Underneath, the API client kept shedding weight into per-domain seams, and a worktree build now uses the pinned Vite instead of a different one that silently succeeded.
v0.3.988 · v0.3.1002–1003 · v0.3.1009 · v0.3.1015–1018Earlier · v0.3.911–929
Drawings that explain themselves, one canvas, and a model that admits when it is behind
That wave was about output you can trust without opening the model to check. A plan that finds nothing at the cut plane now says so and why; a sheet publishes the transform it drew with; the canvas is one surface at a time instead of two fighting; and a converted model tells you when it is behind the file rather than quietly serving stale geometry.
A plan that says why it is blank
A plan could compose perfectly — titleblock, scale bar, grid — while the cut plane found no geometry, and nothing in the output said so. An empty plan now states the reason. Sheets publish the transform they were drawn with, so a drawing can be checked against the model rather than trusted, and a sheet asking for an axonometric no longer quietly draws a plan.
v0.3.913–915 · v0.3.928–929The canvas is one surface at a time
The viewer sub-app work stopped two canvases fighting: cross-mode selection is asserted rather than working by accident, and Specs ships into the room rail. Leaving a drawing returns you where you were — a rule that now lives at the event, not at the two crossings that happened to be wired. The arc is not closed; switching 2D and 3D fully in place, print included, is still open work.
v0.3.913–914 · v0.3.917–922Keep the geometry, and admit when it is stale
Re-converting a model no longer throws away geometry that has not changed — and when the converted model is behind the file, it says so instead of serving the previous version under this version's name. Alongside it, money is Decimal end to end, so a rounded display value can no longer become a stored total.
Earlier · v0.3.298–306
In-browser authoring came of age
The wave that turned the web app from a strong reviewer into a genuine modeling tool — draw, slope, mesh, and undo real geometry, then stock the site with properly-classified content.
automatic axis inference
As you place a point it snaps on-axis, parallel, or perpendicular to the last edge — clean lines without holding Shift.
v0.3.299Model undo / redo
Every edit is a new versioned IFC; undo restores a prior version and republishes — GUID-stable, so pins, RFIs and clashes survive.
v0.3.298Sloped-top walls
Parapet-slope, shed and gable walls — a trapezoidal profile extruded across the thickness, so every geometry engine renders it.
v0.3.304Procedural mesh
Author an element straight from a raw triangle mesh for geometry the parametric recipes can't express — verts + faces in, valid fragment out.
v0.3.305Site content library
Drop cranes, hoists, fencing, sanitary units, furniture and planting — each auto-classified into the right IFC class + phase; logistics time-phase on the 4D slider.
v0.3.306Sandboxed code hatch
An AST-sandboxed ifcopenshell escape hatch (off by default, red-teamed hard) for the one-off geometry the fixed recipes don't cover.
v0.3.300The platform
What it already does, end to end
Design & feasibility
- Generate a real IFC building from a zoning envelope
- Test Fit — unit-mix, parking solver, yield-on-cost optimize
- Development proforma with underwriting guardrails
Author & document
- Model from a blank IFC → grids, levels, walls, families, MEP
- Full per-discipline NCS drawing set — plans, sections, details, schedules
- Dated AIA issuances (SD → DD → CD → Permit → Bid → Construction → Record)
Coordinate & build
- Clash intelligence, code compliance, model-health scorecard
- Config-driven GC portal — RFIs, change orders, pay apps, closeout
- CPM + takt + 4D, lean pull-planning, model-based Earned Value
Turnover & operate
- Field-verified as-built dimensions, variance & manufacturer record (LOD 500)
- COBie turnover, facility-condition index, reserve & capital planning
- Disposition — listing kit, tri-approach appraisal, RESO-aligned
Foundations