byfma← Work
Design systemDesign tokensAI agentsB2B SaaS

Fluuen

A three-layer token system, generated from Figma into a shipped AI product — and an honest account of where the two drifted apart.

role

Product Designer · Design Systems

type

Design system · B2B SaaS product

year

2026

tools

Figma · Tokens Studio · Next.js

848

Color tokens

3

Token layers

121

Divergences found

6

Pipeline steps

The Fluuen dashboard: metric cards, a runs chart, agent status list and recent run history, on the dark River Styx surface
The shipped product, live on VercelNew

This is a real, navigable product.

Try it live →
00Overview

A system first, then a product to test it

Fluuen is a no-code automation platform with AI agents, shipped as a navigable demo. But the product was never the deliverable — it was the test. I built the token system, then built something real on top to find out whether it held.

It mostly did. This is the account of the 121 places where it didn't.

01Where truth lives

Each artefact has one source of truth

When Figma and the code disagree, which one is wrong? I answered it per artefact. Tokens: Figma is the source. Screens: the code is. The shipped screens don't exist in Figma — that's a boundary, not a gap.

Component

status badge

Active · label

Semantic

icon.success

Primitive

green.500

Value

#3fb950

A component never learns its colour. It asks for a success label; three layers resolve that to a hex. Change the ramp, and everything that asked for success moves with it.

02The pipeline

I wrote the generator instead of using Style Dictionary

Tokens Studio exports a verbose JSON tree — emoji-prefixed, Figma scopes, redundant segments. A 385-line script flattens it, resolves the alias chain, and writes clean CSS variables. Style Dictionary would have meant its learning curve plus the same custom transformers, for one output I could write directly.

The output is public and inspectable: the Storybook parses the generated CSS at build time, so its documentation can't drift from what ships.

Storybook

What it cost: the naming is owned by the script, not copied from Figma — so the code reads bg-status-success, ugly but 1:1 with the source. No light mode, no second format, and I'm the only one who can debug it.

The Fluuen Agent Builder: a node canvas with a trigger, two action nodes and an AI node wired together, the node catalog on the left and the inspector open on the right
The agent workflow builder — the token system in a real interfaceNew

Build an agent yourself in the demo.

Open the builder →
03The drift

The pipeline kept CSS in sync with JSON — not with Figma

The gap hid for months because every check I had was a count. 897 in code against 848 in Figma looked like 49 missing. It was 85 stale names against 36 that never arrived, netting out. Counting answers how many. It doesn't answer: are these the same?

Mechanical

54 tokens

Pure renames — one clear destination.

Needs judgement

24 tokens

Renames needing a design call to resolve.

No destination

7 tokens

No destination — six hovers and a focus border.

A whole component — the Agent Builder inspector, 20 tokens — existed in Figma and not in code. Its neighbours shipped; it didn't. The drift wasn't decay. The system evolved and the code kept speaking last year's version of the same language.

04Classified

Where they diverge, I classify rather than absorb

Select a state. The node's border is a token, not a colour — and this is the exact component where Figma and code drifted.

Live component · agent builder node

Node states

Send Slack message

a3

Action · Slack

channel#alerts
ts

Component

Control/Node/Structure/border-default

Semantic

border.default

Primitive

river-styx.400

Value

#1e1e26

Default: border.defaultriver-styx.400 #1e1e26

node sublabel

#6b7280

components/builder/canvas-node.tsx:202

#868e9e

Control/Node/*

debt

border-selected

brand.500

components/builder/canvas-node.tsx:53

brand.400

Control/Node/Structure/border-selected

affordance

shipped screens

code is truth

app/

not in Figma

by design
05What's true

What's done, what's partial by choice

Done: the token system and pipeline, the shipped screens, a Storybook that parses the production build so its docs can't drift. Partial by design: the demo runs on simulated data — a sandbox with no login, so anyone with the link is inside the product in seconds. Open debt: a sublabel contrast fix and the seven tokens with no home.

These aren't bugs — they're classified divergences. In a live product each has a one-line fix; as a portfolio piece, finding and naming them was the point.

The Fluuen agents grid: agent cards showing active, paused and error states side by side
Agent states, failure included — the error card is designed, not an afterthoughtNew
06Live

See it running

Open the builder
A recording of the Fluuen agent builder running a workflow: an Invoice Processing agent advances step by step from its Email Received trigger through Read Email, Extract Data and a Check Amount condition, each node highlighting as it executes and the extracted values filling in
The builder mid-run.

The published file

The file, as it’s publishedOpen in Figma
Loading embed…
Fluuen Design System — 848 colour variables across 3 collections
Live demo →