Logo
[v0.2]The xCO logotype is constructed, not typeset. Every glyph is drawn from one circle radius and one stroke weight, so the mark is exact at any size and renders identically with no fonts installed.
The C and the O are the same circle. The C is that circle with an aperture cut; the O is closed. Same geometry, different openness — the optionality argument stated in the letterforms rather than described alongside them.
The lowercase x is the operator acting on them. Its reduced height is not a stylistic choice: it encodes the naming rule as a visual fact.
Construction
Everything derives from the cap height. Change it and the mark scales exactly — there are no independent values to keep in sync.
- Cap height
- 100
- the base unit
- Stroke
- 12
- single weight, all glyphs
- x-height
- 62
- cap ÷ φ
- Radius
- 44
- shared by C and O
- Aperture
- 100°
- the C's opening
- Gaps
- 14 / −10
- x→C / C→O, measured
[rule] The two gaps are equal in optical space, not in metric distance. The C's aperture faces the O and pours white into that gap, so C→O is negative: the boxes overlap before the pair holds as much space as x→C. Measured, not eyeballed — npm run logo:spacing fails if the pairs drift more than 10% apart.
Scale
The mark holds down to 24px tall. Below that the aperture closes optically and the C reads as an O — use the wordmark in live text instead.
120px
72px
48px
32px
24px
16px — too small
Clear space
Clear space equals the x-height on every side, and it is already inside the file's viewBox. Place the mark flush and the spacing is correct — do not add your own padding on top.
Dashed line marks the file edge — the clear space is the gap between it and the glyphs.
Variants and downloads
Pick a variant, then take the file. SVG is the master format.
Download
SVG is the master. The letterforms are geometry, so the file renders identically with no fonts installed. PNG is rasterised server-side at the size you pick — use it only where SVG is not accepted.
View SVG source
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 160" width="320" height="160" role="img" aria-label="xCO — Expanding Civilizational Optionality">
<title>xCO</title>
<g fill="none" stroke-width="12" stroke-linecap="butt">
<path d="M 30 68 L 86 130" stroke="#20201e"/>
<path d="M 86 68 L 30 130" stroke="#20201e"/>
<path d="M 178.28 46.29 A 44 44 0 1 0 178.28 113.71" stroke="#20201e"/>
<path d="M 284 80 A 44 44 0 0 0 196 80 M 196 80 A 44 44 0 0 0 284 80" stroke="#20201e"/>
</g>
</svg>
[note] The descriptor lockup is the one part that is live text, set in DM Mono. It rasterises correctly to PNG because the exporter loads that face, but an SVG lockup opened on a machine without DM Mono will substitute the descriptor line. The glyphs themselves are unaffected. For third parties, send the PNG lockup or the plain SVG.
Aperture system
One device for any family of related marks — Signal groups today, anything needing a set tomorrow. Every mark is this same lockup with the C's aperture rotated: the logotype's own argument made literal, the same circle at a different openness.
[rule] A mark is ground and aperture. No pair may be weak on both channels at once.
Eight positions, 8 of 8 allocated
0°
45°
90°
135°
180°
225°
270°
315°
Registry
Parent group. The default ink variant, unrotated. Dusk on paper measures 2.77:1, under the non-text bar, so the accent sits on Berlin instead.
The inverse register, and the one mark carrying dusk — 5.22:1 here, which the accent variant permits at one instance per set.
Ocean, the documented structural blue. Dusk on it is a chroma clash, so both glyphs take paper.
Green and white, after the flag. Paper mark on green rather than the reverse — the parent already owns the paper ground.
Sand. Teal and navy were the alternatives and both collapse in greyscale — against green at 1.12:1 and ink at 1.09:1.
Teal, the open register: frontier, coastal. 45° puts it 135° from green, its value twin at 1.12:1.
Navy, the deep structural register — a group stewarding the positions themselves rather than a place. 315° clears both its value twin (ink) and its hue twin (ocean) by 135°.
Light violet. 225° sits between ocean and green, so colour alone had to separate it from both: 4.15:1 and 2.01:1.
The first mark to share an aperture: the parent's unrotated 0°, carried apart by ground — amber against paper at 1.94:1, with ink glyphs at 7.44:1. Of every ground and angle that holds the pair audit, this had the widest greyscale margin in the warm register.
With hue removed
What a colour-blind reader, a print run, or forced colours leaves behind. The apertures still separate every mark — which is the test of whether the second channel was ever real.
Pair audit
36 pairs. 0 weak on both channels. 16 rely on a single channel, each with the other channel far — listed below so the thin margins are visible rather than assumed.
xCO · xCO-Santiago
value 3.90:1 · angle 45° · ground carries it
xCO · xCO — Positions & Options Stewards
value 15.71:1 · angle 45° · ground carries it
xCO · xCO — Capital
value 1.94:1 · angle 0° · ground carries it
xCO-Berlin/Medulla · xCO-Madrid
value 8.13:1 · angle 45° · ground carries it
xCO-Berlin/Medulla · xCO-Santiago
value 3.71:1 · angle 45° · ground carries it
xCO-Berlin/Medulla · xCO — Positions & Options Stewards
value 1.09:1 · angle 135° · aperture carries it
xCO-Oceans Continuity Studio · xCO-Madrid
value 4.04:1 · angle 45° · ground carries it
xCO-Oceans Continuity Studio · xCO — Learning System
value 4.15:1 · angle 45° · ground carries it
xCO-India · xCO-Santiago
value 1.12:1 · angle 135° · aperture carries it
xCO-India · xCO — Positions & Options Stewards
value 4.52:1 · angle 45° · ground carries it
xCO-India · xCO — Learning System
value 2.01:1 · angle 45° · ground carries it
xCO-Madrid · xCO — Learning System
value 1.03:1 · angle 90° · aperture carries it
xCO-Madrid · xCO — Capital
value 1.09:1 · angle 135° · aperture carries it
xCO-Santiago · xCO — Capital
value 2.01:1 · angle 45° · ground carries it
xCO — Positions & Options Stewards · xCO — Capital
value 8.09:1 · angle 45° · ground carries it
xCO — Learning System · xCO — Capital
value 1.12:1 · angle 135° · aperture carries it
Rules
Two channels, never colour alone.
A mark is ground plus aperture. Colour is not reliable on its own — under deuteranopia the domain hues collapse, and in print or forced colours hue is gone entirely.
Never weak on both channels at once.
Grounds under 1.5:1 apart read as one tone in greyscale, and apertures within 45° read as one shape at listing size. A pair may be close on one, never on both.
The mark clears 3:1 on its ground.
WCAG 1.4.11 for non-text. Domain and accent colours mostly fail this as a mark on paper, which is why the glyphs are ink or paper in almost every case.
A hairline ring, in the mark's own colour.
Signal's dark list ground sits near ink, so an ink-ground mark has no edge without one and reads as a hole. Structure is drawn, not shadowed — so the answer is a hairline, applied to every mark for consistency.
45° steps only.
Eight positions. Half-steps are not used: at 48px a 22.5° difference is not readable, so it would be a channel that does not actually carry.
Documented tones first.
Go outside the palette only when it is exhausted or a specific reference is asked for. Group colours are declared in lib/group-marks.ts and never promoted to tokens — they identify a group, they do not mean anything.
No group takes a domain colour or a domain shape.
Those channels mean biophysical, institutional, technological, cultural. A group is a place, a track or a function — tagging it with a domain would be a false claim.
Thresholds: mark clears 3:1 on its ground · grounds under 1.5:1 are one tone in greyscale · apertures within 45° are one shape at listing size.
Adding a mark
Add an entry to lib/group-marks.ts and run npm run avatars. The generator fails the run if any pair ends up weak on both channels, and this page updates from the same registry.
[note] 9 marks on 8/8 apertures, every documented tone, plus 3 group colours — so apertures are now shared.
New marks share an aperture where the pair audit holds. When no ground can clear it, add a third channel: ring weight or a doubled ring fits best, since the hairline is already a system device. A 22.5° aperture step is not recommended — half-steps do not read at listing size.
Misuse
The mark carries the system's claim to precision. Breaking it breaks that claim.
✗ Don't retype it
The mark is drawn geometry, not set type. Never rebuild it in a font.
✗ Don't recolour freely
Three variants exist. The x may carry dusk; nothing else may carry colour.
✗ Don't stretch it
Scale proportionally. The stroke weight is tied to the cap height.
✗ Don't add effects
No shadows, gradients, outlines, or rounded caps. Terminals are cut flat.
✗ Don't reflow it
The gaps are optically tuned. Never re-space, stack, or reorder the glyphs.
✗ Don't box it
Clear space is built into the file. Do not add a frame or a container.