Home/ News/ v5.2.7 — Widget grid + one-click upgrade
Release 2026-05-27 ~4 min read

v5.2.7 — Project-detail widget grid
and one-click in-app upgrade.

Two visible improvements on top of v5.2.6. The 13 widgets on /projects/:id finally lay out as a responsive grid instead of one tall stack, and the in-app update checker gains a real Apply update button — same Python interpreter, captured pip log, humanised restart hint.

v5.2.7

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.