The problem
- The application had to be delivered within a tight contractual deadline.
- The team had too few experienced engineers to meet its feature commitments, and little to no experience with React, TypeScript and modern front-end practice.
- Without intervention, the project was at risk of missing its deadline and its contractual obligations.
What we found
- Every developer depended on a single shared integration environment, which slowed development and testing.
- Schema changes and deployments created friction and delays.
- Front-end changes often broke other parts of the application, because there was no type safety and little testing.
- Back end and front end often fell out of sync, and a loose Jira structure produced duplicated work.
What we did
Added senior capacity
Senior front-end and back-end engineers joined the client's team and led the front-end effort, particularly in the second half of the project.
Stabilized the front end
We made the application fully TypeScript-compliant, introduced reusable UI patterns, added lazy loading and code splitting, and split the front end and back end into separate repositories.
Unblocked development
Docker-based local environments removed the dependency on the shared integration environment, and Liquibase migrations let developers manage schema changes alongside their code.
Platform features
We implemented role-based access control with Spring Security, a notification subsystem for app, email and SMS, audit history with Hibernate Envers, and OpenAPI documentation to keep the front end and back end aligned.
Tests and pipeline
Cypress end-to-end tests, Spring Boot integration tests with TestContainers, CI/CD fixes including container build memory limits, and fixes for production CORS and authentication issues.
Process and mentoring
Clearer Jira tickets ("one screen, one ticket"), better branching, and hands-on mentoring that brought the client's developers up to speed on the modern stack.
The result
- The data exchange was delivered to the county on time, meeting the client's contractual obligations.
- Type safety and automated testing reduced defects and stabilized the application.
- The client's team gained hands-on experience with modern technology and a more structured, predictable process.
[CLIENT QUOTE: public-health nonprofit (publish anonymized only)]