Skip to content

OpenConstructionERP v15.0.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 06:29
· 2508 commits to main since this release

Update, 19 August. The desktop installers on this release do not start.
The sidecar was assembled without its translation catalogue, so the backend
exits while starting and the app stops at "Starting the application server".
Windows, macOS and Linux are affected equally. Nothing on your machine causes
it and nothing on your machine can fix it. The pip package on PyPI is not
affected and upgrades normally.

The cause is found and fixed, along with the checks that let a build like this
pass. Version 15.0.1 carries both and is being built now; it will appear on the
releases page. Until it does, stay on 14.8.1 or install with pip. Reported as
issue #434 and by mail, with thanks to both reporters for the logs, which is
what made this quick to find.


The product crosses into two markets it could previously only describe. Nine playbooks written for the American market ship beside twelve written for the German one, and behind them sit the things those markets actually turn on: Texas and California packs carrying their own state rules, a weekly certified payroll for public works, the statutory payment clocks of VOB/B and BGB, and the working time record MiLoG section 17 requires, shown on the timesheet where the hours are entered rather than in a report nobody opens. American English is a locale of its own now rather than a spelling variant, and a bill of quantities is a Bid Schedule to the reader who calls it that.

GAEB is no longer an import format with an export bolted to it. A plain X84 export is a Hauptangebot, alternate bids opt in rather than being guessed at, the Pruefdatei survives a round trip, imported sections keep their hierarchy on every screen that shows them, and umlauts survive the filename. A bill states only what it can state: the export summary stopped claiming prices for a bill that carries none, an unpriced Zuschlagsposition is a position and not an import error, and a long text with a graphic embedded in it is capped rather than allowed to bounce the position it belongs to. Typed units resolve the way the person typing them means them: a ton entered in an American bill is the short ton, and cf reaches cubic feet the way sf already reached square feet.

Markups became something an estimator can reason about. A section carries its own rate, an exception is drawn as an exception instead of being folded into the stack that contradicts it, a bond is priced off its rate card and an escalation off an index, and the contingency stays out of a base that already carries profit. Where the stack does not add up the product says so and lets the estimator proceed, because a markup engine that refuses is a markup engine people work around. One country now yields one markup stack whichever engine is asked.

A register that cannot fit on one screen now says so, and the programme to make that true everywhere has a ratchet behind it. A list that would not fit used to look complete, and the answer is not a message on one screen but a rule across the product: the count comes from the register rather than from the page, a filter cannot deny what the register holds, an empty screen is no longer reported as an empty register, and a guard runs at commit time so a new list cannot ship silently truncated. Around thirty registers gained the notice this release, among them the quality registers, correspondence, inspections, the resource roster, the diary, contracts, the snag list and the risk section. The honest figure for the rest is 484: that is how many list endpoints the guard still counts as waiting, and it is printed by the guard rather than estimated here. What is finished is the rule and the ratchet, not the sweep.

Measurement from drawings is real work now rather than a demonstration. The seeded German floor plans carry verifiable quantities and a second issue so revisions can be compared, calibration is stated in the reader's units and digits, every quantity readout goes through one locale aware formatter, and a takeoff position links to a priced line only where the unit can actually be reached. The viewer follows the document's own project instead of whichever project the switcher last remembered.

Language reaches further in and stops leaking. Forty one locales carry the product, module manifests introduce themselves in the reader's language rather than in English, page headings and the browser tab follow the language the rest of the screen speaks, and the first paint waits for the active bundle instead of showing English for a moment. Numbers stop asking the browser which language they are in. A figure written with no locale takes the operating system's language rather than the one the reader chose, so a German running an English Windows read a German page with American separators and nothing about that was visible to whoever wrote the line. The shared formatter and 218 screens behind it now name the app locale, percentages, compact money and measurements included, and a test names every call site that still asks the browser. Ukrainian and American English joined the repository. Uzbek is in the tree and deliberately not in the picker, because roughly a fifth of it still reads as English, and a language offered half translated is worse than a language not yet offered.

A first visit is 14.9 MB lighter. The service worker keeps locale catalogues out of what it downloads up front, and six of them were slipping through on a naming rule that assumed a language code is two letters. American English and the Spanish, Portuguese and Filipino variants are not, so five full catalogues and an overlay were being handed to every visitor by the very lane written to prevent exactly that.

Semantic search stops being an install time decision. The encoder downloads in the background and reports which of five states it is in, the setup wizard shows the download rather than performing it silently, and the desktop build ships the encoder it was already fetching, on the CPU build of torch rather than the CUDA one. A reindex that wrote nothing is reported as having written nothing.

An API key is honoured at the permissions it declares, a self hosted AI endpoint belongs to the user who saved it, and three company registers stopped presenting themselves as project scoped while a register scoped to a project is now read from the project the route names. Four security advisories reported against earlier versions are fixed in this tree, and the most recent of them, an AI endpoint hijacking issue reported on 2026-08-10, reaches a tagged release for the first time here.

Reliability work that has no screen of its own. Three Alembic revisions the chain pointed at and did not have were restored, a healed sequence column is numbered the way the migration numbers it, starting the app twice no longer binds every handler twice, exports carry real filenames through every download header, and the environment doctor now proves a native extra by importing it instead of locating a directory, gives the desktop build advice it can act on, and spends one line rather than a whole report on a check that could not run.

Full Changelog: v14.8.1...v15.0.0