01 · The challenge
Two planners, one row, no protection.
Planners managed new-product forecasts in a low-code portal on top of Dataverse. It was hard to change safely, limited in how grids and filters could work, and offered no protection when two people edited the same row at the same time.
02 · What I did
What I owned and built.
- Evaluated Streamlit, Retool, Budibase, and Cloudflare, then chose a custom stack to avoid vendor lock-in and keep hosting in-house.
- Built nine data pages (titles, forecast, comps, history, controls, and planner/product-manager views) plus a home KPI dashboard.
- Added optimistic locking so concurrent edits can’t silently overwrite each other, and a snapshot system that writes locked rows to their own table.
- Built a collapsible filter panel, multi-value paste filtering, saved personal views, and inline editing limited to the pages where it belongs.
- Matched the look of the rest of the internal tool suite, captured the team’s feature wishlist, and drafted the IT provisioning request.
03 · Architecture
How it fits together.
HTMX + AG Grid
Server-rendered pages
04 · Key decisions
The judgment behind the build.
Why custom over low-code platforms?
Every platform I evaluated traded one limitation for another, plus lock-in. A lean custom stack gave full control over grids, filters, and concurrency, with hosting kept in-house.
Why HTMX?
Server-rendered HTML with targeted swaps keeps the app fast and simple, with no heavy front-end build for a small team to maintain.
Why optimistic locking?
Conflicts are rare but costly. Optimistic locking catches them at save time without making users hold locks while they think.
Why limit inline editing?
Editing everywhere is a footgun. Scoping it to the pages that need it protects the data users should only read.
05 · Impact
What changed because of the work.
- Protects forecast data from conflicting edits and keeps an auditable record of locked rows.
- Gives planners a faster grid with better filtering and saved views.
- No vendor lock-in, and a consistent look across the internal tool suite.
06 · What’s next
Where it goes from here.
Wire in Entra ID sign-in, deploy to Azure App Service, create the locked-rows table, and confirm KPI definitions with users.
This case study is a sanitized reconstruction. Organization names, proprietary code, data, and internal schemas are intentionally left out.