Brand operations

13 operations named brand.*. Every one runs in a batch through apply_ops, dry_run_ops, the CLI or the admin.

Updated
OperationWhat it doesPermissionConfirmation
brand.setupSet the site's brand from three colours, a type pairing, a type ratio and base size, a spacing unit and a corner style: the server derives every token write of the brand (the brand, accent and neutral palette ramps, the light and dark colour roles as aliases of palette steps, the font sizes and families, the main type presets, the space steps and the radii) and lands them as one designSystem.setTokens change, gated once for AA contrast on the end state, so one undo restores the lot.designSystem.operationnone
brand.presetsbrand.presets with brand validation and transactional history.site.adminnone
brand.templatesbrand.templates with brand validation and transactional history.site.adminnone
brand.updateIdentitybrand.updateIdentity with brand validation and transactional history.site.adminnone
brand.createPresetbrand.createPreset with brand validation and transactional history.site.adminnone
brand.renamePresetbrand.renamePreset with brand validation and transactional history.site.adminnone
brand.deletePresetbrand.deletePreset with brand validation and transactional history.site.admindestructive
brand.createTemplatebrand.createTemplate with brand validation and transactional history.site.adminnone
brand.updateTemplatebrand.updateTemplate with brand validation and transactional history.site.adminnone
brand.deleteTemplatebrand.deleteTemplate with brand validation and transactional history.site.admindestructive
brand.rebuildTemplatebrand.rebuildTemplate with brand validation and transactional history.site.adminnone
brand.renderbrand.render from an approved, curated template through a standalone render boundary.brand.generatenone
brand.savebrand.save from an approved, curated template through a standalone render boundary.brand.generatenone

brand.setup

Set the site's brand from three colours, a type pairing, a type ratio and base size, a spacing unit and a corner style: the server derives every token write of the brand (the brand, accent and neutral palette ramps, the light and dark colour roles as aliases of palette steps, the font sizes and families, the main type presets, the space steps and the radii) and lands them as one designSystem.setTokens change, gated once for AA contrast on the end state, so one undo restores the lot. A brand with pairs below AA is refused unless the input carries acknowledgeContrast: true, the designer's explicit "save anyway", which the stored batch keeps; then the failing pairs come back as error findings. The admin's Brand setup screen runs this same operation.

permission: designSystem.operationwrites: designSystemclass: transactionundo: yes

Example input

{
  "primary": "#1e3d4f",
  "secondary": "#c8553d",
  "neutral": "#737373",
  "headingFamily": [
    "DM Sans",
    "sans-serif"
  ],
  "bodyFamily": [
    "DM Sans",
    "sans-serif"
  ],
  "typeRatio": 1.25,
  "baseSize": 17,
  "spaceBase": 4,
  "radius": "soft"
}

Input

FieldTypeRequiredNotes
primarystringyes
secondarystringyes
neutralstringyes
headingFamilyarray of stringyesAt least 1 item.
bodyFamilyarray of stringyesAt least 1 item.
typeRationumberyesOne of 1.125, 1.2, 1.25, 1.333.
baseSizeintegeryesAt least 14. At most 22.
spaceBasenumberyesOne of 4, 8.
radiusstringyesOne of "sharp", "soft", "round", "pill".
acknowledgeContrasttrueno

Output

FieldTypeRequiredNotes
treeobjectno
tree.pageIdstringyes
tree.revisionintegeryes
tree.inversearray of object | object | object | object | object | object | object | object | object | object | object | object | objectyes
findingsarray of object | object | object | object | objectyes
diffarray of object | object | object | object | object | objectyes
changesarray of objectno
changes[].changestringyesOne of "added", "changed", "removed".
changes[].overrideobject | object | object | object | object | objectyes
changedbooleanyes
revisionintegeryes
dryRunbooleanyes
cssstring | nullyes
reportobjectno
report.addsarray of objectyes
report.changesarray of objectyes
report.typeConflictsarray of objectyes
report.unknownNamesarray of objectyes

Fields nested deeper are in the output schema that discover_operations answers with outputSchemas: true.

Try it

yarn splash brand.setup '{"primary":"#1e3d4f","secondary":"#c8553d","neutral":"#737373","headingFamily":["DM Sans","sans-serif"],"bodyFamily":["DM Sans","sans-serif"],"typeRatio":1.25,"baseSize":17,"spaceBase":4,"radius":"soft"}' --dry-run

brand.presets

brand.presets with brand validation and transactional history.

permission: site.adminreads onlyclass: read

Example input

{}

Input

The input is a record; see the schema below.

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output

FieldTypeRequiredNotes
presetsarray of objectyes
presets[].presetIdstringyes
presets[].presetNamestringyes
presets[].updatedAtstringyes

Try it

yarn splash brand.presets '{}' --dry-run

brand.templates

brand.templates with brand validation and transactional history.

permission: site.adminreads onlyclass: read

Example input

{}

Input

The input is a record; see the schema below.

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output

FieldTypeRequiredNotes
templatesarray of objectyes
templates[].idstringyesAt least 1 character.
templates[].namestringyes
templates[].pageIdstringyesAt least 1 character.
templates[].snapshotobject | nullyesDefault null.
templates[].customerSettingsrecord of array of string | nullyesDefault null.
templates[].statusstringyesOne of "draft", "approved".
templates[].versionnumberyes
templates[].widthnumberyes
templates[].heightnumberyes
templates[].createdAtstringyes
templates[].updatedAtstringyes

Try it

yarn splash brand.templates '{}' --dry-run

brand.updateIdentity

brand.updateIdentity with brand validation and transactional history.

permission: site.adminwrites: brandclass: transactionundo: yes

Example input

{
  "identity": {
    "brandName": "Studio",
    "tagline": "Architecture and landscape"
  }
}

Input

FieldTypeRequiredNotes
presetIdstringnoAt least 1 character.
identityobjectyes
identity.brandNamestringno
identity.taglinestringno
identity.logoPrimarystring | nullno
identity.logoInversestring | nullno
identity.logoMarkstring | nullno
identity.brandPrimarystringno
identity.brandSecondarystringno
identity.brandSurfacestringno
identity.brandOnSurfacestringno
identity.headlineRolestringno
identity.bodyRolestringno
identity.toneWordsstringno
identity.doRulesstringno
identity.dontRulesstringno

Output

FieldTypeRequiredNotes
identityobjectyes
identity.brandNamestringyes
identity.taglinestringyes
identity.logoPrimarystring | nullyes
identity.logoInversestring | nullyes
identity.logoMarkstring | nullyes
identity.brandPrimarystringyes
identity.brandSecondarystringyes
identity.brandSurfacestringyes
identity.brandOnSurfacestringyes
identity.headlineRolestringyes
identity.bodyRolestringyes
identity.toneWordsstringyes
identity.doRulesstringyes
identity.dontRulesstringyes

Try it

yarn splash brand.updateIdentity '{"identity":{"brandName":"Studio","tagline":"Architecture and landscape"}}' --dry-run

brand.createPreset

brand.createPreset with brand validation and transactional history.

permission: site.adminwrites: brandclass: transactionundo: yes

Example input

{
  "presetName": "Autumn campaign"
}

Input

FieldTypeRequiredNotes
presetNamestringyesAt least 1 character. At most 120 characters.
cloneFromstringnoAt least 1 character.

Output

FieldTypeRequiredNotes
presetIdstringyes
presetNamestringyes
updatedAtstringyes

Try it

yarn splash brand.createPreset '{"presetName":"Autumn campaign"}' --dry-run

brand.renamePreset

brand.renamePreset with brand validation and transactional history.

permission: site.adminwrites: brandclass: transactionundo: yes

Example input

{
  "presetId": "autumn-campaign",
  "presetName": "Autumn campaign 2026"
}

Input

FieldTypeRequiredNotes
presetIdstringyesAt least 1 character.
presetNamestringyesAt least 1 character. At most 120 characters.

Output

FieldTypeRequiredNotes
presetIdstringyes
presetNamestringyes
updatedAtstringyes

Try it

yarn splash brand.renamePreset '{"presetId":"autumn-campaign","presetName":"Autumn campaign 2026"}' --dry-run

brand.deletePreset

brand.deletePreset with brand validation and transactional history.

permission: site.adminwrites: brandclass: transactionconfirm: destructiveundo: yes

Example input

{
  "presetId": "autumn-campaign"
}

Input

FieldTypeRequiredNotes
presetIdstringyesAt least 1 character.

Output

FieldTypeRequiredNotes
status"deleted"yes

Needs confirmed: ["destructive"] on the batch, which the single-operation CLI form does not set: put it in a batch file and run yarn splash apply <file> --dry-run.

brand.createTemplate

brand.createTemplate with brand validation and transactional history.

permission: site.adminwrites: brand, pagesclass: transactionundo: yes

Example input

{
  "name": "Instagram post",
  "width": 1080,
  "height": 1080
}

Input

FieldTypeRequiredNotes
namestringyesAt least 1 character. At most 120 characters.
widthintegeryesAt least 16. At most 4096.
heightintegeryesAt least 16. At most 4096.
layoutIdstringnoAt least 1 character.

Output

FieldTypeRequiredNotes
idstringyesAt least 1 character.
namestringyes
pageIdstringyesAt least 1 character.
snapshotobject | nullyesDefault null.
customerSettingsrecord of array of string | nullyesDefault null.
statusstringyesOne of "draft", "approved".
versionnumberyes
widthnumberyes
heightnumberyes
createdAtstringyes
updatedAtstringyes

Try it

yarn splash brand.createTemplate '{"name":"Instagram post","width":1080,"height":1080}' --dry-run

brand.updateTemplate

brand.updateTemplate with brand validation and transactional history.

permission: site.adminwrites: brand, pagesclass: transactionundo: yes

Example input

{
  "templateId": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b",
  "patch": {
    "name": "Instagram post, square"
  }
}

Input

FieldTypeRequiredNotes
templateIdstringyesAt least 1 character.
patchobjectyes
patch.namestringnoAt most 120 characters.
patch.statusstringnoOne of "draft", "approved".
patch.customerSettingsrecord of array of string | nullno
patch.expectedDraftRevisionstringno

Output

FieldTypeRequiredNotes
idstringyesAt least 1 character.
namestringyes
pageIdstringyesAt least 1 character.
snapshotobject | nullyesDefault null.
customerSettingsrecord of array of string | nullyesDefault null.
statusstringyesOne of "draft", "approved".
versionnumberyes
widthnumberyes
heightnumberyes
createdAtstringyes
updatedAtstringyes

Try it

yarn splash brand.updateTemplate '{"templateId":"4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b","patch":{"name":"Instagram post, square"}}' --dry-run

brand.deleteTemplate

brand.deleteTemplate with brand validation and transactional history.

permission: site.adminwrites: brand, pagesclass: transactionconfirm: destructiveundo: yes

Example input

{
  "templateId": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b"
}

Input

FieldTypeRequiredNotes
templateIdstringyesAt least 1 character.

Output

FieldTypeRequiredNotes
successtrueyes

Needs confirmed: ["destructive"] on the batch, which the single-operation CLI form does not set: put it in a batch file and run yarn splash apply <file> --dry-run.

brand.rebuildTemplate

brand.rebuildTemplate with brand validation and transactional history.

permission: site.adminwrites: brand, pagesclass: transactionundo: yes

Example input

{
  "templateId": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b"
}

Input

FieldTypeRequiredNotes
templateIdstringyesAt least 1 character.

Output

FieldTypeRequiredNotes
idstringyesAt least 1 character.
namestringyes
pageIdstringyesAt least 1 character.
snapshotobject | nullyesDefault null.
customerSettingsrecord of array of string | nullyesDefault null.
statusstringyesOne of "draft", "approved".
versionnumberyes
widthnumberyes
heightnumberyes
createdAtstringyes
updatedAtstringyes

Try it

yarn splash brand.rebuildTemplate '{"templateId":"4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b"}' --dry-run

brand.render

brand.render from an approved, curated template through a standalone render boundary.

permission: brand.generatereads onlyclass: external

Example input

{
  "templateId": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b",
  "scale": 1
}

Input

FieldTypeRequiredNotes
templateIdstringyesAt least 1 character.
presetIdstringnoAt least 1 character.
scale1 | 2noDefault 1.
overridesvalueno

Output

FieldTypeRequiredNotes
pngstringyes
contentType"image/png"yes
filenamestringyes
templateVersionintegeryesMore than 0.
widthintegeryesMore than 0.
heightintegeryesMore than 0.
warningsarray of stringyes

A dry run refuses an external operation, so it has no dry-run line: run it alone in a batch.

brand.save

brand.save from an approved, curated template through a standalone render boundary.

permission: brand.generatewrites: media, generationsclass: externalundo: yes

Example input

{
  "templateId": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b",
  "scale": 2
}

Input

FieldTypeRequiredNotes
templateIdstringyesAt least 1 character.
presetIdstringnoAt least 1 character.
scale1 | 2noDefault 1.
overridesvalueno

Output

FieldTypeRequiredNotes
kind"template"yes
mediaobjectyes
media.idstring (uuid)yes
media.kindstringyesOne of "image", "svg", "video", "document".
media.filenamestringyesAt least 1 character. At most 255 characters.
media.mimestringyesAt least 1 character. At most 127 characters.
media.sizeintegeryesAt least 0.
media.urlstringyesAt least 1 character. At most 2048 characters.
media.widthintegernoAt least 1. At most 100000.
media.heightintegernoAt least 1. At most 100000.
media.variantsarray of objectyes
media.altstring | record of stringyes
media.captionstring | record of stringno
media.creditstringnoAt most 200 characters.
media.folderIdstring (uuid) | nullno
media.pageCountintegernoAt least 1.
templateIdstringyes
templateVersionintegeryesMore than 0.
widthintegeryesMore than 0.
heightintegeryesMore than 0.
warningsarray of stringyes

Fields nested deeper are in the output schema that discover_operations answers with outputSchemas: true.

A dry run refuses an external operation, so it has no dry-run line: run it alone in a batch.

Generated from the operation registry and the MCP tool catalogue (source 1500d35b708dfe39).

Something wrong on this page? Write to docs@librettocms.com.

Libretto docs

Colophon. These docs are a Libretto site: 68 pages in two languages, 20 guide pages imported from Markdown and 41 reference pages generated from the operation registry. Set in Softcore, with code in IBM Plex Mono. Its outline:

/ Libretto docs /start Get started /start/request-access Request access /start/workspace Your workspace /start/first-site Your first site /start/invite-a-client Invite a client /start/connect-claude Connect Claude to Libretto /build Build /build/first-page Build a page /build/layers-and-canvas Layers and canvas /build/site-components Site components /design-system Design system /design-system/tokens Colours, space and themes /design-system/components Components and variants /design-system/fonts Typography and fonts /motion Motion /motion/scenes Scenes and recipes /motion/image-sequences Image sequences /motion/reduced-motion Reduced motion /publish Publish /publish/languages Site languages /publish/versions Publish and versions /publish/members-and-forms Members and forms /publish/domains Domains /handover Hand a site to a client /glossary Glossary /agents Agents and API /agents/mcp MCP server /agents/cli CLI /agents/batches Batches /agents/errors Errors and findings /agents/operations Operations /search Search