40+
Components documented
Components already in production, now documented on the platform — design tokens, components, and UX specifications.
01 · AI + Design Systems
The gap between design intent and shipped product cost weeks of back-and-forth on every component. I built a living documentation platform to close it — and learned that the hard part was never generating the documentation. It was architecting the system that holds it.
The Problem
Every component handoff followed the same script: send a PDF export, a link to a Sketch library, and a Radar ticket written for an engineer who hadn’t sat in the design review. Nobody could run the spec. Nobody could resize it to test mobile. And by the time engineering asked the first follow-up question, the Sketch file had already changed.
The result was a fragmented documentation landscape. Each artifact lived in a different place, maintained by a different person, at a different level of freshness. Web developers discovered edge cases the PDF never addressed. Engineers had to interpret static annotations instead of inspecting working code. Designers spent their time answering questions a running prototype would have answered on its own.
“Specs felt like a wishlist.”
The fix wasn’t better annotations or more detailed tickets. It was a different format entirely — one that could run in a browser, adapt to dark mode, and answer follow-up questions before anyone had to ask them.
PDFs, Sketch links, and tickets — three artifacts, three owners, three versions
The Constraints
Three things were fixed before I started, and each one shaped the outcome more than any decision I made afterward.
Sketch was the input, not by preference but by policy. It’s the approved design tool, so any pipeline had to begin there. That ruled out the tooling most design-system automation assumes.
I had no access to the production source code. Whatever the platform produced could never be the code that ships. That single constraint defines the ceiling of this project, and I designed against it rather than around it.
The team was hesitant. Changing how designers hand work to developers means changing what both sides are accountable for. The resistance wasn’t to the tool — it was to the shift in a working relationship that had been stable for years.
The Approach
I chose to generate a running page at a URL rather than produce a better static document. The alternative was available and cheaper — more detailed annotations, longer tickets, a stricter PDF template — and I rejected it because none of those change the fundamental problem: a static artifact can only answer questions its author anticipated. A prototype answers the ones they didn’t.
The platform had to serve three audiences at once. Designers needed high-level specs. Engineers needed complete handoff detail. Web developers needed something they could open in devtools and inspect directly. A single static format can’t serve all three; a page that adapts can.
Each component followed the same path, and the middle step is the one that matters. First, decide the component from what actually needed building — for example, a modular reveal container that holds an image or icon, with optional items that can be toggled on or off depending on the page. Then design it in Sketch, in multiple views, to see the structure in visual terms before any code existed.
Then build it with AI and test the limits. This is where the design work happens. Not “does it render,” but what breaks it — what content lengths, what nesting, what viewport, what combination of optional elements. The generated component is a hypothesis; stress-testing is how it becomes a spec. Only once it held up did the documentation pass begin.
All of the code was written by AI assistance, directed by my prompts. I want to be precise about that, because it locates the contribution correctly: my work was deciding the architecture, defining the constraints, finding where the output was structurally wrong, and directing it toward something that scales. The generation was never the hard part.
How prototypes are generated
The platform organized everything into five top-level categories: Design Tokens, Components, UX Specifications, Accessibility, and Resources. Each category had its own section in a persistent collapsible sidebar — navigating between components never required a trip back to the homepage.
Within each article, a floating table of contents gave engineers and developers quick access to specific sections — Overview, Interactive Prototype, Anatomy, Variants, Breakpoints — without scrolling through content that wasn’t relevant to their task.
Every component article embeds a working HTML/CSS/JS prototype. Not a screenshot. Not an animation. A real interactive element that responds to clicks, keyboard input, and screen resizes — built from the same code that goes into production.
The pipeline generates each prototype from a structured prompt: component name, intended states, token references, and responsive requirements fed into the Claude API. The output goes through GitHub PR review before being embedded into the article. Key insight: explicit output constraints outperform descriptions. “Produce a component using CSS custom properties for all color values, with focus and hover states, keyboard accessible” outperforms “make a nice button.”
A single component article serves two different readers. Essentials mode shows the high-level summary: version, date, designer, Sketch file link, and PDF references. Engineers and web developers who need the full picture switch to Full Spec for complete anatomy, all interaction states, responsive breakpoints, and implementation notes.
The toggle means the same source of truth serves designers in a standup and developers in a sprint. No separate document to maintain. No version to keep in sync. The audience changes; the platform adapts. If a component generated questions during review, the feedback folded back into the article — one update, visible to everyone.
The Solution
The output of every pipeline run was a page — not a file to email, not a Sketch artboard to share, but a real URL that anyone on the team could open in any browser. Designers could walk management through a component without needing Sketch installed. Engineers could open the prototype in devtools and inspect the actual CSS. The interactive prototype replaced what used to be a long written description in a Radar ticket, open to interpretation.
Dark mode was designed in at the data level, not the surface level. The color reference tables don’t invert — they display the actual dark mode token values, because the hex codes themselves differ between themes. An engineer reading that table gets the correct value for the mode they’re implementing, not an approximation of it.
Three fragments (PDF + Sketch + Radar ticket) become two: one Radar ticket + one shared URL
Color token values change between themes — the table reflects the correct hex for each mode
What Almost Broke
The documentation site itself almost didn’t come together.
I designed it the way a designer designs a page: screen by screen, solving what was in front of me. What I hadn’t designed was the system underneath — and it failed in three specific ways.
Hardcoded values instead of variables. As the site grew, colors went in as hex codes rather than tokens. Light and dark mode broke constantly, and every fix was local to one page.
Cache-busting wasn’t thought through. Updates shipped and didn’t appear. Stale files kept being served while the source had already changed — the same class of problem the platform existed to solve, reproduced in the platform itself.
Generated pages didn’t inherit anything. New articles were created on top of the site rather than from a shared foundation. Each one carried its own structure. Some were never linked into the navigation at all — real pages, reachable only if you knew the URL.
AI produces locally-correct output while having no model of the system that output belongs to.
None of these were AI errors in the narrow sense. Every page it generated was correct on its own terms. That’s precisely the failure mode. It optimizes the artifact in front of it, and left undirected it will default to literals over tokens, new files over shared foundations, and no global wiring — every single time.
The fix was information architecture, applied to a codebase instead of a navigation tree. One source of truth for tokens. Generated navigation instead of hand-linked pages. One foundation every article inherits. The site became a pseudo-CMS: create a spec article now and it wires itself into the navigation and renders through the correct template automatically, because the structure decides that — not the generation step.
That rethink is the actual design contribution in this project. Learning to direct AI toward scalable architecture is not a prompting trick — it’s the same systems judgment that makes a design system work, applied to a medium that will happily let you skip it.
Pages that inherit nothing drift apart and fall out of the nav — one foundation keeps them consistent and wires them in
Where It Stands
A living documentation platform. Interactive prototypes embedded in every component article. Shared across design, engineering, web development, and management. No translation layer.
40+
Components documented
Components already in production, now documented on the platform — design tokens, components, and UX specifications.
2
Through the full loop
Two components have gone from Sketch to stress-tested prototype to published article. Both were materially faster to hand off than the process they replaced.
In progress
Rollout
Adoption is ongoing and some components are still pending. I’m not putting a multiplier on a sample of two.
The platform does not produce production code. I don’t have access to the source, so what it emits is a working prototype in HTML, CSS and JavaScript — a reference for intent and behavior. Engineers still implement in their own language and syntax, against parameters I don’t have. It is not a copy-paste source, and calling it one would misrepresent where the handoff boundary actually sits.
That boundary is worth naming, because it clarifies what the platform is for: not eliminating implementation, but removing ambiguity from it.
Designers stopped fielding clarifying questions — the prototype answered them. Engineers stopped interpreting static specs — they inspected real behavior. Web developers stopped working from guesswork. Management stopped asking to see Sketch files and opened a URL.
Adoption is not finished. Some of the hesitancy I described at the start is still there, and it’s reasonable — this changes what each side is accountable for at handoff.
The deeper shift: when documentation runs in a browser, the question changes from “did the designer spec this right?” to “does this behave the way we intended?” That’s a much more useful conversation — and one that AI-assisted documentation makes possible without adding overhead to the design process.
The lesson I carry out of it is narrower and more useful than the platform itself: AI doesn’t change design-system architecture principles. It makes violating them faster. I’ve since seen the same three failures — hardcoded values, unversioned assets, pages that don’t inherit or register — appear in other AI-assisted projects. The third time, I went in knowing what to check.
Case study 02
HR Platform IA & Navigation System →