{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"camelCaseName": {
"description": "A camelCase identifier used for named things defined in the definition (colors, components, variants). Must start with a lowercase letter and may contain letters and digits.",
"type": "string",
"pattern": "^[a-z][a-zA-Z0-9]*$",
"maxLength": 64
},
"colorName": {
"description": "A reference to a color palette defined in the top-level `colors` section.",
"allOf": [{ "$ref": "#/definitions/camelCaseName" }]
},
"componentName": {
"description": "A reference to a component defined in the top-level `components` section.",
"allOf": [{ "$ref": "#/definitions/camelCaseName" }]
},
"translateValue": {
"description": "A translation value expressed as a percentage of the component's width (for `x`) or height (for `y`). Defines a range the PRNG picks from. Set `min === max` for a fixed value. A positive `step` quantizes the range to multiples of `step` starting at `min`; omit for a continuous range. When `(max - min)` is not a multiple of `step`, `max` itself is unreachable — the last bucket is clamped to `≤ max`.",
"type": "object",
"properties": {
"min": { "type": "number", "minimum": -1000, "maximum": 1000 },
"max": { "type": "number", "minimum": -1000, "maximum": 1000 },
"step": { "type": "number", "exclusiveMinimum": 0, "maximum": 2000 }
},
"required": ["min", "max"],
"additionalProperties": false
},
"hexColor": {
"description": "A hex color with leading `#`, in 3, 4, 6, or 8 digit form.",
"type": "string",
"pattern": "^#([a-fA-F0-9]{3}|[a-fA-F0-9]{4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$",
"maxLength": 9
},
"colorValue": {
"description": "A color value for `fill`, `stroke`, `stop-color`, and other color attributes. Either a plain string (any CSS color format — named color, hex, `rgb()`, `oklch()`, `color-mix()`, local paint server reference `url(#id)`, etc.) or an object referencing a named color palette defined in the top-level `colors` section. CSS color syntax is not validated; invalid colors are the browser's problem.",
"anyOf": [
{ "$ref": "#/definitions/attributeString" },
{
"description": "A reference to a named color palette. At render time, the PRNG selects a color value from the referenced palette.",
"type": "object",
"properties": {
"type": { "const": "color" },
"name": {
"description": "The name of the color palette to reference.",
"$ref": "#/definitions/colorName"
}
},
"required": ["type", "name"],
"additionalProperties": false
}
]
},
"safeUrl": {
"description": "A URL restricted to HTTP and HTTPS protocols.",
"type": "string",
"pattern": "^https?://",
"maxLength": 2048
},
"filteredString": {
"description": "Base definition for the filtered-string family (`attributeString`, `cssString`). Blocks a shared set of known-dangerous patterns: external `url(...)` references (local `url(#id)` is allowed), `expression()`, `behavior:`, `-moz-binding`, `javascript:` / `vbscript:` URI schemes, and backslash escape sequences. This is not a general CSS sanitizer — it is a defense-in-depth injection filter, so substring matches of blocked tokens will reject otherwise-harmless strings (e.g. a plain text containing the literal word `javascript:`). The `maxLength` here acts as an absolute ceiling for all derivatives; callers narrow it further.",
"type": "string",
"maxLength": 16384,
"not": {
"type": "string",
"anyOf": [
{ "type": "string", "pattern": "[uU][rR][lL]\\s*\\(\\s*[^#)\\s]" },
{
"type": "string",
"pattern": "[eE][xX][pP][rR][eE][sS][sS][iI][oO][nN]\\s*\\("
},
{
"type": "string",
"pattern": "[bB][eE][hH][aA][vV][iI][oO][rR]\\s*:"
},
{
"type": "string",
"pattern": "-[mM][oO][zZ]-[bB][iI][nN][dD][iI][nN][gG]"
},
{
"type": "string",
"pattern": "[jJ][aA][vV][aA][sS][cC][rR][iI][pP][tT]\\s*:"
},
{
"type": "string",
"pattern": "[vV][bB][sS][cC][rR][iI][pP][tT]\\s*:"
},
{ "type": "string", "pattern": "\\\\" }
]
}
},
"attributeString": {
"description": "The default value type for generic SVG attribute values — transform lists, numeric values, keywords, and so on. No syntactic validation; only the common `filteredString` injection filter applies.",
"type": "string",
"allOf": [{ "$ref": "#/definitions/filteredString" }],
"maxLength": 1024
},
"pathDataString": {
"description": "Used for the `d` attribute of `<path>`. Same filter as `attributeString`, but with a much larger length budget to accommodate complex path geometry.",
"type": "string",
"allOf": [{ "$ref": "#/definitions/filteredString" }],
"maxLength": 16384
},
"cssString": {
"description": "Used for inline `style` attribute content and `<style>` element bodies. Known-dangerous `@`-rules — `@import`, `@font-face`, `@document`, `@charset` — are rejected in addition to the common `filteredString` injection filter. Other `@`-rules (`@media`, `@keyframes`, `@supports`, `@layer`, etc.) are permitted, but the `filteredString` injection filter still applies to their contents — so external `url(...)` references inside e.g. an `@media` rule are still blocked. This is not a general CSS sanitizer.",
"type": "string",
"allOf": [{ "$ref": "#/definitions/filteredString" }],
"maxLength": 4096,
"not": {
"type": "string",
"anyOf": [
{ "type": "string", "pattern": "@[iI][mM][pP][oO][rR][tT]" },
{
"type": "string",
"pattern": "@[fF][oO][nN][tT]-[fF][aA][cC][eE]"
},
{
"type": "string",
"pattern": "@[dD][oO][cC][uU][mM][eE][nN][tT]"
},
{ "type": "string", "pattern": "@[cC][hH][aA][rR][sS][eE][tT]" }
]
}
},
"element": {
"description": "An SVG node. One of four mutually exclusive forms, discriminated by `type` (and `name` for the `<style>` special case): a text element, a component reference, a `<style>` element, or any other SVG element.",
"anyOf": [
{ "$ref": "#/definitions/textElement" },
{ "$ref": "#/definitions/componentReference" },
{ "$ref": "#/definitions/styleElement" },
{ "$ref": "#/definitions/genericElement" }
]
},
"textElement": {
"description": "A raw text node. Its `value` becomes the text content rendered into the parent element.",
"type": "object",
"properties": {
"type": { "const": "text" },
"value": {
"description": "Either a plain string, or a `variable` reference resolved at render time to the seed's initials.",
"anyOf": [
{ "type": "string", "maxLength": 4096 },
{
"type": "object",
"properties": {
"type": { "const": "variable" },
"name": { "enum": ["initial", "initials"] }
},
"required": ["type", "name"],
"additionalProperties": false
}
]
}
},
"required": ["type", "value"],
"additionalProperties": false
},
"componentReference": {
"description": "A reference to a named component defined in the top-level `components` section. At render time, the PRNG selects one of the component's variants. Optional `attributes` are applied to the generated `<use>` tag — most commonly a `transform` placing the instance, but any allowlisted attribute is accepted.",
"type": "object",
"properties": {
"type": { "const": "component" },
"name": { "$ref": "#/definitions/componentName" },
"attributes": { "$ref": "#/definitions/attributes" }
},
"required": ["type", "name"],
"additionalProperties": false
},
"styleElement": {
"description": "An SVG `<style>` element. Its CSS content must be provided as `text` children; each child's value is validated as a CSS string with a stricter content policy than generic SVG attribute values.",
"type": "object",
"properties": {
"type": { "const": "element" },
"name": { "const": "style" },
"attributes": { "$ref": "#/definitions/attributes" },
"children": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "const": "text" },
"value": { "$ref": "#/definitions/cssString" }
},
"required": ["type", "value"],
"additionalProperties": false
},
"maxItems": 64
}
},
"required": ["type", "name"],
"additionalProperties": false
},
"genericElement": {
"description": "Any SVG element other than `<style>`, which has its own stricter content policy.",
"type": "object",
"properties": {
"type": { "const": "element" },
"name": {
"description": "The SVG tag name. Only a safe subset of SVG elements is permitted; dangerous elements such as `script`, `foreignObject`, or `a` are excluded.",
"enum": [
"circle",
"clipPath",
"defs",
"desc",
"ellipse",
"feBlend",
"feColorMatrix",
"feComponentTransfer",
"feComposite",
"feConvolveMatrix",
"feDiffuseLighting",
"feDisplacementMap",
"feDistantLight",
"feDropShadow",
"feFlood",
"feFuncA",
"feFuncB",
"feFuncG",
"feFuncR",
"feGaussianBlur",
"feImage",
"feMerge",
"feMergeNode",
"feMorphology",
"feOffset",
"fePointLight",
"feSpecularLighting",
"feSpotLight",
"feTile",
"feTurbulence",
"filter",
"g",
"image",
"line",
"linearGradient",
"marker",
"mask",
"metadata",
"mpath",
"path",
"pattern",
"polygon",
"polyline",
"radialGradient",
"rect",
"stop",
"svg",
"switch",
"symbol",
"text",
"textPath",
"title",
"tspan",
"use",
"view"
]
},
"attributes": { "$ref": "#/definitions/attributes" },
"children": {
"type": "array",
"items": { "$ref": "#/definitions/element" },
"maxItems": 1024
}
},
"required": ["type", "name"],
"additionalProperties": false
},
"attributes": {
"description": "A map of allowed SVG presentation attributes. Only a safe subset is permitted; event handlers (e.g. `onclick`) and namespace attributes (e.g. `xlink:href`) are not allowed.",
"type": "object",
"properties": {
"alignment-baseline": { "$ref": "#/definitions/attributeString" },
"amplitude": { "$ref": "#/definitions/attributeString" },
"azimuth": { "$ref": "#/definitions/attributeString" },
"baseFrequency": { "$ref": "#/definitions/attributeString" },
"baseline-shift": { "$ref": "#/definitions/attributeString" },
"bias": { "$ref": "#/definitions/attributeString" },
"class": { "$ref": "#/definitions/attributeString" },
"clipPathUnits": { "$ref": "#/definitions/attributeString" },
"clip-path": { "$ref": "#/definitions/attributeString" },
"clip-rule": { "$ref": "#/definitions/attributeString" },
"color": {
"$ref": "#/definitions/colorValue"
},
"color-interpolation": { "$ref": "#/definitions/attributeString" },
"color-interpolation-filters": {
"$ref": "#/definitions/attributeString"
},
"crossorigin": { "$ref": "#/definitions/attributeString" },
"cx": { "$ref": "#/definitions/attributeString" },
"cy": { "$ref": "#/definitions/attributeString" },
"d": { "$ref": "#/definitions/pathDataString" },
"decoding": { "$ref": "#/definitions/attributeString" },
"diffuseConstant": { "$ref": "#/definitions/attributeString" },
"direction": { "$ref": "#/definitions/attributeString" },
"display": { "$ref": "#/definitions/attributeString" },
"divisor": { "$ref": "#/definitions/attributeString" },
"dominant-baseline": { "$ref": "#/definitions/attributeString" },
"dx": { "$ref": "#/definitions/attributeString" },
"dy": { "$ref": "#/definitions/attributeString" },
"edgeMode": { "$ref": "#/definitions/attributeString" },
"elevation": { "$ref": "#/definitions/attributeString" },
"exponent": { "$ref": "#/definitions/attributeString" },
"fill": { "$ref": "#/definitions/colorValue" },
"fill-opacity": { "$ref": "#/definitions/attributeString" },
"fill-rule": { "$ref": "#/definitions/attributeString" },
"filter": { "$ref": "#/definitions/attributeString" },
"filterUnits": { "$ref": "#/definitions/attributeString" },
"flood-color": {
"$ref": "#/definitions/colorValue"
},
"flood-opacity": { "$ref": "#/definitions/attributeString" },
"font-family": {
"anyOf": [
{ "$ref": "#/definitions/attributeString" },
{
"type": "object",
"properties": {
"type": { "const": "variable" },
"name": { "const": "fontFamily" }
},
"required": ["type", "name"],
"additionalProperties": false
}
]
},
"font-size": { "$ref": "#/definitions/attributeString" },
"font-size-adjust": { "$ref": "#/definitions/attributeString" },
"font-style": { "$ref": "#/definitions/attributeString" },
"font-variant": { "$ref": "#/definitions/attributeString" },
"font-weight": {
"anyOf": [
{ "$ref": "#/definitions/attributeString" },
{
"type": "object",
"properties": {
"type": { "const": "variable" },
"name": { "const": "fontWeight" }
},
"required": ["type", "name"],
"additionalProperties": false
}
]
},
"fx": { "$ref": "#/definitions/attributeString" },
"fy": { "$ref": "#/definitions/attributeString" },
"gradientTransform": { "$ref": "#/definitions/attributeString" },
"gradientUnits": { "$ref": "#/definitions/attributeString" },
"height": { "$ref": "#/definitions/attributeString" },
"href": {
"anyOf": [
{
"type": "string",
"pattern": "^#[a-zA-Z_][a-zA-Z0-9_.-]*$",
"maxLength": 128
},
{
"type": "string",
"pattern": "^data:image/(png|gif|jpeg|webp|avif);base64,[a-zA-Z0-9+/=]+$",
"maxLength": 262144
}
]
},
"id": { "$ref": "#/definitions/attributeString" },
"image-rendering": { "$ref": "#/definitions/attributeString" },
"in": { "$ref": "#/definitions/attributeString" },
"in2": { "$ref": "#/definitions/attributeString" },
"intercept": { "$ref": "#/definitions/attributeString" },
"k1": { "$ref": "#/definitions/attributeString" },
"k2": { "$ref": "#/definitions/attributeString" },
"k3": { "$ref": "#/definitions/attributeString" },
"k4": { "$ref": "#/definitions/attributeString" },
"kernelMatrix": { "$ref": "#/definitions/attributeString" },
"kernelUnitLength": { "$ref": "#/definitions/attributeString" },
"lang": { "$ref": "#/definitions/attributeString" },
"lengthAdjust": { "$ref": "#/definitions/attributeString" },
"letter-spacing": { "$ref": "#/definitions/attributeString" },
"lighting-color": {
"$ref": "#/definitions/colorValue"
},
"marker-end": { "$ref": "#/definitions/attributeString" },
"marker-mid": { "$ref": "#/definitions/attributeString" },
"marker-start": { "$ref": "#/definitions/attributeString" },
"markerHeight": { "$ref": "#/definitions/attributeString" },
"markerUnits": { "$ref": "#/definitions/attributeString" },
"markerWidth": { "$ref": "#/definitions/attributeString" },
"mask": { "$ref": "#/definitions/attributeString" },
"maskContentUnits": { "$ref": "#/definitions/attributeString" },
"maskUnits": { "$ref": "#/definitions/attributeString" },
"media": { "$ref": "#/definitions/attributeString" },
"method": { "$ref": "#/definitions/attributeString" },
"mode": { "$ref": "#/definitions/attributeString" },
"numOctaves": { "$ref": "#/definitions/attributeString" },
"offset": { "$ref": "#/definitions/attributeString" },
"opacity": { "$ref": "#/definitions/attributeString" },
"operator": { "$ref": "#/definitions/attributeString" },
"order": { "$ref": "#/definitions/attributeString" },
"orient": { "$ref": "#/definitions/attributeString" },
"overflow": { "$ref": "#/definitions/attributeString" },
"paint-order": { "$ref": "#/definitions/attributeString" },
"path": { "$ref": "#/definitions/attributeString" },
"pathLength": { "$ref": "#/definitions/attributeString" },
"patternContentUnits": { "$ref": "#/definitions/attributeString" },
"patternTransform": { "$ref": "#/definitions/attributeString" },
"patternUnits": { "$ref": "#/definitions/attributeString" },
"points": { "$ref": "#/definitions/attributeString" },
"preserveAlpha": { "$ref": "#/definitions/attributeString" },
"preserveAspectRatio": { "$ref": "#/definitions/attributeString" },
"primitiveUnits": { "$ref": "#/definitions/attributeString" },
"r": { "$ref": "#/definitions/attributeString" },
"radius": { "$ref": "#/definitions/attributeString" },
"refX": { "$ref": "#/definitions/attributeString" },
"refY": { "$ref": "#/definitions/attributeString" },
"result": { "$ref": "#/definitions/attributeString" },
"rx": { "$ref": "#/definitions/attributeString" },
"ry": { "$ref": "#/definitions/attributeString" },
"scale": { "$ref": "#/definitions/attributeString" },
"seed": { "$ref": "#/definitions/attributeString" },
"shape-rendering": { "$ref": "#/definitions/attributeString" },
"slope": { "$ref": "#/definitions/attributeString" },
"specularConstant": { "$ref": "#/definitions/attributeString" },
"specularExponent": { "$ref": "#/definitions/attributeString" },
"spreadMethod": { "$ref": "#/definitions/attributeString" },
"startOffset": { "$ref": "#/definitions/attributeString" },
"stdDeviation": { "$ref": "#/definitions/attributeString" },
"stitchTiles": { "$ref": "#/definitions/attributeString" },
"stop-color": {
"$ref": "#/definitions/colorValue"
},
"stop-opacity": { "$ref": "#/definitions/attributeString" },
"stroke": { "$ref": "#/definitions/colorValue" },
"stroke-dasharray": { "$ref": "#/definitions/attributeString" },
"stroke-dashoffset": { "$ref": "#/definitions/attributeString" },
"stroke-linecap": { "$ref": "#/definitions/attributeString" },
"stroke-linejoin": { "$ref": "#/definitions/attributeString" },
"stroke-miterlimit": { "$ref": "#/definitions/attributeString" },
"stroke-opacity": { "$ref": "#/definitions/attributeString" },
"stroke-width": { "$ref": "#/definitions/attributeString" },
"style": { "$ref": "#/definitions/cssString" },
"surfaceScale": { "$ref": "#/definitions/attributeString" },
"systemLanguage": { "$ref": "#/definitions/attributeString" },
"tabindex": { "$ref": "#/definitions/attributeString" },
"tableValues": { "$ref": "#/definitions/attributeString" },
"targetX": { "$ref": "#/definitions/attributeString" },
"targetY": { "$ref": "#/definitions/attributeString" },
"text-anchor": { "$ref": "#/definitions/attributeString" },
"text-decoration": { "$ref": "#/definitions/attributeString" },
"text-rendering": { "$ref": "#/definitions/attributeString" },
"textLength": { "$ref": "#/definitions/attributeString" },
"transform": { "$ref": "#/definitions/attributeString" },
"transform-origin": { "$ref": "#/definitions/attributeString" },
"type": { "$ref": "#/definitions/attributeString" },
"values": { "$ref": "#/definitions/attributeString" },
"viewBox": { "$ref": "#/definitions/attributeString" },
"visibility": { "$ref": "#/definitions/attributeString" },
"width": { "$ref": "#/definitions/attributeString" },
"word-spacing": { "$ref": "#/definitions/attributeString" },
"writing-mode": { "$ref": "#/definitions/attributeString" },
"x": { "$ref": "#/definitions/attributeString" },
"x1": { "$ref": "#/definitions/attributeString" },
"x2": { "$ref": "#/definitions/attributeString" },
"xChannelSelector": { "$ref": "#/definitions/attributeString" },
"y": { "$ref": "#/definitions/attributeString" },
"y1": { "$ref": "#/definitions/attributeString" },
"y2": { "$ref": "#/definitions/attributeString" },
"yChannelSelector": { "$ref": "#/definitions/attributeString" },
"z": { "$ref": "#/definitions/attributeString" }
},
"additionalProperties": false
},
"componentProbability": {
"description": "The probability, expressed as a percentage, that this component is rendered at all.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"componentRotate": {
"description": "A rotation in degrees. Defines a range the PRNG picks from. Set `min === max` for a fixed angle. A positive `step` quantizes the range to multiples of `step` starting at `min`; omit for a continuous range. When `(max - min)` is not a multiple of `step`, `max` itself is unreachable — the last bucket is clamped to `≤ max`.",
"type": "object",
"properties": {
"min": { "type": "number", "minimum": -360, "maximum": 360 },
"max": { "type": "number", "minimum": -360, "maximum": 360 },
"step": { "type": "number", "exclusiveMinimum": 0, "maximum": 720 }
},
"required": ["min", "max"],
"additionalProperties": false
},
"componentScale": {
"description": "A scale factor around the component's own center (`1` corresponds to the original size). Defines a range the PRNG picks from. Set `min === max` for a fixed scale. A positive `step` quantizes the range to multiples of `step` starting at `min`; omit for a continuous range. When `(max - min)` is not a multiple of `step`, `max` itself is unreachable — the last bucket is clamped to `≤ max`.",
"type": "object",
"properties": {
"min": { "type": "number", "minimum": 0, "maximum": 10 },
"max": { "type": "number", "minimum": 0, "maximum": 10 },
"step": { "type": "number", "exclusiveMinimum": 0, "maximum": 10 }
},
"required": ["min", "max"],
"additionalProperties": false
},
"componentTranslate": {
"description": "A positional translation applied to the component after placement. Values are interpreted as a percentage of the component's size.",
"type": "object",
"properties": {
"x": { "$ref": "#/definitions/translateValue" },
"y": { "$ref": "#/definitions/translateValue" }
},
"additionalProperties": false
},
"componentBase": {
"description": "A base component definition with its own dimensions and variants. The PRNG selects one variant per render based on the seed.",
"type": "object",
"properties": {
"width": {
"description": "The natural width of the component canvas in pixels.",
"type": "number",
"minimum": 1,
"maximum": 1000000
},
"height": {
"description": "The natural height of the component canvas in pixels.",
"type": "number",
"minimum": 1,
"maximum": 1000000
},
"probability": { "$ref": "#/definitions/componentProbability" },
"rotate": { "$ref": "#/definitions/componentRotate" },
"scale": { "$ref": "#/definitions/componentScale" },
"translate": { "$ref": "#/definitions/componentTranslate" },
"variants": {
"description": "The available visual variants of this component. The PRNG selects one variant per render. Keys must be `camelCaseName` identifiers.",
"type": "object",
"propertyNames": { "$ref": "#/definitions/camelCaseName" },
"additionalProperties": {
"type": "object",
"properties": {
"elements": {
"description": "The SVG elements that make up this variant.",
"type": "array",
"items": { "$ref": "#/definitions/element" },
"maxItems": 1024
},
"weight": {
"description": "A weight that influences how likely the PRNG is to select this variant. Higher values make the variant more likely. When omitted, defaults to 1 (equal weighting). A value of 0 means the variant is not selected unless all available variants have a weight of 0.",
"type": "number",
"minimum": 0,
"maximum": 1000000
}
},
"required": ["elements"],
"additionalProperties": false
},
"maxProperties": 512
}
},
"required": ["width", "height", "variants"],
"additionalProperties": false
},
"componentAlias": {
"description": "An alias that inherits its dimensions, variants, and transforms from another component referenced by `extends`. Aliases have no per-instance overrides — they are pure references.",
"type": "object",
"properties": {
"extends": {
"description": "The name of an existing, non-alias component in this `components` map.",
"$ref": "#/definitions/componentName"
}
},
"required": ["extends"],
"additionalProperties": false
}
},
"type": "object",
"properties": {
"$id": {
"type": "string",
"maxLength": 256
},
"$schema": {
"type": "string",
"maxLength": 256
},
"$comment": {
"type": "string",
"maxLength": 4096
},
"meta": {
"description": "Metadata about the avatar style, such as license information, creator details, and source references.",
"type": "object",
"properties": {
"license": {
"description": "License information for the avatar style.",
"type": "object",
"properties": {
"name": {
"description": "The name of the license, e.g. `CC BY 4.0`.",
"type": "string",
"maxLength": 128
},
"url": {
"description": "A link to the full license text.",
"$ref": "#/definitions/safeUrl"
},
"text": {
"description": "The full license text.",
"type": "string",
"maxLength": 32768
}
},
"additionalProperties": false
},
"creator": {
"description": "Information about the creator of the avatar style.",
"type": "object",
"properties": {
"name": {
"description": "The name of the creator.",
"type": "string",
"maxLength": 128
},
"url": {
"description": "A link to the creator's website or profile.",
"$ref": "#/definitions/safeUrl"
}
},
"additionalProperties": false
},
"source": {
"description": "Information about the original source of the artwork.",
"type": "object",
"properties": {
"name": {
"description": "The name of the original source.",
"type": "string",
"maxLength": 128
},
"url": {
"description": "A link to the original source.",
"$ref": "#/definitions/safeUrl"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"attributes": {
"description": "Global SVG presentation attributes applied to the root `<svg>` element.",
"$ref": "#/definitions/attributes"
},
"canvas": {
"description": "The main content of the avatar, defining the SVG structure, canvas dimensions, and element tree.",
"type": "object",
"properties": {
"elements": {
"description": "The list of SVG elements that make up the avatar.",
"type": "array",
"items": { "$ref": "#/definitions/element" },
"maxItems": 1024
},
"width": {
"description": "The natural width of the avatar canvas in pixels.",
"type": "number",
"minimum": 1,
"maximum": 1000000
},
"height": {
"description": "The natural height of the avatar canvas in pixels.",
"type": "number",
"minimum": 1,
"maximum": 1000000
}
},
"required": ["elements", "width", "height"],
"additionalProperties": false
},
"components": {
"description": "Named, reusable SVG components. Each component defines a set of variants that the PRNG can select from at render time, or aliases another component to render an additional, independently-randomized instance of it. Keys must be `camelCaseName` identifiers.",
"type": "object",
"propertyNames": { "$ref": "#/definitions/camelCaseName" },
"additionalProperties": {
"anyOf": [
{ "$ref": "#/definitions/componentBase" },
{ "$ref": "#/definitions/componentAlias" }
]
},
"maxProperties": 512
},
"colors": {
"description": "Named color palettes used by the avatar. The PRNG selects colors from these groups at render time. Color groups can define constraints such as contrast or exclusion rules. Keys must be `camelCaseName` identifiers.",
"type": "object",
"propertyNames": { "$ref": "#/definitions/camelCaseName" },
"additionalProperties": {
"type": "object",
"properties": {
"values": {
"description": "The list of hex color values the PRNG can choose from.",
"type": "array",
"items": { "$ref": "#/definitions/hexColor" },
"minItems": 1,
"maxItems": 128
},
"notEqualTo": {
"description": "A list of other color names. The selected color value must differ from the color values selected in those colors. The schema does not prevent cycles (e.g. `a` notEqualTo `b` and `b` notEqualTo `a`); renderers resolve palettes in definition order and must reject unsatisfiable configurations at load time.",
"type": "array",
"items": { "$ref": "#/definitions/colorName" },
"maxItems": 64
},
"contrastTo": {
"description": "The name of another color. When specified, the PRNG is not used for selection — instead, the color value with the highest contrast against the selected color value of the referenced color is chosen. The schema does not prevent cycles (e.g. `a` contrastTo `b` and `b` contrastTo `a`); renderers resolve palettes in definition order and must reject unsatisfiable configurations at load time.",
"$ref": "#/definitions/colorName"
}
},
"required": ["values"],
"additionalProperties": false
},
"maxProperties": 512
}
},
"required": ["canvas"],
"additionalProperties": false
}