Backstory
Write it down before the wild ride
- The plan was a few AI micro SaaS apps on different marketplaces and a website, with a platform to come. We had a well thought-through logo, and not much else written down.
- So before the quick prototypes, I wrote down my base choices: font, colours, icons and a component library. Nothing new, just sure. The Storybook TODO at the end was the long game.
Logo
light · darkFont
Aa Inter · 538 for headingsColour
#F97316 · white · a gradient
Icons
lucide-reactComponents
shadcn/ui, with our brandTokens
text-orange-600dark:text-orange-400
Tailwind CSS
TodoAdd a Storybook version soon
the long game, from day one
scroll the real doc ↓
Design call · base
Borrow the components, own the tokens
- We were building towards a platform, so everything had to be modular: components, tokens and layouts.
- So no component library of our own yet. We themed shadcn/ui, standard and widely used, to Strive, with modular Tailwind presets from the start. Set up for the long term, build only what today needs.
Our own component library
- Built before we need it
- Ours to maintain, from day one
- No clear reason why, yet
vs
shadcn/ui, themed to Strivethe call
- Standard and widely used
- Modular Tailwind presets from the start
- Only what today’s apps need
Foundations
Two packages, one playground
- Then came the agents: a marketing assistant, an engineering partner in Slack and more. I gathered the patterns into
@strivelabs/ui-corefor the foundations, and@strivelabs/ui-blocksfor bigger blocks. - Not a public library. Just everything in one place, so the next use case could pick it up, with a Storybook playground for developers to see what exists and build on their own.
-
Every app and agent
Micro SaaS appsAgentsThe platform client
-
Blocks
@strivelabs/ui-blocksRich text editorCommand searchDrag and dropAI chatHooks
-
Foundations
@strivelabs/ui-coreButtonInputDialogTabs
-
shadcn/ui, themed to Strive
Tailwind presetsFontColoursIconsTokens
the same parts, from the first app to the whole platform
Where it hurt
One button, three versions
- From micro SaaS apps to agents to a marketing OS, I worked with a different designer on each pivot, and each experiment needed its own look.
- So the registry and the presets outgrew themselves. I kept versions of the same component alive for each one, and Storybook got confusing.
-
Micro SaaS apps
ButtonCardpreset · saas
-
Agents
ButtonButton v2Cardpreset · saaspreset · agents
-
Marketing OS
ButtonButton v2Icon Button v2CardKbd v2preset · saaspreset · agentspreset · os
which Button do I use?
Design call · scope
A knowledge base, not a showcase
- We had no plans for a builder experience anytime soon, so there was no reason to publish any of it.
- So I paired with our designer on something minimal: a knowledge base for the team and their coding agents, mess included, to see how alarming it was.
A public design system site
- Polished for the outside world
- Made for a builder we don’t plan
- Hides the mess we need to see
vs
A knowledge basethe call
- Minimal, for the team
- Written for coding agents too
- Everything in one place, mess included
Common ground
One source, three readers
- Our designer did a good first pass: a Claude artifact documenting what was in our codebase. I polished it into one source of truth: foundations, patterns, components, and links to Storybook, Figma and a cheat sheet.
- Now designers use the doc, Figma or Storybook, and developers use the playground. Coding agents read the doc as context, because we can’t really leave the agents out.
-
Designers
the doc, Figma, or straight in Storybook -
Developers
the Storybook playground -
Coding agents
the doc as context, through llms.txt and DESIGN.md
One source of truth
The Strive design system docFoundationsPatternsComponentsResources
with links to Storybook, Figma and a cheat sheetFor agents
Generated, not hand-kept
- Agents get their own way in:
llms.txt, a tiny router that points toDESIGN.md, a page per component, and JSON catalogues of components, patterns and tokens. - Almost none of it is written by hand. A script builds it from the component source, the Storybook stories and the platform token CSS. Change a component, run
gen-ai-context, commit the result.
- Component source
- Storybook stories
- Platform token CSS
One script
gen-ai-context
run it, commit the result
For coding agentsgenerated
llms.txta tiny router: which file answers which questionDESIGN.mdthe rules and tokens, in prose an agent can quotecomponents/<slug>.mdone page per component, with its propscomponents.jsonthe catalogue, for tools and validatorstokens.jsonevery token, for quick lookups
don’t hand-edit. regenerate.
Design call · Figma
Sync it when it hurts
- Nobody asked for any of this, so every call weighed cost against impact. Does Figma still make sense when we design in code? Our designer’s answer: yes, as a playground for quick, specific changes.
- Based on that, we generated one version in Figma, straight from code: the doc and the registry, through Claude and the Figma MCP. The sync isn’t automated end to end yet. It regenerates just as fast.
A code-to-Figma sync, now
- A pipeline to build and keep running
- Before many people touch the file
- Bandwidth away from the product
vs
One version from code, sync laterthe call
- Generated from the doc and the registry
- Regenerated just as fast
- A pipeline once people need one
What changed
Audits, then a cleanup
- Writing it all down worked like an audit: where we were inconsistent, what to build, and what not to reinvent.
- So we unified pages that used to look different from each other, and cleaned up a big chunk of tokens. Agents now have fewer variants to choose between.
Before
- Pages that looked different from each other
- Tokens and presets piling up per pivot
- Agents guessing between variants
vs
Now
- Pages that look like one product
- A standard set of tokens, in use
- One answer for people and agents
Misses & lessons
What our pivots taught the system
-
MissLet each pivot add its own version of a component.
LessonWrite down the drift early. It’s cheaper to see the mess than to guess it.
-
MissLet Storybook grow a variant per experiment.
LessonA playground helps only when you can find the one to use.
-
MissKept the base doc for myself.
LessonWrite it for the team, and now for the agents too.
-
MissTried to support every way of doing the same thing.
LessonPut a hard stop. We skipped Claude Design completely, and didn’t automate the Figma sync right away.
We didn’t set out to build a design system. We kept writing things down, and one grew.