v5.2.6 closed five first-touch papercuts. v5.2.7 keeps the same theme — the things you see in the first five minutes — and fixes two more: the single most-visited page in the app (the project detail view) was rendering as an awkward narrow stack on wide screens, and the “update available” banner had been quietly broken for so long that nobody noticed it never fired.
The two changes
Project-detail widget grid
The 13 widgets on /projects/:id — RFI inbox, Change
orders pulse, Daily diary, HSE incidents, Variations, Quality NCRs,
Compliance, Schedule summary, Budget burn, Recent files, Photo strip,
AI insights, Activity feed — were rendered as a single tall column
since the original ec5aec1e widget customizer landed.
Desktop users saw an awkward narrow stack on otherwise-wide screens.
v5.2.7 wraps the block in
grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 with
selective lg:col-span-2 on widgets whose content needs
horizontal room (Schedule timeline, Budget burn history bars, Photo strip
carousel) and sm:col-span-2 lg:col-span-3 for the full-width
Activity feed.
One-click in-app upgrade
The version-check endpoint was querying the wrong GitHub repo (renamed
long ago) so the “update available” banner never fired, and
its version comparison was a raw string compare that gets
5.2.10 > 5.2.9 wrong (string sort: "1"
< "9"). Both bugs fixed: source of truth switched to
PyPI (Trusted-Publisher OIDC always builds a wheel; GitHub releases are
sometimes skipped on hotfixes), with GitHub releases as a fallback for
the rich notes. Versions now compared through a numeric tuple. New
POST /api/system/upgrade runs
pip install --upgrade openconstructionerp in the
same interpreter serving the API
(sys.executable), captures stdout/stderr for the installer
log, and returns restart_required plus a humanised restart
hint — Python caches imports, so the running process keeps the old
wheel until restart. Gated by ALLOW_RUNTIME_UPGRADE (default
on for dev / Windows installer, off for managed VPS deploys). The
frontend UpdateChecker modal gains an Apply update
button with a 4-state machine (idle / running / done / error) that calls
the endpoint, shows the pip log, and surfaces the restart hint. A 403
falls back gracefully to copy-paste install commands.
Why this matters
The widget grid is the kind of fix that takes ten lines of Tailwind and shifts a daily-driver page from “why is this so narrow” to “obviously a project dashboard.” The single column was a holdover from the first version of the widget customizer, when the block was hidden behind a feature flag — nobody re-evaluated the layout once the flag flipped on.
The upgrade button is bigger than it looks. Until now the path from
“there’s a newer version” to “the newer version is
running on your machine” was a copy-paste shell session that assumed
you knew which venv was serving the app, that you had the right activation
command in muscle memory, and that you wouldn’t accidentally upgrade
the system Python by running pip from the wrong shell. Routing
through sys.executable removes all three.
Upgrade
pip install --upgrade openconstructionerp
No Alembic migration in this release — head stays at v3144.
On a managed deploy, set ALLOW_RUNTIME_UPGRADE=false if you
don’t want the in-app button to be live (the version banner still works;
the Apply button just falls back to copy-paste). On dev and the Windows
installer, the button is on by default.
Try v5.2.7 today.
Live demo in your browser, or self-host in five minutes. AGPL-3.0, no signup required.