dicebear_core 10.5.0
dicebear_core: ^10.5.0 copied to clipboard
Unique avatars from dozens of styles — deterministic, customizable, vector-based.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased #
10.5.0 - 2026-08-09 #
Added #
- Core: New per-color option
*ColorOrderwith the valuesrandomandfixed, in all six core implementations (JavaScript, PHP, Python, Rust, Go, and Dart).randomis the previous behavior: the PRNG shuffles the colors before use. Withfixed, colors passed via*Colorkeep exactly the given order; gradient fills apply them as stops from first to last, solid fills always use the first color, and the number of gradient stops defaults to the number of given colors. Without user-supplied colors,fixedonly skips the shuffle and uses the style's palette in sorted order;contrastToandnotEqualToconstraints still apply, so referenced color groups can keep the result seed-dependent. Existing avatars are unaffected, sincerandomstays the default. Requested in discussion #549 for building gradients with a fixed color sequence, such as flag colors.@dicebear/schema1.4.0 validates the option, and two new parity fixture cases per style pin its behavior across the ports. The core options guide and the implementation specification cover the details. - Docs: Style pages for
voxel-artandvoxel-bot, the two styles new in@dicebear/styles10.4.0. The animated-avatars page now fills its style count from the definitions at build time, through the same token mechanism the overall count already uses; the hardcoded number it replaces had gone stale at 15. - Editor: The eight character styles the editor was missing:
clay,critters,moods,pixelbot,sprouts,thumbs,voxel-art, andvoxel-bot. Its style list now matches the docs' Characters category exactly, and the new option labels are translated into English, German, and Portuguese. The animation option stays hidden in the editor, since its export writes static files; an avatar without an explicitanimationVariantnever animates, because every animated variant carries weight 0.
Changed #
- Core (JavaScript): The schema validators are now generated with
@exodus/schemasafeinstead of Ajv. The published package still has no runtime dependencies, and the validator code shrinks from 164 KB to 114 KB minified, so browser bundles of@dicebear/coreshrink by the same amount. Both compilers accept and reject the same inputs: every published style definition and a set of deliberately broken samples produced identical verdicts. Error messages change, however. schemasafe reports JSON pointers without prose, so the message is now derived from the failing keyword (/size is smaller than allowed), and everyValidationErrorDetailcarries two new optional fields,schemaPathandkeyword, that name the schema rule behind a failure. When an object violates a named property and a pattern property at the same time, the error list only reports the first group; the verdict is not affected. - CLI: Removed the unused
ajvdependency, which makes a CLI install about 2.7 MB smaller. - Converter: The browser build no longer bundles an XML parser. Setting the
render size and mirroring
mask-typedeclarations now run on the nativeDOMParserandXMLSerializer, which every browser ships. The XML dependency stack (fast-xml-parser and friends) made up nine tenths of the browser bundle; it stays in the Node build, where no native XML machinery exists. A browser bundle of@dicebear/convertershrinks from 26 kB to 1.4 kB gzipped. Two edges change with the parser: a malformed SVG now fails with a clear error instead of a parser-specific one, and whennormalizeMaskTyperewrites a document in the browser, empty elements come back self-closing. Both helpers are covered by new jsdom-based tests. - Styles: Bumped
@dicebear/stylesto10.4.0for the CLI, the docs, and the editor. The release addsvoxel-artandvoxel-bot, which take the collection from 50 to 52 styles. Both ship the opt-inanimationcomponent, so 18 of the 52 styles can now animate.
Deprecated #
- Core: The sorted fallback order that
*ColorOrder: 'fixed'applies when no*Coloroption is set. In DiceBear 10, this case deduplicates and code-point sorts the style palette, so palettes keep their canonical order and only the shuffle is skipped. DiceBear 11 will use the palette in its definition order instead, the same verbatim rule that already applies to user-supplied colors. That removes the user-colors/palette distinction from the resolvers and makesfixedmean the same thing for both sources. The sort site in each of the six ports carries a matching deprecation comment.
Fixed #
- Docs: The bundle size estimator now reports what a bundler actually ships:
one minified bundle per package, gzipped as a whole. It previously gzipped
every published file on its own without minification, which showed
@dicebear/coreat 58 kB instead of 26 kB and@dicebear/converterat 8 kB instead of 26 kB, since the converter's browser build pulls its XML dependencies into the bundle. The converter hint also claimed PDF output; the package converts to PNG, JPEG, WebP, and AVIF.
10.4.0 - 2026-08-01 #
Changed #
- Styles: Bumped
@dicebear/stylesto10.3.0. The release adds thirteen styles:blobs,clay,constellation,critters,landscape,loops,moods,pixelbot,planets,sprouts,squircles,waves, andweave. It also givesshapes,glass,thumbs,initial-face, and every new style exceptweavean opt-inanimationcomponent, which stays off until theanimationVariantortagsrender option turns it on.
10.4.0-rc.2 - 2026-07-31 #
Fixed #
- Converter: Raster conversion no longer drops parts of rotated avatars with
translucent layers. The resvg build that
resvg-jsbundles places the isolation layer of anopacitygroup in the wrong coordinate space when the group sits under both aclip-pathand a large rotation, and cuts the group's content. Thewavesstyle lost about half of its image in every raster format, including through the HTTP API. Since the viewport crops to the canvas anyway, the converter now removes clip paths that cover exactly the canvas before it hands the SVG to resvg. A clip with rounded corners is removed as well and re-applied to the rendered image, so theradiusoption keeps working. Its corners are drawn by sharp instead of resvg as a result, which changes their antialiasing slightly.
10.4.0-rc.1 - 2026-07-31 #
Added #
- Core (all languages): A new
tagsrender option narrows the pool of variants an avatar is drawn from. Styles may label their variants with tags such asanimationorhairLength:long, and the option keeps or drops variants by those labels, so one trait is pinned down while the rest of the avatar stays varied. A token iscategoryorcategory:value, with a leading!to exclude. An include keeps the variants carrying a matching tag together with those that carry no tag in the category. Several values of one category act as "or", different categories act as "and", and an exclude wins over an include. A barecategorytoken requires the category and drops the variants without a tag in it, but only in the components where the category is in use. An unknown category is ignored, an unknown value is not: since nothing matches it, every variant tagged in that category drops out. A per-component{component}Variantoption is more specific and switches the filter off for that component. If a filter leaves a component without a variant, the component is not drawn. The option takes a string or an array of strings, and in the HTTP API it is the comma-separatedtagsquery parameter. Styles that carry no tags are unaffected. In the DiceBear styles, tags currently describe one thing, the opt-in animation of the animated styles, sotags=animationturns that animation on at a random speed per seed and!animationkeeps it off. The character categories follow in a later release. - Docs: Two guides cover the new option, "Filter Avatar Variants with Tags" for the filter itself and "How DiceBear Tags Variants" for the vocabulary the DiceBear styles use. The playground has a tag panel per category, where every token is an allow/disallow switch, and its count of unique avatars accounts for the filter. Style pages list the tags a style provides and mark every variant preview with its own. The core option reference moved out of the JavaScript page onto a shared "Core options" page that all six library pages link to.
- CLI: Definition files can now be compressed in place with
dicebear ./my-style.json --optimize. The flag runs the same svgo pass over every element tree that the current Figma exporter applies on export. Hand-authored definitions and files from older exporter versions shrink, by up to 42% (pixel-art), while recent exports come back unchanged.--optimize-checkreports without writing and exits non-zero when the file would change, which makes it usable as a CI gate.--optimize-precisionsets the float precision for path and transform data (default 3). Color and component references, variables, element ids, CSS classes and<style>contents are verified after the pass, and the CLI refuses to write the file when any of them changed.
Fixed #
- Core (all languages): The id suffix for
<defs>entries now hashes the style source name together with the seed. It previously hashed only the seed, so two avatars of different styles with the same seed produced identical ids for shared component names (body,eyes,animation,clip, ...) and stole each other's<defs>when inlined on one page. Rendered ids change for every avatar as a result. - Core (all languages): The generator comment now points at
https://www.dicebear.com. It carried the baredicebear.comhost since 10.3.0, which only redirects to the canonicalwwwhost that the<metadata>block already used. The byte output of every avatar changes as a result, including data URIs and content hashes, so consumers that compare rendered SVGs against stored snapshots need to update them. - Docs: In the playground, clicking "None" in a component's variant picker while weights were shown stored an empty weights object, which the core rejects — the preview then rendered no avatar at all. An empty selection is now stored as an empty list, which renders the avatar without that component. Styles that ship non-default weights were affected immediately, because their pickers open in weights mode.
10.3.2 - 2026-07-29 #
Fixed #
- Converter: Raster conversion no longer alters text content. The XML round
trip that sets the output size trimmed whitespace and converted
numeric-looking text, so
<text>0123</text>rendered as123and1e3as1000in every raster format, including through the HTTP API. Text nodes and CDATA sections now survive the round trip unchanged. Previously the converter unwrapped a CDATA section into raw text, which could turn a valid SVG into ill-formed XML. - Converter: Raster conversion now accepts SVGs nested deeper than 100
elements. The XML parser's default nesting cap made
toPng()and friends throw on valid documents that resvg renders fine. The cap is now 1024 levels. - Converter: The converter now reads
mask-typedeclarations the way a browser does. It strips a trailing!importantinstead of copying it into the presentation attribute, where resvg would reject the value and silently fall back toluminance. It ignores invalid values, and when astyleattribute repeats the declaration, the last valid one wins.
Changed #
- Converter:
normalizeMaskType()now works on the parsed XML tree instead of rewriting the markup with regular expressions, and the raster entry points apply it in the same parser pass that sets the output size. Input that needs no fix comes back byte-identical. So does input the XML parser cannot read, where the old version attempted a partial rewrite. When a mask does need fixing, the function re-emits the SVG from the parsed tree, which can normalize formatting details such as quote style or self-closing tags and drops a<!DOCTYPE>declaration. The rendered image stays the same. - Converter: The XML serializer moved from the deprecated
XMLBuilderexport offast-xml-parserto its successor packagefast-xml-builder. The output is byte-identical. The only visible change for consumers is the new package in the dependency tree.
10.3.1 - 2026-07-27 #
Fixed #
- Converter: Masks that declare
mask-type: alphain astyleattribute now rasterize correctly. resvg readsmask-typeonly as a presentation attribute, and without one it falls back to theluminancedefault, which turns a mask drawn in black into a mask that hides its subject. Seven styles ship such masks:bottts-neutral,disco,glyphs,lorelei,micah,personasandtoon-head. Onloreleia bearded avatar lost its mouth in the PNG while the SVG rendered fine. The HTTP API converts through this package and was affected the same way. The normalization is also exported asnormalizeMaskType()for callers that drive resvg directly.
10.3.0 - 2026-06-13 #
Added #
- Core: Every rendered SVG now starts with the generator comment
<!-- Generated by DiceBear (https://dicebear.com) -->as the first child of the root<svg>element. The comment is byte-identical across the JavaScript, PHP, Python, Rust, Go, and Dart libraries. The byte output of every avatar changes as a result, including data URIs and content hashes, so consumers that compare rendered SVGs against stored snapshots need to update them. SVG optimizers that strip comments (e.g. SVGO with default settings) remove it again. - Dart library: A new Dart implementation (the
dicebear_corepackage) that produces identical output to the JavaScript library when given the same styles and options. It validates style definitions and options against the shared schemas (viadicebear_schema) and pairs with thedicebear_stylespackage. - Core (PHP, Python): Added
Style::fromJson()(PHP) andStyle.from_json()(Python) to build a style from a raw JSON string without a separatejson_decode(..., true)/json.loads(...)call. Malformed JSON raises the language's native parse error (JsonException/json.JSONDecodeError); an invalid definition raises the usualStyleValidationError. MirrorsStyle::from_str(Rust) andStyle.parse(Dart); the existing array/dict constructor is unchanged.
Deprecated #
- Core (JS, PHP, Python): Passing a raw style definition to
Avataris deprecated; pass aStyleinstead (new Avatar(new Style(definition), options)), which also lets you reuse one parsed style across many avatars. The definition still works for now and renders identically, but emits a deprecation warning (a one-timeconsole.warnin JS,E_USER_DEPRECATEDin PHP,DeprecationWarningin Python) and will be removed in v11. The Dart, Rust and Go libraries already require aStyle, so this brings every port to the sameAvatar(style, …)call.
10.2.0 - 2026-06-10 #
Added #
- Go library: A new Go implementation (the
github.com/dicebear/dicebear-go/v10module) that produces identical output to the JavaScript library when given the same styles and options.
Fixed #
- Core:
Color.luminance()now derives the sRGB linearization from a precomputed lookup table (one entry per 8-bit channel value) instead of callingpowat runtime.powis not required to be correctly rounded and produced last-ULP differences between JS engines (V8 vs. others), the C math library (PHP, Python, Rust), and Go's pure-Go implementation, so luminance values, and in contrived cases contrast-based color ordering, could diverge across languages and even across browsers. The table holds the values the JavaScript reference produces today, so JavaScript output is unchanged; the other libraries move by at most one ULP. The Go library additionally forces intermediate rounding in the weighted sum, which the compiler could otherwise fuse into FMA instructions on arm64. Rendered SVGs are unaffected. - Core (PHP):
Avatar::toDataUri()now percent-encodes exactly like JavaScript'sencodeURIComponent. Previously the PHP library used plainrawurlencode, which additionally escapes!*'(), characters that occur in every rendered SVG (e.g.url(#…)references andtranslate(…)transforms), so the data URI diverged byte-wise from the JavaScript, Python, Rust, and Go libraries. The decoded SVG was unaffected. - Core (JS): The
initialstyle variable now resolves to the full first code point of the initials. Previously the JavaScript library emitted a lone UTF-16 surrogate (ill-formed XML) when the initials started with a character outside the Basic Multilingual Plane (e.g. an emoji). The PHP, Python, Rust, and Go libraries already returned the full character; all libraries are now byte-identical for such seeds. - Core (Rust):
Avatar.to_json()now recordssizebeforetitlein the resolved-options snapshot, matching the JavaScript, PHP, and Python libraries. The rendered SVG was unaffected; only consumers comparing or hashing the serialized options JSON across languages were affected. - Core (Python):
Avatar.to_json()now serializes whole-number floats in the resolved-options snapshot as integers (1, not1.0), matching the JavaScript, Rust, and PHP libraries. Previously snapshot values such asscale,rotate,translateX/translateY,borderRadius, color angles, and per-component transforms were emitted as1.0/0.0, so the serialized JSON diverged from the other ports. The rendered SVG was unaffected. The values were already numerically equal, so only consumers comparing or hashing the serialized options JSON across languages were affected.
10.2.0-rc.1 - 2026-06-07 #
Added #
- Rust library: A new Rust implementation (the
dicebear-corecrate) that produces identical output to the JavaScript library when given the same styles and options.
Fixed #
- Core: Initials now discard everything from the first
@to the end of the seed (e.g. an email domain). Previously the strip stopped at the first line terminator (at a line feed in PHP and Python, and additionally at a carriage return orU+2028/U+2029in JavaScript), so a seed with a line break after the@kept the trailing text as a second word, and the libraries could even diverge from each other. All language libraries now produce byte-identical initials for such seeds.
10.1.0 - 2026-06-06 #
Changed #
- Schema: Bumped the bundled
@dicebear/schemato1.1.0across the JavaScript, PHP, and Python libraries. It adds an upper bound of1000000to the canvas and componentwidth/height, preventing the language ports' number-to-string formatting from diverging at extreme values. Official styles use ~100, so no real avatar is affected. - Styles: Bumped
@dicebear/stylesto10.1.0. Lorelei's mouth is now visible throughbeardvariants (the overlaying mask was previously rendered at0opacity), and all style definitions now reference@dicebear/schema@1.1.0.
10.1.0-rc.1 - 2026-06-02 #
Added #
- Python library: A new Python implementation that produces identical output to the JavaScript library when given the same styles and options.
10.0.2 - 2026-06-02 #
Fixed #
- Core: Numeric values in rendered SVGs are now consistently rounded to at
most 5 decimal places, so the JavaScript and PHP libraries produce
byte-identical output for every input. Previously, fractional or very
small/large values (e.g. a fractional
borderRadiusortranslateX, component transforms, or gradient stop offsets) could be stringified differently between languages (scientific notation, differing precision). Avatars built from whole-number options are unaffected. - Core (PHP):
Prng::floatnow rounds halves toward +Infinity (matching the JavaScript reference'sMath.round) instead of PHP's nativeround(), which rounds halves away from zero. The two diverged for negative values landing exactly on a.5boundary, so a PHP-rendered avatar could differ from the JavaScript one by0.0001in a rotate/translate transform or color angle for certain seeds. Output is now byte-identical across languages. - Core (PHP): Initials are now derived correctly from seeds containing
multibyte letters such as
üorô. The quote-stripping step was missing the/u(Unicode) flag, so it removed raw UTF-8 bytes and corrupted those letters: e.g.überandcôtéproduced wrong or empty initials instead ofÜB/CÔ. The PHP output now matches the JavaScript reference. - Core: Range options (
scale,borderRadius,rotate,translateX/translateY, and per-color angle/fill-stops) given as a single-element array[n]are now treated as the fixed valuen(identical to the scalarn), and an empty array[]falls back to the option's default. Both forms are permitted by the schema. Previously the behavior diverged: the JavaScript library emittedNaN(e.g.scale(NaN)), while PHP dropped[n]to the default. All three now agree.
10.0.1 - 2026-05-29 #
Fixed #
- CLI:
dicebear --versionanddicebear --helpno longer fail by trying to read a file named--version/--help. The definition path is now resolved via the argument parser, so flags (and the values they consume) before the path are handled correctly, e.g.dicebear --json my-style.jsonanddicebear --count 2 my-style.json.
10.0.0 - 2026-05-27 #
See the v10.0.0 release notes.
Added #
- 6 new avatar styles: Disco, Glyphs, Initial Face, Shape Grid, Stripes, and Triangles.
- PHP library: A new PHP implementation that produces identical output to the JavaScript library when given the same styles and options.
- CLI support for custom styles: Generate avatars from a JSON style
definition, e.g.
dicebear ./path/to/style.json --seed test --format svg. - Weighted variants: Assign weights to component variants to control how frequently each appears.
- Gradient support: Colors can be defined as gradients, including an angle parameter.
- Integrated validation: Built-in validation for avatar styles and options.
- Redesigned playground: Adjust options, upload custom styles, batch download avatars, and view the number of possible combinations.
- New tools: WCAG Contrast Picker and Bundle Size Estimator.
- Reorganized and improved documentation, with better style docs and component previews.
Changed #
- Each avatar style is now stored as a JSON definition file instead of JavaScript code, separating licensing concerns from implementation.
- Styles are now distributed via
@dicebear/stylesas JSON definitions. - The JavaScript API now uses
StyleandAvatarclasses together with definition imports. - BREAKING: Component options are now suffixed with
Variant(e.g.eyesVariantinstead ofeyes).
Removed #
- BREAKING: Individual style packages (e.g.
@dicebear/initials) have been removed in favor of@dicebear/styles.