We replaced MUI with Radix + Shadcn across a multi-tenant SaaS dashboard over the last quarter. Bundle size dropped. Theming finally made sense. Our design system stopped being two different design systems wearing a trench coat.

It also wasn't smooth.

Most "migrate to shadcn" posts you read online are clean. They show you the add command, the new component, a screenshot, and call it done. That's not a migration. That's a greenfield. A real migration is six different teams with five different opinions, twelve dialogs in production traffic, and a Tuesday morning where staging breaks because someone's portal isn't rendering inside an iframe.

Here are the seven things that bit us, in roughly the order they bit us. If you're staring down the same migration, this is the post I wish someone had written for me.

1. Dialog focus trap behaved differently than MUI's