Contribute.
Anyone on the UX team can change this site. Every change ships through a merge request with an automatic preview link, and main deploys to production on merge. Here's how to get going — the exact commands live in the CONTRIBUTING guide.
Before you start
A one-time setup.
Two ways to work
Pick by the size of the change — both end in the same MR + preview.
GitLab Web IDE
- Open the file in GitLab → Edit → Open in Web IDE.
- Make your change.
- Commit to a new branch and tick “Start a merge request”.
- Open the preview URL on the MR, check it live.
- Ask a maintainer to review and merge.
Local clone + push
- Clone the repo, npm install, npm run dev.
- git checkout -b my-change.
- Edit, check at localhost:3000, commit.
- git push -u origin my-change → open the MR at the URL printed in the terminal.
- Same preview → review → merge as above.
Claude Code
- Clone the repo and open it in Claude Code (claude command in the project folder).
- Describe your change in plain language — Claude reads CLAUDE.md and knows the conventions.
- Claude edits files, runs the dev server, and shows you a preview before committing.
- When happy: “push this and open an MR” — Claude pushes the branch and gives you the MR link.
- Click the link, set auto-merge, done.
@vonkrogh (Mikel) or @maan (Mathias). That's what sends them a notification. Without a reviewer the MR sits silently and nothing ships.Never commit straight to main — it's protected, and the MR preview is your safety net.
Three worked examples
The shapes you'll hit most often.
Add a page
- Copy a simple page as a template (e.g. VoicePage.jsx) into components/pages/.
- Add a 3-line route file in app/<route>/page.jsx (copy app/trust/page.jsx).
- Add a title + description entry in components/data/page-meta.js.
- Add the sidebar item in components/data/nav.js and wire the PageNav chain.
- Bump SPROUT_VERSION and add a CHANGELOG entry in sprout-data.js.
Add a component
- Add it to COMPONENTS in sprout-data.js — it appears on the coverage board.
- Create a component page with the Section and DemoCard primitives (copy ButtonsPage.jsx).
- Wire the route, metadata and nav exactly like a new page.
- New React primitive? Pair with a maintainer — it also gets a Code Connect mapping for Figma Dev Mode.
Add or change an icon
Icons flow from Figma through the sync pipeline — never edit SVGs by hand. The full step-by-step is on the Iconography page.
- Search this page first — 297 icons are already in the set.
- Found it in Lineicons? Drop the name in #sprout-design-system — no Figma work needed.
- Custom icon: open MiniSprout in Figma, add a component frame (24×24, 2px stroke, round caps, currentColor), name it in kebab-case.
- Tag a maintainer. They trigger the sync pipeline in sprout-tokens, which opens an MR with the new SVG.
- Sync MR merged → maintainer publishes a patch version → docs vendor updated → live on /icons.
Two repos, one rule
Know which one you're in.
This site
Pages, components and guidelines live in the docs repo. That's everything you reach from the sidebar. See How it works for the full pipeline.
The tokens
Colours, spacing, radii and icons live in the sprout-tokens repo and flow from Figma — never hand-edit vendor/sprout-tokens/ here. The CONTRIBUTING guide covers the token release flow.
House rules
Questions → #sprout-design-system.