Skip to main content
Avinro

Hello Dojo

Cover image for Hello Dojo
ClientHello Dojo
RoleLead Product Designer
Year2023
Read time5 min read
researchinteractionvisualstrategy

Outcome

40
Shared components
Shipped in 10 weeks
+35%
Feature velocity
Measured by sprint cycle time
2 days4 hours
Design QA per sprint
4.64.8
Driver app rating
App Store, post-redesign quarter

Problem statement

Hello Dojo operates three distinct surfaces — a customer ordering app, a driver delivery app, and a vendor management portal. Each had been designed independently over two years. The result was three products that felt like strangers: inconsistent components, conflicting interaction patterns, and a design debt backlog that was slowing every sprint.

The challenge: unify without rebuilding from scratch, while shipping new features in parallel.

Side-by-side comparison of the customer app, driver app, and vendor portal before the design system: conflicting type scales, button styles, and interaction patterns across all three.

My role and constraints

As Lead Product Designer, I owned the design system architecture, component library, and the surface-level redesigns across all three products.

Constraints:

  • Three separate engineering teams with different tech stacks (React Native, React, Vue)
  • No shared design infrastructure existed
  • Could not pause feature development during the consolidation

Process

Audit and mapping

Before designing anything new, I audited every existing component across the three surfaces.

The audit became the case for a shared design system. Numbers are more persuasive than design principles.

Audit results: 214 unique components across three surfaces with 31% functional overlap but 0% visual consistency.

System architecture

Designed a three-layer token architecture:

Layer 1: Primitives    — raw values (colors, spacing, type sizes)
Layer 2: Semantic      — purpose-based tokens (primary, surface, on-surface)
Layer 3: Component     — component-specific tokens (button-bg, input-border)

This structure allowed each app to consume the same semantic tokens while maintaining platform-appropriate visual expression. The vendor portal looks more "enterprise"; the customer app feels more "consumer" — but they share the same foundation.

Three-layer token architecture: primitives → semantic → component-specific tokens, shared across all three stacks.

Component library build

Prioritised components by frequency of use × inconsistency score. Built the top 40 components first, covering approximately 78% of all UI surface area across the three products.

UI surface area covered by the top 40 componentsNaN%

The remaining 22% consists of surface-specific screens refactored over time as a feature trigger, not a separate design debt sprint.

Each component shipped with:

  • Light and dark mode variants
  • All interactive states (default, hover, pressed, focused, disabled, loading)
  • Accessibility annotations
  • Engineering handoff tokens in a format each stack could consume
40 components shipped in 10 weeks — covering 78% of combined UI surface area across the three products.

Integration and rollout

Rather than a big-bang migration, I designed a parallel track strategy:

  • New features always use system components
  • Legacy screens are refactored in order of user frequency
  • No screen is refactored just for consistency — it must have a feature trigger

This eliminated the "design debt sprint that goes nowhere" pattern.

Rollout playbook: new features always use system components; legacy screens are refactored in order of user frequency, triggered by a feature — never standalone.

Key decisions and trade-offs

Token-first, not component-first. The temptation is to start building components. I started with tokens. This meant engineering could begin consuming the system before a single component was finished, and it gave us a forcing function for design decisions that might otherwise stay informal.

One icon set, three visual personalities. Using a single icon library (Lucide) with consistent stroke weight across all surfaces, but allowing the surrounding context — spacing, color, typography — to carry the brand differentiation. This saved approximately six weeks of icon design work.

Results and impact

Customer app, driver app, and vendor portal post-system: shared token layer, consistent iconography, and platform-appropriate visual personality from a single foundation.

Design QA time per sprint

2 days
4 hours

Driver app — App Store rating

4.6
4.8

Learnings

A design system is a product, not a deliverable. The most important moment was treating the system as something that needed its own roadmap, its own acceptance criteria, and its own users (the engineers and designers who would consume it).

I also learned that the governance model matters as much as the components. We defined clear rules for who could extend the system, under what conditions, and how proposals were reviewed. That structure prevented the fragmentation that had created the problem in the first place.

Next case study

UMA
Let's talk