Build your first design system

An end-to-end walkthrough: create an organization and project, choose targets, author foundations, add a real component, preview it, release it to a registry, and install it in an app. Every step is grounded in how the Studio and release flow actually work.

Where you do this
Authoring happens in the Milda Studio - the visual editor. This page describes the shape of the workflow so you know what each step is for. If you just want to feel the editor, the Foundations editor and editor runtime pages embed the real thing, live and with no setup.

#1. Create an organization and project

Everything in Milda lives under an organization - its slug becomes your package scope (@your-org), and it is immutable once chosen, because consumers will import against it. Inside the org you create a project: one design system. The project slug becomes the package name, so a project design-system under org acme releases as @acme/design-system.

#2. Choose the project's targets

A project declares which outputs it produces. React is the shipping code target today; Figma is a design target. You pick targets when you create the project (and can adjust them later in project settings), and each target can carry its own realization options. See Targets.

#3. Author your foundations

Foundations are your design tokens - color, spacing, type, radius, motion - and every component and every output draws from them. Tokens are typed, layered, and context-aware, so one token can resolve differently by color scheme or platform. Define these first: a component styled against tokens stays consistent and re-themes for free. See Foundations, or try the live Foundations editor.

#4. Add a component from an archetype

You rarely start from a blank node tree. An archetype is a built-in blueprint that comes with a correct contract, a published anatomy, and composed behavior. Add a component, pick the Button archetype, and you immediately have a working, accessible button - a props contract (e.g. a variant), a press event, and the right semantics.

Then make it yours:

  • Style it against your tokens using style facets (fill, ink, ring…), keyed to states like hover and pressed. See Facets & tokens.
  • Shape the contract - add or rename props, mark them required, give defaults. The contract is the stable surface consumers code against. See Components.
  • Add composition with slots where consumers should drop their own content.
Start seeded, not empty
New projects start from a seeded library of curated archetypes rather than an empty canvas, so your first component is a customization, not a from-scratch build.

#5. Preview it

The Studio previews the component live as you edit - you can drive its props, force interaction states, and step through its behavior without generating anything. This is where you confirm the contract and styling feel right before you commit to a version. See Behaviors & interactivity.

#6. Generate and release

Releasing turns the IR into real code and assembles it into installable packages. A generator emits self-contained React components plus a shared theme; the release layer packages that output - one package for the whole system, or per-component packages plus a shared theme - as a versioned, reproducible release, and publishes it to a registry that speaks the npm protocol.

How it runs
Release is driven from the Studio and its release flow; generation is also available from the CLI (milda generate) for local builds and CI. Version numbers are derived from the contract: Milda diffs the new contract against the last release and bumps semver by severity (the same diff the CLI's milda diff runs), so breaking changes are caught before they ship. Locally, releases publish to a Verdaccio registry; hosted registry hosting is on the roadmap.

#7. Install and use it

Consumers don't need Milda. They route only your scope to the registry, then install the package like any dependency - no mirroring, no risk to their other dependencies:

ini
# .npmrc - route only your scope to the private registry
@acme:registry=https://registry.your-company.com
# everything else still resolves from npmjs
bash
npm install @acme/design-system

And import components as usual:

tsx
import { Button } from '@acme/design-system'

export function Example() {
  return <Button variant="primary">Ship it</Button>
}

#Next steps

  1. Let AI build on your system - wire up the MCP server so coding agents read your exact contracts.
  2. Understand what you can express in the Milda Language and its archetype catalog.
  3. See the open/paid split in Editions & pricing, or the common questions in the FAQ.