tasteHQ specification · v2.0.0

Grammar v2 the design taste specification

A 30-axis open standard for measuring design taste. Forkable. Citable. Built so any LLM, design tool, or brand team can speak the same language about visual decisions.

Version
v2.0.0
Released
2026-05-17
Status
Stable
Schema
grammar-v2.json
Axes
30 across 8 categories
License
CC BY 4.0

§Abstract

Grammar v2 is an open specification that decomposes brand design taste into 30 named axes across surface, palette, typography, emphasis, whitespace, voice, motion, and imagery.

It exists so that arguments about design — usually subjective, frequently circular — can be grounded in a shared vocabulary that machines and humans both speak. Every axis has an enumerated value set, a scoring scale (ordinal or nominal), and a documented extraction method. A brand, a generated webpage, or an LLM‑authored mockup can each be expressed as a vector over these 30 axes and compared point‑by‑point.

The intended audience is threefold: agents and LLMs that need a stable target schema for design output; design tools (linters, generators, brand systems) that want to declare conformance; and brand teams that need a portable, version‑pinned definition of their visual identity. If OpenAPI describes the shape of HTTP, Grammar v2 describes the shape of taste.

§Status & versioning

This document specifies grammar-v2.0.0, released 2026-05-17. The canonical machine-readable form lives at /schema/grammar-v2.json.

Semver policy

Implementations must pin to a specific major.minor in audit blocks. Computed weights and per-axis convergence priors are versioned separately in /api/weights.json.

§Conformance levels

A tool, brand, or service may declare conformance at one of four levels. Higher levels include everything from the levels below.

  1. L0
    Declarative
    Tool or brand references Grammar v2 by URL. No machine-checkable claim about output — just a stated commitment to the vocabulary.
  2. L1
    Producer
    Emits axis vectors that pass JSON Schema validation against grammar-v2.json. Values are syntactically valid; semantic accuracy not yet verified.
  3. L2
    Producer + Validated
    Vectors are verified against a hand-graded reference set (the Golden Set). Inter-axis agreement above the published threshold.
  4. L3
    Reference tier
    Hand-graded by maintainers. Anchors the calibration chain — all L2 implementations are evaluated against L3 vectors.

§The 30 axes

Each axis is identified by a dotted key (category.name), an enumerated value set, and a scale type. Distance scoring for ordinal axes uses c = clip(1 − |b − o| / (max − 1), 0, 1); nominal axes use binary match until a proximity matrix is published. Every row below is individually addressable via #axis-<key>.

surface 6 axes — ground, radius, borders, shadows, texture, dark mode
Key Label Scale Extraction Values Example
surface.ground Page ground nominal deterministic whitecreamgray-lightgray-darkblackwarm-tintedcool-tinted anthropic · cream
surface.radius Corner radius ordinal deterministic 0px4-6px8-10px12-16pxpill stripe · 4-6px
surface.borders Border philosophy ordinal deterministic nonehairlinemediumheavy linear · hairline
surface.shadows Shadow / elevation ordinal deterministic nonesubtlelayereddramatic stripe · subtle
surface.texture Surface texture nominal model_graded flatgraingradientmeshphoto stripe · mesh
surface.dark_mode Dark mode handling nominal deterministic nonesystem-adaptiveinversioncustom-palettedark-first linear · dark-first
palette 5 axes — strategy, saturation, warmth, accent use, contrast
KeyLabelScaleExtractionValuesExample
palette.strategy Color strategy ordinal deterministic monomono+1duotonetriadicfull-spectrum stripe · full-spectrum
palette.saturation Accent saturation ordinal deterministic desaturatedmutedbalancedvividneon antimetal · neon
palette.warmth Color temperature nominal deterministic coolneutralwarmmixed anthropic · warm
palette.accent_use Accent frequency ordinal deterministic rare-signalrecurringpervasive stripe · pervasive
palette.contrast Text contrast ordinal deterministic lowmediumhighextreme acne-studios · extreme
type 5 axes — pairing, heading weight, body size, display scale, tracking
KeyLabelScaleExtractionValuesExample
type.pairing Typeface pairing nominal mixed serif/sanssans/sanssans/monoserif/grotesquegrotesque/monosingle-family anthropic · serif/sans
type.heading_weight Display heading weight ordinal deterministic ultralightlightregularmediumboldblack anthropic · light
type.body_size Body text size ordinal deterministic smallregularlarge acne-studios · large
type.display_scale Display-to-body scale ordinal deterministic compactbalancedoversized acne-studios · oversized
type.tracking Display tracking ordinal deterministic negativetightnormalloose anthropic · negative
emphasis 3 axes — mechanism, CTA treatment, density signals
KeyLabelScaleExtractionValuesExample
emphasis.mechanism Emphasis device nominal model_graded weightcolorunderlinescalespacing stripe · color
emphasis.cta_treatment Primary CTA treatment ordinal mixed underline-onlytext-linkoutlinedfilled-solidfilled-gradient stripe · filled-gradient
emphasis.density_signals Section density signals nominal model_graded dividerswhitespacebordersgrouping-cards apple · whitespace
whitespace 3 axes — discipline, section gap, element gap
KeyLabelScaleExtractionValuesExample
whitespace.discipline Whitespace generosity ordinal mixed densemediumgenerousextreme acne-studios · extreme
whitespace.section_gap Section gap ordinal deterministic compactbalancedgrand apple · grand
whitespace.element_gap Element gap ordinal deterministic tightmediumairy acne-studios · airy
voice 4 axes — archetype, formality, hedging, sentence length
KeyLabelScaleExtractionValuesExample
voice.archetype Voice archetype nominal model_graded librarianengineerartistfriendconciergecuratorchallengergeneric linear · engineer
voice.formality Voice formality ordinal mixed casualconversationalprofessionalformal mercury · professional
voice.hedging Hedging frequency ordinal deterministic nonelowmediumhigh linear · none
voice.sentence_length Sentence length ordinal deterministic tersebalancedflowing linear · terse
motion 3 axes — budget, character, trigger
KeyLabelScaleExtractionValuesExample
motion.budget Motion budget ordinal deterministic noneaccentrecurringpervasive stripe · pervasive
motion.character Motion character nominal model_graded mechanicalsmoothplayfulcinematic phantom-studios · cinematic
motion.trigger Motion trigger nominal model_graded hover-onlyscrollautonomousgesture stripe · autonomous
imagery 1 axis — strategy
KeyLabelScaleExtractionValuesExample
imagery.strategy Imagery strategy nominal model_graded nonephotographicillustrationabstractmixed duolingo · illustration

§JSON shape

Every brand entry under /api/styles/<brand>.json includes a grammar field — a complete 30-axis vector keyed by category. Below is the verbatim shape from Stripe’s entry (an L3 reference-tier brand).

"grammar": {
  "surface": {
    "ground":    "white",
    "radius":    "4-6px",
    "borders":   "hairline",
    "shadows":   "subtle",
    "texture":   "mesh",
    "dark_mode": "none"
  },
  "palette": {
    "strategy":   "full-spectrum",
    "saturation": "balanced",
    "warmth":     "mixed",
    "accent_use": "pervasive",
    "contrast":   "high"
  },
  "type": {
    "pairing":        "sans/sans",
    "heading_weight": "medium",
    "body_size":      "regular",
    "display_scale":  "balanced",
    "tracking":       "normal"
  },
  "emphasis": {
    "mechanism":       "color",
    "cta_treatment":   "filled-gradient",
    "density_signals": "grouping-cards"
  },
  "whitespace": {
    "discipline":  "medium",
    "section_gap": "balanced",
    "element_gap": "medium"
  },
  "voice": {
    "archetype":       "engineer",
    "formality":       "conversational",
    "hedging":         "low",
    "sentence_length": "balanced"
  },
  "motion": {
    "budget":    "pervasive",
    "character": "smooth",
    "trigger":   "autonomous"
  },
  "imagery": {
    "strategy": "abstract"
  }
}

Live: /api/styles/stripe.json · Validation schema: brand-style-v2.json

§“Speak Grammar v2” badge

If your tool, brand site, or LLM output emits valid Grammar v2 vectors, you may display this badge. It is a single inline SVG with no external dependencies.

Speaks Grammar v2.0 grammar v2.0 160 × 28 · inline SVG · no dependencies
Markdown
[![Speaks Grammar v2.0](
  https://tastehq.dev/badge/grammar-v2.svg
)](https://tastehq.dev/spec)
HTML
<a href="https://tastehq.dev/spec">
  <img src="https://tastehq.dev/badge/grammar-v2.svg"
       alt="Speaks Grammar v2.0" height="28">
</a>

§Implementations

Reference implementations maintained alongside the spec. All speak Grammar v2 natively.