Self-hosted service
porsche-design-system/porsche-design-system avatar
porsche-design-system/porsche-design-system

Inside the Porsche Design System monorepo, from crest assets to React and Vue wrappers

The official Porsche Design System repository, offering fundamental UXI guidelines and a library of reusable web components to enable designers and developers to build consistent, intuitive, and high-quality digital products that reflect the Porsche brand.

671 stars62 forksTypeScriptNOASSERTION

At a glance

What is it?
The Porsche Design System is a TypeScript monorepo holding design tokens, web components, framework wrappers and asset packages for Porsche-branded web products. It is a serious toolchain with a heavy setup cost, and the root package is marked UNLICENSED with a custom LICENSE file, which is the first thing to check before adopting it.
Who is it for?
Porsche Design System is a good fit for an agency or product team that must ship Porsche-branded interfaces and wants the tokens, components and wrappers to come from one source, and a poor fit for a small team that only needs a few buttons, since the setup assumes Node 24 through Volta, a Playwright container and an IDE configured for Prettier and Biome.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 1 day 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 October 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A brand toolkit split into tokens, components and guidelines

The Porsche Design System is the official repository for building Porsche web applications, and it presents itself as an all-in-one toolkit rather than a component drop. The three parts are design tokens, a library of reusable web components, and the UXI guidelines that explain how those pieces are meant to be used.

That combination matters for how it fits an organisation. A component library on its own gives you buttons and inputs but leaves spacing, colour and typography decisions open. Guidelines on their own describe a system without shipping the code. Here both live in the same repository, and the tokens are the layer that connects them.

The primary language is TypeScript and the project is organised as a monorepo of npm workspaces under packages/. The site is designsystem.porsche.com, and the repository author is Dr. Ing. h.c. F. Porsche AG. Releases move in small increments: v4.8.0 on 2026-10-02, v4.7.0 on 2026-09-09 and v4.6.0 on 2026-08-20, so the published packages are versioned independently from the monorepo root, which itself carries version 0.0.0 and the private flag.

Workspaces for assets, tokens, styles and framework wrappers

The workspace list in the root package.json describes the architecture more honestly than any documentation would.

There is an assets group with separate projects for crest, flags, fonts, font-face, icons, marque, meta-icons and model-signatures. Those are brand artifacts rather than interface code, and giving each one its own workspace means a consumer can depend on the crest alone without pulling in the whole icon set. A tokens group holds tokens-meta, and a styles group carries four parallel implementations of the styling layer: tailwindcss, scss, emotion and vanilla-extract.

The framework wrappers are the part a consumer actually installs. There is a components-js tree with a components-manager-cli, a components-manager-core, a jsdom-polyfill and partials, and separate dist folders for angular, react and vue wrappers. The react workspace goes further, with projects for nextjs, react-ssr-wrapper and react-router, and there is a utilities workspace with an ag-grid project and a storefront workspace with skills and stackblitz projects for angular and react.

The stackblitz projects are worth pausing on. They are browser-based sandboxes, so someone evaluating the components can open a running example without a local toolchain. The cost of that convenience sits in the rest of the repository, which is a heavy build with a containerised test setup.

Volta, Node 24 and a two step npm bootstrap

The documented setup starts with version management. Volta is recommended for pinning Node.js and npm, and the installation is a single command on Unix systems including macOS:

bash
# On most Unix systems including macOS, you can install with a single command:
curl https://get.volta.sh | bash

With Volta in place, the Node version is installed and verified:

bash
volta install node@24
# Verify the Node.js version:
node -v

Volta then picks up the correct Node.js version from ./package.json automatically, which is the point of using it: contributors do not have to agree on a Node version by hand.

Installation of the project itself is two commands, one to install the npm packages and one to build the internal npm packages:

bash
npm install
bash
npm run build

That second step matters. This is a monorepo of published packages, and the build step produces the artefacts that consumers install, so skipping it produces a checkout that neither runs nor packages correctly.

Editor configuration is part of setup too, with the instructions written for WebStorm. Prettier is configured for markdown files with automatic formatting on save, and Biome is installed as a plugin and configured for a long list of extensions covering Astro, CSS, GraphQL, JavaScript, JSON, Svelte, HTML, TypeScript and Vue.

Docker is not optional for the visual regression suite

Docker is described as optional but recommended for test automation, on the grounds that it ensures consistent results across different machines. The documentation singles out visual regression testing as the case where that consistency matters most, and the container image behind it is Playwright:

yaml
services:
  design-system:
    image: mcr.microsoft.com/playwright:v1.63.0-jammy
    working_dir: /opt/repository
    user: "${RUN_UID}:${RUN_GID}"
    ports:
      - "3000:3000"
      - "3001:3001"

Two details in that service definition show how seriously the reproducibility concern is taken. The container runs as the host user rather than as root, mapped through RUN_UID and RUN_GID environment values, so files written into the mounted volume keep your ownership. And a separate named volume holds node_modules, so the installed dependency tree is not shadowed by the host's.

The port list is long. The compose file publishes 3000, 3001, 3010, 3011, 3012, 3333, 3334, 4200, 8080 and 8575, which is what you would expect from a repository that runs several storefront and component demos side by side. The memory setting is explicit too, with NODE_OPTIONS set to --max-old-space-size=5120, a hint that the build and the test tooling are hungry.

Every command also runs through docker.sh

The commands for developing, building and testing are listed in the scripts section of the root package.json, and the documentation shows a few of them: npm run build, npm run test:e2e:components-js and npm run test:vrt:components-js. The naming is readable. The e2e script drives components in a browser, and the vrt script is the visual regression run.

The same commands can be executed inside a Docker container through the docker.sh wrapper, for example ./docker.sh npm run build or ./docker.sh npm run test:vrt:components-js. That is the mechanism behind the recommendation to use Docker: it is not a separate test environment with different commands, it is the same command list routed through a container.

The repository is built around automated checks. A GitHub Actions workflow badge sits at the top of the project page, and the tree contains a .github directory, a test directory, and a scripts directory. There are also .ort.yml for the OSS Review Toolkit and .syncpackrc.json, which is the configuration for keeping dependency versions consistent across workspaces, a problem that is easy to hit in a monorepo of this size.

There is an AGENTS.md file at the root as well. Combined with .cursor and the context7.json entry, it suggests the repository is set up for coding agents as well as humans, which is a reasonable signal about how the project expects contributions to be made.

An UNLICENSED root package with a custom licence file

The licensing situation needs attention before anything else, because it is unusual.

The root package.json declares the repository private, sets version to 0.0.0, and states the license as UNLICENSED. The repository also ships a LICENSE.md file, an OSS_NOTICE file, a patches directory, a SECURITY.md file and a directory of licence texts under licenses/. GitHub itself cannot classify the licence as one of the standard types, which means the terms are custom and written in the licence file rather than expressed as a standard open source licence.

The practical consequence is that the code is available to read and to work with under terms you have to read for yourself, and the distinction between the monorepo and the published packages matters. UNLICENSED on a private root package is normal practice for a repository that is not itself distributed, while the separately published components are the artifacts a consumer installs. What that means for redistribution, and what obligations attach to the individual packages, cannot be answered from the metadata alone.

The OSS_NOTICE file and the .ort.yml configuration indicate attention to third party attribution and automated licence scanning, which is a good sign about intent. It is not the same as a standard licence, and any adoption decision that depends on clear redistribution rights has to start by reading LICENSE.md rather than the badge on the repository page.

Frequent releases, and a setup cost that dominates small projects

The maintenance signal is strong on the release side. Three tagged releases in three months, v4.6.0 on 2026-08-20, v4.7.0 on 2026-09-09 and v4.8.0 on 2026-10-02, and the last push on 2026-10-20. Whatever else is true about the project, it is being shipped.

The cost sits in the setup rather than in the maintenance. To contribute you need Volta, Node 24, an npm install that covers every workspace in the monorepo, a build of the internal packages, and a Playwright container with ten published ports for the test and demo tooling. The IDE configuration steps for Prettier and Biome are also spelled out, which suggests that formatting differences are a recurring source of friction.

That effort is justified for a team that has to produce Porsche-branded interfaces and wants the brand assets, the tokens and the components to come from the same source. It is not justified for a project that needs one button. The workspaces are granular enough to install a single asset package, but the documented path in the README is the full monorepo bootstrap, and the framework wrappers plus the storefront stackblitz projects are only reachable through that same tree.

Editorial conclusion

Porsche Design System is a good fit for an agency or product team that must ship Porsche-branded interfaces and wants the tokens, components and wrappers to come from one source, and a poor fit for a small team that only needs a few buttons, since the setup assumes Node 24 through Volta, a Playwright container and an IDE configured for Prettier and Biome. Before adopting it, read LICENSE.md and OSS_NOTICE to establish what you may redistribute, because the root package.json declares the monorepo private with the licence set to UNLICENSED.

Frequently asked questions

What is included in the Porsche Design System repository?

The repository holds design tokens, a library of reusable web components and the UXI guidelines, organised as npm workspaces covering brand assets, tokens, style implementations, framework wrappers for React, Angular and Vue, and storefront demos.

How do I set up the Porsche Design System locally?

Install Volta, then install Node 24 with volta install node@24, run npm install to fetch the packages and npm run build to build the internal npm packages. Docker is optional but recommended for test automation and visual regression testing.

Can I run the Porsche Design System tests without Docker?

Yes, the scripts section of the root package.json lists commands such as npm run test:e2e:components-js and npm run test:vrt:components-js that can be run directly. The same commands can be routed through the docker.sh wrapper for a consistent environment.

What licence does the Porsche Design System use?

The root package.json marks the monorepo private with the licence set to UNLICENSED, and the repository ships a LICENSE.md file plus an OSS_NOTICE file. The terms are custom, so they have to be read in the licence file rather than inferred from a standard licence identifier.

Which frameworks does the Porsche Design System support?

The workspace list includes wrapper packages for React, Angular and Vue, with additional React projects for nextjs, react-ssr-wrapper and react-router, alongside a plain web components package under components-js.

Official sources

  1. Issues
  2. porsche-design-system/porsche-design-system on GitHub
  3. Project website
  4. README
  5. Releases
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/porsche-design-system-porsche-design-system.svg)](https://hysenlabs.com/projects/porsche-design-system-porsche-design-system)

Was this useful?