Landbrugslotteriet – RemixJS Modernization

Landbrugslotteriet – RemixJS Modernization

Skills:

RemixJS React React Router 7 Umbraco Delivery API SSR

I recently worked on rebuilding the Landbrugslotteriet website — a complete frontend port from an older .NET Razor Pages and vanilla JavaScript setup to a modern stack powered by RemixJS, React, Tailwind CSS, and Vite. The backend remained on Umbraco, but we used the new Umbraco 13 Delivery API, which provided a much cleaner and more efficient way to fetch content compared to the legacy rendering logic.

This wasn't a straightforward migration — most components had to be rewritten from scratch. I made architectural decisions around routing, state management using Zustand, and performance optimizations. I implemented data streaming with RemixJs’ defer() and loader APIs to get critical content on the screen faster. Skeleton loaders were added for perceived performance, and SEO was treated as a first-class concern throughout the project. Remix’s server rendering model made it easier to implement solid metadata and semantic HTML structure.

One of the bigger challenges was achieving parity with the legacy frontend while modernizing UX patterns. This meant translating imperative jQuery behaviors into declarative, maintainable React components. At the same time, we had to ensure mobile responsiveness and accessibility. Tailwind CSS proved invaluable here for speeding up layout decisions and enforcing consistency. I also tweaked the build pipeline with Vite to support fast local iteration and production-grade asset optimization.

The end result was a much faster, more maintainable frontend codebase with improved SEO scores and reduced time-to-interactive. This project gave me the opportunity to apply performance tuning, SSR best practices, and UX design patterns in a real production context. It’s a great example of taking legacy systems into modern territory without throwing away what still works on the backend.

Feature image 1
Feature image 2
Feature image 2
Feature image 3
Feature image 3
Feature image 4
Feature image 4
Feature image 5
Feature image 5
Feature image 6
TC