v3.0.0 is not a single big new feature — it is the release that put
the platform’s skeleton in place. Eighteen modules now share one
module-loader, one event bus, one validation framework, one auth layer.
Status fields stop being free-form strings and become explicit finite-state
machines. CAD coverage extends from the DDC cad2data bridges
(DWG / DGN / RVT) to native IFC via an ISO 16739-1 parser written in pure
Python, with no IfcOpenShell runtime dependency.
The three things that matter
18-module wave on one loader
Projects, BOQ, Costs, BIM Hub, Match Elements, Contracts, Finance,
Documents, Reporting and nine more all moved to the same
module_loader + manifest convention. Each module
self-registers its router, models and validation rules. No more
per-feature wiring in main.py.
Deterministic FSM engine
Free-form status columns are replaced by a single
FSM engine. Every transition has a named guard, optional
side-effect and an audit-log entry. Invalid transitions raise
FSMTransitionError instead of silently writing bad state.
Twelve modules adopted the engine in v3.0.0.
ISO 16739-1 IFC parser
A pure-Python IFC parser shipped at app.modules.bim.parser.
Reads IFC2x3 and IFC4 step files, extracts
spatial structure + property sets + quantities + relations, emits the
same canonical JSON the DDC bridges produce. No IfcOpenShell, no
native compile step.
Match Elements with Qdrant + BGE rerank
/match-elements moves to a SearchPlan with
29 hard- and soft-field filters fed into Qdrant for vector search and
BGE for cross-encoder rerank. Every search writes a
match_search_log row so result quality is measurable
instead of anecdotal.
What this unlocks
The 18-module wave is the precondition for everything that follows. Once every module speaks the same loader / FSM / validation contract, adding a new module is a manifest file plus business logic — not a refactor. Six of the modules that landed here (Projects, BOQ, Costs, BIM Hub, Match Elements, Reporting) became the core that v3.6 and v3.11 built on top of.
The FSM engine is the quiet headliner. Status-as-string was already a
latent bug; every project that uses status drives several invariants
(“a quote can only be awarded once”,
“a contract can’t be signed before it’s approved”).
Encoding those invariants in transitions instead of scattered
if status == … branches removed an entire class of
reported bugs in the v3.0.x line.
And the IFC parser closes the last CAD-format gap. The platform now reads DWG, DGN, RVT, IFC2x3 and IFC4 into one canonical schema — without any GPL-incompatible runtime dependency. The downstream BIM Hub, Match Elements and Take-off pipelines all consume the same JSON, regardless of which converter produced it.
Upgrade
pip install --upgrade openconstructionerp==3.0.0
v3.0.0 introduced the v3 alembic baseline. Subsequent v3 minors layered
additional migrations on top — see the v3.6 and v3.11 release notes
for those. The 18-module set runs on a single PostgreSQL (or SQLite for
local dev) and benefits from Qdrant when the optional QDRANT_URL
environment variable is set.
Try the platform today.
Live demo in your browser, or self-host in five minutes. AGPL-3.0, no signup required.