A seed is a name for a whole theme, and the exports can't disagree
Ornament turns one seed into a palette, procedural SVG art, and three exports (CSS tokens, a terminal theme, a wallpaper) that are guaranteed to match, because they're all functions of that seed.
Pick "Nord" in any theme generator and you get the exact swatch everyone else got. Then you want those colors three ways, as CSS variables for a web project, as a scheme for your shell, as a wallpaper for the desktop behind both, and now you are in three separate tools picking the color three separate times, with no promise the three ever line up. A lookup table wearing a generator's clothing, run three times, drifting a little each time.
Ornament starts from one word instead. Type a seed, pick a motif family, and it draws a palette and a piece of generative art, then exports the same theme as CSS custom properties, a 16-color terminal scheme, and a tiled SVG wallpaper. The point is not that it makes three files. It is that the three files cannot disagree.
Why a seed is a durable name
Under the hood the seed is a string, and a string is not a random number, so Ornament runs it
through two small, old, well-understood functions: xmur3
hashes the word into a 32-bit integer, and mulberry32 turns that integer into a fast,
deterministic stream of pseudo-random values. Every generator in the app, the hue math, the
curve parameters, the star positions, draws from that stream and nothing else. There is no
Math.random() anywhere in the core.
That determinism is the whole feature, not a nicety. Because the RNG is seeded, the seed
first-light reproduces the exact same palette and pattern for anyone, forever. A seed becomes
a durable, shareable name for a theme: you can text someone six characters and they get your
colors, byte for byte, with no file attached. The address bar reflects ?seed=&family= on
every change, so any studio state is already a link.
One bundle, three exporters
Here is the part that makes the sync a guarantee rather than a promise. The generators run once
and produce a single { palette, motif } bundle. Then each exporter, CSS, terminal, wallpaper,
is a pure function of that same bundle. The terminal theme does not re-pick colors; it reads
them out of the palette the CSS also reads out of. So the accent is the accent is the accent,
in all three files, because it was only ever computed once.
You can see it in the numbers. Seed first-light on the Astro family gives
--ornament-accent: hsl(48 55% 55%). That string is byte-identical to the yellow key in the
seed's terminal theme and the accent stroke in its wallpaper. Change the seed and all three
move together, in lockstep, because they are all downstream of the same six characters. It also
means adding a fourth export format later, a VS Code theme, say, never touches the generators;
it just consumes the bundle everyone else already consumes.
And the art is real art, not clip art with the colors swapped. The Nouveau family generates parameterized Bezier whiplash curves, the long confident sweeps of art-nouveau ironwork; the Astro family builds a constellation chart by scattering stars from the seed and linking them into a random spanning structure, the way a star map connects points into figures. Both render straight to SVG, so the wallpaper is resolution-independent and the same markup tiles cleanly at 1080p, 1440p, or 4K.
The honest limitation: there are two motif families today. Nouveau and Astro cover a lot of ground between flowing organic and sparse geometric, but they are two moods, not twenty. The architecture is built so a third generator plugs in without disturbing the exporters, and that is the next thing I want to add; right now, though, it is two.
Try it
Open Ornament, type any word into the seed box or hit New seed for a random one, and watch the palette and pattern draw in. Toggle between Nouveau and Astro, nudge the strand or star count, and when a seed feels like yours, click Export CSS, Export terminal theme, and Export wallpaper. Drop the tokens into a project, the scheme into your shell, the SVG behind both, and for the first time the three will actually match. If you would rather read the generator than trust it, the whole thing is on GitHub.
This post is part of the build log: every app my automated factory ships gets written up here, honestly. Browse everything at apps.charliekrug.com. Comments are open below.
Loading comments…