A single source of truth for brand
BrandSpec is an open standard for defining a brand as structured, machine-readable JSON. Tokens, strategy, voice, assets, and purpose — all in one canonical file.
BrandSpec lets any tool — a design system, a website builder, a content platform, or an AI — read and apply a brand consistently, without interpretation.
The problem it solves
Brand guidelines live in PDFs no one reads. Design tokens live in Figma. Strategy lives in decks. Voice lives in someone's head. Every tool rebuilds the same brand from scratch — inconsistently.
BrandSpec puts everything in one place, in a format machines can read directly.
What it replaces
- Static PDF brand guidelines
- Fragmented design token files
- Verbal briefings about tone of voice
- Manual setup in every new tool
- Brand drift across platforms
How it works
ProcessA BrandSpec file is a single .json document. Define it once; consume it everywhere.
-
Define your brand
Create a
brandspec.jsonfile using the open schema. Include colours, typography, logos, voice, strategy, and purpose. You can create and manage this in a compatible tool (like the Whyso platform), or write it by hand. -
Push to your tools
Feed the file into your design tool, website builder, CMS, or AI. BrandSpec-compatible tools read the tokens and apply them directly — no manual setup, no re-entry.
-
Generate outputs
Compile BrandSpec tokens to CSS custom properties, Figma Variables, Tailwind config, or any downstream format. The same definition powers every output.
-
Keep it live
When the brand evolves, update the
brandspec.json. Every connected tool stays in sync. Brand drift becomes a configuration problem, not a communications problem.
For AI tools: BrandSpec gives language models a structured, unambiguous brand brief. Instead of parsing a PDF or being prompted with vague descriptions, an AI receives a machine-readable object it can query directly — colours, tone, values, positioning — and apply with precision.
Schema structure
v0.1.0A BrandSpec document is a JSON object with a root brand key and five top-level sections. All sections are optional at the object level but recommended for complete brand definition.
brand.tokens
Design tokens: colour palette (with HEX, RGB, and CMYK values), typography scales, weights, and roles. The raw material for any visual output.
brand.assets
Logo variants with format, colour mode, dimensions, and hosted URLs. Supports SVG, PNG, and other formats. Primary and secondary logo flags.
brand.voice
Tone descriptors and tagline. Tells any content tool — human or machine — how this brand communicates. Concise and intentionally opinionated.
brand.strategy
The brand's positioning, mission, vision, values, archetype, target audience, and differentiators. Brand strategy as structured data — queryable, not buried in a deck.
brand.purpose
The brand's reason for existing beyond profit. Includes a purpose statement, SDG alignment, and impact metrics with measurement frequency and verification status.
brand.metadata
Administrative fields: brand name, version string, last updated timestamp, and tags. Used for versioning, auditing, and tool compatibility checks.
Colour token fields
| Field | Type | Description | Example |
|---|---|---|---|
| name | string | Human-readable colour name | "Blue" |
| role | string | Semantic role: primary, secondary, neutral, accent | "primary" |
| hex | string | 6-digit hex value with # | "#242f62" |
| rgb | object | RGB channels as integers 0–255 | {r:36, g:47, b:98} |
| cmyk | object | CMYK channels as integers 0–100 | {c:63, m:52, y:0, k:62} |
| primarySpace | string | Authoritative colour space: rgb or cmyk | "rgb" |
Typography token fields
| Field | Type | Description | Example |
|---|---|---|---|
| name | string | Descriptive name for this type style | "Headings" |
| role | string | Semantic role: heading, body, caption, mono | "heading" |
| family | string | Font family name | "Inter" |
| weights | number[] | Numeric font weights used for this role | [600] |
| sizes.recommended | number | Recommended base size in pixels | 36 |
| fontColor | string | Default colour for this type role (hex) | "#c9142e" |
| lineHeight | string | Unitless line height multiplier | "1.5" |
| fallback | string | CSS font stack fallback category | "sans-serif" |
Example file
JSONA minimal but complete BrandSpec document. All fields shown are part of the v0.1.0 schema.
{
"_export": {
"brandName": "Example Brand",
"brandSpecVersion": "0.1.0",
"exportedAt": "2026-01-01T00:00:00.000Z"
},
"brand": {
/* ── Tokens ──────────────────────────────── */
"tokens": {
"colors": [
{
"name": "Primary",
"role": "primary",
"primarySpace": "rgb",
"hex": "#1a1a2e",
"rgb": { "r": 26, "g": 26, "b": 46 },
"cmyk": { "c": 43, "m": 43, "y": 0, "k": 82 }
},
{
"name": "Accent",
"role": "accent",
"primarySpace": "rgb",
"hex": "#e94560",
"rgb": { "r": 233, "g": 69, "b": 96 },
"cmyk": { "c": 0, "m": 70, "y": 59, "k": 9 }
}
],
"typography": [
{
"name": "Headings",
"role": "heading",
"family": "Plus Jakarta Sans",
"weights": [700],
"fontColor": "#1a1a2e",
"lineHeight": "1.2",
"fallback": "sans-serif",
"sizes": { "recommended": 40 }
},
{
"name": "Body",
"role": "body",
"family": "Source Sans Pro",
"weights": [400, 600],
"fontColor": "#333333",
"lineHeight": "1.6",
"fallback": "sans-serif",
"sizes": { "recommended": 18 }
}
]
},
/* ── Voice ───────────────────────────────── */
"voice": {
"tone": ["confident", "clear", "human"],
"tagline": "Your brand's tagline goes here"
},
/* ── Strategy ────────────────────────────── */
"strategy": {
"archetype": "creator",
"brandEssence": ["Honest", "Considered", "Purposeful"],
"mission": "We exist to...",
"vision": "A world where...",
"brandPromise": "What we commit to delivering",
"values": [
{
"name": "Craft",
"description": "We do things properly or not at all.",
"behaviors": ["Precision", "Care", "Quality"]
}
],
"targetAudience": {
"primary": "Describe your primary audience",
"secondary": "Describe your secondary audience"
}
},
/* ── Purpose ─────────────────────────────── */
"purpose": {
"statement": "Why this brand exists beyond profit",
"sdgAlignment": [8, 12],
"metrics": [
{
"name": "Impact Metric",
"unit": "units",
"measurementFrequency": "monthly",
"verificationStatus": "unverified"
}
]
},
/* ── Metadata ────────────────────────────── */
"metadata": {
"name": "Example Brand",
"version": "1.0.0",
"lastUpdated": "2026-01-01T00:00:00.000Z"
}
},
"$schema": "https://brandspec.org/schema/v0.1/brandspec.json",
"version": "0.1.0"
}
Using BrandSpec
OutputBrandSpec tokens are designed to compile to any downstream format. Below are reference patterns for the most common outputs.
CSS custom properties
Map colour and typography tokens directly to CSS variables at the :root level.
/* Generated from brandspec.json → brand.tokens */
:root {
/* Colours */
--color-primary: #1a1a2e;
--color-accent: #e94560;
/* Typography */
--font-heading: 'Plus Jakarta Sans', sans-serif;
--font-heading-weight: 700;
--font-heading-color: #1a1a2e;
--font-heading-size: 40px;
--font-heading-lh: 1.2;
--font-body: 'Source Sans Pro', sans-serif;
--font-body-weight: 400;
--font-body-color: #333333;
--font-body-size: 18px;
--font-body-lh: 1.6;
}
JavaScript consumption
Read a BrandSpec file and extract tokens programmatically.
// Load and parse brandspec.json
const spec = await fetch('/brandspec.json').then(r => r.json());
const { tokens, voice, strategy } = spec.brand;
// Apply colour tokens to CSS variables
tokens.colors.forEach(color => {
document.documentElement.style
.setProperty(`--color-${color.name.toLowerCase()}`, color.hex);
});
// Get tone of voice descriptors
const tone = voice.tone.join(', ');
// → "confident, clear, human"
// Access brand positioning for an AI prompt
const brief = `
Brand: ${spec.brand.metadata.name}
Archetype: ${strategy.archetype}
Tone: ${tone}
Essence: ${strategy.brandEssence.join(', ')}
Mission: ${strategy.mission}
`;
Figma Variables (API push)
BrandSpec colour tokens map directly to Figma Variable collections via the Figma REST API.
// Push BrandSpec colours to a Figma Variable collection
const variables = spec.brand.tokens.colors.map(color => ({
name: `colour/${color.role}/${color.name}`,
resolvedType: 'COLOR',
valuesByMode: {
default: {
r: color.rgb.r / 255,
g: color.rgb.g / 255,
b: color.rgb.b / 255,
a: 1
}
}
}));
// POST to Figma REST API → /v1/files/:key/variables
AI system prompt injection: Pass the entire brand object as structured context in an AI system prompt. The model can then reference colours, voice, values, and positioning without ambiguity — producing on-brand output from day one.
Standards & references
W3CBrandSpec is designed to be standards-aware. Where relevant, it aligns with or extends existing open specifications rather than working against them.
W3C Design Tokens Community Group
The DTCG draft specification defines a standard format for design tokens using $value and $type descriptors. BrandSpec's brand.tokens structure is informed by this work. BrandSpec extends it with brand-specific additions — CMYK colour space support, a primarySpace declaration for print/screen authority, and semantic role assignment — none of which are covered by the DTCG scope.
JSON Schema
The BrandSpec document format is defined using JSON Schema (Draft 2020-12). The $schema field in every BrandSpec file points to the published schema, enabling validation in any compatible tool. Editors such as VS Code will auto-complete and validate a BrandSpec file when the schema URI is present.
UN Sustainable Development Goals
The brand.purpose.sdgAlignment field references the 17 UN SDGs by their official index number. This allows brand purpose claims to be linked to a recognised, auditable international framework rather than remaining as freeform statements.
Schema.org
BrandSpec pages and brand exports can be annotated with Schema.org structured data — Organization, Brand, and TechArticle types are most relevant. This makes brand information legible to search engines and AI crawlers without any additional configuration.
Relationship to DTCG: BrandSpec does not replace or compete with the W3C DTCG format. A future version may support exporting brand.tokens as a DTCG-compliant .tokens.json file, making BrandSpec the upstream source that compiles to the DTCG format for tool consumption.