During a vacation in the rain forests of Queensland in 2001, we saw some strangler figs. These are vines that germinate in a nook of a tree. As it grows, it draws nutrients from the host tree until it reaches the ground to grow roots and the canopy to get sunlight. It can then become self-sustaining, and its original host tree may die leaving the fig as an echo of its shape. This gradual process of replacing the host tree struck me as a striking analogy to the way I saw colleagues doing modernization of legacy software systems. A couple of years later I posted a brief blog post about this metaphor. While I've not used the term in my writing since then, it caught attention anyway, and the term “Strangler Fig” is now often used to describe a gradual approach to legacy modernization.
If everyone who knew Theseus's name died, neither ship would ever be the Ship of Theseus again.
I would try switching the SPA to render on the server entirely/for specific components if possible, knowing there will be angular code changes to support this, then do a progressive blazor rewrite of individual paths. Your app is going to run like hot garbage during this transition though, so you'll need plenty of buy-in to attempt this.
I still like that we did strangler pattern for the API vs the "rip the bandaid off" pattern, but it does carry some baggage that can be glossed over in some articles about it.
I haven't tried this myself with a large project (just small examples as proof-of-concepts), but the approach seems very sound. One thing I liked is once you have the legacy app shell figured out, it's not a crazy approach to mock out the bridge/native services and run the app in just flutter (or react native) for development/testing acceleration, then adding final integration testing/QA with the full legacy app shell. I've seen some odd behaviors from apps that have used this approach that I would have to imagine can be serious headaches to debug. That said, it does seem the approach pays off long-term.
There's not much published online about it, but I believe Headspace has used this approach for its mobile app. See [5]
[1] https://www.droidcon.com/2024/10/17/flutter-add-to-app-the-g...
[2] https://www.droidcon.com/2024/10/17/successful-flutter-re-pl...
[3] https://docs.flutter.dev/add-to-app
[4] https://leancode.co/blog/flutter-add-to-app-overview-and-cha...
[5] https://www.nearcoast.com/headspaces-leap-to-flutter-a-game-...
It's called a monopoly
> Comments from industry indicate a realization that the West is not quite as far along as China in this regard
Good!