Calibrate is Measured’s brand design system for digital experiences, a reference implementation for our design systems practice, and a testbed for new approaches.
This is a pnpm monorepo with lockstep versioning across publishable and private packages.
| Package | Path | Public | Description |
|---|---|---|---|
@measured/calibrate-adapter |
packages/adapter |
no | Codegen for framework adapters (drives react's wrapper generation). |
@measured/calibrate-assets |
packages/assets |
yes | Runtime assets for Calibrate. Fonts and favicons consumed by sites and apps building on the system. |
@measured/calibrate-config |
packages/config |
yes | Shared developer-tooling config (ESLint, Stylelint, Prettier, browserslist) plus editor IntelliSense lookup. |
@measured/calibrate-core |
packages/core |
yes | SSR-first component library. Native HTML output via custom elements, with a co-located CSS contract. |
@measured/calibrate-markdown |
packages/markdown |
yes | Opinionated GFM markdown → safe HTML utility. Pairs with core's prose component (loose coupling via GFM's element set). |
@measured/calibrate-react |
packages/react |
yes | React adapter — typed wrappers over the core custom-element library. |
@measured/calibrate-skills |
packages/skills |
yes | Markdown guardrails for AI coding agents (and humans) building sites and apps with Calibrate. |
@measured/calibrate-system |
packages/system |
no | Token authoring + resolver/build pipeline. Outputs feed core's CSS. Internal — consumers use @measured/calibrate-core. |
@measured/calibrate-tokens |
packages/tokens |
yes | Calibrate tokens as data: DTCG-shaped JSON artifacts and JSON Schema. For docs sites, MCP, agents, and downstream tooling. |
| App | Path | Description |
|---|---|---|
| Documentation | apps/documentation |
Public docs site, dogfooded with core and markdown. |
| Playground | apps/playground |
Real-browser harness for the React adapter. |
| Storybook | apps/storybook |
Component dev and a11y harness. |
pnpm installCommon scripts (root, delegating via workspace filters):
pnpm config:verifypnpm core:build/pnpm core:test/pnpm core:typecheckpnpm format/pnpm format:checkpnpm lint/pnpm lint:fixpnpm markdown:build/pnpm markdown:test/pnpm markdown:typecheckpnpm playground/pnpm playground:build/pnpm playground:typecheckpnpm react:build/pnpm react:test/pnpm react:typecheck/pnpm react:generatepnpm storybook/pnpm storybook:build/pnpm storybook:testpnpm stylelint/pnpm stylelint:fixpnpm system:build/pnpm system:validate/pnpm system:verifypnpm tokens:validate/pnpm tokens:verify
- Conventional Commits enforced on PR titles via
.github/workflows/pr-title.yml. Squash-merge means the PR title becomes the commit subject onmain, so this is the canonical validation surface. - Required commit scopes:
adapter,assets,config,core,markdown,react,skills,system,tokens,repo(apps and root config userepo), plusdeps/deps-devfor Dependabot PRs. - Pre-commit auto-formatting via Husky +
lint-staged: prettier runs on staged files before each commit, no opt-in. - Changesets required when a PR touches
packages/{assets,config,core,markdown,react,skills,tokens}/src/**. Runpnpm changesetper consumer-visible change.
Releases are driven by changesets with fixed lockstep across all workspace packages. Authors add changeset files via pnpm changeset per PR. The bot accumulates them on main and opens a persistent "Version Packages" PR aggregating queued changesets. Merging that PR triggers npm publish via Trusted Publishing (OIDC + provenance, no long-lived token in the repo).
The bot-opened Version Packages PR hits GitHub Actions' infinite-loop suppression: PRs created using the default GITHUB_TOKEN don't trigger downstream workflows, so required status checks sit at "Expected — Waiting for status to be reported" indefinitely. Unblock with a close + reopen from your account:
gh pr close <number> && gh pr reopen <number>That re-emits the pull_request events as you (not the bot), and CI fires normally. Merge once green.