topfoc.usStart a buildLIÉNA
A fine-jewelry store on a multi-shop commerce backend, and underneath it the recovery of that backend from a dead .NET Core 3.1 deployment whose source was gone.
- E-commerce
- Legacy rescue
- .NET / Blazor
- SSG
- i18n

- Client
- LIÉNA
- Role
- Recovery, migration, backend and storefronts
- Year
- 2026
- Stack
- React · vite-react-ssg · .NET 10 Blazor · MySQL
The challenge
The shop was running. The source code was not available. What existed was a .NET Core 3.1 application on a VPS, an end-of-life runtime, and no way to change anything. A business sitting on a machine nobody could open.
The choice was rewrite from scratch, guessing at years of accumulated domain rules, or get the existing behaviour back into a form that could be edited. A rewrite would have quietly dropped the rules nobody remembered were there.
The approach
Recovery first: the binaries were decompiled and brought up on .NET 10 LTS. Decompiled Blazor
components aren't authorable, because the markup is gone and replaced by render-tree calls, so a
purpose-built Roslyn tool converted all 105 of them back to .razor. Each conversion is backed by
a bUnit snapshot baseline, which turns "the rewritten component renders the same DOM as the
recovered one" into a test result instead of an opinion.
With an editable backend, the storefront got rebuilt in front of it. A single deployment serves each shop by hostname, exposing a read-only catalog API with tiered caching. The storefront is React, statically prerendered on every route across eight locales, with build-time catalog snapshots inlined per page and a persisted client cache. A returning visitor sees last-known-good data before the network answers.
The awkward domain rules survived the trip, including commissioned "private collection" pieces, which have to appear differently in listings, related products and calls to action.
The outcome
The storefront is live on a backend that can be changed again, with a test suite that pins the recovered behaviour in place. The thing that was a liability on an EOL runtime is now an ordinary codebase.
What came of it
- 1A dead .NET Core 3.1 app recovered from VPS binaries and shipped as maintainable .NET 10
- 2All 105 UI components converted back to authorable Razor, DOM parity proven by snapshot tests
- 3Every route statically prerendered across 8 locales, so SEO didn't cost the SPA
- 4Multi-shop from a single deployment, each storefront resolved by hostname

LIÉNA