Changelog

Generated from CHANGELOG.md. The codebase also contains construction modules; this page lists only entries about the business features.

Full changelog on GitHub →

Unreleased

  • Renamed to OpenBusinessERP: PyPI package and CLI are now openbusinesserp (the openconstructionerp command remains as a deprecated alias); repository moved to https://github.com/datadrivenconstruction/OpenBusinessERP.

18.1.0

  • In-app updates are now off by default. The Apply update button runs pip install --upgrade inside the environment the server runs from, so it is now switched off unless you set ALLOW_RUNTIME_UPGRADE=true in the server's environment and restart.

18.0.0

  • The macOS installer is for Apple Silicon only. Both macOS files on the release page are built for it and nothing is published for Intel Macs; the download badge and the install guide now say so and point an Intel Mac owner at pip or Docker.

17.5.0

  • The Windows installer now offers to continue when the old uninstaller fails instead of aborting, so a machine whose previous uninstaller hangs can still complete an upgrade.

17.4.1

  • Approving an invoice was writing "sent" instead of "approved", which blocked the Mark Paid button because it required the approved status. The service, the router description, the audit log and both test suites are corrected.

17.4.0

  • The Windows desktop upgrade no longer freezes when a legacy uninstaller is still on disk. The old installer used ExecWait to run the previous uninstaller, which opened a visible window and waited for the user to interact with it before continuing, so a silent upgrade hung indefinitely; it now runs under nsExec with a five-minute timeout and no window.

17.2.0

  • The macOS desktop build asked the system for a protection it had no identity to satisfy. Bundled PostgreSQL would not initialise, and the loader said a library and the process loading it have different team identifiers on a machine where neither carries one, which is library validation rather than the quarantine everybody reaches for first.

17.1.0

  • A printed invoice ignored the country it was going to. Post code before city is right for the German speaking countries and wrong for every party in the Australian, New Zealand, British, Indian and North American profiles we ship, and the formatter returns lines rather than fields now, since field order alone cannot say which parts share a line.

16.8.2

  • And 16.8.1 shipped with no desktop installers at all, which is fixed here in the machinery rather than in the product. The check that opens the built application ran all three of its legs against one port while the Windows helper process survives every stop signal available to it, so one process that would not die failed the whole job and took the four installers with it.

16.8.1

  • A patch release, and most of it is money. An invoice total was written for a reader and then read back as a number, so from a thousand upwards the field came up empty and nine thousand left the browser as nine, while a reader whose decimal mark is a comma lost the cents off every invoice at any size.
  • A first boot told the user to add by hand what the seeder was about to write. The two seed reconcilers run from the data repair registry, which the application calls well before the seeder, so on a fresh data directory they met an empty table, read it as a database whose seed cannot be dated, and warned that the tax rates and the working calendars had to be entered manually.

16.8.0

  • The desktop application carried a file that documented itself as the frozen entry point and was not the frozen entry point. Every guard in it, including the one that stops a frozen build from misreading the command lines Python's own multiprocessing sends its children, has been dead in every artifact we ever released, because the build freezes a different file.
  • Two more defects came out of the same root. Every installed copy signed its tokens with the secret that is printed in the public source, because the routine that exists to replace that literal stood down for anything calling itself a development environment, and the desktop launcher calls itself exactly that.
  • Removing that did not stop the macOS crash, and being wrong about it in public is worth more than being quietly right later. The second launch went on dying, which said plainly that building the model three times was a real defect but not this one.
  • That same installer then decided whether the product had come up by waiting for the word healthy and calling everything else a failure, and this release would have turned that into a lie. An enabled module that does not load now reports the installation as degraded, so a running, usable install would have announced itself as one that did not install, in the same release that made the state reachable.
  • Upgrading by re-running the one-liner kept installing the version you had asked for the first time. Both installers record a requested version beside the two secrets and neither could remove one, and that file is read on every command run in its directory afterwards, so the first install decided the version for every install after it.
  • The desktop pipeline now starts the server it ships and waits for it to answer, on a cold start and on a restart over an existing data directory. It already ran the frozen binary, to print its version, to run the doctor and to prepare a database, so the thing that had never run anywhere was the path those three do not touch: building the application, firing the startup event and loading the modules.

16.3.0

  • A desktop installation can be pointed at a server the organisation already runs. The application has only ever talked to a server it starts itself, which is right for one person on one machine and wrong for an office, because every desk then keeps its own separate database and nobody sees anybody else's work.
  • The desktop startup screen speaks the language the machine is set to. It is the first thing every desktop user sees and every word on it was English, the boot checklist, the first run wait, the failure message and the one time question about opening in an application window or a browser.
  • The Windows installer is about 19 MB smaller and carries less of somebody else's code. The bundle shipped both programs out of the upstream converter folder, the one this codebase actually runs and a graphical one nothing here opens, and the second dragged a user interface toolkit and its plugin folders along with it.
  • The running product can show the licence texts it ships. Those texts have travelled inside every published artefact for the life of the product and nothing in the backend could read them, so the only route to one was a link to an external site, which on a desktop install with no network is a link to nothing, and that is precisely the deployment where somebody is most likely to be looking.