Skip to content
OTFotf
All posts

Eliminate the UI Review Tax with a Shared Design Token Layer

D
DaveAuthor
7 min read
Eliminate the UI Review Tax with a Shared Design Token Layer

AI can ship a screen in eight seconds. It can ship a screen that matches the rest of your app in roughly eight minutes. The gap between those two numbers is where most of the AI productivity tax actually lives — not in the generation, but in the review pass where you stare at the new component and ask "is this the same spacing as everything else, or did it just invent 18px because it felt right?"

That review pass is the tax. It's not glamorous. It rarely shows up in a post-mortem. But multiply it by every screen, every modal, every list row an agent ships, and you've burned a day a week not building — just verifying.

The fix isn't "tell the AI to use the same spacing." The fix is a shared design-token layer that makes the answer automatic.

What "inconsistent" actually costs

A component set without tokens isn't really inconsistent — it's uncoordinated. Each screen makes its own decisions about padding (was it 12px or 16px?), corner radius (6 or 8?), type ramp (14 or 15 for body?), and shadow elevation. Every one of those decisions is small. Together they're the visual texture your users feel without naming.

When a human designer built the original screen, the inconsistency was hidden — they held the conventions in their head. When AI builds the next twelve screens, those conventions aren't anywhere a model can read. So it invents. gap: 14px here, padding: 18px there, border-radius: 7px because some training example used that. Each one is a one-character drift from your real scale.

The cost isn't the drift itself. The cost is the review to catch it. You have to scan the new screen, hold it next to the old ones, decide if the 14px gap is "close enough" or "wrong". Do that twenty times a day and you've paid for an afternoon you didn't plan on spending.

manual review vs token-driven shipping

Why AI makes this worse, not better

This is the part nobody wants to hear: AI is very good at making a new screen look right in isolation. Border-radius, color, type weight, hierarchy — all present, all plausible, all internally consistent. The screen looks finished. It will pass a screenshot review from a non-designer.

It will fail a side-by-side review from anyone who's used the rest of the app. Because the agent built a plausible component, not your component. It pulled spacing from its training distribution, not from your codebase.

The naive mitigation is "put the design system in the prompt." It helps, a little. But every prompt is a lossy compression of the real system, and every model interprets "use 16px spacing" slightly differently. You end up with a different kind of inconsistency — the kind that almost matches, which is harder to spot than the kind that obviously doesn't.

One codebase. iOS, Android, and web.

The Fitness Kit ships with auth, a database, and a backend already connected — no setup. Live demo at fitness-preview.otf-kit.dev.

See the live demo

What a token layer actually does

A design token is a named constant for a design decision. space.3 = 12px, radius.md = 8px, color.surface.muted = #F5F6F8. The names are stable; the values can change. Every component reads from the token, never from a literal.

// tokens.ts — a single source of truth
export const space = {
  0: '0',
  1: '4px',
  2: '8px',
  3: '12px',
  4: '16px',     // the gap that used to be 14, 15, or 18
  5: '24px',
  6: '32px',
  8: '48px',
} as const

export const radius = {
  sm: '4px',
  md: '8px',     // the radius that used to be 6, 7, or 10
  lg: '12px',
  full: '9999px',
} as const

export const color = {
  surface: { base: '#FFFFFF', muted: '#F5F6F8', raised: '#FAFBFC' },
  text:    { primary: '#0B0C0E', secondary: '#4A4F57', muted: '#7A8089' },
  border:  { subtle: '#E6E8EC', strong: '#C9CDD3' },
  accent:  { 500: '#3B6EF5', 600: '#2E58D1' },
} as const

When every component in the kit reads gap: space[3] and border-radius: radius.md, there is nothing for the agent to invent. There's no "what padding should I use?" — the token answers it. There's no "what radius?" — the token answers it. The agent's job collapses from "decide every value" to "pick the right token name", which is a much smaller job and one it's good at.

tokens are the dictionary the agent actually reads

The review step disappears

This is the actual win, and it's worth naming carefully. When the agent produces code that reads from the token layer, the review pass changes shape:

  • Before: open the new screen, eyeball it next to the old ones, decide if the 14px gap is close enough, fix the three that aren't, re-render.
  • After: open the new screen, confirm it uses the kit components, ship.

The visual review doesn't go away — but it becomes a legibility check ("does this layout tell the user the right thing?") instead of a consistency check ("is this the same spacing as the other screen?"). The first is design judgment. The second is mechanical, and mechanical is what tokens automate.

If your screen review loop averaged four minutes before tokens, it averages roughly forty seconds after. That ratio holds across the team.

Cross-platform is where it matters most

On the web alone, an inconsistent component set is a one-platform problem. Add iOS and Android and it becomes three. An agent that ships a web screen in 14px padding will ship the mobile equivalent in whatever its native training data thinks "standard padding" is — usually 16, occasionally 13, sometimes 15 depending on which platform's examples dominated pretraining.

A token layer with a single source of truth fixes this only if it actually reaches every platform. That means the same token names have to resolve to the right values on web, iOS, and Android without three parallel files drifting apart. When they do:

// one component, three platforms, one set of decisions
import { Card, Stack, Text } from '@otfdashkit/ui'           // web
import { Card, Stack, Text } from '@otfdashkit/ui-native'   // iOS + Android

<Card padding="md" radius="md">
  <Stack gap="3">
    <Text size="lg" weight="semibold">Project name</Text>
    <Text size="sm" tone="secondary">Last edited 3 hours ago</Text>
  </Stack>
</Card>

The gap="3" is the same value on every platform because the token is the same value on every platform. The agent doesn't get to pick — it can only name. That's the whole game.

What this enables

The compounding effect is the part that doesn't show up in a single-screen demo. Two weeks into a project where every component reads from tokens:

  • The kit has a 24-item design checklist enforced by a script before anything ships. The agent extends the kit instead of regenerating it.
  • Theme changes are a one-file edit. Flip the brand color in tokens.ts, every screen on three platforms updates. No grep, no three-place edit.
  • New screens take minutes, not hours, because the consistency question is already answered.
  • The review pass is short enough that it stops feeling like work and starts feeling like a sanity check.

That's the productivity story. It's not "AI is faster." It's "AI plus a token layer is faster and the output is consistent enough to ship without a human reconciliation pass."

The durable layer under the model churn

Models will keep changing. The one that ships great components today will be replaced by one that's better at prose, or worse at spacing, or trained on a different corpus. The token layer doesn't care. It sits underneath the model, the agent, the editor, the framework — and it makes every one of them produce the same output, because the output is reading from the same dictionary.

That's the layer worth investing in. Not because any single model needs it, but because the next model will too.

A free MIT SDK that ships this layer for web, iOS, and Android — same component names, same token names, same look — is on npm as @otfdashkit/ui, @otfdashkit/ui-native, and @otfdashkit/tokens. It's the part that doesn't change when the model does.

design-systemai-toolsreact-native
OTF Fitness Kit

Stop wiring. Start shipping.

  • Login, database, and backend already connected — nothing to set up
  • iOS + Android + web from one codebase
  • AI configs pre-tuned + 40+ tested prompts included