Skip to content
HomeWorkProcessAboutBlogContact[email protected]
← Back to blog

Choosing a Design System Framework: Material, Tailwind, or Custom

Choosing a Design System Framework: Material, Tailwind, or Custom. design system selection Insights from The Proper Motion Company.

Every new web application faces the same decision within its first week of development: what is the foundation for the UI? The choice between an opinionated component library like Material UI, a utility-first CSS framework like Tailwind, or a fully custom design system affects development speed, visual identity, long-term maintenance, and how easy it is to hire developers who can work in the codebase.

This is not a religious debate, despite what Twitter might suggest. Each approach solves different problems and introduces different constraints. The right choice depends on your project’s specific needs: your timeline, your team’s skills, how much your product’s visual identity matters to your competitive position, and whether you expect to maintain this codebase for two years or ten.

Material UI: The Opinionated Accelerator

Material UI (MUI) is a React component library that implements Google’s Material Design specification. It provides a comprehensive set of pre-built components – buttons, text fields, data tables, navigation drawers, date pickers, dialogs, and dozens more – all styled consistently and accessible out of the box.

Where MUI excels: Internal tools, admin dashboards, B2B applications, and any project where “looks professional and works correctly” is more important than “looks unique and distinctive.” A team of two developers can build a 30-screen admin panel with MUI in three to four weeks because they spend zero time designing buttons, debating border radius values, or building a date picker from scratch. MUI’s data grid component alone – with sorting, filtering, pagination, column resizing, and cell editing – would take a team weeks to build from scratch.

The costs of MUI: Your application will look like a Google product. For some use cases (internal tools, enterprise software), this is a non-issue. For consumer-facing products or brands that need a distinctive visual identity, the “Material” aesthetic is a limitation. Customizing MUI beyond its theming system (which supports custom color palettes, typography, spacing, and shape) requires overriding styles at the component level, which is tedious and fragile – theme updates or MUI version upgrades can break custom overrides.

Performance considerations: MUI’s bundle size is significant. The core library is approximately 80KB gzipped, and importing the data grid adds another 50KB+. For applications where initial load time is critical (consumer-facing landing pages, mobile web experiences), this matters. For admin dashboards loaded once and used all day, it rarely matters. MUI supports tree-shaking, so you only pay for the components you import, but the base cost of the styling engine (Emotion by default) is unavoidable.

Practical advice: Use MUI when your team needs to ship fast, the product does not need a distinctive visual identity, and the application is component-heavy (lots of forms, tables, and dialogs). Avoid MUI when brand differentiation through design is a competitive requirement or when you need pixel-perfect control over every visual detail.

Related: How to Run a Design Sprint for Product Development

Tailwind CSS: The Utility-First Toolkit

Tailwind CSS takes a fundamentally different approach. Instead of providing pre-built components, it provides low-level utility classes – flex, pt-4, text-center, bg-blue-500, rounded-lg – that you compose directly in your HTML to build any design. It is not a component library; it is a styling system.

Where Tailwind excels: Projects that need a distinctive visual identity built efficiently. Tailwind gives designers and developers a shared vocabulary of spacing, color, and typography tokens without constraining the visual output. Two applications built with Tailwind can look completely different, unlike two applications built with Material UI, which tend to converge visually.

Tailwind is also excellent for responsive design. Its responsive modifiers (md:flex-row, lg:grid-cols-3) make building adaptive layouts intuitive. And the “design in the browser” workflow – composing styles directly in markup rather than writing CSS in a separate file – is genuinely faster for many developers once they learn the class naming conventions.

The costs of Tailwind: You are building every component yourself. Tailwind gives you bg-blue-500 text-white px-4 py-2 rounded, not a <Button variant="primary"> component. You need to build your own button component, your own form inputs, your own modal, your own data table. For a simple marketing site, this is fine. For a complex application with 40 unique UI patterns, this is a substantial investment.

This gap is partially filled by component libraries built on Tailwind: Headless UI (unstyled, accessible components you style with Tailwind), Radix UI (similar philosophy), and shadcn/ui (a collection of copy-pasteable components styled with Tailwind). These significantly reduce the effort of building a Tailwind-based design system, but they still require more assembly than MUI.

The “ugly HTML” concern: Tailwind markup can become verbose. A styled button might have 15-20 utility classes. This is visually noisy in the code but practically manageable when components are properly abstracted. Create a Button component once with its Tailwind classes, and every usage site is clean: <Button variant="primary">Submit</Button>. The verbosity lives in one place, not everywhere.

Practical advice: Use Tailwind when your product needs a distinctive visual identity, your team has frontend engineering capacity to build a component library, and you want fine-grained control over every visual detail. Pair it with headless component libraries (Radix, Headless UI) or shadcn/ui to avoid building accessibility-critical components from scratch.

Building a Custom Design System

A fully custom design system means building your own component library from scratch: your own design tokens (colors, spacing, typography), your own component API, your own styling approach (CSS Modules, styled-components, vanilla CSS), and your own documentation.

Where custom excels: Large organizations with multiple products that need visual consistency across platforms, and products where the design is a primary differentiator (fintech apps, creative tools, consumer social products). Airbnb’s design system, Shopify’s Polaris, and Atlassian’s design system exist because these companies need consistent design language across dozens of products and hundreds of engineers.

A custom system also makes sense when you have extreme performance requirements. By building exactly what you need and nothing more, you eliminate the overhead of unused library code. A custom button component is a few hundred bytes; an MUI button carries the weight of its theming engine, style injection system, and variant logic.

The costs of custom: They are high. Building a production-grade design system – with properly accessible components, dark mode support, responsive behavior, animation, documentation, and a contribution process – is a 6-12 month project for a dedicated team. A basic component library (20-30 components) takes a skilled frontend engineer 2-3 months to build to production quality.

Ongoing maintenance is equally significant. Every component needs to be updated when design patterns evolve, tested across browsers and screen sizes, documented for new team members, and reviewed when accessibility standards change. Without a dedicated design system team (typically 2-4 people for a medium-sized organization), the system atrophies – documentation falls behind, new patterns are implemented ad hoc, and the system’s value degrades.

Practical advice: Build a custom design system only when you have at least 10 engineers consuming it (otherwise the investment in creating and maintaining it exceeds the value), your product’s visual identity is a competitive differentiator, and you have the organizational commitment to maintain it over years. For most startups and small-to-medium teams, this is not the right choice.

See also: Why Every Serious Software Product Needs a Design System

The Hybrid Approach: Starting With a Framework and Evolving

The most practical approach for many teams is to start with an existing framework and evolve toward custom as needed. This takes two common forms.

MUI with progressive customization: Start with MUI’s default theme to ship quickly. As the product matures and brand identity solidifies, customize the theme (colors, typography, shape, spacing). Eventually, replace individual MUI components with custom implementations for the components where MUI’s behavior or appearance is insufficient. The MUI theme layer provides a clean boundary: your application code uses semantic component names, and you swap the underlying implementation without changing call sites.

Tailwind with growing component library: Start with Tailwind utilities and shadcn/ui for rapid development. As patterns emerge, extract them into a shared component library with consistent APIs. Over time, this library becomes your design system, built on Tailwind’s utility foundation but with your own design decisions baked in. This approach scales well because you are building the system incrementally based on actual needs rather than speculating about what you will need.

The hybrid approach also applies across products. A company with both an admin dashboard and a consumer-facing app might use MUI for the admin dashboard (where speed and functionality matter more than uniqueness) and a Tailwind-based custom system for the consumer app (where brand identity matters more than development speed).

Decision Matrix: Matching Framework to Project Type

Here is how the three approaches map to common project types:

Internal tools and admin panels: MUI or Ant Design. Speed is paramount, visual uniqueness is not. Ship in weeks, not months.

B2B SaaS products: MUI with theme customization, or Tailwind with shadcn/ui. You need to look professional but not necessarily unique. The investment in a fully custom system is usually not justified until you have 20+ engineers.

Consumer-facing web applications: Tailwind with a growing component library, or a custom system if the team is large enough. Brand identity matters and the “Material Design” look will not differentiate you.

Marketing sites and landing pages: Tailwind. Maximum visual flexibility, performance is critical, component complexity is low (you need styled sections, not data grids).

Multi-product organizations: Custom design system. The investment pays for itself when the same components are used across five or more products by 30+ engineers.

Evaluating Migration Cost If You Choose Wrong

Every framework choice is reversible, but the cost of reversing varies dramatically.

Migrating from MUI to Tailwind (or vice versa) is a significant effort. Every component in the application needs to be restyled, and if MUI’s component APIs are deeply embedded in your code, you are rewriting UI logic as well as styling. For a 50-screen application, expect 2-4 months of dedicated effort.

Migrating from Tailwind to a custom system is relatively smooth because Tailwind-based components already have custom markup – you are mostly replacing Tailwind utility classes with your own CSS approach. The component structure and behavior stay the same.

Migrating from MUI to a custom system is the most expensive because MUI components carry significant behavioral logic (menu positioning, transition management, focus handling) that you need to reimplement or replace with a headless library.

The implication: if you are unsure, start with Tailwind plus a headless component library. This approach gives you the most flexibility to evolve in any direction – toward a fully custom system, toward a component library like MUI for specific complex components, or toward your own opinionated component library – without a costly migration.


The design system decision is not permanent, but it shapes your team’s velocity and your product’s visual identity for months or years. Choose based on your specific constraints – team size, timeline, brand requirements, and long-term maintenance capacity – rather than community popularity or personal preference.

If you need help choosing the right foundation for your product’s UI or building a design system that scales with your team, get in touch. We have implemented all three approaches across different products and can help you make the right call for your situation.

// Related posts