Skip to main content

Theme Schema

The theme.json file defines your brand's visual identity for slide generation. It is located at .slide-builder/theme.json and is created by the /pitchsmith:setup command.

This reference documents every section and field in the theme schema.

Last verified

March 2026 — verified against pitchsmith-plugin/reference/theme-schema.md in the Pitch Smith source.

Root Structure

{
"name": "string",
"version": "string",
"colors": { },
"typography": { },
"shapes": { },
"components": { },
"slides": { },
"gradients": { },
"workflowRules": { },
"personality": { },
"meta": { },
"brandContext": { }
}
FieldTypeRequiredDescription
namestringYesTheme display name
versionstringYesTheme version identifier
colorsobjectYesColor palette definitions
typographyobjectYesFont and text scale definitions
shapesobjectYesBorder radius, shadow, and border definitions
componentsobjectYesComponent style presets (can be empty {})
slidesobjectNoSlide dimension and layout definitions
gradientsobjectNoNamed gradient definitions
workflowRulesobjectNoWorkflow-specific generation rules
personalityobjectNoBrand personality classification and traits
metaobjectNoExtraction metadata and lock state
brandContextobjectNoUnstructured brand context data

colors

Defines the complete color palette used across all generated slides.

{
"colors": {
"primary": "#1E40AF",
"secondary": "#0D9488",
"accent": "#F59E0B",
"background": {
"default": "#FFFFFF",
"alt": "#F3F4F6",
"dark": "#111827",
"light": "#F9FAFB",
"darkAlt": "#1F2937"
},
"text": {
"heading": "#111827",
"body": "#374151",
"muted": "#6B7280",
"onDark": "#F9FAFB",
"onLight": "#111827",
"onPrimary": "#FFFFFF"
},
"brand": { },
"dataViz": {
"palette": ["#3B82F6", "#10B981", "#F59E0B"],
"positive": "#10B981",
"negative": "#EF4444"
},
"semantic": { }
}
}
FieldTypeRequiredDescription
primaryhex colorYesMain brand color
secondaryhex colorYesSupporting brand color
accenthex colorYesHighlight / CTA color
background.defaulthex colorYesMain background
background.althex colorYesAlternate background
background.darkhex colorNoDark background variant
background.lighthex colorNoLight background variant
background.darkAlthex colorNoAlternate dark background
text.headinghex colorYesHeading text color
text.bodyhex colorYesBody text color
text.mutedhex colorNoSecondary / muted text color
text.onDarkhex colorNoText color for dark backgrounds
text.onLighthex colorNoText color for light backgrounds
text.onPrimaryhex colorNoText color on primary background
brandobjectNoAdditional brand color tokens
dataVizobjectNoChart and graph colors
dataViz.palettearrayNoChart / graph color palette
dataViz.positivehex colorNoPositive indicator color
dataViz.negativehex colorNoNegative indicator color
semanticobjectNoSemantic color tokens (success, warning, error, info)

typography

Defines font families, size scales, weights, and line heights.

{
"typography": {
"fonts": {
"heading": "Inter, system-ui, sans-serif",
"body": "Source Sans Pro, system-ui, sans-serif",
"mono": "JetBrains Mono, monospace"
},
"scale": {
"hero": "72px",
"h1": "48px",
"h2": "36px",
"h3": "28px",
"body": "18px",
"caption": "14px"
},
"weights": {
"light": 300,
"regular": 400,
"semibold": 600,
"bold": 700
},
"lineHeight": {
"tight": 1.2,
"normal": 1.5,
"relaxed": 1.8
}
}
}
FieldTypeRequiredDescription
fonts.headingCSS font-familyYesHeading font stack
fonts.bodyCSS font-familyYesBody font stack
fonts.monoCSS font-familyNoMonospace font stack
scale.heroCSS sizeYesLargest display size
scale.h1CSS sizeYesPrimary heading
scale.h2CSS sizeYesSecondary heading
scale.h3CSS sizeYesTertiary heading
scale.bodyCSS sizeYesBody text
scale.captionCSS sizeYesSmall text / captions
weights.*numberYes (at least one)Font weight values
lineHeightobjectNoLine height scale

shapes

Defines border radius, box shadow, and border style scales.

{
"shapes": {
"borderRadius": {
"none": "0",
"small": "4px",
"medium": "8px",
"large": "16px",
"full": "9999px"
},
"shadow": {
"small": "0 1px 2px rgba(0,0,0,0.05)",
"medium": "0 4px 6px rgba(0,0,0,0.1)",
"large": "0 10px 15px rgba(0,0,0,0.15)"
},
"border": {
"thin": "1px solid #E5E7EB",
"medium": "2px solid #D1D5DB"
}
}
}
FieldTypeRequiredDescription
borderRadiusobjectYes (at least one entry)Border radius scale
borderRadius.nonestringNoNo rounding (typically "0")
borderRadius.smallstringNoSmall rounding
borderRadius.mediumstringNoMedium rounding
borderRadius.largestringNoLarge rounding
borderRadius.fullstringNoFull rounding (circle / pill)
shadowobjectYes (at least one entry)Box shadow scale
shadow.smallstringNoSubtle shadow
shadow.mediumstringNoMedium shadow
shadow.largestringNoProminent shadow
borderobjectYes (at least one entry)Border style scale
border.thinstringNoThin border
border.mediumstringNoMedium border

components

Defines style presets for reusable slide components. This section can be an empty object {} if no component presets are needed.

{
"components": {
"box": {
"default": { "background": "#F3F4F6", "border": "1px solid #E5E7EB", "radius": "8px" },
"outlined": { "background": "transparent", "border": "2px solid #1E40AF", "radius": "8px" },
"callout": { "background": "#EFF6FF", "border": "none", "radius": "12px" }
},
"arrow": {
"default": { "color": "#6B7280", "strokeWidth": "2px" }
},
"button": {
"primary": { "background": "#1E40AF", "color": "#FFFFFF", "radius": "8px" },
"secondary": { "background": "transparent", "color": "#1E40AF", "radius": "8px" }
}
}
}
FieldTypeRequiredDescription
componentsobjectYes (can be {})Component style presets
boxobjectNoBox / container component styles
arrowobjectNoArrow / connector component styles
iconobjectNoIcon component styles
buttonobjectNoButton component styles

Each component type can have multiple named variants (e.g., default, outlined, primary).


slides

Defines slide dimensions and named layout definitions.

{
"slides": {
"dimensions": {
"width": 1920,
"height": 1080,
"aspectRatio": "16:9"
},
"layouts": {
"title": { },
"content": { },
"split": { },
"data": { }
}
}
}
FieldTypeRequiredDescription
slidesobjectNoSlide configuration
dimensionsobjectNoSlide dimensions
dimensions.widthnumberNoSlide width in pixels
dimensions.heightnumberNoSlide height in pixels
dimensions.aspectRatiostringNoDisplay aspect ratio (e.g., "16:9")
layoutsobjectNoNamed layout definitions

gradients

Defines named gradient values that can be referenced in slide generation.

{
"gradients": {
"brandFade": "linear-gradient(135deg, #1E40AF 0%, #0D9488 100%)",
"darkOverlay": "linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.7) 100%)",
"lightAccent": "linear-gradient(90deg, #F3F4F6 0%, #EFF6FF 100%)"
}
}
FieldTypeRequiredDescription
gradientsobjectNoNamed gradient definitions
gradients.*CSS gradientNoAny named gradient value

workflowRules

Defines rules that influence how AI workflows generate slides. These rules provide constraints and preferences for the generation process.

{
"workflowRules": {
"maxBulletsPerSlide": 4,
"preferDarkMode": false,
"defaultTone": "professional",
"alwaysIncludeTagline": true
}
}
FieldTypeRequiredDescription
workflowRulesobjectNoWorkflow-specific generation rules

This is a flexible object. Any key-value pairs are accepted and consumed by workflows during slide generation.


personality

Classifies the brand personality to guide tone and style decisions during slide generation.

{
"personality": {
"classification": "bold",
"traits": ["innovative", "confident", "forward-thinking"],
"guidance": {
"do": ["Use strong action verbs", "Lead with data"],
"dont": ["Avoid passive voice", "Skip generic stock imagery"]
}
}
}
FieldTypeRequiredDescription
personalityobjectNoBrand personality profile
classificationenumNoPrimary personality type: bold, minimal, playful, or corporate
traitsarrayNoDescriptive characteristics
guidance.doarrayNoRecommended design and content approaches
guidance.dontarrayNoApproaches to avoid

meta

Stores metadata about how the theme was created, including extraction sources and confidence levels.

{
"meta": {
"extractedFrom": {
"website": "https://example.com",
"reference": "Brand guidelines PDF"
},
"brandDescription": "Enterprise SaaS platform for customer engagement",
"confidence": 0.85,
"locked": false,
"changeNotes": [
"Initial extraction from website",
"Adjusted typography per user feedback"
]
}
}
FieldTypeRequiredDescription
metaobjectNoTheme extraction metadata
extractedFrom.websiteURLNoSource website used for extraction
extractedFrom.referencestringNoOther source references
brandDescriptionstringNoBrief brand summary
confidencenumber (0-1)NoExtraction confidence score
lockedbooleanNoWhen true, prevents automated modifications
changeNotesarrayNoHistory of changes to the theme

brandContext

Stores unstructured brand context data that informs AI-driven slide generation. This is an open-ended object — any keys and value types are accepted.

{
"brandContext": {
"voice": "Professional but approachable",
"designPhilosophy": "Clean, modern minimalism with strategic accent color use",
"colorUsage": "Primary blue for headlines and CTAs only. Secondary teal for data accents.",
"typographyNotes": "Inter for headings, Source Sans Pro for body text.",
"customInstructions": [
"Always include the company tagline on title slides",
"Limit bullet points to 4 per slide maximum"
]
}
}
FieldTypeRequiredDescription
brandContextobjectNoUnstructured brand context data
voicestringNoBrand voice and tone description
designPhilosophystringNoCore design principles and visual approach
colorUsagestring or objectNoGuidelines for brand color usage
typographyNotesstringNoTypography choices, pairing rationale, and usage guidelines
customInstructionsstring or arrayNoAdditional AI instructions for brand-aware slide generation

The fields listed above are common conventions but are not enforced by the schema. Custom keys are fully supported.

How brandContext is populated: Brand context data is typically generated during the /pitchsmith:setup workflow, where brand assets and user input are analyzed. It can also be manually edited in the theme.json file.

How brandContext is consumed: Slide generation workflows use brand context fields to produce brand-aware content, ensuring consistent voice, color usage, and design alignment across generated presentations.

Complete theme.json example
{
"name": "Acme Corp",
"version": "1.0.0",
"colors": {
"primary": "#1E40AF",
"secondary": "#0D9488",
"accent": "#F59E0B",
"background": {
"default": "#FFFFFF",
"alt": "#F3F4F6",
"dark": "#111827",
"light": "#F9FAFB",
"darkAlt": "#1F2937"
},
"text": {
"heading": "#111827",
"body": "#374151",
"muted": "#6B7280",
"onDark": "#F9FAFB",
"onPrimary": "#FFFFFF"
}
},
"typography": {
"fonts": {
"heading": "Inter, system-ui, sans-serif",
"body": "Source Sans Pro, system-ui, sans-serif"
},
"scale": {
"hero": "72px",
"h1": "48px",
"h2": "36px",
"h3": "28px",
"body": "18px",
"caption": "14px"
},
"weights": {
"regular": 400,
"semibold": 600,
"bold": 700
}
},
"shapes": {
"borderRadius": {
"small": "4px",
"medium": "8px",
"large": "16px"
},
"shadow": {
"small": "0 1px 2px rgba(0,0,0,0.05)",
"medium": "0 4px 6px rgba(0,0,0,0.1)"
},
"border": {
"thin": "1px solid #E5E7EB"
}
},
"components": {},
"personality": {
"classification": "corporate",
"traits": ["professional", "trustworthy", "modern"],
"guidance": {
"do": ["Use data to support claims", "Maintain visual hierarchy"],
"dont": ["Avoid overly casual language", "Skip decorative elements"]
}
},
"brandContext": {
"voice": "Professional but approachable. Use active voice.",
"designPhilosophy": "Clean minimalism with strategic use of brand blue."
}
}