Skip to content
← All work

Loop design system · PackBack Network

One system for a dashboard, a phone app and a bin.

One design system for three very different surfaces: the PackPulse web app, the crew's iOS app and the touchscreens on our machines. Built with Arabic and right-to-left layouts from the start, for the Gulf launch.

Role
Product Lead, system owner
Company
PackBack Network
Timeline
Nov 2025 to now
Team
1 product designer, 3 front-end engineers, 1 iOS engineer, 1 firmware engineer
Platforms
Web (React), iOS (SwiftUI), Machine screens, Figma

1One scale, three reading distances

2Machine targets never smaller than 64 px

3Arabic layouts built into every component

84%

Production UI built from Loop components

3

Platforms from one set of tokens

5 weeks

To ship Arabic machine screens and PackPulse

AA

Contrast on every token pair, checked at build

The problem

PackBack's three products had grown separately. Two purples, three button styles, machine screens hard-coded by the firmware team, and no plan for Arabic, even though the Gulf launch was months away.

What I did

I audited all three surfaces, designed a token architecture that covers web, iOS and machine screens, built the core components with the team, and made right-to-left layouts part of every component from day one.

What changed

84% of production UI now comes from Loop. When the first Gulf customer signed, we shipped Arabic machine screens and an Arabic PackPulse in five weeks instead of the three months engineering had estimated.

01 · Context

Three products, three ways of doing the same thing.

When I joined, PackBack had three customer-facing surfaces built by three groups of people. PackPulse was a React app built by a contractor. The machine screens were made by the firmware team inside the machine software. The crew app was about to be started. Each had its own colours, type and components.

PackPulse (web)Ops app (iOS)Machine screens
Who reads itOperators at a deskCrew in a van or basementStrangers in a hurry
Reading distance50 cm30 cm1 to 1.5 m
Smallest target32 px44 pt64 px
Body text15 px17 pt28 px
Built inReactSwiftUIWeb view on the machine
LanguagesEnglish, DutchEnglish, DutchEnglish, Dutch, Arabic
Fig. 1The three surfaces Loop had to serve. The differences are the reason a single component library wasn't enough.

On top of that, PackBack had hired a managing director for the Gulf region and was in talks with its first customers there. Arabic was coming, and none of the three surfaces could handle right-to-left text.

02 · Problem

Inconsistency was costing us speed, and Arabic would make it worse.

I started with an audit of every screen in production. It took a week and produced a wall of screenshots that made the case on its own.

Audit, Nov 2025 Loop, Sep 2026Lower is better
Distinct purples
7
1(-86%)
Grey values
19
8(-58%)
Button styles
11
3(-73%)
Font sizes
23
9(-61%)
Icons drawn twice
34
0(-100%)
Fig. 2What the audit found, and where Loop stands today.

Engineering estimated three months to make all three surfaces work in Arabic, mostly because layouts were built with hard-coded left and right values. That estimate was the moment the system stopped being a design nice-to-have.

The question we worked on

How might we give three very different surfaces one shared language, without forcing a phone app and a bin to look the same, and make Arabic a setting instead of a project?

03 · Research

Talking to the people who'd actually use it.

A design system has two audiences: the people who build with it and the people who see the result. I interviewed every engineer, sat with the firmware team while they changed a machine screen, and ran a small study with eight Arabic-speaking participants in Rotterdam and, remotely, in Dubai.

Insight 1

Engineers read the repository, so the docs live there

Nobody opened the old style guide. Examples sitting next to the component in the repository were used every day.

“If it's not in the repo, it doesn't exist for me.”

NielsFront-end engineer
Insight 2

Machines need their own scale

Web sizes made bigger looked clumsy at 1.5 metres. Machine screens needed their own type scale and spacing, still from the same family.

“We just doubled everything and it looked like a toy.”

KoenFirmware engineer
Insight 3

Arabic is more than mirroring

Participants expected layouts to flip, but not numbers, charts or the clock icon. Most preferred Western digits on receipts and machines.

“Flip the screen, but don't flip the time.”

FatimaParticipant, Dubai

04 · Process

Build what's used most, first.

Week 048121620242832364044
Audit and naming
Tokens and themes
Core components
Machine scale
RTL and Arabic
Arabic launch
Docs and governance
◆ Tokens in code◆ Top 25 components◆ First Gulf customer◆ Arabic live
Fig. 3November 2025 to September 2026. The system grew alongside product work.

We never stopped product work to build the system. Every component was built when a real feature needed it, starting with the 25 that covered 80% of what we saw in the audit. That kept the system honest: nothing went into Loop that wasn't being used.

Option ARejected

One component library for all three

Tried for buttons. A web button scaled up for a machine looked wrong, and a machine button scaled down wasted space on the web.

Option BRejected

Three separate systems

What we already had. Every change happened three times and drifted within weeks.

Option CChosen

Shared tokens, platform components

One set of tokens and rules. Each surface gets its own components and scale, built from the same decisions.

Fig. 4The structural decision, made in week 3.

05 · Design decisions

Shared decisions, platform components.

Three tiers of tokens, three outputs

Primitive tokens hold raw values. Semantic tokens hold meaning, like 'action primary' or 'surface warning'. Component tokens hold decisions for a specific component. Themes, density and the machine scale only change the semantic layer, so components never need to know which platform they're on.

Tokens live in Figma variables and are exported as JSON, then compiled into CSS variables for PackPulse, Swift for the iOS app and a theme file for the machine screens.

Fig. 5The token tiers and their three platform outputs. Contrast is checked at build time.

Accessibility lives in the tokens

Every foreground and background pair in the semantic layer is contrast-checked when tokens are built. If a change would break AA contrast, the build fails before anyone ships it. Machine screens use a stricter rule, 7:1, because they're read from further away and often in bright light.

  1. 01Figma variablesDesigners change a value
  2. 02Export JSONW3C token format
  3. 03Contrast checkAA for screens, 7:1 for machines
  4. 04CompileCSS, Swift, machine theme
  5. 05Visual testsScreenshots in three languages

Fails the build if contrast breaks

Fig. 6The token pipeline.

Right-to-left is part of every component from day one

Every component uses logical properties: start and end instead of left and right. Icons are tagged as mirroring or not. Arrows and progress flip; clocks, charts, play icons and our logo don't. Numbers stay in Western digits, which our Arabic participants preferred and which match card receipts in the Gulf.

We tested every component in Arabic from the first week, using real copy written by a native speaker. I speak Arabic, which helped with reviews, but it didn't replace testing with people who'd actually use the screens.

Fig. 7The same PackPulse card in English and Arabic, with notes on what mirrors and what doesn't.

Documentation next to the code, readable by people and by tools

Each component has usage rules, do and don't examples and a structured spec in the repository. Our engineers increasingly build screens with AI coding assistants, and with the spec in reach those tools reuse Loop components instead of inventing look-alikes.

Fig. 8Component anatomy for the Insight Card, as it appears in the docs.

06 · Governance

Small team, light rules.

A startup can't afford a design system team. Loop is owned by me and one designer, with engineers contributing directly. Anyone can propose a component with a short template, and we review proposals every Thursday.

Proposed

Template filled in

Problem, where it's used, why existing parts don't work.

In review

Thursday review

Design and engineering together, 30 minutes, decision on the spot.

Beta

Used in one feature

Lives in Loop with a beta tag until a second feature needs it.

Stable

Documented and tested

Docs, RTL check, contrast check, visual tests in three languages.

Fig. 9How a component gets into Loop. 38% of current components were proposed by engineers.

07 · Outcome

The Arabic launch was the real test.

When the first Gulf customer signed in July 2026, we had five weeks before installation. Because RTL had been part of every component since the start, the work was mostly translation, review and testing. Arabic machine screens and an Arabic PackPulse went live on schedule.

Production UI built from Loop
0%25%50%75%100%
Arabic launch
NovJanMarMayJulSepOct
Fig. 10Share of production UI built from Loop components, measured monthly with a code scan.

“We quoted three months for Arabic. It took five weeks, and most of that was waiting for copy.”

NielsFront-end engineer

“I changed the machine colours for a customer in an afternoon. That used to be a firmware release.”

KoenFirmware engineer
Fig. 11From the team retrospective after the Gulf launch.

08 · Reflection

What I'd do differently.

I would have brought the firmware team in a month earlier. The machine scale was the most original part of Loop, and their constraints shaped it more than anything I designed in Figma.

I'd also measure adoption from day one. We only started scanning the codebase in January, so the first two months of progress are estimates.

Tools on this project

Figma variables, Tokens Studio, Style Dictionary, Storybook, SwiftUI, Chromatic, GitHub

Names of the people quoted have been changed to protect their privacy.

Next projectPackBack Network

PackPerks →