Company
Entri India's vernacular e-learning platform 15M+ learners · 600+ courses · 8 languages
Year
2024
Team
4 Designers Design Systems · Accessibility Audit Component Design · Documentation
Tools
Figma Figma Variables Jetpack Compose · KMM WCAG Checker

Building EntriVerse

Cover Image
Hero image — design system overview or component library screenshot

Five designers, five style guides, zero consistency

Silos
each designer maintained their own component set — no shared layer between decisions and implementation
#59A1C9
our primary brand color — failed WCAG AA contrast standards, a symptom of deeper accessibility blind spots
No dark
the product had no dark mode — and no token architecture that would make building one feasible

The Audit That Exposed the Real Scope

We started with a comprehensive audit of every screen, component, and color scheme across our Figma files. Not just to count problems — but to understand why they had accumulated and what they were costing us. The audit gave us a holistic picture of the design landscape and a clear brief for what EntriVerse needed to solve.

What looked like a visual inconsistency problem turned out to be three separate problems stacked on top of each other.

Accessibility

Brand color failing WCAG

Our primary color, #59A1C9, failed WCAG contrast standards — and it wasn't the only one. Color contrast ratios were broken across the product, including onboarding and core learning flows.

Consistency

Designers working in silos

Each designer had developed their own style — their own color usage, spacing conventions, component shapes. Good intentions, but no shared foundation. The output diverged with every sprint.

Handoff

No scalable color management

Color values were hardcoded everywhere. A brand color update meant manually hunting through dozens of Figma files. There was no token layer — so a single change cascaded into hours of design cleanup.

Design Debt

Dark mode was structurally impossible

There was no architecture to support a dark theme. Without tokens mapping colors to intent, building dark mode would have meant duplicating every screen and maintaining two parallel design systems indefinitely.

Screenshot
Audit spreadsheet or visual map showing component variants and accessibility failures

Inconsistency Wasn't the Problem — It Was the Symptom

Every team was designing in good faith. The problem was structural: there was no shared layer between design decisions and implementation. Each designer maintained their own component set. Each developer interpreted specs locally. There was no contract between them.

The inconsistency wasn't a discipline problem. It was a missing infrastructure problem. Without tokens, without a component library with documented states, without accessibility baked in at the source — the output was always going to drift.

lightbulb The real cost
Design debt compounds differently from technical debt. A misaligned button style doesn't crash anything — it just slightly erodes trust, slightly slows down every new screen, and slightly increases the friction between designers and developers. At scale, "slightly" becomes the team's entire velocity.
Screenshot
Side-by-side comparison of inconsistent button/component variants found in audit

Everything We Ruled Out First

Before committing to building a full design system, we considered lighter-weight approaches. Each had a reason it wasn't enough.

clipboard A Shared Style Guide Document
Ruled out
A written document outlining colour values, type scales, and spacing rules — shared via Confluence. Low effort to create, easy to distribute.
Why not → Style guides go stale immediately. They describe intent but don't enforce it. The problem wasn't that designers didn't know the rules — they just had no way to apply them consistently under sprint pressure. A PDF doesn't fix that.
wrench Retrofitting Existing Figma Files
Ruled out
Going through existing screens and converting ad-hoc elements into proper Figma components — cleaning up the existing library rather than starting fresh.
Why not → The existing files were built without a token layer. Retrofitting components on a broken foundation just adds a cleanup debt on top of the original debt. Every change would still require manual propagation across files.
shopping cart Adopting an Off-the-Shelf System
Ruled out
Using an existing design system — Material Design, Ant Design, or a similar framework — as the product's foundation instead of building custom.
Why not → The product had strong brand conventions and a regional audience with specific UX patterns. An off-the-shelf system would have solved the technical problem while creating a brand consistency problem. The goal was a foundation that reflected this product, not a generic one.
sparkles Token-First Design System Built from Scratch
Selected
Build a layered design system starting from primitive tokens (colour, spacing, type) up through semantic tokens and into fully documented components — with accessibility requirements encoded at the token level, not bolted on later.
Why this won → Tokens are the only way to enforce decisions at scale. If accessibility lives in the token (e.g. color.text.on-primary always passes AA against its background), it can't be accidentally violated in a component. The foundation fixes the root cause, not just the symptoms.

What if accessibility, consistency, and speed weren't separate problems — but all symptoms of the same missing layer?

Token-First, Then Components

The system was built in layers. Global tokens first — raw color, spacing, radius, and type values with no semantic meaning attached. Then reference (alias) tokens that mapped globals to usage intent, with light and dark modes both defined. Then component tokens that only referenced aliases, never raw values.

The timing was fortuitous. Our mobile engineering team was simultaneously migrating to Jetpack Compose and KMM for unified Android and iOS support — a ground-up rewrite. That meant they could implement the design tokens natively in Compose from day one, rather than retrofitting them onto legacy code. The design system didn't have to fight existing patterns. It became the pattern.

eye Why the order mattered
Most teams build components first and try to extract tokens later. That approach fails because components end up with hardcoded values that are too specific to tokenise cleanly. Starting with tokens forces you to define the design language before you design anything — which is the only way to make it consistent.
handshake The engineering window
The Jetpack Compose + KMM migration was the rarest kind of opportunity — a clean slate. Engineers weren't adapting the design system to legacy architecture. They were writing the architecture with the design system in mind from the start. That alignment between design and engineering timelines is what made adoption stick.
1
Full UI/UX audit
Scrutinized every screen, component, and color scheme in our Figma files — building a complete map of what existed and what was broken
Figma
2
Color palette refinement
Built WCAG-compatible color ramps for primary, secondary, and neutral colors — verified contrast ratios at every step
Figma Variables
3
Global token definition
Established the raw building blocks — color, spacing, radius, type — as reusable global tokens managed via Figma Variables
4
Reference (alias) token mapping
Mapped globals to intent-based alias tokens with two modes — light and dark — enabling seamless theme switching across all screens
Light & Dark Mode
5
Component token layer + library
Built component tokens for buttons, cards, form fields, and more — then assembled a shared component library all designers could use and build from

The Decisions That Made It Actually Work

A design system is only as good as its adoption. The token architecture and component library were the foundation — but these specific decisions were what made designers and developers actually use it.

Screenshot
Token layer diagram — primitive → semantic → component mapping
Layer 1 · Global Tokens

purple circle Consistent raw values

The building blocks of the system — color, spacing, radius, type. Named by scale (blue-300, space-4) — consistent everywhere, but with no usage meaning attached.

Layer 2 · Reference Tokens

target Alias tokens for intent

Global tokens mapped to intuitive, usage-intent names — with light and dark mode colors both mapped here. WCAG contrast verified at this layer. Change a global token and the alias updates everywhere.

Layer 3 · Component Tokens

puzzle Granular component control

Component-level tokens for specific elements — buttons, cards, form fields, radio buttons. Reusable, documented styles that ensure consistency without locking teams into rigid patterns.

nut and bolt Key Component Decisions

accessibility Accessibility as a constraint, not a checklist

Every interactive component required a visible focus state, a 44×44px minimum touch target, and a colour contrast ratio of ≥4.5:1 before it could be added to the library. Not guidelines — hard gates.

book Every state documented, not assumed

Default, hover, focus, active, disabled, loading, error — all explicitly designed and annotated. Developers stopped asking "what does the disabled state look like?" because the answer was always one click away.

brick Composition over configuration

Instead of a single Button component with 30 props, components were kept small and composable. A Card was a surface + padding token — not a locked pattern. Teams could build layouts without needing new components.

speech Usage notes over prop documentation

Component documentation focused on when to use a component, not just what it does. "Use the destructive variant only for irreversible actions" prevented misuse better than listing every prop value.

What the Audit Numbers Looked Like 6 Months Later trophy

The implementation of EntriVerse yielded tangible outcomes: increased design delivery speed and reduced development time. These were the metrics we committed to at the start — and they held up.

Accessibility
0
WCAG AA failures on core components — down from 38% of screens failing at audit
Handoff Time
−64%
Design-to-dev handoff: 4.2 days → 1.5 days. Token references replaced manual spec sheets.
Developer Queries
−75%
Design questions per sprint dropped from ~12 to ~3. Storybook became the first point of reference.
Before
4.2d
Avg. handoff per screen
After
1.5d
Avg. handoff per screen
nerd What the numbers actually mean
The handoff reduction wasn't just efficiency — it changed the nature of designer-developer collaboration. Instead of specs being questioned, they became a starting point. Developers started contributing to the system, not just consuming it. That shift in dynamic was the real result.
Screenshot
Before/after comparison of Figma component library or Storybook documentation
Key Takeaway

Accessibility, consistency, and slow handoffs aren't three problems. They're three symptoms of one missing thing — a shared layer between decisions and implementation. brick

A Design System Is Never Finished

The biggest shift in thinking was understanding that EntriVerse wasn't a project to complete — it's infrastructure to maintain. A design system needs to evolve as the product evolves. Locking it down creates a different kind of bottleneck.

Because the system was touched by multiple designers simultaneously, we built a change log page to track every update — what changed, why, and when. That single artifact became one of the most-used references on the team. It made the system feel trustworthy, not mysterious.

clipboard On measuring success
We measured success by tracking time saved by designers using EntriVerse components and tokens. It's a deliberately practical metric — not design maturity scores or adoption percentages, but real sprint hours recovered. That framing kept the system grounded in actual team needs.

What Comes Next

The system is live and in active use, but a design system is never done. Version 1 solved the foundational problems — here's what V2 looks like.

New platform surfaces

Extend EntriVerse beyond the core app to web, admin, and partner surfaces — using the same token layer so brand stays consistent across every product touchpoint.

Component versioning

Introduce a formal deprecation process so legacy components can be retired without breaking existing screens in production.

Usage analytics

Track which components are most used, most deviated from, and most often questioned — to prioritise what gets documented and improved next.

Contributor model

Open the system for developer contributions with a lightweight RFC process — so the system grows with the team instead of creating a bottleneck.