Designing for Scalability

Design
Designing for Scalability
Yannic Scheef
Yannic Scheef 02 Aug 2025

Reading length Full · 7 min read
TL;DRShortMediumFull

Most products don't break because the code can't handle the load. They break because the design assumed a smaller, simpler version of the business than the one that eventually showed up. A dashboard built for ten records becomes unusable at ten thousand. A navigation menu that fit five features buckles under twenty. Scalability is usually framed as a backend concern, but the decisions that decide whether a product ages gracefully or collapses into a rebuild are made in design and product long before traffic becomes the problem.

Scalability is a design property, not just an engineering one

When a product grows, three things grow with it: the number of people using it, the volume of data it holds, and the surface area of features it offers. Engineering can keep the servers responsive under all three. What it can't do is keep the experience coherent. That job belongs to design and product.

A useful test: imagine your product with ten times the users, ten times the data, and twice the features. Does the interface still make sense, or does it quietly fall apart? The answer is rarely about raw performance. It's about whether the structure was built to absorb growth or to fit a snapshot of the present.

That distinction shows up clearly when you compare two products feature by feature. The same screen designed two different ways behaves very differently once reality scales it up.

DimensionBuilt for a snapshotBuilt to absorb growth
NavigationFlat menu of every feature, ordered by when it shippedGrouped categories with search, designed for the menu you'll have in two years
Data tablesRenders the full result set; fine at 50 rows, a wall at 50,000Filtering, sorting, search, and pagination as first-class features from day one
ComponentsBespoke layout per screen; happy path onlyReusable primitives that own their loading, empty, error, and overflow states
PerformanceAssumes instant, complete data; feels broken under real volumeSkeletons, deferred content, and visible-region-first loading designed in

The cost of getting this wrong is concrete. Teams hit a point where every new feature requires a one-off layout, every screen is a special case, and shipping anything new means touching code nobody fully understands. That is the moment a "redesign" gets proposed — not because the old design was ugly, but because it stopped being extensible.

A redesign is the most expensive way to learn that scalability should have been designed in from the start.

Design systems and component reuse

A design system is the most direct way to prevent this kind of fragmentation. When buttons, forms, tables, modals, and empty states are defined once and reused everywhere, growth stops multiplying the work. Adding a feature becomes assembling known parts rather than inventing new ones, and a change to a component propagates everywhere it's used instead of being patched screen by screen.

The benefit is consistency, but the deeper benefit is speed that holds up over time. In our experience, a team without a shared system tends to slow down as it grows, because each new screen adds to the pile of bespoke patterns someone has to maintain. A team with a real system keeps a steadier pace, because the marginal cost of the next feature stays roughly flat.

Principles that separate systems that scale from libraries that rot

  • Design tokens over hard-coded values. Color, spacing, and typography defined as named tokens mean a brand change or a dark-mode launch is a configuration update, not a hunt through hundreds of files.
  • Components that own their states. Every component should define loading, empty, error, and overflow behavior up front. The empty state and the error state are where growth exposes shortcuts — they're also the states most often skipped in the first build.
  • Composition over duplication. A handful of flexible primitives that combine cleanly beat fifty rigid components that each solve one screen and nothing else.
  • One source of truth shared by design and code. When the design files and the component library drift apart, both stop being trustworthy, and people quietly go back to building one-offs.

Tokens are the part teams most often underestimate. The point is that a single declaration cascades everywhere, so a theme change is data, not a refactor:

:root {
  --color-bg: #0b1220;
  --color-accent: #38bdf8;
  --space-md: 12px;
  --radius-card: 8px;
}

.card {
  background: var(--color-bg);
  border-radius: var(--radius-card);
  padding: var(--space-md);
}

Whether tokens live in CSS custom properties, a JSON file consumed by a build step, or a platform like the patterns documented on MDN, the discipline is the same: name the decision once, reference it everywhere, and never inline the raw value.

Information architecture: structuring for growth

The hardest scaling problem in design is not visual — it's structural. Information architecture that works at launch often fails at volume because it was organized around what existed on day one rather than how things would grow.

Navigation is the clearest example. A flat menu of top-level items is perfectly readable with five entries and unusable with twenty-five. The fix isn't a bigger menu; it's an architecture that anticipated categories, grouping, and search before the list got long. Plan for the menu you'll have in two years, not the one you have today. The research on how people actually parse menus and hierarchies — much of it catalogued by the Nielsen Norman Group — consistently favors grouped, predictable structure over long flat lists.

Flat menu — overflows Grouped — categorized groups absorb new items
A flat menu degrades with every feature; a grouped architecture has somewhere to put the next one.

Data-heavy interfaces face the same pressure. A table that renders fine with fifty rows becomes a wall with fifty thousand. Designing for data volume means treating filtering, sorting, search, and pagination as first-class features, not additions bolted on once the complaints arrive. It means defaulting to the most relevant subset rather than dumping everything on screen, and showing aggregates before details so a person can orient before drilling in.

Perceived performance is a design decision

Structure determines whether the product stays legible; perceived performance determines whether it stays usable. They are two faces of the same load problem, and the second is just as much a design responsibility as the first.

Perceived speed is shaped by decisions designers own:

  • Skeleton screens that signal progress instead of a blank wait.
  • Loading the visible region before the rest of the page.
  • Deferring expensive content until it's actually needed.
  • Pagination patterns that never ask the browser to render more than it can handle.

A design that assumes instant, complete data will feel broken the moment real volume arrives, no matter how fast the server responds. Performance belongs in the design brief, not a separate engineering ticket filed after launch — a point the broader web-performance community at web.dev has been making for years.

Designing for change without a rebuild

The features a product will need are largely unknowable at the start. What is knowable is that there will be more of them, and that they'll arrive in shapes the original design didn't predict. The goal is not to anticipate every feature — that's a fantasy that produces bloated, over-engineered interfaces. The goal is to build patterns flexible enough to absorb features without structural surgery.

In practice, that resolves to a short discipline you can apply to almost any design decision:

  1. Favor layouts that extend over layouts that reorganize. A settings architecture that supports adding a section is worth more than a perfectly tuned settings page with no room to grow.
  2. Design the system to be additive. A new feature should plug into existing conventions rather than introducing its own.
  3. Resist over-tuning the present. Don't optimize the current state so tightly that nothing new fits.
  4. Separate the stable from the changing. Keep a clear line between the system (stable) and the features built on it (changing often).

There's a balance to hold. Over-design for an imagined future and you ship complexity nobody needs and slow yourself down today. Under-design and you buy a rebuild in eighteen months. The discipline is to make decisions that are reversible and extensible: structures that can grow, patterns that can be reused, and a clear separation between the things that are stable and the things that change often.

The right question to ask early is not "does this work now?" but "does this still work when there's far more of everything?" The structures that survive growth are usually the boring, extensible ones rather than the impressive one-offs — chosen by teams willing to trade a little cleverness at launch for legibility two years on.

The products that scale well are rarely the ones that were most clever at launch. They're the ones whose structure stayed legible as everything around it multiplied.