Skip to content

Our product · open source soon

CDS.

One set of components for web, iOS and Android.

You write the UI once and use it in Next.js, React Native and a Vite SPA, with no Platform.select in your code. This site already runs on CDS.

Next.jsReact NativeVite SPA
call-site.hashlive
b768aa14a346apps/web/app/LoginScreen.tsxNext.js 16 · RSC
b768aa14a346apps/spa/src/routes/LoginRoute.tsxVite SPA
b768aa14a346apps/mobile/App.tsxReact Native 0.87
✓ Identical call site

LoginForm is a 135-line file with no native twin. Only its primitives differ by platform.

Counted74

components, one API on every platform

Measured91%

of what the phone draws is reused unchanged

Counted678

tests after the port to mobile

Counted81

catalog pages, props generated from source

Counted~2,450

lines of checks that fail the build

Counted0

Platform.select in app code

Why it exists

Five problems CDS was built to solve.

We ran into the same five failures on eleven projects, and each one cost money before we started building CDS.

Why it happens · Platform.select and conditional imports let any file branch by platform for free. Neither leaves a trace, and nothing fails as branches multiply.

What CDS does · The platform split happens one layer below the code that calls a component. A theme token resolves per platform, to a CSS variable on web and a value the native resolver fills in, so one color definition serves both.

The principle

We split only what differs by platform.

38 of 74 components have a native twin, which sounds like half the system diverged. It didn’t: 33 of the 38 import no other component. They are leaf components that translate one element, div to View, so nothing above them has to know which platform it is on.

And no pattern has a native twin at all, because CI fails on any change that adds one.

Native twins by layer

primitives/27
overlay/8
form/2
navigation/1
patterns/0 / 26

Enforced conventions

If a rule is broken, the build fails.

  • verify-tokens902Checks token integrity, from the Figma values to every platform.
  • verify-conventions1,056Checks that no pattern has a native twin, that twin exports match and that client boundaries hold.
  • verify-katalog485Runs ten hard checks on the generated catalog.
  • eslint-plugin4 rulesApplies the same rules in the editor as you type, before the hook and CI.

Status

Free and open source at launch.

The repository stays private until the example apps are ready to publish with it. Leave your email and we’ll send one message when it goes public.

We’ll send one email at launch and nothing else.

Before launch

Want the same approach in your product? We also build design systems for clients.

The first call takes 30 minutes, and you’re under no obligation.

Tell us about your projectcontact@microtech.consulting