The problem
The client works in construction and mechanical and electrical contracting. Project tracking lived in one place and job information in another, so a simple question about a live job meant opening both, and the answer depended on who had updated which one last.
The obvious answer, buying something, did not fit. Generic project tools are built for a generic project, and construction projects do not run like one. Bending the business to fit the product would have meant keeping the spreadsheets alongside it, which is the situation it was meant to end.
What we built
A project management application built for how construction projects actually run, rather than a general-purpose tool configured to look like one. It is written in TypeScript end to end: Next.js on the front, NestJS and PostgreSQL behind it.
Where it is now
Live and in daily use across the business.