Skip to content

MDS 2.0 / Prototyping Studio / FORGE

From component library to working prototypes

I designed and coded MDS 2.0's shared workspace, where non-developers generate and review repository-backed prototypes aligned to production components. Agent-readable Skills give coding assistants the same system context, while Figma remains available when it is the right starting point.

Result

Implemented a shared workspace for production components, responsive prototypes, and AI instructions. The FORGE generation pipeline remained experimental.

The Prototyping Studio I designed and coded. Repository-backed concepts carry review status, categories, ownership, contributors, and update history in a searchable team library.
The Prototyping Studio I designed and coded. Repository-backed concepts carry review status, categories, ownership, contributors, and update history in a searchable team library.Open full-size image
Year
2025–26
My scope
Designed and coded the shared workspace, Prototyping Studio, and Skills browser. Owned color foundations, component-state matrices, and button Code Connect mapping.
Collaborators
Three designers on the library, with Flutter engineers on the production system. I implemented the workspace and prototyping features independently.

Three copies of the truth

A design system tends to exist three times: once as a Figma library, once as the code that implements it, and once as documentation describing both. Each copy has a different owner and a different update cadence, so they drift. Add an AI assistant to the workflow and there is a fourth copy, because the model needs an instruction set and somebody writes it by hand.

MDS 2.0 was an attempt to collapse that into one thing. A token architecture in Figma, bound to the Flutter codebase through Code Connect, with component rules written in a form a model could read directly. Not a library plus docs plus prompts. One artifact with several outputs.

I owned the color foundation, the component-state variable matrices, and the Code Connect mapping for the button set. Most of my time went to the seam between those, which is also where all of the arguments were.

A component library, its documentation, and a model's instruction set are one artifact rendered three ways. Most teams maintain three.

A token architecture shared by design and code

Seven named tonal ramps at thirteen stops each. Nothing consumes a raw palette value. Semantic theme roles alias into the ramps, and every role carries an explicit light assignment and an explicit dark one, so a theme swap is a lookup rather than a redesign. Elevation is authored twice for the same reason.

The system needed success, warning, danger, and info roles alongside the Material 3 theme. We gave those roles explicit light and dark assignments in design and code, so individual screens did not have to invent status colors. Extending the base theme also created a maintenance obligation: future Material upgrades would need a reconciliation pass.

About 1,830 variables across nine collections. The split matters more than the count: primitives separated from semantics, semantics separated from component-state matrices, and one collection built purely to serve the codebase rather than the canvas. Component interaction state runs off variable modes instead of hand-built variants. A text input resolves fifteen bound properties across five modes, so the stroke walks from outline to primary to danger by state and the floating label is a boolean, with no duplicated variant holding either.

Connecting Figma to Flutter

Code Connect maps one Figma button set to five Flutter symbols, including a named constructor. The mapping targets Flutter's ThemeExtension classes rather than bespoke wrapper widgets.

Dev Mode hands an engineer a standard Flutter button snippet. The design-system connection lives in the theme, so it is less obvious at the call site and must be checked in theme configuration. In exchange, engineers can use framework components without maintaining a parallel wrapper layer.

The spec board and the sandbox are deliberately separate objects. The master variant set is locked. Next to it sits a playground of roughly sixty rendered permutations including a disabled state for every style, because the question a developer actually has is not what the spec says, it is what this looks like when it is off.

From component catalog to shared workspace

The original sandbox opened on a single component example. Navigation sat behind a modal drawer, and components appeared as one long list. It exposed the library, but it did not orient a designer around what they were trying to accomplish, provide a place to review concepts, or show an AI assistant how the repository expected work to be structured.

I redesigned and coded the workspace end to end. A persistent rail separates Home, Components, Prototypes, and Skills. The home page starts with three outcomes: build product UI, explore a concept, or work with AI. That information architecture gives each activity a clear boundary while keeping the same design language and repository context visible across all three.

The Prototyping Studio registers source-controlled concepts with status, category, creator, contributors, and update history. Designers and other non-developers can generate a working concept, open it in a responsive preview canvas, resize across breakpoints, review comments, and inspect the files behind the experience. A prototype is no longer a detached mock or an unexplained branch. It is a reviewable team artifact aligned to production MDS components, with a route back to its source.

The Skills browser surfaces repository-specific instructions, required inputs, file locations, and creation steps for designers, developers, and AI assistants. Figma remains an available input when visual authoring is useful. The aim is to reduce repeated setup and translation work by making the same guidance available to everyone using the workspace.

The design system became a place to browse production patterns, test ideas as working software, and see the instructions an AI assistant would follow.

FORGE: an experimental generation pipeline

FORGE is the pipeline built on top. Three ingest paths converge on one representation: analysis of legacy screens, the proven path from Figma files already built out of MDS components, and an R&D path starting from prompt-generated HTML. All three produce the same enriched JSON. Per-component skill files are what the model reads, and those files are treated as source of truth rather than as prompt scaffolding.

The enrichment step filters tool-specific noise, preserves component identity and structure, and packages the MDS context needed to choose and configure production components. I framed this workflow around shared component instructions so the team could investigate generation quality without rewriting the system context for each attempt.

Which model runs is a controlled variable in the design rather than an implementation detail, so output can be compared across models instead of argued about.

What shipped, and what remained experimental

Code Connect was wired and reporting connected. The artifact I can show is the panel rather than the figma.connect() source file, so that is the limit of the public evidence.

The redesigned workspace, Prototyping Studio, responsive preview canvas, and Skills browser were implemented as working, repository-backed tools. They give designers and developers one place to create and review concepts against the MDS component context used by coding assistants.

FORGE's enrichment path worked at prototype level. End-to-end Flutter generation was not feasible when I last worked on it, output quality had not been benchmarked, and adoption was not instrumented.

The next measurement step would be to track which teams create and review prototypes, how often they return, and where concepts stall. That would connect the implemented workflow to evidence of adoption before making a delivery-speed claim.

Decisions

  1. The decision

    Point Code Connect at Flutter ThemeExtension classes instead of building a wrapper widget for every component.

    The tradeoff

    Wrappers would make system use explicit at each call site. Theme extensions require reviewers to inspect the theme configuration to confirm the design-system connection.

    The consequence

    The connected button set uses ordinary Flutter components with MDS theme configuration, avoiding a separate widget layer to keep aligned with framework updates.

  2. The decision

    Drive component interaction state from Figma variable modes rather than from hand-built variants.

    The tradeoff

    Variable modes require more explanation than a variant picker. Designers need to understand how the state matrix resolves before making a local override.

    The consequence

    One text input holds fifteen bound properties across five states with nothing duplicated. Changing the error stroke is a single edit that lands everywhere, and the matrix reads to an engineer as a table of resolved values rather than as a pile of variants.

  3. The decision

    Turn the component sandbox into a shared workspace with first-class Prototypes and Skills areas.

    The tradeoff

    The sandbox became a product with repository conventions, metadata, responsive preview behavior, and documentation surfaces to maintain. A simpler component catalog would have required less engineering and fewer ownership decisions.

    The consequence

    Designers and developers can now move from production patterns to source-controlled concepts and inspect the same instructions available to AI assistants without leaving the workspace. The workflow is implemented, although its effect on delivery speed has not yet been measured.

  4. The decision

    Insert a JSON enrichment step and treat per-component skill files as source of truth, instead of writing better prompts.

    The tradeoff

    Component instructions and enriched data add a maintenance step. Changes to component behavior must stay aligned with the context the generation pipeline consumes.

    The consequence

    The prototype consumed the same versioned component instructions on every run, replacing ad hoc prompts with shared system guidance. End-to-end output quality remained unbenchmarked, so the evidence is the repeatable context path rather than a productivity claim.

Design systemsProduct designDesign engineeringFigma Code ConnectFlutterAI tooling

Artifacts

Before and after

The MDS workspace home after I redesigned and coded the sandbox. Outcome-based entry points connect production components, repository-backed prototypes, and agent-readable Skills through one persistent navigation system.BeforeAfter

Drag to compare. Arrow keys work when the control is focused.

BeforeBefore the rebuild, the sandbox opened directly on a typography example with no workspace orientation, prototype library, or visible route to AI instructions.

AfterThe MDS workspace home after I redesigned and coded the sandbox. Outcome-based entry points connect production components, repository-backed prototypes, and agent-readable Skills through one persistent navigation system.

  • Before the rebuild, navigation lived in a modal drawer and presented the component inventory as one long alphabetical list.Before
    Before the rebuild, navigation lived in a modal drawer and presented the component inventory as one long alphabetical list.Open full-size image
  • A prototype opened in the responsive review canvas. Designers can resize the working experience, inspect its source contents, review comments, and assess breakpoint coverage without separating the preview from its repository context.After
    A prototype opened in the responsive review canvas. Designers can resize the working experience, inspect its source contents, review comments, and assess breakpoint coverage without separating the preview from its repository context.Open full-size image
  • The Skills browser exposes repository-specific instructions, input contracts, file locations, and deterministic creation steps so people and AI assistants work from the same operational guidance.After
    The Skills browser exposes repository-specific instructions, input contracts, file locations, and deterministic creation steps so people and AI assistants work from the same operational guidance.Open full-size image
  • The Figma Variables editor with nine collections listed and the TextInput States matrix open: fifteen rows resolving stroke, radius, label, and text roles across five component states.After
    The Figma Variables editor with nine collections listed and the TextInput States matrix open: fifteen rows resolving stroke, radius, label, and text roles across five component states.Open full-size image
  • The MDS 2.0 library at 24% zoom, showing seven named tonal palettes, the light and dark theme boards that alias into them, and separate elevation effect styles per mode.After
    The MDS 2.0 library at 24% zoom, showing seven named tonal palettes, the light and dark theme boards that alias into them, and separate elevation effect styles per mode.Open full-size image
  • Figma's Code Connect panel reporting Connected, mapping one button component set to five Flutter theme-extension symbols including FilledButton.tonal, above the generated Dart preview.After
    Figma's Code Connect panel reporting Connected, mapping one button component set to five Flutter theme-extension symbols including FilledButton.tonal, above the generated Dart preview.Open full-size image
  • A FigJam board diagramming the FORGE pipeline: three ingest paths converging on one JSON-enriched representation, followed by model selection, planned Flutter output, and a quality benchmark.After
    A FigJam board diagramming the FORGE pipeline: three ingest paths converging on one JSON-enriched representation, followed by model selection, planned Flutter output, and a quality benchmark.Open full-size image