Skip to content

Changelog

What shipped in each release.

Releases follow the project’s phases. Every number here comes from a script; the command is next to it.

v0.5 — Agents

In progress

Tools for AI coding agents, and a measurement of whether they help.

  • Renamed: the project is Syntara, and the name changes everywhere it was the project's own (ADR-029). Packages move to the @syntara scope, every custom property is --syntara-* instead of --strata-*, the theme scope writes data-syntara-*, and server-driven UI schema ids are urn:syntara:sdui:v1:*. No token value and no component behaviour changed. There is no codemod for the token prefix yet, so a consumer rewrites imports, token references and attribute selectors by hand.
  • @syntara/audit: the drift auditor. It finds off-system code, suggests a fix for every finding and applies the ones with a single right answer — pnpm drift <path>.
  • @syntara/mcp: a read-only MCP server with seven tools. See MCP server.
  • AGENTS.md: the rules for agents, and what they may change without a person.
  • Brand fidelity: every theme reports how far its brand fill is from the colour the brand asked for. Across 1,000 random brands the primary is kept exactly for 89.2% in light and 80.0% in dark — pnpm test:themes.
  • The agent eval: 25 prompts, 100 runs. With the server, 88% of runs were fully on-system, against 64% without. It didn’t help with type errors. The first attempt was thrown out because of a fault in the harness; both are in the repo.
  • After the eval: find_icon, and imports and typeNotes in get_component. The eval also found that ToggleButtonGroup overflows at 390px, which is a component bug and still open.
  • Server-driven UI: a JSON Schema per component, a validator and a reference renderer for the web (ADR-023). See Server-driven UI. It covers 26 node types; forms, overlays, tables and charts aren’t on the wire yet.
  • Native token files for Compose and SwiftUI, with every contrast pair re-checked on the exported values — pnpm tokens (ADR-025). The Swift files are type-checked against the macOS SDK. The Kotlin files haven’t been compiled.
  • A sixth tenant, Haat, in Hindi, with a Devanagari type pair whose line heights were set by measuring for clipping — node scripts/check-script-clipping.mjs --pairs=bilingual-devanagari (ADR-024). Its Hindi copy is a draft until a Hindi reader has reviewed it.
  • The docs app scores 98.8 on the drift auditor, with 60 findings, and CI fails below 95 — pnpm drift apps/docs.

v0.4 — Governance

In progress

How the system changes, and the first change made that way.

  • GOVERNANCE.md: who decides what, the four outcomes for a request, and the deprecation policy. Deprecated APIs keep working until 1.0.0. See Governance.
  • Requests for comments, with a template. RFC-001 is the first.
  • Deprecated: Button’s variant="danger". Use tone="danger", which also works on outline and ghost buttons (ADR-021). The old prop renders the same and warns once in development.
  • @syntara/codemods: a new package. npx @syntara/codemods button-variant-danger-to-tone <path> rewrites literal usages and reports the ones it can’t be sure of.
  • Deprecations are records in meta.json. Component pages show them, and pnpm check:meta fails if a record names a codemod or RFC that doesn’t exist.
  • The engine now solves success, warning, danger and info text on the canvas and raised surfaces too: 118 contrast checks per brand, up from 102 — pnpm test:themes.

v0.3 — Craft

In progress

The finish pass: motion, depth, our own icons and charts, and an editorial voice.

  • Tactile motion: a damped spring token, press and hover lift, sliding selection, and entrances. Everything respects prefers-reduced-motion (ADR-013).
  • Glass for floating layers, with the opacity solved so text stays 4.5:1 over any backdrop. Rim light and brand glow tokens.
  • @syntara/icons: 235 curvy, minimal icons across 8 groups, drawn to one spec (ADR-014). See Icons.
  • Charts: AreaChart, LineChart, BarChart and Sparkline, keyboard-navigable with a table view. Each brand gets a chart palette that is checked for colour blindness (ADR-016).
  • New components: Sidebar, IconTile, Eyebrow, Amount, Meter, Tag, PersonChip. Card gains feature and inset, Button gains contrast, Badge gains status.
  • Soft-outline fields that still meet WCAG 1.4.11 (ADR-017). Fields and buttons now share heights and radii.
  • An editorial type pair and a paper neutral (ADR-015). Geist is now the house font.
  • A fourth tenant, Care, built from Anuj's KYB web prototype, and new blocks: Benefits overview and Portfolio.
  • The engine checks 102 contrast pairs per brand (focus ring and brand text on selected rows added after the colour page found a 2.97:1 gap), and chart palettes on top — pnpm test:themes.

v0.2 — Components

Shipped

Phase 2.

  • Components built on React Aria Components, styled with CSS Modules and --syntara-* tokens only. Each one has a maturity label.
  • One meta.json per component — props, examples, accessibility, guidelines, tokens — driving these docs (ADR-007).
  • Distribution through npm: @syntara/react builds to ESM with one module per component, 'use client' kept, one styles.css and type declarations (ADR-011).
  • Overlays copy their opener’s theme attributes, so portaled dialogs and popovers keep the tenant, scheme and density; ThemeScope takes a locale that sets React Aria’s locale, lang and dir (ADR-012).
  • The house brand the docs use lives in tenants/house/brand.json.
  • This docs site, themed by the engine, with live previews in every tenant.

v0.1 — Tokens and theme engine

Phase 1.

  • The theme engine: OKLCH ramps, semantic roles for light and dark, and a contrast solver that explains each change in plain English. No runtime dependencies.
  • Exporters for CSS variables, DTCG 2025.10 JSON and Figma variables.
  • Three tenants — Vela, Harbor and Qamar — each one brand.json and one content.json.
  • The Brand Generator: six inputs, a live preview, export.
ResultValueCommand
Random brands fuzzed, light and dark1,000pnpm test:themes
Contrast checks passed78,000 of 78,000pnpm test:themes
Tokens per theme316pnpm tokens