Skip to content
Early access Kaleidoscope needs a key to run. Email contact@kleosresearch.xyz and we will send you one.

Brand assets

Three marks belong to one system, and all of them are generated from a single geometry table in the brand/ folder. This page renders every file in that folder so you can see which drawing a file name refers to, and on which ground it is meant to sit.

Half of these marks are drawn in ink for paper and half in bone or brass for a dark ground, so a contact sheet on one background hides half of them. The light panels below are painted #EAE7E0 — the value the bone theme calls raised, and the same value this site calls --k-ink. One hex, doing both jobs.

This is the part that gets applied wrong, so it is first. Which brand a surface wears, and on which stock, is not a taste call:

domainbrandstocktheme
kleosresearch.xyzKleos — the lab, the front doorbone #F4F2ECkleos-light
memory.kleosresearch.xyzKaleidoscope — the productink #0B0B0Ckaleidoscope-dark

Crossing the subdomain crosses the stock. The subdomain is the tagline: memory. says what the product does before the page loads. This site is the second row, which is why every panel on it is ink and why brass appears here and nowhere else.

The brand/ folder holds one generator, build.py, and four geometry tables. Running it writes all 40 SVGs and, with --png, all 26 rasters:

Terminal window
python3 brand/build.py --png

Every generated file opens with the line Kleos brand system — generated by brand/build.py. Do not hand-edit. Take that literally. To change a mark, change the table and run the generator again; editing an SVG by hand produces a file that the next run silently reverts, and in the meantime the copy you edited disagrees with every other size of the same drawing.

Four files in brand/ are hand-maintained rather than generated: the README, the generator, and the two token exports. The tokens are republished here as kleos-brand.css.

Copies of these marks exist in other repositories. brand/ is the only source; a copy that disagrees with it is wrong, and the fix is always to re-copy rather than to redraw.

Six values per theme, and the only difference between the two themes is that brass takes a darker cut on bone so it clears contrast. Same hue, not a second colour.

The product, on ink. These six are the palette this site is painted in.

bg
#0B0B0C
raised
#131315
rule
#232325
muted
#8C887F
ink
#EAE7E0
brass
#CFA757

The lab, on paper. Nothing on this site is painted in these; they are here because the marks below are drawn for them.

bg
#F4F2EC
raised
#EAE7E0
rule
#D8D4C9
muted
#6A675F
ink
#141310
brass
#8A6A22

Constant across both stocks. Do not re-theme them.

icon-tile
#0E0D0C
copilot-tile
#17161C
copilot-sky
#5FB2EC
copilot-sky-hi
#9BD4FF
copilot-sky-lo
#4593D8
copilot-sky-text
#2F79B5

The last one is a text token. Sky at #5FB2EC fails contrast as type on paper, so links there take #2F79B5 instead. It is never used to fill an icon.

Two full-width rules with the record between them. This is the house mark: the lab, the organisation, and the endorsement line “a kleos project” at the foot of this page.

The bars thicken and lengthen as the mark shrinks, so the three elements stay separable. Pick the cut by the tile you are drawing into, never by scaling one file. Every cut ships three ways: currentColor for inline HTML, and two hardcoded variants for contexts that cannot inherit a colour.

tilebarsinheritson boneon ink
48px and up48×7kleos-mark.svgkleos-mark-ink.svgkleos-mark-bone.svg
40 and 6452×9kleos-mark-40.svgkleos-mark-40-ink.svgkleos-mark-40-bone.svg
3254×10kleos-mark-32.svgkleos-mark-32-ink.svgkleos-mark-32-bone.svg
1656×12kleos-mark-16.svgkleos-mark-16-ink.svgkleos-mark-16-bone.svg

Kleos never drops its centre square, at any size. Only the Kaleidoscope app-icon ladder does that.

All five rendered at 56px, so the cuts can be compared. In use they would be 16, 32, 40 and 48-and-up.

Kleos mark, base cut
kleos/kleos-mark.svg
currentColor · any stock, inline only
Kleos mark in ink, base cut
kleos/kleos-mark-ink.svg
ink #141310 · base cut, on bone
Kleos mark in ink, 40 cut
kleos/kleos-mark-40-ink.svg
ink · the 40 and 64 tiles
Kleos mark in ink, 32 cut
kleos/kleos-mark-32-ink.svg
ink · the 32 tile
Kleos mark in ink, 16 cut
kleos/kleos-mark-16-ink.svg
ink · the 16 tile, fattest bars

The first cell is the currentColor file. Loaded through an img element it cannot inherit anything and falls back to black, which is why the hardcoded variants exist at all. Inline the file in your markup and it takes the colour of its parent.

Kleos mark in bone, base cut
kleos/kleos-mark-bone.svg
bone #EAE7E0 · the endorsement cut
Kleos mark in bone, 40 cut
kleos/kleos-mark-40-bone.svg
bone · the 40 and 64 tiles
Kleos mark in bone, 32 cut
kleos/kleos-mark-32-bone.svg
bone · the 32 tile
Kleos mark in bone, 16 cut
kleos/kleos-mark-16-bone.svg
bone · the 16 tile

Kleos is ink on bone, and that is the identity rather than an exception: a tiled mark reads against light browser chrome and dark browser chrome alike, which a bare transparent mark does not. Each tile below is rendered at its own size.

The hairline ring is inset, not outset. An icon canvas has no outside, and at 16px that one pixel is the entire margin — the ring closes on the bars and the mark turns to mush. So 16 ships without a ring; 32 and up keep it.

Kleos avatar tile, 16 pixels
kleos/avatar-16.svg
16 · no ring, by design
Kleos avatar tile, 32 pixels
kleos/avatar-32.svg
32 · inset hairline #C3BEB1
Kleos avatar tile, 40 pixels, circular
kleos/avatar-40.svg
40 · circular, the org avatar
Kleos avatar tile, 64 pixels
kleos/avatar-64.svg
64 · square, ringed
Kleos avatar tile, 180 pixels
kleos/avatar-180.svg
180 · apple-touch: square, unringed, because iOS applies its own mask
Kleos favicon
kleos/favicon.svg
byte-identical to avatar-32 · one file has to serve 16 and 32

The 40 is the only circular tile in the system.

One bar swept four times about the centre with a falling opacity cascade, plus the centre square the Kleos mark also has. That shared square is the entire relationship between parent and product.

Two rules govern this mark and neither is negotiable. The cascade is the mark: flatten the four bars to one opacity and it reads as a static frame rather than a rotation, which is a different logo. And the centre is a square, never a circle — a circle severs the link to Kleos.

tilebarscentreinheritson inkon bone
display28×7yeskaleidoscope-mark.svgkaleidoscope-mark-brass.svgkaleidoscope-mark-brass-on-bone.svg
6428×8yeskaleidoscope-mark-64.svgkaleidoscope-mark-64-brass.svgkaleidoscope-mark-64-brass-on-bone.svg
3230×10droppedkaleidoscope-mark-32.svgkaleidoscope-mark-32-brass.svgkaleidoscope-mark-32-brass-on-bone.svg
1632×12droppedkaleidoscope-mark-16.svgkaleidoscope-mark-16-brass.svgkaleidoscope-mark-16-brass-on-bone.svg

Read that ladder as what it is: the macOS app-icon ladder, where the art sits inside a squircle at those pixel sizes. Below 32 the centre square fills in and muddies, so it comes out — but only there. For an inline mark in running interface work, a header, a footer, a lockup, use the display cut with its centre square even at 20px. The mark in this site’s header is that cut at 18px.

Kaleidoscope mark in brass, display cut
kaleidoscope-mark-brass.svg
brass #CFA757 · display cut, centre square
Kaleidoscope mark in brass, 64 cut
kaleidoscope-mark-64-brass.svg
brass · 64 tile, centre square
Kaleidoscope mark in brass, 32 cut
kaleidoscope-mark-32-brass.svg
brass · 32 tile, no centre
Kaleidoscope mark in brass, 16 cut
kaleidoscope-mark-16-brass.svg
brass · 16 tile, bars reach the edge

Brass darkens to #8A6A22 on paper. It is the same hue pulled down until it clears contrast, not a second brand colour, and it appears on no surface this site paints.

Kaleidoscope mark, display cut
kaleidoscope-mark.svg
currentColor · the inline file, black through an img
Kaleidoscope mark in darkened brass, display cut
kaleidoscope-mark-brass-on-bone.svg
brass #8A6A22 · display cut
Kaleidoscope mark in darkened brass, 64 cut
kaleidoscope-mark-64-brass-on-bone.svg
64 tile, centre square
Kaleidoscope mark in darkened brass, 32 cut
kaleidoscope-mark-32-brass-on-bone.svg
32 tile, no centre
Kaleidoscope mark in darkened brass, 16 cut
kaleidoscope-mark-16-brass-on-bone.svg
16 tile, no centre

Brass on its own dark tile, which is the inverse of the Kleos treatment and gets to the same place: the icon reads against light or dark browser chrome because it brings its own ground. Shown here on bone so the edge of that tile is visible. The squircle sits at 824/1024 of the canvas, with the art inset a further step inside it.

The squircle is the only rounded thing in the system. Marks are always sharp-cornered.

Kaleidoscope app icon, 16 pixels
kaleidoscope/app-icon-16.svg
16 · three blades of cascade, no centre
Kaleidoscope app icon, 32 pixels
kaleidoscope/app-icon-32.svg
32 · no centre square
Kaleidoscope app icon, 64 pixels
kaleidoscope/app-icon-64.svg
64 · last size that keeps the centre
Kaleidoscope app icon, 128 pixels
kaleidoscope/app-icon-128.svg
128 · its own cut, not the 1024 scaled
Kaleidoscope app icon master
kaleidoscope/app-icon-1024.svg
the master · shown at 180 · every raster comes from here
Kaleidoscope favicon
kaleidoscope/favicon.svg
byte-identical to app-icon-32 · this is /favicon.svg here

The one fixed point in the system. A blade rotated six times, filled with a sky gradient from #9BD4FF to #4593D8, over a dark hub and a sky dot, on the #17161C tile at every size. Never recoloured for a surface, never inverted onto paper, never given a light-mode variant. The stock around it varies; the icon does not.

Its small-size simplification is the one Kaleidoscope makes with its centre square: at 16 the blade count drops from six to three, because six will not survive.

The first three files carry no tile of their own. They are transparent, and the consumer has to place them on #17161C, which is what the panels below do.

0xCopilot turbine, base cut
0xcopilot/turbine-mark.svg
base · six blades, hub #0D0C10, dot #5FB2EC
0xCopilot turbine, 32 cut
0xcopilot/turbine-mark-32.svg
32 · thicker blades, larger hub
0xCopilot turbine, 16 cut
0xcopilot/turbine-mark-16.svg
16 · three blades, not six
0xCopilot app icon
0xcopilot/app-icon.svg
the only 0xCopilot file that ships its own tile

Each of the four uses a different gradient identifier, so several can be inlined on one page without colliding.

Twenty-six PNGs, written by the same run with --png. Use them where an SVG cannot go: an operating system icon slot, an email, a store listing.

FamilySizesRasterised from
kaleidoscope-app-icon1024, 512, 256, 128, 64, 32, 16app-icon-1024.svg
kaleidoscope-favicon180, 32, 16kaleidoscope/favicon.svg
kaleidoscope-mark-brass1024, 256, 64kaleidoscope-mark-brass.svg, transparent
kleos-favicon180, 32, 16avatar-180, avatar-32, avatar-16 — each its own cut
kleos-avatar400avatar-40.svg, the circular cut
kleos-mark-ink1024, 256, 64kleos-mark-ink.svg, transparent
kleos-mark-bone1024, 256, 64kleos-mark-bone.svg, transparent
0xcopilot-app-icon1024, 256, 640xcopilot/app-icon.svg

Two things in that table are worth knowing before you use it.

The Kleos favicon rasters each come from the tile carrying their own optical cut, so the 16 is the 16 drawing and not the 180 scaled down. The Kaleidoscope app-icon rasters do the opposite on purpose: all seven come from the 1024 master, so the 32 and 16 PNGs carry the centre square that the 32 and 16 SVG cuts drop. If you need the optical cut at those sizes, take the SVG.

No wordmark lockup exists as an asset, and one should not be added. An SVG carrying live text renders differently wherever the typeface is absent, which turns the lockup into a trap. Set wordmarks in HTML with the webfont instead:

wordmarkfaceweighttrackingcase
KLEOSNewsreader400.055em, .05em below 14px, .06em at 14pxupper
KaleidoscopeNewsreader4000sentence

Newsreader is never set bold. Inter carries interface text; JetBrains Mono carries metadata, uppercase and tracked. 0xCopilot runs its own stack — Space Grotesk for display, Instrument Sans for body, the same mono.

There is also no .ico in brand/. The generator writes SVG and PNG only, so the favicon.ico this site serves was assembled by hand around canonical pixels and nothing regenerates it when a mark changes. Treat it as the one file here that can go quietly stale.

Worth stating so nobody fills the gap by redrawing something.

The 0xCopilot set is the thinnest. It has no macOS-grid app icon of the kind Kaleidoscope has — one tile inset at 824/1024 rather than filling the canvas — and its raster ladder stops at 1024, 256 and 64, with no favicon or apple-touch rungs. Surfaces that need those sizes have been cutting their own, which is how a mark ends up with two versions of its corner radius. The fix belongs in the geometry table, not in the surface.

The README in brand/ still carries a warning that this domain ships the wrong mark, no favicon and a half-wired theme. That was true when it was written and is not true now: the header mark here is the canonical display cut, the four icon links and the theme colour are wired, and the whole palette resolves. The mark on every page of this site is checked geometrically at build time — bar count, rotation angles, the opacity cascade, the centre square, and the absence of any rounded corner — so it cannot drift back without the build refusing.