topfoc.usStart a build
← All projects

LIÉ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
LIÉNA Jewels storefront landing page
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

Screens

Click to enlarge

Got a build
in mind?

Book a free consultation