Building a design system from the ground up

Building a design system from the ground up

Defining tokens, patterns, and foundations to bring consistency, clarity, and confidence to how we design and build UI at Coherent

scope
Develop a comprehensive design system to support Coherent’s frontend architecture
role
Design System Lead
team
1x frontend developer

Context

As Coherent matured and we began to refine the product, inconsistencies in our interface started to become more noticeable. Similar components had different visual identities, styles were duplicated throughout the codebase, and updating our UI took longer than it should have

Even small UI changes required effort - developers would need to search for styles and I would need to confirm these against scattered documentation in Figma. We needed a single source of truth for design decisions so that everyone could work with more confidence

It became clear that we needed a system that could

  • Bring consistency back into the product
  • Reduce duplicated CSS
  • Establish a clear source of truth for UI foundations
  • Improve speed and confidence in frontend development

I led the design and implementation of a new design system from the ground up - defining tokens, establishing naming conventions, and building a component library that could scale as the product grew

My role

As the lead designer and decision maker on the project, I was responsible for defining the vision, principles and structure of the design system. I worked closely with a frontend developer to ensure that design and code remained aligned as decisions were made

My responsibilities included

  • Defining the long-term direction and goals of the system
  • Researching and building upon best practices
  • Establishing token structure and naming conventions
  • Designing core tokens including colour, typography and spacing
  • Working with frontend to maintain alignment between Figma and the codebase
  • Designing and documenting reusable components
  • Setting standards for how the system would be adopted and maintained

This role was both strategic and hands-on. I needed to look at the product and team from a bird’s-eye view to make long-term decisions, and then jump into Figma and code to execute them

Principles & strategy

Before defining foundations or components, I established a set of principles that I could refer back to ensure the system remained coherent, and maintainable as it evolved. As the sole designer, staying within scope was crucial if I actually wanted to ship anything

I focused on building a system that was:

  • Token-driven - expressing design decisions as reusable variables rather than hardcoded values
  • A single source of truth - keeping Figma and code aligned to reduce ambiguity and duplication
  • Accessible by default - ensuring colour, type, and interaction decisions met WCAG 2.1 standards
  • Built for long-term maintainability - making decisions that would scale as the product and team grew
  • Consistent but flexible - providing clear standards while supporting real product needs
  • Documented as part of the system - treating guidance and rationale as primary outputs, not afterthoughts

I also started work on perhaps the hardest part of this project, choosing a name for the design system! I wanted something abstract but on the theme of coworking, so that it felt connected to Coherent. I didn’t have plans to make this a publicly accessible design system, so didn’t need to worry too much about the marketing benefit of the name

After throwing around a few ideas, and generally just testing for vibe, Hotdesk was born.

Foundations

With principles established, I defined a structured set of design tokens, creating a shared language between design and development. I introduced a layered token model - separating primitive, semantic, and component tokens - so that clear decisions could be made whilst still allowing for easy evolution of the system in the future

Screenshot of the Figma variables dialog showing a collection of overlay variables

Tokens were defined across:

  • Colour - establishing a refined palette and semantic roles for surfaces, borders, text, and patterns
  • Typography - defining a clear type scale and hierarchy to support readability and consistency
  • Spacing - introducing a consistent spacing system based on an 8px grid, to bring rhythm and predictability to layouts
  • Radii and elevation - standardising shape and depth across components

Early colour palette exploration presented a challenge with sprawl. My initial colour set was broad, which made the interface feel visually busy and distracting during testing. By simplifying and rationalising the palette, I was able to create a clearer, more cohesive visual language

Token sprawl also emerged as components evolved. To address this, I introduced clearer categorisation for component tokens - for example defining shared tokens like $input-border-color-default that could be applied consistently across similar components like text inputs, dropdowns, and text areas. This drastically reduced duplication and made for a much more manageable system

A grid of inputs, each with an annotation showing their shared input-level tokens

Token architecture and design–code alignment

To ensure tokens could be reliably used in production, I worked closely with frontend to define how they would be structured and applied in the codebase. After researching existing design systems and emerging standards - including the Design Tokens Community Group (DTCG) specification - I proposed storing tokens in JSON as a way to create a clearer bridge between design and implementation. This helped translate decisions made in Figma into a format that could be consistently referenced in development, regardless of the device we were developing for

We aligned on naming conventions and set up a consistent, human-readable naming pattern where information becomes more granular with each level

Introducing JSON tokens helped speed up the development of new components and reduced back-and-forth between design and engineering. Because token names clearly expressed intent, frontend could apply them with confidence without needing constant clarification, improving both efficiency and trust.

A design-token-chip for $input-surface-color-negative with annotations defining each level of the token name, from category to state

Component library

With tokens in place, I started building a component library that could support real product needs while establishing consistent patterns across the interface

Each component was designed with clearly defined variants covering size, state, and behaviour, allowing teams to solve common problems without introducing new patterns unnecessarily

Rather than attempting to replace large areas of the existing UI, we introduced new components incrementally - allowing the system to grow naturally as features were developed. This approach reduced disruption while steadily improving consistency

By grounding components in shared tokens and clear naming, we created building blocks that felt predictable and easy to apply - reducing decision overhead and making future development more efficient

A zoomed out view of a Figma file breaking down an input component, with annotations and tokens to help developer handoff

Adoption and rollout

Hotdesk was launched into production alongside a piece of work that added clarity to booking details - we created new drawer and key-value table components that became the test subjects for our new token library

Launching the system as part of new feature development allowed frontend to adopt tokens and patterns organically and put us in a good position for 360 degree feedback - design system developments would inform component updates, and new component development would highlight shortcomings in the design system

Impact and outcomes

The impact of Hotdesk was felt almost immediately. New UI components were being built more quickly, and interfaces were being assembled by developers with much more confidence. With each release, the benefits compounded — more tokens enabled more components, which unlocked new areas of the interface to refactor

Key outcomes included:

  • Reduced duplication across design and frontend, with shared tokens replacing one-off styles
  • Faster development of new components, supported by clear naming and reusable foundations
  • Improved consistency across new features as patterns became easier to reuse
  • Less back-and-forth between design and development, as decisions were easier to interpret and apply
  • Increased confidence when making UI changes because updates were built on a stable foundation

Reflection

The biggest surprise for me was how quickly the benefits of this system became visible. Within just a few pieces of work, I could see frontend building with greater confidence and needing less clarification

Token and palette sprawl proved to be a natural part of the process. Catching this early allowed me to step back, simplify, and refine the system before complexity became harder to manage. This project also highlighted the importance of shipping early. Releasing the system alongside real feature work helped avoid getting stuck in a cycle of refinement and ensured the system could grow through practical feedback rather than speculation.

Leading the work largely independently was both challenging and clarifying. Having a clear set of principles to refer back to helped guide decisions, maintain focus, and ensure the system remained aligned with its goals.

This was a massive project for me and felt like the culmination of 7 years of design learning and experience. I’m very happy to finally see Hotdesk putting in the work and laying the foundation for the future of frontend development at Coherent