Library / SDK
seek-oss/braid-design-system avatar
seek-oss/braid-design-system

Braid Design System: SEEK's Themeable React Component Library

Themeable design system for the SEEK Group. For example, if you wanted to ensure that all relative links are React Router links: Local Development This project uses pnpm for development dependencies.

1,571 stars98 forksTypeScriptMIT

At a glance

What is it?
Braid is a themeable React design system published as braid-design-system, built for SEEK Group products and configured to work with the sku build tool. It is a strong fit for teams already inside that toolchain, and a rougher one for anyone bringing a custom bundler.
Who is it for?
Adopt Braid if you are building a React interface inside SEEK's sku toolchain, or if you are prepared to configure Vanilla Extract and unassert yourself. Do not adopt it if you want a framework-agnostic or bundler-agnostic component library, or if you need a theme other than the ones shipped in braid-design-system/themes.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 3 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Braid Solves, and Who It Is Built For

Braid is a themeable design system for the SEEK Group, distributed on npm as braid-design-system. The problem it addresses is the usual one behind an internal design system: several applications need the same buttons, text styles, links and layout primitives, and each team should not rebuild them. Braid ships those components as React components and lets a consuming app pick a theme, such as seekJobs or wireframe, at the provider level.

The audience is narrow by design. The README states the setup guide is "currently optimised for usage with sku", SEEK's own build tool, because sku is configured to support Braid out of the box. If your project uses a custom build setup, the README says you will need extra guidance from project contributors to configure your bundler. That sentence is the honest summary of the project's scope: it is a design system for one organisation's stack, published openly rather than a general-purpose library that happens to come from SEEK.

BraidProvider, Themes and the Reset Import Order

The mechanism is a React context provider plus static CSS. You import a reset stylesheet, a theme object and the BraidProvider component, then wrap your application. Every Braid component below the provider reads the theme from context, so switching themes is a matter of passing a different object to the theme prop rather than editing component call sites.

The reset import is the part that bites. The README carries an explicit warning that the reset styles must be imported first to avoid CSS ordering issues, and the example annotates the line with "Must be first". This is a real constraint, not a stylistic preference: if the reset lands after component styles in the bundle, the cascade resolves differently than the authors intended.

BraidProvider also accepts styleBody. When you render inside another application, passing styleBody={false} opts out of the provided body styles that set the background color and reset margin and padding. That is the correct choice for embedding Braid in a host page whose body styling you do not control.

Styling itself is authored with Vanilla Extract, which the README describes as writing CSS in TypeScript that is statically extracted at build time into reusable atomic CSS classes. Braid does not ship a runtime CSS-in-JS engine; the styles are collected by a bundler plugin and either injected into the document or emitted as a separate stylesheet.

Installing braid-design-system and Rendering a First Component

Installation is a single npm command inside a sku project. The README gives this exact line:

bash
$ npm install --save braid-design-system

After that, the reset, a theme and BraidProvider go at the very top of your application. The README's example imports the reset first, then the seekJobs theme, then the components:

js
import 'braid-design-system/reset'; // <-- Must be first
import seekJobsTheme from 'braid-design-system/themes/seekJobs';
import { BraidProvider, Text } from 'braid-design-system';

Rendering is then a provider wrapping whatever components you need. The README's minimal example puts a Text component inside the provider:

js
import 'braid-design-system/reset';
import seekJobsTheme from 'braid-design-system/themes/seekJobs';
import { BraidProvider, Text } from 'braid-design-system';

export default () => (
  <BraidProvider theme={seekJobsTheme}>
    <Text>Hello World!</Text>
  </BraidProvider>
);

What you should see is styled text using the theme's typography and the reset's base styles. If the text renders unstyled, the reset import order or the Vanilla Extract bundler plugin is the first thing to check, since those are the two moving parts the README calls out.

One customisation worth knowing early is linkComponent. If you want every Link and TextLink in Braid to route through React Router, you build a component with makeLinkComponent and pass it to BraidProvider:

tsx
import { Link as ReactRouterLink } from 'react-router';
import { BraidProvider, makeLinkComponent } from 'braid-design-system';
import wireframe from 'braid-design-system/themes/wireframe';

const CustomLink = makeLinkComponent(({ href, ...restProps }, ref) =>
  href[0] === '/' ? (
    <ReactRouterLink ref={ref} to={href} {...restProps} />
  ) : (
    <a ref={ref} href={href} {...restProps} />
  ),
);

The README's example then passes CustomLink to BraidProvider via the linkComponent prop. This is the cleanest extension point in the library: you change link behaviour once, at the provider, instead of wrapping individual components.

The Build-Side Work Braid Does Not Do For You

Two build concerns are pushed onto the consumer, and the README is explicit that sku handles both at SEEK. The first is style extraction: Braid uses Vanilla Extract, which requires a bundler plugin to collect the extracted styles, either injecting them into the document or writing a separate CSS stylesheet. Without that plugin, the classes Braid references will not exist.

The second is assertion stripping. Braid performs precondition and invariant checking at runtime using the assert library to catch incorrect component usage. The README recommends stripping assert calls at build time with unassert, and notes that SEEK does this through sku via Babel with babel-plugin-unassert. If you skip it, those checks ship to production and run in the browser, which the README frames as disrupting the end user experience.

There is a third, softer category: dev and build time warnings for deprecations, logged conditionally based on process.env.NODE_ENV, which is expected to be either development or production. The README recommends replacing process.env.NODE_ENV with a configured string so the bundler can dead-code-eliminate the warnings during minification.

None of this is unusual for a design system built on static extraction, but it does mean Braid is not drop-in for a custom webpack or Vite setup. You are adopting a build configuration as much as a component library.

Where Braid Is the Wrong Choice

If your application is not React, Braid does not apply. It is a React component library and its extension points, from BraidProvider to makeLinkComponent, are React concepts.

The sharper limitation is the theme set. Braid is themeable in the sense that a theme object is passed at the provider, and the repository ships themes such as seekJobs and wireframe. Producing a new theme that matches your brand means reproducing the shape of an existing theme object, and the README does not document a theme authoring guide for outside teams. Nothing in the README suggests a supported path for third parties to publish their own themes.

There is also a cost to the runtime assertions if you cannot strip them. In a custom build without unassert, every Braid component that performs invariant checking carries that code into production. The README treats stripping as a recommendation rather than a requirement, but the reasoning it gives is about end user impact, which is a strong hint about what happens when you skip it.

Finally, the documentation is written for people inside SEEK's toolchain. The README's own framing, that a custom build setup needs extra guidance from project contributors, tells you the outside path is not the well-trodden one.

Braid Against Other Organisations' Design Systems

The related searches around Braid are mostly other design systems: ONS, Gov.uk, Duet, Cloudflare, Rise, Bold, Compound. The useful comparison is Gov.uk's design system, because the difference in approach is structural rather than cosmetic. Gov.uk's system is delivered as HTML and CSS patterns with framework-agnostic markup, so a team using Rails, Django or plain templates consumes the same components as a team using a JavaScript framework. Braid is the opposite bet: it is React-first, and its styling is authored in TypeScript through Vanilla Extract with static extraction at build time.

That choice buys type safety at component call sites and atomic CSS output, and it costs you framework portability. Duet and Cloudflare's design system sit closer to Braid in being component libraries for specific stacks, so the comparison question is not which system is better but which stack you are already on. If you are on React with a bundler you control, the field is wide. If you are on sku, Braid is the one that arrives preconfigured.

Maintenance, Releases and the MIT Licence

The repository is not archived, and the most recent push recorded for it is 2026-08-20, the same date as the [email protected] release. Two earlier releases in the same series, 34.6.2 and 34.6.1, landed on 2026-08-12 and 2026-08-03. Release cadence is therefore frequent and versioned on the package itself, with a .changeset directory in the repository root indicating changesets are used to manage versioning and changelogs.

For upgrade cost, the versioning scheme matters more than the cadence. A 34.x line with patch releases every week or two suggests small, frequent updates rather than rare large ones, and the deprecation warnings the README describes exist precisely so that removals are announced before they land. Consuming those warnings in development is how you keep the upgrade path cheap.

The licence is MIT, stated in both the README and the LICENSE file. That permits commercial use and modification, but the README does not discuss trademark rights over the SEEK name or the themes, and it offers no warranty language beyond what MIT provides. If your legal team needs more than a permissive licence grant, the repository does not supply it.

Editorial conclusion

Adopt Braid if you are building a React interface inside SEEK's sku toolchain, or if you are prepared to configure Vanilla Extract and unassert yourself. Do not adopt it if you want a framework-agnostic or bundler-agnostic component library, or if you need a theme other than the ones shipped in braid-design-system/themes. Before committing, verify that your bundler extracts Vanilla Extract styles and strips assert calls, because the README states those steps are handled by sku at SEEK rather than by Braid itself.

Frequently asked questions

How do I install braid-design-system?

The README gives a single command, npm install --save braid-design-system, run inside a sku project. The setup guide notes it is optimised for sku because sku supports Braid out of the box, and that a custom build setup needs extra guidance from project contributors.

Why must the Braid reset be imported first?

The README warns that the reset styles must be imported first to avoid CSS ordering issues, and marks the import line as "Must be first". Importing it later can change how the cascade resolves against Braid's component styles.

Can I make Braid's links use React Router?

Yes. You build a component with makeLinkComponent that renders a React Router link for relative hrefs and a plain anchor otherwise, then pass it to BraidProvider through the linkComponent prop. This changes every Link and TextLink in the tree at once.

What licence does the Braid design system use?

MIT, as stated in the README and in the repository's LICENSE file. The README does not address trademark rights over the SEEK name or the shipped themes.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/seek-oss-braid-design-system.svg)](https://hysenlabs.com/projects/seek-oss-braid-design-system)