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 100x-height 62r 44r 44baseline · stroke 12 · aperture 100°
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.

Variant
Options

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

xCO

paper · 0° · 14.46:1

xco.png ↓

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.

xCO-Berlin/Medulla

ink · 90° · 5.22:1

xco-berlin-medulla.png ↓

The inverse register, and the one mark carrying dusk — 5.22:1 here, which the accent variant permits at one instance per set.

xCO-Oceans Continuity Studio

ocean · 180° · 7.19:1

xco-oceans-continuity-studio.png ↓

Ocean, the documented structural blue. Dusk on it is a chroma clash, so both glyphs take paper.

xCO-India

group green · 270° · 3.48:1

xco-india.png ↓

Green and white, after the flag. Paper mark on green rather than the reverse — the parent already owns the paper ground.

xCO-Madrid

sand · 135° · 8.13:1

xco-madrid.png ↓

Sand. Teal and navy were the alternatives and both collapse in greyscale — against green at 1.12:1 and ink at 1.09:1.

xCO-Santiago

teal · 45° · 3.90:1

xco-santiago.png ↓

Teal, the open register: frontier, coastal. 45° puts it 135° from green, its value twin at 1.12:1.

xCO — Positions & Options Stewards

navy · 315° · 15.71:1

xco-positions-options-stewards.png ↓

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°.

xCO — Learning System

group lilac · 225° · 8.35:1

xco-learning-system.png ↓

Light violet. 225° sits between ocean and green, so colour alone had to separate it from both: 4.15:1 and 2.01:1.

xCO — Capital

group amber · 0° · 7.44:1

xco-capital.png ↓

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.