Six months ago, I convinced our product teams to move our design system documentation from Confluence to a docs-as-code workflow. The pitch was compelling: version control, code review for docs, automated deployment, documentation that lives with the code it describes.
Now that we’re on the other side, I want to share what actually worked, what failed spectacularly, and the compromises we made.
The Setup
We moved from Confluence to Markdown files in Git, deployed via Docusaurus. Three product teams, mix of engineers, designers, and product folks all contributing to our shared design system.
What Worked Brilliantly
1. Engineers Actually Update Docs
When documentation is just another file in the repo, engineers update it. They’re already in the terminal, already making a commit. Adding a doc update to the same PR is trivial.
Before: “I’ll update the Confluence page later” (never happens)
Now: “Updated the component.md file in this PR” (actually happens)
2. Pull Request Reviews Caught Inconsistencies
Having docs in PRs means they get reviewed with the same rigor as code. We caught:
- Incorrect prop descriptions before they shipped
- Missing breaking change warnings
- Examples that wouldn’t actually work with the new API
The review process for docs became just as thorough as code review.
3. Versioned Docs Matching Code Versions
This was huge for a design system. We can now say “these are the docs for v2.3” and “these are the docs for v3.0” and developers can see exactly what changed between versions.
For a component library supporting multiple product versions, this was transformative.
What Didn’t Work
1. Non-Technical Stakeholders Struggled
Product managers and designers who needed to contribute docs found Git/Markdown intimidating. We lost contributions from people who had valuable context but didn’t want to deal with branches and merge conflicts.
One PM told me: “I just want to add a note about when to use this component. I don’t want to learn Git workflows.”
2. Lost Rich Formatting
Confluence had embedded prototypes, videos, rich diagrams. Markdown is plain text. We lost the ability to embed interactive examples easily.
We worked around this with code sandboxes and external embeds, but it’s not as seamless as Confluence was.
3. Search Wasn’t as Good
Confluence’s full-text search was better than our static site generator’s search. We added Algolia DocSearch which helped, but it’s an extra dependency and configuration burden.
The Compromise We Reached
Not all documentation belongs in code. We now split our docs:
In Git/Markdown (docs-as-code):
- Component API reference
- Usage examples
- Props and types
- Technical implementation guides
- Anything that changes with code
In Notion (traditional wiki):
- Design principles and philosophy
- Project planning and roadmaps
- Meeting notes and decisions
- User research findings
- Cross-functional strategy docs
The Lesson
Docs-as-code is fantastic for technical reference documentation that needs to stay in sync with code. It’s less great for strategic documents, cross-functional collaboration, and content that needs rich media.
Match the tool to the documentation type. Not everything needs to be in Git.
My Advice if You’re Considering This
- Start small: Convert high-churn docs first (API references, frequently updated guides)
- Keep stable docs where they are: Don’t move everything just to move it
- Invest in tooling: Good static site generators, search, deployment pipelines matter
- Train your team: Git workflows aren’t obvious to non-engineers
- Accept you’ll have multiple systems: That’s okay, as long as you’re clear about what goes where
Who else has tried docs-as-code? What worked for you? What would you do differently?