Skip to content
Riel St. Amand

A customer portal on two ERPs

Full-stack on Davey Tree's customer portal, twice. I rewrote the front end in TypeScript in 2021; five years later I came back to modernize the stack, move its data from SAP to Dynamics 365, lock down its Azure footprint, and get it ready for a big wave of new users.

−54%initial JavaScript, without a framework rewrite

  • full-stack
  • React
  • TypeScript
  • .NET
  • Azure
  • Bicep
  • Dynamics 365

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

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.