
Bilingual EN/FR by default — implementation notes
How next-intl and a localized Firestore schema let us ship every page in both languages.
Lessons from migrating off a heavy runtime CSS-in-JS library to a code-you-own component library.
By Kamga Simo Junior
An earlier attempt at this site shipped on MUI 5. We've since moved to shadcn/ui. The motivation was three-fold: bundle size, visual flexibility, and ownership.
MUI ships ~80 KB of runtime CSS-in-JS infrastructure before you render a single component. Tailwind v4 + shadcn/ui ships a static stylesheet, computed at build time, with zero runtime cost.
MUI has strong opinions about typography, spacing, and component shape. Those opinions are reasonable but they read as 'MUI' — not as 'J7Soft'. shadcn/ui ships unopinionated Radix primitives styled with Tailwind classes you can edit.
With shadcn/ui, every component lives in our repo. We can edit any of them at any depth without forking. Upgrades are a copy-paste, not a major version bump.

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

App Router, React Server Components, and a Firebase backend — the decision behind the J7Soft website stack.