← All case studies

A Figma plugin that checks a design is ready to build before handoff.

Lead designerExpedia Group2023-248 min read

Auditor’s cover: the plugin window listing EGDS components, with platform icons, usage counts and lifecycle status for each one.
120+
Users by April 2025
64%
Of designers used EGDS plugins daily
30,000
Layers audited in about 5 seconds

Auditor is a Figma plugin I designed for the Expedia Group Design System (EGDS). It shows designers and developers which EGDS components a design uses and whether they are ready in code, and places a report in the file for handoff. I was the lead designer, working with Eric, an engineer, throughout. Some additional developers were drafted in for parts of the project.

Auditor slides1 / 18
Introducing Auditor, the title slide.

Where it started

EGDS had consolidated four design systems into one and graduated 55 components across iOS, Android and web, and product teams were now expected to build with it. But the system wasn’t complete. Some components weren’t built on every platform and others were being deprecated. Designers had no easy way to tell which was which, so teams were designing with components that didn’t exist in code.

The working assumption was a versioning problem, so Eric and I were put onto it. When we started talking to people who used the system, we found the terms they used didn’t match, even within our own team. So I put together a glossary first, working through each term with the design system team and a group of designers and developers until we agreed.

The EGDS glossary

One set of words for everyone working on the system.

VersioningVersioningVersioning is the creation and management of multiple product releases. When comparing a proposed design with what is available as code in the system, a developer needs to be able to identify what has been swapped, added or deprecated over time and install or upgrade what’s needed. They also need to be aware of any potential breaking changes that could occur. Versioning allows us to identify feature sets that exist at a particular point in time and ultimately to communicate about that feature set. This is particularly helpful given we have multiple products and systems.
VersioningVersioned artifactsArtifacts refer to all of the individual pieces that a design system releases, not just code. Not all of these will need to be versioned and the method of versioning for those that do may be different, depending on type of artifact. Examples: Tokens, toolkits, components, fonts, Figma components, Figma sticker sheets.Previously known as Outputs or Versioned outputs.
VersioningSemantic VersioningSemantic versioning or Semver is a public specification for giving meaning to product or software releases. Semver is represented by 3 numbers separated by periods eg 2.1.17 and uses the format Major.Minor.Patch, incrementing each number depending on what happened to the file. Major - breaking or incompatible changes / major design refreshes. Minor - adding features that are backwards-compatible Patch - backwards-compatible bug fixes Examples: v0.1.0 (unstable, before first major release) v1.0.0 (stable and dependable, first major release) v1.1.0 (first feature released) V1.1.1 (bug fix or patch applied) v2.0.0 (major release launched)
VersioningNamed VersioningMajor versions of a system can be given a codename or release name to help with recognition and for marketing purposes. Apple, for example, has used named versioning alongside semantic versioning when releasing its products, first with big cats (Leopard, Tiger, etc), and then with mountain ranges (Yosemite, Big Sur, etc). The historical context can be lost with named versions, but many users can recall the name of the latest version. Examples: OS X 10.6 Snow Leopard OS X 10.7 Lion OS X 10.8 Mountain Lion OS X 10.9 Mavericks OS X 10.10: Yosemite OS X 10.11: El Capitan
VersioningBreaking ChangeA breaking change is when a change in one part of the system or component causes other apps / components to fail or break (without refactoring). The issues usually occur in shared coded libraries with interdependencies, however a breaking change could also occur in design when updating to a newer component could cause other design files or coded components to break. If using Semver, a breaking change would constitute a MAJOR update/bump to the version number. Examples: v1.5.0 (Component receives minor update) v2.0.0 (Component receives major update that results in a breaking change)
VersioningSoft Breaking ChangeA version that is released containing the old and new functionality so it is backwards compatible. This gives teams an easy way to migrate to a breaking change. A soft breaking change will then be followed by a Breaking Change after a set period of time, where the old function has been removed.
VersioningBackwards compatibilityA backwards compatible feature or fix should allow for interoperability with existing components or code libraries. If using Semver, a new design feature that ensured existing compatibility could be expressed as a Minor update, whereas a bug-fix or under the hood tweak that also ensured backwards compatibility could be expressed as a Patch update. Examples: v1.5.0 (Component receives minor update that is backwards compatible) v1.5.1 (Component receives a bug-fix that is backwards compatible)
VersioningDeprecationThe act of no longer supporting a piece of the design system. This can be how part of a component functions, the whole component, or a set of components. Often, there is a period where it is marked “deprecating”, where it is not removed from the system, but a notice of deprecation is communicated. Examples: UDS token gets renamed to EGDS. Old token gets deprecated. Component uses new sheet system as a container. The previous sub component will be marked as deprecated and eventually sunset.
VersioningMonorepoA monorepo is a single code repository that contains many projects. In the case of EGDS, each Toolkit (i.e. components-react) will contain several installable systems (core and all subsystems). Example: UITK React or lodash - 1 repository, many installable things
Tiers and systemEGDS PlatformThe EGDS (Expedia Group Design System) Platform is the collection of pieces, parts, people and processes that allow us to create cohesive customer experiences at scale. It is the product that our designers and developers use that allows us to deliver a product to our travelers and suppliers. The EGDS Platform encompasses design files, patterns, documentation, processes, coded components, code toolkits, design tokens and more. Note: Shared UI is not a part of the EGDS Platform, but is composed of EGDS components.
Tiers and systemTiersA tiered design system architecture allows additional teams to contribute and extend the core functionality of the design system. Components released in the core, middle, and local tiers have differing minimum requirements for quality and platform adherence. Examples: Core system contains the EGDS core system and is owned by core team. Middle tier contains workspaces that are collectively owned by a group of product teams. Local tier contains workspaces that are owned by a single product team
Tiers and systemCore TierCore tier contains only the EGDS Core system. The core tier is managed by a centralized team who are responsible for the definition and governance of the overall ecosystem. Example: Core tier contains the core system.
Tiers and systemMiddle Tier (TBD)The middle tier contains workspaces that extend the core system. Components in these workspaces should have general capabilities and functionality that can span across multiple product teams or divisions. Components in a middle tier workspace are collectively built, owned and maintained by a collective of 2 or more product teams. Middle tier workspaces have a dependency on EGDS core system. Example: Middle tier could contain the search, shopping and reporting subsets. Note: Middle tier naming is still TBD. There are concerns with naming it ‘Shared’, due to confusion with Shared UI. Suggestions: Communal Community Combined Middle GroupPreviously known as Shared tier, and now called that again.
Tiers and systemLocal TierThe local tier contains workspaces that extend the core library with specific capabilities and functionality that is limited in scope to a single line of business. Components in a local tier workspace are built, owned and maintained by a single product team only. Local tier workspaces have a dependency on EGDS core system and could also potentially have a dependency on a shared workspace. Everything in local should be a net new feature of a component or a net new component, not a roll up of pre-existing components - that should live in shared UI. Example: Local tier could contain the air and lodging workspaces.Now called Team tier.
Tiers and systemCore SystemEGDS core system includes the design tokens, components and documentation that is used by all adopters of the EGDS platform. EGDS core system lives in the core tier. The core system contains platform and framework specific toolkits, which in turn contain components. Foundation, semantic and feature tokens can be created and used within the core system.
Tiers and systemWorkspaceWorkspaces are extensions to the EGDS core system and as such, have a dependency on it. Workspaces can live in a local or middle tier of the design system. Each workspace extension of the core would eventually include tokens, components, documentation, a dependent parent system, owners and versions. Each workspace is responsible for establishing its operating model. Only feature tokens can be created and used within a middle or local tier workspace. Examples: A shopping workspace could potentially live in the middle tier and be jointly owned by the local air and lodging teams. The lodging workspace lives in the local tier and is owned solely by the lodging team. The air workspace lives in the local tier and is owned solely by the air team.Previously known as Subsystem.
Tiers and systemMiddle tier workspaceA workspace in the middle tier is collectively built, owned and maintained by 2 or more product teams working together. Example: The shopping workspace lives in the middle tier and is collectively owned by the local lodging and air teams.Now called Shared tier workspace.
Tiers and systemLocal tier workspaceA workspace in the local tier is built, owned and maintained by a single product team only. Example: The lodging workspace lives in the local tier and is owned solely by the lodging team.Now called Team tier workspace.
Tiers and systemToolkitA toolkit represents the encoding of EGDS through a particular programming language or framework. Within each toolkit (eg React) will be components that can be used to build experiences on that specific platform. Components expressed in code have a 1:1 representation in design. Examples: React (web) SwiftUI (iOS) Jetpack (Android) Figma (design)
Tiers and systemComponentComponents are the implementation of an EGDS design in code and are used as building blocks used to build experiences. Components can contain a set of behaviors, properties, and a user interface. Note: Components in design only are referred to as ‘Figma Components’ - these have a 1:1 representation in code.
Tiers and systemMatchmakingWhen a team has a need for a component not covered by the core system across toolkits, there will be a matchmaking phase, where a match will be attempted between that team and another workspaces component. If no match exists, then that component will be created in a new or existing workspace. The process for matchmaking is currently TBD.
PlatformPlatformPlatforms refer to the specific device type that the application will run on, either Native or Web. Native platforms we currently support are iOS and Android. The web platform will usually mean desktop, tablet or mobile device, accessible via a web browser. Examples: Web Native (iOS, Android)
PlatformExperience PlatformExperience platform is the name given to the EG organisation that is responsible for providing end-to-end experience architecture innovation and the design system and platform tools that power it. Experience Ecosystem: EG Design System Accessibility + XD Engineering One Design Language Platform Tools Core Experiences: One Identity, Profile & Personalization One Messaging Platform Assistance Everywhere eCommerce & CheckoutAlso known as XD Platform, Experience Platform Design or XD Experience Platform.
PlatformFrameworkThe framework is a software toolset that provides built-in solutions meant to speed up development. The framework is built on a programming language, and often has reusable code (functions, utilities, etc) so the platform does not need to be built from the ground up. A framework does not mean a platform, as there can be multiple frameworks per platform. Examples: React for web Jetpack for Android SwiftUI for iOS
PlatformProgramming LanguageA type of written language that tells computers what to do. Examples: Javascript / Typescript for web Kotlin for Android Swift for iOS
PlatformLibraryA library is a set of code that’s been packaged for reuse. While we use it synonymously with “toolkit”, our preference is to use “toolkit”. See also: Figma library for design
PlatformAdoptersThe teams, pods or organizations that consume the code to build applications or experiences. Examples: XD Lodging Team Trips TeamAlso referred to as Consumers or Customers.
PlatformDocumentation siteA single documentation site that combines (or federates) all previously existing documentation sites regarding EGDS, Shared-UI and Experience API. Example content could include: Tokens Component examples and guidelines A11y guidelines Support Guidance on developing for web & native Design guidelines & best practicePreviously known as Federated doc site.
PlatformThe CatalogThe catalog provides a clear picture of component names and system relationships. The catalog acts as the source of truth for what workspaces and components exist and the current state of each. The catalog will eventually track the version history of components across platforms. Example implementations: Figma (design) React (Web) Swift (iOS) Kotlin (Android)Previously known as Pipeline, Design ecosystem registry or Registry.
TokensTokenDesign tokens store repeatable style values like colours, fonts, sizing and spacing. They provide a platform and technology-agnostic way to store a value to be ingested by applications. These can represent anything defined by design: a color as a hex value, an opacity as a number, an animation ease as Bezier coordinates. Overall, they establish the single source of truth for style decisions made across creative tools and coding languages. This allows product teams to collaborate better and ensure consistency across platforms.
TokensFoundation tokenFoundation tokens contain the raw values for color, spacing, size, weight, etc to define a brand in EGDS. This allows for all possible brand values to be visible in one place. The brand overrides the default values with specific values. Brand designers typically define these tokens and don’t change very often. For the most part, foundation tokens can be considered “set-and-forget” and don’t change when doing product or component design work.
TokensSemantic tokenSemantic tokens are an additional layer that sits between feature and foundation tokens. They provide the ability to make fast, sweeping changes to colors throughout an application. Semantic tokens allow for consistent choices when applying meaningful color to components (eg positive / negative) and offer guidance for creating accessible experiences for our users (semantic color tokens always have dark mode mapping built in).
TokensFeature tokenA feature token contains values that are specific to a component, such as a button, banner, card, etc. Feature tokens define specific properties of a component and then map or point to a foundation or semantic token to define their brand value. Feature tokens always point to a semantic or foundational token and never reference values directly.
TokensCore tokenWhen we refer to ‘Core tokens’, in conversations amongst our team as we build out our platform, we are in fact referring to any foundation, semantic and feature tokens used by the core tier of the design system. We may want to do this occasionally to distinguish the difference between a group of core feature tokens and local tier feature tokens, for example. We can refer to the token within the core system by including the core name as a prefix before the token name: Examples: “Core token” “Core foundation token” “Core feature token” “Core semantic token” Or simply just refer to them by their original name: “Foundation token” “Feature token” “Semantic token”
TokensWorkspace tokensWhen we refer to ‘workspace tokens’, in conversations amongst our team as we build out our platform, we are in fact referring to any feature tokens used by the local or middle tier of the design system. We may want to do this occasionally to distinguish the difference between local tier, middle tier or core system tokens. A contributor within a workspace can define feature tokens to be applied to a workspace component, but cannot define a foundational token. When referring to the token within the workspace, we can include any combination of tier, workspace or component names as a prefix before the word token: Examples: {workspace} token: “shopping token” {tier} {workspace} token: “local shopping token” {tier} {workspace} {component} token: “local shopping comparison table token”
FigmaFigmaFigma is a collaborative web based design tool that allows us to create elements for reuse across design files. At EG, we have an EGDS Team Library where Figma Components are kept for use in product designs, along with documentation. Components in Figma are published to a library and then used to compose experiences by adopting product design teams.
FigmaFigma componentFigma components are the building blocks of our experiences. Components are published to a Figma library. Components in Figma can be used in designs by pulling an ‘instance’ of the component in from the EGDS Figma library. They are then able to be configured by changing properties within the component and also themed for brands, using our in-house ‘Themer’ plugin. All Figma components have a 1:1 representation in code.
FigmaFigma libraryIn Figma, you can share components and styles by publishing them. This turns your file into a library, so you can use instances of those components in other files. Updates to the design of your components can be published and pushed out to other documents where instances of your components live. Currently in Figma each EGDS Core component (along with all its variations) is published as a separate library, within the larger EGDS team.
FigmaFigma instanceA Figma instance is a placed occurrence of a main component in a design file. There can be multiple instances of the same Figma component with various states and variations per design file. When changes are made to an original Figma Core component and published to a library by the EGDS team, the end user of the instance (eg a designer on a product team) will get a notification that the component has changed and will be asked if they want to update their design to the latest version of that library.
FigmaFigma stickersheetA Figma stickersheet is a single page view of commonly used Figma components, used by the design team as a quick start guide to cut and paste from. The stickersheet is composed of instances of Figma components and is maintained by the EGDS design team.
FigmaFigma pluginPlugins are programs or applications created by the Figma community that extend the functionality of Figma and FigJam. Plugins run in Figma or FigJam files and perform one or more user actions. They allow users to customize their experience or create more efficient workflows. Figma plugins are written in Javascript and build UI using HTML. Plugins interact with the Figma application via a dedicated Plugin API. They can also leverage external Web APIs. You can build plugins that run immediately, or build plugins that require users to input information via a user interface (UI). EG currently has several published plugins that can be used to build experiences on EGDS platform: Themer (renders components in any brand theme) Tokenizer (applies design tokens to Figma components) Syncer (syncs brands foundational tokens and style)
FigmaFigma auditor pluginAuditor is a Figma plugin currently being built by the EGDS team. It will enable the user to be able to check the status of any component used within a design in Figma, across all platforms (eg iOS, Android, web).
AssetsIconsIcons are globally recognized, simple symbols that gives a user the visual representation of common actions, objects, or ideas. When we refer to icons in EGDS it’s important to note that there are 2 different types of icons: icon glyphs and icon components.
AssetsIcon glyphsWhen icons are displayed using typographical characters, they are often referred to as icon-glyphs. However, in EGDS we refer to Icon Glyphs as the base unstyled icon shape, stored in Figma Foundation files and as SVG in code.
AssetsIcon componentIcon components take a foundational icon glyph and apply a size constraint and semantic color to it. Icon components can be used both in Figma and in code to build cohesive experiences.
AssetsMarksA graphic symbol that gives a user the visual context of a brand or program. Examples: Brand logo marks, payment type logos, brand loyalty program assets.
AssetsIllustrationsA pictorial representation that communicates and illuminates a concept, idea, or process to a user with delight, interest, and beauty. EGDS illustrations are currently restricted to single-brand use. Illustrations cannot be shared across brands. The EGDS core team does not create or take requests for illustrations. Each brand’s design team is responsible for asset creation if defaults aren’t desired.

What was going wrong

With the language agreed, we went back to the research. Most problems showed up at handoff, when a developer found parts of a design couldn’t be built. I laid out one common scenario for a PM, a designer and a developer: a design using components that weren’t built on every platform. After a lot of back and forth, the team falls back on an older version already in code, which might look and work differently.

A handoff, as it worked then

One piece of work, followed through each role. The red cards are where the design and the code fall out of step. Scroll or drag sideways to follow it.

  1. I’m aPM
  2. My team identifies the need for a feature
  3. We assign some design & dev resource to the project in quarterly planning
  4. Write Jira tickets, estimate project time & contact resources to begin work
  5. I review designs with the rest of the team, all looks good to me so far
  6. Designer tells me we can’t build the designs as we intended as some components aren’t up to date
  7. Hold Zoom meeting to discuss with designer. Developer estimates it will be a few weeks to get component up to latest version.
  8. No time allocated due to other workstreams. Discuss with designer and agree to use the older (current) version in code.
  9. Receive an updated design using the older (current) components. Tell team & stakeholders some features are missing.
  10. I’m aDesigner
  11. I get briefed on some new project work and assigned
  12. I put together a page flow using EGDS components from the library
  13. I prepare the design as ready for dev handoff with a11y specs etc
  14. I share the design with the team for review. Once it’s signed off, it goes to development.
  15. Developer tells me several of the components aren’t built yet in EGDS and asks what to do next.
  16. I discuss the issue with my PM. Apparently we have a limited window to ship the feature.
  17. Developer wonders if we can use a previous version of the component that is readily available in code.
  18. This sounds ok, however some features may be missing.
  19. I look on the web and native documentation sites to see what version of the component is available right away.
  20. I can see what the version is on the web documentation site but it has a different number on native platforms
  21. I speak to a dev for each platform to see what state the component is.
  22. The dev asks me to mock up the designs with an older version of the component?
  23. I go to Figma and look through the version history to see when major changes were made.
  24. There are no version numbers but I think I can match up the right old version of the component before feature X was added.
  25. I revert the history to see the older version. I can’t inspect the component, just view it.
  26. I manage to duplicate the component file into my drafts. I can now use this in my design.
  27. I’m aDeveloper
  28. I get assigned to a project
  29. I receive a design spec
  30. I inspect every component in the design and notice some features don’t match what’s in the web component library.
  31. A team mate who’s worked in this space before suggests I use the current version of the component as the features aren’t built yet.
  32. This sounds like a good idea so I ask designer to mock up a new comp with the current components in.
  33. I wait for the new designs...
  34. I receive the designs and can now begin to code up the page flow

As a PM working on a new experience

I want to ensure my developers can build the designs within our scheduled timescale, and to know early if they can’t

So that we hit our deadlines, deliver on the roadmap and our quarterly targets, and don’t miss the conversion bps the feature was planned to deliver.

As a designer working on a new experience

I want to use the latest components and features, and know straight away whether I can

So that I don’t have to compromise my designs, dig through documentation sites or get dragged into meetings to find out.

As a developer working on a new experience

I want to receive a design that I know has been pre-checked for feasibility

So that I can just get on and build it, without wasting time on feasibility studies I don’t need to do.

A change of focus

It looked less like a versioning problem and more like a status one.

Most questions people brought us were about whether a component was ready to use, not which version it was.

What each group needed

From our conversations with the people building with EGDS.

Product designers

  • Want to use the latest components without compromising their designs.
  • Need to see every component’s status before handoff, without digging through doc sites.

Developers

  • Want designs already checked for feasibility, so they can get on and build.
  • Need to know when updating a component or library will cause breaking changes.

Product and programme managers

  • Want designs that can be built in the allotted time, so deadlines are met.
  • Need to know early if a component has to be built on a platform, as that’s a whole stream of work.

The idea

I then looked at how someone could check a component’s status. The simplest way was by hand: a designer or developer looks up each component in the registry.

  1. Inspect file
  2. Find components
  3. Note names
  4. Check the registry
  5. Write a status report

Repeat for every component in the design

We ruled that out first. It was too slow, and nobody would do it the same way twice. So we looked at automating it, with an audit that runs over the design and does every lookup at once.

  1. Run the audit
  2. Every component checked
  3. Report ready

Once, in seconds

The audit could be run by the designer before handoff, or by the developer after it. We went with the designer, so problems could be sorted while the design was still in progress and the designer still had time set aside for it, before it reached a developer. Developers also couldn’t run plugins without a full design seat, as Dev Mode hadn’t launched.

The same handoff, with a component audit

The same piece of work, as we expected it to run before we built anything. The designer runs the audit before handoff and sorts out anything that isn’t ready with the PM. Switch between the happy and unhappy paths to see both.

  1. I’m aPM
  2. My team identifies the need for a feature
  3. We assign some design & dev resource to the project in quarterly planning
  4. Write Jira tickets, estimate project time & contact resources to begin work
  5. Designer tells me components are out of date. Due to time constraints, I suggest we use the current versions.
  6. I review designs with the rest of the team, all looks good to me so far
  7. Developer estimates build time and updates Jira
  8. Designer sends me link to page flow to review with team
  9. I’m aDesigner
  10. I get briefed on some new project work and assigned
  11. I put together a page flow using EGDS components from the library
  12. I prepare the design as ready for dev handoff with a11y specs etc
  13. I run a component audit which gives me a list of all components in my design and checks which version they are all on
  14. I notice a few components aren’t available to use. Hold meeting with PM.
  15. All components are up to date
  16. Modify design using older (current) version of components.
  17. I share the design with the team for review. Once it’s signed off, it goes to development.
  18. I run the component audit again and share the design with the team for review. Once it’s signed off, it goes to development.
  19. I get sent coded page flow to review / UAT
  20. I’m aDeveloper
  21. I get assigned to a project
  22. I receive a design spec with a list of all components.
  23. All the components are ready to use so it’s easy for me to estimate delivery time
  24. Begin work
  25. Finish working on page flows

As a PM working on a new experience

I want to ensure my developers can build the designs within our scheduled timescale, and to know early if they can’t

So that we hit our deadlines, deliver on the roadmap and our quarterly targets, and don’t miss the conversion bps the feature was planned to deliver.

As a designer working on a new experience

I want to use the latest components and features, and know straight away whether I can

So that I don’t have to compromise my designs, dig through documentation sites or get dragged into meetings to find out.

As a developer working on a new experience

I want to receive a design that I know has been pre-checked for feasibility

So that I can just get on and build it, without wasting time on feasibility studies I don’t need to do.

What needs to happen early

Spot the components that can’t be used, then decide what to do about them.

The earlier it’s surfaced, the more time there is to decide: use an older version already in code, or build what’s missing, which can affect the roadmap.

Why a plugin

To decide early, someone had to know which components weren’t ready on every platform. The Design System Resource Service (DSRS) already held that, and much more.

Lifecycle status, platforms, owner, docs, repo links, tier and Figma IDs all feeding into the Design System Resource Service (DSRS).LifecyclestatusPlatformsOwnerDocsRepolinksTierFigma IDsDSRSDesign System Resource Service
Everything about a component, gathered in one place.

The designs were in Figma, so a plugin made sense, checking every component against the DSRS in one go. It ran the audit for you, so we called it Auditor.

Deciding what to build first

We started with real handoff files. Every team handed off differently, often with many frames on one page, so Auditor needed to check a selection of frames as well as a whole page.

We then tested static mock-ups with designers and UI engineers, turned the feedback into features, and stack ranked them with the team by impact and feasibility.

SelectionUsabilityContentComprehensionPlugin designs

Tap a note to read it.

High impactLow impactLow feasibilityHigh feasibility

    P1 15

    • Plugin designsDesign an MVP version of the plugin
    • UsabilityFeedback to tell the user the report is running (loader / spinner)
    • SelectionConsider how to read content nested within Figma components, eg using nested areas in cards
    • ContentCollapsible panels to break up Core / Local / anything else
    • ContentIcons instead of links in the report to declutter (UI only, the placed report can’t link an image)
    • ContentRecognise and potentially flag deprecated components
    • ComprehensionEducate users on what lifecycle status actually means
    • ComprehensionSome way to say what the number of instances of a component means, eg a header
    • ComprehensionInstall landing page in Figma explaining what Auditor does
    • ComprehensionA header row on the report table explaining what the data means, eg how many times a component is used
    • ComprehensionA best practice guide on designing and building with Auditor
    • ComprehensionOnboarding section that links out to Confluence / Figma to find out more
    • ContentLink to Android docs site
    • ContentLink to iOS docs site
    • ContentLink to UITK docs site

    P2 16

    • SelectionFeedback to say which frames have been selected
    • SelectionSelect multiple frames in the page
    • UsabilityMake the plugin performant
    • Plugin designsDesign a north star version of the plugin with all features
    • UsabilityFeedback for the user when they’ve completed an action
    • ContentRecognise a user’s own local Figma component as not EGDS, then check the components inside it
    • UsabilityGive the report a name
    • UsabilityIf several frames are selected, the report says which frames it ran against
    • ComprehensionA link to docs or onboarding in the placed report, for a developer seeing one for the first time
    • ComprehensionMake it obvious where the links in the report go
    • UsabilitySortable table, eg A to Z or number of times a component is used
    • Plugin designsDark mode version of the stickersheet
    • ComprehensionOnboarding content inside the plugin window itself
    • UsabilityReport for one, several or all platforms, eg only web if that’s all you’re building
    • UsabilityGenerating a report could place the frames and report into a section
    • UsabilityAdding the report to a new page could bring the selected designs across into a section

    P3 8

    • SelectionList selected frames with checkboxes to toggle before running, so a wrong frame is easy to remove
    • ContentShow detached instances of components
    • UsabilityMake a report easier to find on a busy page, eg zoom to it, highlight it, blur the rest
    • SelectionRemember which frames were selected when a report is regenerated
    • ContentShow things that aren’t EGDS, eg a plain text layer
    • UsabilityMake the plugin delightful, eg illustrations and animation
    • SelectionLock layers such as specs and documentation so Auditor skips them
    • UsabilityOne click to open the Figma, web, iOS and Android code for a component in separate tabs
    Every feature plotted by impact and feasibility, then stack ranked.

    A UI kit for our plugins

    We wanted Auditor to feel like a native Figma tool, using Figma’s own design language to keep the learning curve low. Figma’s UI2 community file gave us a start in design, but there was nothing reliable in code, so we built our own kit. I forked UI2 and extended it with everything our plugins needed. Eric rebuilt the same set 1:1 in React, so we could turn an idea into a working prototype in code quickly. It became the base for every plugin we built after that.

    The plugin UI kit in Figma. Section headers, disclosures and type styles; buttons in every state and size; plugin footers with primary, secondary and destructive actions; the Auditor plugin window with its tabs, page and frame pickers and Run report button; text inputs, checkboxes, radio buttons and switches; option menus and dropdowns; status badges for alpha, stable and deprecated; platform marks; toasts; and tooltips.
    The plugin kit in Figma. The same components existed in React, so a design could go straight into a build.

    The pilot

    Once we had an early version working, we invited product teams into a pilot. The pilot group shared comments in a Slack channel, which we fed straight back into the build, so bugs and usability issues were caught early.

    Auditor demo, work in progress

    What we shipped

    After the pilot, we published Auditor as a private plugin in Expedia Group’s Figma organisation, so anyone in the company could use it. It runs on a page or a selection of frames, with a short tour the first time you open it, and lists every EGDS component in the design, grouped into Core and each team workspace. For each one you can see:

    • How many times it’s used
    • Its lifecycle status: alpha, beta, stable or deprecated
    • The platforms it’s built on, with a link to the docs for each. Platforms without a coded version are greyed out

    From there, designers can place a report next to the design or on a new page, so developers can read it in the file without running the plugin. Every link goes straight to that component’s documentation or code repo for each platform.

    The first-run tour

    What people saw the first time they opened Auditor. Press Take a tour to step through it.

    Auditor’s first-run tour
    The Auditor plugin before a report is run: Page and Selection tabs, a Run report button, and a Using Auditor panel with a Take a tour button.

    Under the hood

    1 / 5The bridge

    Auditor is a plugin that runs inside Figma. It acts as a bridge between the design file and the DSRS, where everything about each EGDS component is stored. Step through to see what happens when you run it.

    Under the hood

    Turn your phone sideways for a bigger view.

    Figma fileThe page being handed offResultsCheckoutButtonCardBadgeButtonLinkButtonPromo📈 Auditor reportGenerated 30 Jun, 08:30AuditorFigma pluginComponentPlatformUsedStatusAuditing…Button3StableCard1StableBadge1BetaLink1DeprecatedNon-EGDSPromo1Not EGDSMatching against the DSRSAdd to this pageAdd to new pageDSRSDesign System Resource ServiceButtonStablekey 7f3a…CardStablekey c41e…BadgeBetakey 09bd…LinkDeprecatedkey e2a7…

    What we learned

    1. Take-up took time

      Auditor didn’t take off straight away. We’d planned ongoing work to raise awareness after launch, but we were moved onto a different project before we could do it.

      When we launched Discover, the second plugin we built, we promoted Auditor alongside it, which gave it more visibility. We also built plugins into our EGDS training sessions, with a section on fitting them into everyday work and setting up files for handoff. Take-up grew gradually, and by April 2025, the last figure I have, its Figma page showed over 120 users.

    2. The data had to be kept up to date

      The report was only as good as the data behind it. Auditor matched components by their Figma keys, so whenever a component was published or deprecated, the DSRS had to be updated to match. Keeping that data accurate became a big part of keeping Auditor working.

    Keeping it working

    By 2024 Auditor and Discover were well used, but the people who knew them best had moved on to other work. I wrote a pitch to put the basics right before we promoted them any further.

    Most of that was about the DSRS data. I wrote a playbook for the designers who published components, setting out when the DSRS needed updating, and we added a DSRS flow so any Core designer could pull a component’s keys in with one button. The longer-term aim was a Figma webhook that updated the DSRS on every publish, but the team’s focus moved to bigger priorities, like the AI workstream, before we got to it.

    We also made sure anyone could raise a bug and that it reached someone who could fix it, and did some housekeeping to future-proof the plugins as Figma changed.

    By 2025, plugins were part of everyday work. In the design system’s survey that year, 64% of the designers who responded said they used EGDS plugins every day, and another 16% weekly.

    After Dev Mode

    Auditor was built before Figma launched Dev Mode, to fill a gap in Figma’s own tools. With Dev Mode, a developer could click a component to see which library it came from and whether it had been changed, right down to its overrides. That covered much of what Auditor did, and I’d expect it to be retired in time. For a while, though, it solved one of the biggest pain points at handoff.

    What I’d do differently

    1. I’d plan Auditor’s launch the way we planned Discover’s, with demos, announcements and training from day one, rather than leaving it until after.

    2. At the time, the DSRS sat on the internal network, behind security built for staff rather than external vendors. Some vendors struggled to get access, which probably held back take-up early on. I’d tackle that much earlier.