Back to work
$ cat ./work/ot-design-system.md

Building OTKit: From Drift to Discipline

Built and scaled OpenTable's design system — establishing shared tokens, component patterns, and contribution workflows across web and native platforms.

Design SystemsTokensMulti-platform
Company
OpenTable
Year
2022 – 2024
Role
Lead Product Designer, Design Systems - Product Owner
Timeline
2022–2024
OTKit Design System hero: overview of the design system River built at OpenTable spanning iOS, Android, and web

Overview

When I took ownership of OTKit — OpenTable's design system spanning iOS, Android, and web — the system existed on paper. In practice, it lacked cohesion, governance, and trust. Design drift, fragmented sources of truth, and inconsistent adoption were slowing teams down and introducing costly QA issues.

My mandate was not just to redesign components.

It was to turn a drifting system into an operational platform teams actually relied on.


Role
Design Systems Lead
Scope
iOS, Android, Web
Team
6 product teams
Timeline
~1 year focused engagement

The Problem

Design system drift was expensive and invisible.

Research through user surveys and 1:1 interviews revealed:

  • Three competing sources of truth (Figma, Storybook, internal token sites)
  • Visual inconsistencies across products and platforms
  • Late-stage QA bugs tied directly to token and component mismatch
Screenshots of multiple Storybooks and documentation source-of-truth websites before consolidation
Design system drift across OpenTable products before consolidation.
We estimated the cost of drift at ~$237K/year in inefficiency and rework.

User Research

A survey of 37 respondents across design, product, and engineering revealed the depth of the problem:

One-off component creation

100% of iOS designers said they were creating new or one-off components often or occasionally, compared to 60% of web designers across both Restaurant and Diner teams. iOS teams suffered the most, which made sense given we had a much more mature web component library (Buffet) but nothing comparable for native.

I think iOS lacks the rich component system that web has (Buffet), and that poses some challenges for us. (Restaurant iOS engineer)

Time spent clarifying styling during release

75% of Restaurant web designers reported spending 4–8 rounds clarifying styling with engineering during each release cycle. Meanwhile, 100% of Diner web designers reported only 0–3 rounds. Cross-functional Restaurant teams were spending significantly more time reconciling their style guide with designers and developers.

Consolidating research

We ran 1:1 interviews and remote collaborative brainstorms using FigJam and Dovetail. The main insight was clear: designers and engineers often had the same problem, namely unclear documentation, scattered sources of truth, and no shared language for components. Most folks knew what colors and styles to use, but much of the style guide lived in designers' heads rather than in a system.

We have a ton of legacy styles and pages on our iOS apps and it's always a push and pull on when and how to update those. (Cris, designer on Restaurant product)

Constraints

The system had to evolve without stopping product delivery.

  • Six product and platform teams shipping in parallel
  • Legacy UI patterns deeply embedded in production
  • Cross-platform requirements (iOS, Android, Web)
Screenshot of Restaurant app showing inconsistent, inaccessible components on web using transparent colors
Inconsistent and inaccessible components on web.

Strategy

To stop drift without breaking teams, I focused on foundations first, then scaled upward:

  • Tokens before components
  • Accessible color and typography foundations
  • Documentation as a first-class system artifact

Foundations: Tokens, Type, Icons

These foundational changes made consistency possible without forcing large rewrites — adoption could happen across active codebases, not instead of them.

Color tokens

  • Audited and documented all existing colors cross-platform
  • Deprecated legacy redundant colors
  • Rebuilt the color system around accessible, semantic tokens
  • Built mixed light/dark theming for existing UI

This resolved cases where critical actions appeared disabled, improved cross-platform parity, and allowed teams to adopt the system without rewriting existing UI.

Figma Variables panel showing OTKit foreground color tokens: semantic roles (default, alt, disabled, action, success, info, warning, danger) mapped across Light and Dark themes with primitive references
Primitive → Semantic → Component. The three-tier contract that made OTKit's theming scale without forking.
Screenshot of semantic color token documentation
Screenshot of semantic color token migration tool
Establishing semantic tokens created a single source of truth across platforms and reduced downstream inconsistencies.

System thinking in action: Table Statuses

A real product use case validated the color system early. The Table Statuses feature needed color-coded indicators for reservation states — and the product team initially proposed 21+ new colors. By collaborating with the design system team, we satisfied the project requirements using the existing accent palette, reducing color sprawl while shipping on time. The product got what it needed. The system stayed coherent.

Contextual typography

The existing type system was a one-size-fits-all scale that:

  • Was not mobile-optimized
  • Encouraged incorrect font usage in native apps
  • Had ballooned to 39 fonts in the codebase
Diagram showing how contextual typography scales across platforms
Diagram illustrating how contextual typography scales across platforms

Solution

  • Introduced a contextual typography scale by platform
  • Defined size, weight, and family per context
  • Added support for Apple Dynamic Type

Impact

A/B testing showed a +2.19% increase in diner bookings (+600 weekly net bookers) on pages using dynamic type.

Animated gif of dynamic text sizing from small to large on iOS iPhone based on user accessibility settings
Animation of dynamic text sizing implemented on iOS
Contextual typography scale showing size, weight, and family defined per platform context
The contextual type scale reduced 39 font variants to a purposeful, platform-aware system.
System maturity over time: typography evolution from raw sizes to semantic naming to brand-refresh naming

Icon system

  • Introduced shape-based icon grids
  • Unified keyshapes for indicators
  • Centralized icon repositories across platforms
  • Added SF Symbol parity for accessibility
Animation of shape-based icon creation grid with keyshapes
Screenshot of icon creation guidelines on documentation site

The result: a searchable, themeable SVG system shared across native and web teams — duplication dropped, accessibility parity improved.

Screenshot of searchable icon library on documentation site
Screenshot showing SF Symbol parity mapping across OTKit iconography
SF Symbol parity ensured accessibility-compliant icon behavior on iOS without duplicating icon work.

Brand Evolution: "Black Is the New Red"

OpenTable operates in an industry dominated by red and orange. Partnering closely with Brand, we translated a premium direction into a tokenized theming architecture rather than one-off visual treatments.

Animation showing updated OTKit brand and theme on iPhone app
Animation showing updated OTKit iconography shared by Debby on LinkedIn

This allowed brand evolution without breaking product consistency. Namely:

  • Two new font families
  • A refreshed color palette
  • Visual distinction for Iconic restaurants

The key insight: by encoding brand decisions as token values rather than hardcoded styles, the system could absorb a major brand shift without requiring teams to rewrite their components.


Theming in Practice

The tokenized architecture made it possible to deliver two visually distinct experiences from a single component library.

Mass Theme

The Mass theme serves OpenTable's core restaurant audience. Editorial in feel, it uses a two-column structure inspired by e-commerce: booking surfaced immediately, decisions guided with minimal visual noise. Every component follows the same token-driven pattern, so new features land consistently without bespoke design decisions at the component level.

Mass Theme: functional editorial restaurant detail with hero section, two-column layout, and booking flow

Iconic Theme

For OpenTable's premium Iconic restaurant tier, the system delivered a distinct but coherent experience. Full-bleed photography, dark wine-inspired time slot styling, and sticky booking flows communicated prestige without sacrificing usability. The same underlying tokens and components powered both themes. No fork required, just a different set of token values.

Iconic Theme: premium experience with full-bleed imagery, icon badges, and dark-wine timeslots

Outcomes & Impact

OTKit delivered measurable ROI:

  • 25% reduction in QA time
  • ≈ $59K/year reclaimed in developer time
  • 50% fewer Figma libraries
  • Unified design language across 6 teams
  • Supported a full OpenTable brand refresh

Designers and engineers also reported a 27% lift in clarity around Figma component sources in our follow-up survey. The consolidation work made it easier to find authoritative components without hunting through legacy Storybooks and one-off libraries.

OTKit scaled across 6 product teams, supporting iOS, Android, and web simultaneously.

What Made This Work

OTKit's adoption didn't happen through enforcement. We built a network of design ambassadors: designers embedded in product teams who championed the system locally and surfaced friction back to the core team. This created a feedback loop that made the system more useful over time.

Photo from OTKit design ambassadorship program
Design ambassadors in product teams acted as system advocates and real-world feedback channels.

Documentation was treated as a first-class deliverable, not an afterthought. Component specs, token definitions, and usage guidelines were kept in sync with engineering. We ran regular office hours, live demos, and shipped a system newsletter to keep teams informed and engaged.

Screenshot of the OTKit system newsletter
The OTKit newsletter kept teams aligned on system changes, deprecations, and new patterns.
I wanted to directly reach out and thank you for your feedback in today's session. All of the links and resources you shared were incredibly helpful. (Stephanie, Restaurant Design Ambassador)
I wanted to mention how helpful it has been having River support me on the design systems front. His depth of knowledge has been invaluable for our team. (Jordon, Restaurant Design Ambassador)

Trust was built through follow-through. When teams reported issues, we responded quickly. When we made breaking changes, we migrated them. That responsiveness turned skeptics into advocates.


Learnings

Challenge: Lack of native Figma support for design tokens

We started work on the foundations before Figma released Variables. This meant we initially had to manage tokens through workarounds: naming conventions, separate documentation, and manual syncing. When Variables shipped, we migrated quickly, but the gap cost us early momentum.

What I'd do next time: More upfront communication around the limitations of tooling and clearer expectations about what would change once better tooling arrived. Teams need to understand the 'why' behind interim solutions.

Challenge: Communicating with remote teams

Working in a remote setting with teams distributed across North America, Europe, and Asia created real communication challenges. Updates got lost, context didn't travel well across time zones, and synchronous meetings couldn't cover everyone.

What I'd do next time: Lean harder into async from the start, with more recorded video demos, tech talks, dedicated Slack Q&A channels, and newsletters. The newsletter ended up being one of our most effective tools, and I wish we'd started it earlier.

Challenge: Scaling myself

Design systems work often got sidelined into supporting feature work that needed system alignment. The constant pull between system-level thinking and product-level support was real, and without clear boundaries, it was easy to become a bottleneck.

What I'd do next time: Be clearer upfront about the design system team's role and responsibility relative to product work. The Ambassadorship model helped with this, but establishing those boundaries earlier would have preserved more time for foundational work.


Reflection

The success of OTKit wasn't the components. It was the shift in mindset. The system became something teams relied on, not something they worked around.

That's the difference between a library and a platform.