Bagle Design System

Bagle Design System

Bagle Design System

An unofficial design system for Too Good To Go, built from a full app audit
An unofficial design system for Too Good To Go, built from a full app audit

Made For

Too Good To Go

Made For

Too Good To Go

Team

4 Product Designers

Team

4 Product Designers

Timeline

4 months

Timeline

4 months

Tools

Figma, Zeroheight

Tools

Figma, Zeroheight

Opening

Too Good To Go is the world's largest marketplace for surplus food, it connects diners to restaurants, cafés, and grocery stores selling unsold inventory at a discount, instead of throwing it away. Every transaction in the app diverts food from landfill.

That mission changes what a design system is for. In Too Good To Go, every confusing touch target, every accessibility failure, every minute a team loses rebuilding a button that already exists is friction against the company's actual goal: more meals rescued, less waste.

So when our team audited the iOS app, the main thing we focused on was: where is the product working against its own mission?

What I specifically owned

I led
  • The full content and component audit of the existing TGTG iOS app every screen deconstructed, every element catalogued, every inconsistency documented

  • The Patterns library, end to end defining which compositions earned a pattern slot, building each one in Figma, and writing the Zeroheight documentation for the full pattern set

  • The final pitch deck and storytelling structuring the narrative from audit through system to roadmap for the stakeholder presentation

I contributed to:
  • The accessibility evaluation WCAG contrast audit, touch target analysis, and focus state review across components

  • Token structure and naming convention

  • Component behavior and variant logic specifically on the card and button families

The Audit

We deconstructed the iOS app and found four categories of debt. We pulled every screen, isolated every UI element, and grouped them. Four problems surfaced repeatedly not as one-off bugs, but as systemic patterns the product had developed as it scaled across markets and teams.

Problem 01 · Ten shades of grey

Across the app, Too Good To Go uses ten near-identical greys with no clear pattern for when each appears. Some are actually dark green, some are mid-grey, some are light-grey and they often sit within a few percentage points of contrast from one another.

No single decision was wrong. The system had no shared reference, so each screen made its own call.

Problem 02 · Primary buttons that aren't primary anywhere

Primary buttons appear in different heights across screens. Icon buttons meant to trigger the same action use different icon styles, stroke weights, and arrow lengths. The visual cue "this is the most important thing on this screen" is inconsistent enough that users can't rely on it.

Problem 03 · Tap targets users can't actually tap

Several text-color combinations on the existing app fail WCAG contrast, making them difficult to read for users with low vision. Multiple components place two tap targets so close together that touch precision becomes a usability issue, especially for users with motor differences.

For a product whose audience spans every adult who eats food which is everyone building a system that excludes any of them is the design failure.

Problem 04 · Icons that don't agree on a style

Icons across the app look like they were pulled from different libraries sharp versus rounded, thin versus thick stroke, outline versus filled. The visual identity reads as inconsistent in a way users notice subconsciously even when they can't articulate why.

Why this matters for TGTG specifically

Higher cost per feature.

Every new screen reinvents components that already exist. Designers and engineers spend cycles re-deciding things that should be settled

Higher cost per feature.

Every new screen reinvents components that already exist. Designers and engineers spend cycles re-deciding things that should be settled

Higher cost per feature.

Every new screen reinvents components that already exist. Designers and engineers spend cycles re-deciding things that should be settled

Lower UI reliability.

Users who can't predict how a button behaves spend cognitive effort on the interface instead of the task. For an app meant to be opened quickly during a commute or a lunch break, that matters.

Lower UI reliability.

Users who can't predict how a button behaves spend cognitive effort on the interface instead of the task. For an app meant to be opened quickly during a commute or a lunch break, that matters.

Lower UI reliability.

Users who can't predict how a button behaves spend cognitive effort on the interface instead of the task. For an app meant to be opened quickly during a commute or a lunch break, that matters.

Reduced ability to scale globally.

TGTG operates across 19 countries. Visual drift compounds with every new market, every new feature, every new team. A system that can't scale predictably is a system that becomes a tax.

Reduced ability to scale globally.

TGTG operates across 19 countries. Visual drift compounds with every new market, every new feature, every new team. A system that can't scale predictably is a system that becomes a tax.

Reduced ability to scale globally.

TGTG operates across 19 countries. Visual drift compounds with every new market, every new feature, every new team. A system that can't scale predictably is a system that becomes a tax.

Introducing Bagel!

A design system named for warmth and built for scale.

We named the system Bagel. The reasoning was deliberate: TGTG's product voice is warm, food-grounded, and approachable, not corporate. A name like Bagel fits that voice without performing it. It's a single, recognizable object made of distinct, repeatable parts. Once.

Design Principles

Most design system principle sets read interchangeably across products. Ours had to do work for TGTG specifically.

Most design system principle sets read interchangeably across products. Ours had to do work for TGTG specifically.

Purposeful by Design
Every element earns its place.
Sustainable at Every Scale
the system reduces redundancy, not just visually but operationally.
Designed for All
Accessibility is baseline, not a separate workstream.
Clarity and Simplicity
Remove noise. Reduce effort. Build trust.
Flexible by Design
Structure without rigidity.

Foundations

We rebuilt the bottom layer of the system first. Before any components, four foundations had to be settled. Without them, every component decision would be arbitrary.

Color · From 10+ scattered values to 30+ structured tokens

We consolidated the existing greys, greens, and accent colors into a token system organized in two layers:

Typography · One scale, named roles

We replaced screen-by-screen typography decisions with a unified scale using Tenon, structured into named roles: Display, Heading, Title, Body, Label, Caption. Each role has a defined size, weight, and use case.

Iconography · A single icon family

Instead of building a custom icon set from scratch, we adopted Microsoft Fluent Icons as the foundation. Fluent is open-source, comprehensive, and visually compatible with TGTG's voice friendly without being childlike.

This was a deliberate trade-off. A custom icon set would be more brand-specific. Fluent gave us coverage and consistency in week one instead of month three. For a four-month timeline, that was the right call.

Spacing & Grid · Predictable rhythm

A defined spacing scale (4px base unit) and grid system give layouts a predictable rhythm. Spacing isn't an aesthetic choice anymore it's a token, applied consistently.

The Token Layer

Naming was the hardest single decision.

There is no objectively correct way to structure a token system, and the abundance of competing conventions made early choices feel high-stakes. We considered three approaches:

We chose the layered approach. Primitives encode value. Semantics encode meaning. A developer reading text/primary knows what it's for; reading green/500 they know what it is. Both matter.

The reasoning is documented in the system itself, so future contributors don't have to re-litigate the decision.

Components and Patterns

Four properties of the component library were non-negotiable:

One component, many contexts.

Every component supports multi-context use through variants and Boolean controls. A card on a homepage list and a card in a search result are the same component, they just show different properties.

Configurable without being chaotic.

Boolean controls let designers turn elements on or off without forking the component. The system stays one component; the surfaces look different.

Accessible by default.

Every component meets WCAG standards out of the box. Designers don't have to remember to check contrast, the token system already enforces it.

Built to use.

The kit is structured for drag-and-drop assembly. Patterns are pre-tested combinations of components, so designers can start a screen by composing instead of constructing.

Test Drive

Outside designers revealed the layer we'd missed.

We tested v0 by handing the kit to Pratt classmates and designers outside the program with one task: rebuild the TGTG home feed using only Bagel components. They surfaced what the internal team couldn't see no header component existed, no Patterns layer existed, and component names didn't match how designers searched. We added the header, built the full Patterns library from scratch, and renamed components for function. Patterns were the system's missing layer; testing revealed it.

Documentation

Zeroheight as the single source of truth.

A design system without documentation is a Figma file with strong opinions. The documentation is what makes it usable by people who weren't in the original room.

What we shipped

Three artifacts, designed to work together.
Figma UI Kit

A Complete component library covering primary navigation, content cards, action controls, forms, feedback states, and pattern templates for the TGTG home, search, and detail screens. Built for drag-and-drop use, with handoff-ready handles for engineering.

Zeroheight documentation

six foundation pages (colors, typography, icons, layout, logo, media), full component documentation with anatomy and do/don't guidance, the complete patterns library, accessibility notes, and contribution guidelines.

Stakeholder pitch deck

A pitch deck covering audit findings, system rationale, principles, foundation showcase, component and pattern application demos, and governance roadmap. Delivered as the project's final review to a mock TGTG internal audience.

Roadmap

Phase 1
Soft launch
Roll Bagel out to one product surface. Discover, or Profile. Track what designers reach for, what they bypass, where the kit fails. Fix in place.
Phase-2
Refine and optimize
Expand coverage based on dogfooding signal. Build the engineering side: codify tokens in CSS variables, ship a coded component library.
Phase 3
Evolve continuously
Establish governance: a contribution model, a review cadence, a designated owner. Treat the system as infrastructure versioned, tested, documented, owned.

Reflections

Two things I'd carry into shipping work.
A design system isn't finished without engineering.

We built a coherent Figma library and Zeroheight site, but the absence of a coded implementation is a real gap. The audit findings live in our documentation, not yet in the product. For systems to do their actual job reducing engineering cost per feature, enforcing accessibility at build time they need to exist in code, not only in Figma. This is the part of design systems work I want to do more of next.

Patterns aren't a polish layer. They're the system.

Before the Test Drive, I would have argued Patterns was a nice-to-have a second wave after components. Watching designers struggle to compose flows from raw components changed that. Patterns are the layer at which the system meets the work designers actually do. For any future system I build, Patterns are first-class from the start, not a v2.

The team:

Too Good To Go

Too Good To Go

(From left) Carol Bai, Wendy Li, Shreya Lohakare(Me), Rohini Rajan

(From left) Sakshi Rane, Shreya Lohakare(Me), Radhika Balaji, Nabhi Shah