
From MUI to shadcn/ui: rebuilding our design system
Lessons from migrating off a heavy runtime CSS-in-JS library to a code-you-own component library.
App Router, React Server Components, and a Firebase backend — the decision behind the J7Soft website stack.
By Kamga Simo Junior
We evaluated Astro, Next.js 15, SvelteKit, and Remix for the J7Soft website. Astro wins on raw performance for static-first sites; Next.js 15 wins on ecosystem maturity and on having a server runtime when we need it. We picked Next.js 15.
Astro is excellent. The reason we didn't pick it is operational: our deployment platform is Firebase, and we have an internal firebase-developer agent who knows Next.js + Firebase deeply. Reducing the surface area of unknowns mattered more than shaving a few KB off the bundle.
App Router defaults every component to Server Components — the static parts of marketing pages ship with effectively 0 JS. Interactive islands (the contact form, the command palette, the animated heroes) opt into client rendering. The result is similar to Astro's islands architecture without leaving the React ecosystem.
Firestore for content, Cloud Functions for forms, Firebase Hosting for the app, all under one project. One bill, one console, one CLI. The simplicity is the point.

Lessons from migrating off a heavy runtime CSS-in-JS library to a code-you-own component library.

How next-intl and a localized Firestore schema let us ship every page in both languages.