Building Sprinto's design system.

From a fragmented UI kit to a scalable, AI-ready system that changed how Sprinto ships product.

RoleDesign systems lead
Stage0 → 1
Timeline8 monthsTokens to independent package
Team3 engineers, 12 designers
~90%
Of product now
running on NeoGrid
60+
Components plus a
pattern library
37K
Component instances
tracked for migration
97.6%
Of those instances
migrated
TL;DRThe 60-second version+

Sprinto had 12 designers shipping in parallel — no design system, no tokens, no patterns. The product looked and felt like multiple products stitched together.

Over eight months, with a team of three engineers, I led the design and rollout of NeoGrid— Sprinto's first true design system. We rebuilt from tokens up, shipped 60+ components and a pattern library, migrated 37,146 component instances, and made the system independent of the main app — which unlocked AI-assisted product development through Sprinto's internal AI, Kaizen.

NeoGrid now powers ~90% of the product. Designers and PMs ship UI changes directly through AI. The product finally feels like one product.

01 · Context

Twelve designers. Zero shared system.

When I joined, I audited the product and talked to the design team. The findings were familiar: no design system, just a basic UI kit with components but no rules, tokens, or patterns. Every designer was solving the same problems differently — tables, filters, empty states, error states, all inconsistent across modules. The product looked stitched together, visual language and interaction patterns shifting as you moved between modules.

Why this mattered for the business

Three things were happening at once.

  • Enterprise expansion was bottlenecked. Inconsistency reads as immaturity. The further up-market we went, the more the cracks showed.
  • Design and engineering time was being burned. Designers duplicated effort with no shared library; engineers rebuilt components that already existed under different names.
  • The product wasn't AI-ready. A basic UI kit doesn't give an AI enough context to produce reliable output — without tokens, components, props, and documentation, AI could only guess.

A design system wasn't a nice-to-have — it was the prerequisite for the next phase of the company.

02 · Approach

A framework, not a dogma.

I used Farid Sabitov's Design System Maturity Model as a framework, but didn't try to chase a specific level. Instead, I picked the characteristics that mattered for Sprinto and made them the roadmap — a complete token architecture, a scalable component library, a pattern library to solve UX problems at the system level, Figma-to-code parity, accessibility built in, documentation and contribution guidelines, and AI-readiness.

Level 1

UI kit

A single file to reference — basic visual alignment.

  • Styles
  • Components
Level 2

Design Library

Processes form around the library — a team starts maintaining it.

  • Usage Analytics
  • Governance Practices
  • Design Language
  • Usage Guidelines
  • Pattern Library
Level 3

Design System

Design, code, and other disciplines are connected into one system.

  • Dedicated DS team
  • Product Adoption Tracking
  • Accessibility Built-in
  • Regular Office Hours
  • Built-in Content Strategy
  • Design Tokens
  • Component Status Page
  • Component Management
  • Shared Vocabulary
  • Motion Guidelines
  • Research Insights
  • Release Notes
Level 4

Scaled Design System

Usage across multiple products and platforms.

  • Multi-product Support
  • Deviations Management
  • Usage Examples Bank
  • Release Management
  • Dependency Management
  • Living Roadmap
  • Internal GTM Strategy
  • Branching Strategy
  • Design System Champions
  • Advanced Theming
  • Localization Capabilities
  • Contribution Model
  • Automated Tests & CI/CD
  • Visual Regression Testing
  • Linters
Level 5

Public Design System

Industry-leading innovation & influence.

  • Product/Domain specific Design Systems
  • Public Roadmap
  • Versioned Documentation
  • External Contributions
  • Org-wide adoption metrics
  • Advanced Enablement
  • Multi-platform support
  • Community Engagement
  • Dedicated Support
  • Open-source
  • Custom Tools
  • Dynamic Personalization
  • Public Research Studies
  • Community Resources
  • Certification Programs
  • Internal SSO Access
  • MCP servers
  • DS Assistants
  • Third-party Integrations
↳ The framework I worked from — the Design System Maturity Model by Farid Sabitov · Infa.ai

This gave us a prioritized picture of what NeoGrid needed to be, without inheriting maturity-model dogma that didn't apply to our context.

The roadmap we chose7 characteristics · not a level to chase
01Token architectureColors, type, spacing, radius, shadows — one source of truth.
02Component library60+ scalable components with simpler, dev-ready props.
03Pattern libraryUX problems solved once, at the system level.
04Figma–code paritySame names, variants, and defaults across both.
05AccessibilityFocus, contrast, ARIA, and keyboard — built into components.
06Docs & contributionGuidelines and governance anyone on the team can follow.
07AI-readinessEnough structure and context for AI to build reliably.
↳Cherry-picked from Farid Sabitov's Design System Maturity Model — the characteristics that mattered for Sprinto, made into a roadmap
03 · Design Principles

Five principles guided every decision.

These shaped every component, pattern, and governance choice that followed.

The system is the source of truth

If a designer reaches outside NeoGrid for a one-off solution, that's a signal the system has a gap to fill — not a signal to allow exceptions.

Solve at the system level, not the screen level

Components solve visual consistency. Patterns solve UX consistency. We invested heavily in both.

Flexibility without fragmentation

Slots, multiple sizes, and clear extension points gave designers room to compose without breaking the system.

One language across design and code

The previous UI kit failed because Figma and the codebase had drifted apart. NeoGrid speaks one vocabulary — same names, same props, same defaults.

Built to be used by anyone, including AI

Structuring NeoGrid for AI-readiness turned out to be the same work as making it good for the team.

04 · Building NeoGrid

Tokens up. Patterns, not just components.

The bigger shift wasn't the component count — it was how we approached the whole stack, from the foundation to the problems designers kept solving differently.

Tokens

We started at the foundation: a complete token architecture covering colors, typography, spacing, radius, and shadows. This unlocked theming — light/dark and customer-specific theming without rewrites — and consistency, with every component referencing the same source of truth. We refactored typography to size and weight only, no decorative styles, just clarity and hierarchy.

NeoGrid token architecture — three layersPrimitives feed named tokens, which feed 60+ components. Meaning lives at the component layer, not the token layer.Tokens up — one source of truth01 · PRIMITIVESRaw values#16A34A · 16px8px · 60002 · TOKENSNamed referencesaccent-green · space-mdradius-md · weight-bold03 · COMPONENTS60+ componentsButton · Badge · Tablemeaning decided here
↳ Change a primitive once and it ripples through every token and component above it

One naming decision mattered more than it looked: accent-green, not accent-success.

accent-green#16A34A
  • Success
  • Revenue +
  • Active
accent-red#DC2626
  • Error
  • Revenue −
  • Overdue
accent-yellow#D9A400
  • Warning
  • Pending
  • At risk
accent-blue#2563EB
  • Info
  • In progress
  • Link
↳ One token, many meanings. The color is named for what it is — each component decides what it means.

Semantic names read as more helpful — until the meaning they encode needs to change. The same three moments play out very differently depending on how the token was named.

When this happens…
Named for its jobaccent-successmost design systems
Named for its coloraccent-greenNeoGrid
One color has to carry more than one meaning
Named for its job

Green also means “revenue +” and “active” — but the name only says “success.”

Named for its color

One token; each component decides what its green means.

A new theme ships — white-label or dark
Named for its job

Rework the color-to-intent mapping for every theme.

Named for its color

Redefine what each color resolves to. Nothing else changes.

The brand changes its green
Named for its job

Hunt down every alias that resolved to the old green.

Named for its color

Change one value; everything updates.

What it shaped
  • Theming without rewrites
  • Meaning lives in components
  • Values change; names never lie
↳ Name a token for what it is, not what it means — so it never has to be renamed when the product changes its mind

Tokens describe what something is. Components decide what something means. Conflate the two, and the system fights you every time the product evolves.

Components — 60+ from the ground up

Slots let designers compose modal headers, table cells, popovers, and accordion bodies without detaching instances, with suggested components educating the team on what should and shouldn't go in each slot. Props got simpler and names more consistent, dev-ready. Avatars, tags, and inputs supported multiple sizes, from compact to expressive, without breaking the system. And components got smarter — date pickers gained month/year range selection, popovers got an "Ask AI" variant, accordions and tags were rethought for richer content control.

For direction on structure and conventions, I looked at Atlassian Design System, Razorpay Blade, GitHub Primer, and IBM Carbon — then built NeoGrid around what Sprinto's product actually needed, not a copy of any one of them.

NeoGrid components — typography scale, refined icons with fewer props, multiple avatar sizes, enhanced tags, drag-and-drop dos and don'ts, custom header and body slots, an enhanced date picker with month/year range selection, and an Ask AI popover.
↳ A sampling of the 60+ components — slots, sizes, simpler props, and smarter behaviors

Patterns — solving UX problems system-wide

This is the part most design systems skip, and the part I'm most proud of. We codified patterns for problems designers kept solving differently: tables (row selection, hover-revealed actions, adjustable column widths, saved views inside the table itself), filters (one unified toolbar pattern across every data table), search (one canonical behavior everywhere), navigation (page headers with breadcrumbs, entities opening as full pages instead of drawers), and confirmations (when destructive actions need them, and when they don't). By solving these at the system level, designers stopped reinventing them.

Pattern 01

Tables

  • Row selection
  • Hover-revealed actions
  • Adjustable column widths
  • Saved views inside the table
Pattern 02

Filters

  • One unified toolbar
  • Consistent across every data table
Pattern 03

Search

  • One canonical behavior
  • The same everywhere it appears
Pattern 04

Navigation

  • Page headers with breadcrumbs
  • Entities open as full pages, not drawers
Pattern 05

Confirmations

  • When destructive actions need them
  • And, deliberately, when they don't
↳ Solve at the system level, not the screen level — codified once, so designers stopped reinventing them
NeoGrid table patterns — hover-revealed row actions, blue-background row selection, adjustable column widths, a subtle gradient cueing horizontal overflow, and a unified filter toolbar.
↳ Table patterns — selection, hover actions, adjustable columns, and one filter toolbar everywhere
NeoGrid navigation pattern — an enhanced page header with breadcrumbs for clearer in-app navigation.
↳ Navigation — page headers with breadcrumbs
NeoGrid navigation pattern — entity details opening as a full page instead of a drawer, for improved visibility.
↳ Entities open as full pages, not drawers

Figma–code parity & accessibility

We refactored prop structures to align across Figma and code — same names, same variants, same defaults. This single decision dramatically reduced handoff friction. Accessibility — focus states, color contrast, ARIA patterns, keyboard interactions — was baked into the components themselves. Designers got it for free.

05 · Governance

Everyone a contributor. One maintainer.

If only one or two people could contribute, the system would stall the moment we got busy. I owned the maintainer role — final say on what entered the system — while every designer could propose, branch, and contribute changes. Branches in Figma, DS Owner review, Jira tickets for trackability: safe conflict-free edits, clear ownership, a trackable history like a code repo. It turned NeoGrid into a shared responsibility rather than a top-down mandate.

Governance flow — everyone contributes, one maintainer mergesAny designer proposes a change on a Figma branch; the DS owner reviews it; approved changes merge into NeoGrid. Changes-requested loops back to the author.Everyone a contributor · one maintainer01 · PROPOSEAny designer02 · BRANCHFigma branch + Jira03 · DS REVIEWMaintainer gate04 · MERGEInto NeoGridChanges requested — back to the author
↳ A trackable history like a code repo — safe, conflict-free edits with clear ownership
ArtifactThe full “Contribute to NeoGrid” guide+
The Contribute to NeoGrid guide — how to create a Figma branch, name it, make changes, request a review and merge, add a review description, and log a Jira ticket, with a split for making a change versus requesting one.
↳ The contribution doc designers actually followed — branch, review, merge, and track in Jira

A test of governance: the AI components decision

Partway through, Sprinto's strategy evolved. The AI pod started asking us for AI-specific components.

The easy answer

Absorb everything into NeoGrid

"Of course, NeoGrid will own AI components too." That's the standard design-system playbook — one source of truth, all components live there.

→ The wrong call, here
What we actually did

Let the AI pod own it, separately, for now

AI components were brand new, with heavy iteration and breaking changes ahead. Same conventions and naming, but separate — with a future merge path engineered in from the start.

→ The harder, better call

The instinct in design system work is to absorb everything. But a system that absorbs unstable surface area becomes unstable itself. Knowing when not to absorb something is part of governance, too.

06 · The Migration

A design system nobody uses is a parallel system.

We didn't want NeoGrid to be optional. Two migrations mattered: moving 146 components' worth of old-UI-kit instances onto NeoGrid, and — the strategic one — extracting NeoGrid out of the main Sprinto app repo entirely, so other Sprinto products and AI tools could use it independently. We hired a contract engineer specifically for migration so the rest of engineering could stay focused on product features. High-traffic flows migrated first; long-tail edge cases migrated last.

Component instances97.6%
of 37,146 tracked
Components137 / 146
93.8% migrated
↳ High-traffic flows migrated first; the long-tail remainder is edge cases, not blockers
37,146
Component instances
tracked
97.6%
Instances
migrated
137/146
Components
migrated (93.8%)
1pkg
Independent package,
reusable everywhere
07 · Friction

Adoption was high. Friction was real.

Designers were eager, but friction showed up in three places we had to actively manage.

  • "When should I use this?" The most common DS Slack question wasn't pushback — it was designers genuinely trying to do the right thing. Every question got treated as a signal of where documentation needed to be better.
  • "I need a new component for this." About half the time, the case was real. The other half, the existing system could solve it with composition — so instead of just saying no, we walked through how, and turned the answer into a usage example.
  • Breaking changes during major releases. The hardest one. Shipping v2 of a component sometimes broke pod designers' v1 Figma files — props missing, layouts off. The fix: changelogs that communicated impact, not just changes — what changed, why, what it could break, what action was needed.

Most adoption friction in design systems isn't about the system itself — it's about the coordination around it. Releases are a coordination event, and we hadn't been treating them like one.

08 · The AI Unlock

This is the part that surprised even us.

Sprinto has an internal AI tool, Kaizen, built on top of Claude. For a long time, Kaizen wasn't great at producing usable UI — it lacked the context to know what components to use, what props to pass, what patterns to follow. Once NeoGrid was independent and structured with proper components, patterns, and examples, that changed. Kaizen could generate production-ready component changes, using the right components, the right tokens, the right patterns. The AI had finally been given a real grammar to write in.

The AI unlock — a 3-day handoff loop became a 3-hour loopBefore NeoGrid: design, review, engineer, review — about three days. After NeoGrid: spec in Figma, hand to Kaizen, ship — about three hours.BEFORE — every small UI changeDesignReviewEngineerReview~3 DAYSAFTER — NeoGrid + KaizenSpec in FigmaKaizenShip~3 HOURS
↳ No engineer in the middle for small changes — designers and PMs became builders
  • Designers became builders — spec a flow in Figma, hand it to Kaizen, ship a working implementation. No engineer in the middle for small changes.
  • PMs became builders — prototyping real flows in code, not slides.
  • Engineering bottlenecks dropped — "wait for an engineer" on small UI fixes shrank dramatically.
  • Iteration cycles tightened — a 3-day design → review → engineer → review loop became a 3-hour loop.

NeoGrid wasn't just a design system. It became the foundation of how Sprinto ships product.

09 · Impact

What changed, after eight months.

~90%
Of product running
on NeoGrid
60+
Components +
pattern library
37K
Instances tracked,
97.6% migrated
12/12
Designers on one
source of truth
1pkg
Independent,
reusable across products
Kaizen-ready
AI generating
production-ready UI

Beyond the numbers, the most visible impact is in the product itself. Tables behave the same way. Filters work the same way. Navigation feels unified. The micro-surprises that erode trust have become noticeably rarer. Sprinto stopped feeling like multiple products stitched together. It started feeling like one.

10 · Retrospective

What I'd do differently.

None of these changed the outcome. All of them would have made getting there cheaper.

Lock token naming conventions before the first component ships

The reasoning behind color-named tokens held up, but I'd document the convention itself on day one. The migration would have been smoother with a stable naming convention from the start — it's far easier to set a convention on a blank slate than to retrofit one under a live product.

Build the contribution workflow before the first component, not after

Governance is easier to establish when there's nothing yet to protect. Retrofitting branching, review, and changelogs onto a system that already had momentum created friction that didn't need to exist.

Start the independent-package conversation earlier

Running the UI-kit migration and the monorepo extraction as two separate streams was the right call. But raising the independent-package question sooner would have folded some of that work into the first migration instead of requiring a second pass. Architecture decisions have a cost that compounds the longer they're deferred.

Trust first-principles thinking over waiting for tooling

The slot architecture was a bet we made before Figma shipped native slots as a feature. By the time Figma caught up, we'd already built the mental model and the implementation. That bet paid off — a reminder not to wait on tooling to validate a direction that already made sense.

11 · What's Next

Stable. Not finished.

The foundation is laid. The next phase is about depth, reach, and intelligence.

Theming

Multi-brand and white-label support. The color-named token architecture was built with this in mind from the start — a theme swaps what a token resolves to, nothing else has to change.

Accessibility

A systematic WCAG audit across all 60+ components. Not just compliance — genuinely accessible interaction patterns, not retrofits.

Usage analytics

Instrumenting which components actually get used, which get ignored, and where the system still has gaps — so the roadmap is driven by real usage data, not just requests.

Deeper AI

Expanding what Kaizen can do with NeoGrid — from generating changes within existing components to proposing new ones that follow the system's own conventions.

What I'm most proud of

We thought we were building a design system. We were building a new operating model for how product gets shipped.

A design system is often pitched as a productivity tool — ship faster, reduce duplication, improve consistency. All true. But the deeper value of NeoGrid was something else: it changed who could build product at Sprinto.When a system is well-structured enough that AI can use it, it's well-structured enough that anyone on the team can use it — designers, PMs, engineers, future hires. The barrier to contributing to the product collapses.

NeoGrid continues to evolve. A design system is never done — it grows with the product it supports. But the foundation is laid, and the team builds on it confidently.