The challenge
3P depended on a substantial WinForms client that had grown around years of procurement knowledge and established user workflows. That history made the application valuable, but it also made modernization difficult: replacing everything at once would put proven behaviour at risk. The organization needed a route toward cloud-connected development that respected the existing application and could be followed by a relatively junior development team.
Role and responsibility
As tech lead and architect, David was responsible for making that route concrete. He studied the existing solution, mapped its architecture and dependencies, and identified the areas where cloud integration would create practical value. The assignment combined technical investigation with enablement: the result had to be understandable, divisible into achievable work and safe enough for developers who did not yet know every part of the legacy system.
Mapping a migration path
The first step was to separate durable business behaviour from replaceable client concerns. Rather than treating the WinForms codebase as a single block, the analysis exposed boundaries around authentication, data access and new user-facing functionality. Those boundaries became migration seams. They made it possible to retain working desktop capabilities while introducing new services and web technology in controlled increments.
The proposed sequence documented which dependencies had to remain stable, which components could move first and where compatibility with the existing client was essential. This reduced the number of architectural decisions that junior developers had to rediscover during implementation.
A modern cloud foundation
Azure B2C was introduced as the identity foundation for the cloud-connected experience. New interface work used Vue and Nuxt 3, while .NET services provided a bridge to the established application and its business rules. This combination created room for modern browser-based development without pretending that the mature WinForms client could disappear immediately.
The data layer used Azure SQL with a database-per-tenant model. Keeping tenant data in separate databases supported isolation and made the tenancy boundary explicit in both the architecture and operational approach.
Repeatable delivery and data changes
Entity Framework migrations were used to make database evolution repeatable across tenant databases. Azure DevOps supported source control, work tracking and automated build and release processes. Together, these practices turned the modernization path into more than a target diagram: they described how changes could be developed, reviewed and deployed consistently as the new platform evolved.
Result
3P received a staged modernization approach grounded in the actual structure of its WinForms application. The plan preserved valuable software, introduced a credible cloud and web foundation, and gave the development team clearer boundaries for future work. It reduced the risk of a wholesale rewrite while making authentication, tenant data and delivery automation part of one coherent direction.
