MyDavey is Davey Tree's customer portal. Its data lives in two systems at once, SAP and Dynamics 365, and the portal has to present them as one. I've worked on it in two stretches, 2021–2022 and again from 2026, with a little under a thousand commits between them.
2021: the TypeScript rewrite
The first thing I did on the project was replace the JavaScript app with a TypeScript one. It started on Create React App; a teammate later moved it to Vite, and when I came back in 2026 I took it the rest of the way: Vite 8, Vitest in place of Jest, and oxlint and oxfmt for linting and formatting.
2026: modernize without a rewrite
- Runtime. The backend went from .NET 6 to .NET 10 and Node from 18 to 24.
- Data. Service contracts moved off SAP and onto Dynamics 365, behind an interface, so the pages didn't change when the source did.
- Sign-in. I replaced the identity provider's hosted forms with native React forms. The browser never talks to the identity service directly; the forms call the portal's own backend, which does. Removing the hosted forms also removed a session side effect that a sibling bill-pay site had quietly depended on for single sign-on, so the fix restores that session explicitly instead of by accident.
- Payload. Initial JavaScript went from 251 KiB to 115 KiB gzipped, 54% less. The app did not need a framework rewrite; it needed its bundle looked at.
Infrastructure as code
Everything in Azure is now defined in Bicep, across four environments. The resources already existed, so the templates adopt them in place rather than recreating them. Deploys authenticate from GitHub through OIDC federated credentials, not stored secrets, split across nine app identities with custom least-privilege roles. No routine identity can write Key Vault, IAM, storage keys, or data-plane content.
Code is promoted by branch, from main to dev, qa to QA, and production to
prod. Dependabot runs weekly, and an OSV scan runs nightly and gates every pull
request. The backend has 186 tests that run offline and the front end has 145.
Ready for the wave
A planned migration will bring 100,000 to 200,000 users over from the bill-pay platform. I wrote the capacity plan for it and kept the app on App Service instead of containerizing it, because the numbers said the platform wasn't the constraint.