Skip to main content
← Home
The Such Software monogram and wordmark

The identity

The CORPORATE Such Software identity: the SUCH monogram, the wordmark, the four-colour system, and its facet fields. Every product pack (barns, bauhaus-echo, bloomword, suchoice, vegan-iq, smirk, wownero) is its own brand; this one is the parent.

Pack such-software version 3.0.0. Every value on this page is generated from one source file. Nothing here is typed by hand, and a gate refuses if this page drifts from the pack that produced it.

Colour

Four colours, one per letter of the monogram. They are the categorical palette: the colour is carrying the meaning, not decorating it.

light theme, on #f7f8fa

S#1a5c387.51:1 against the ground
U#b836705.2:1 against the ground
C#176a925.63:1 against the ground
H#12857e4.22:1 against the ground

dark theme, on #0a0a0a

S#35925c5.11:1 against the ground
U#e8689e6.51:1 against the ground
C#4aade07.87:1 against the ground
H#3ad4c610.76:1 against the ground

What the palette measures

A categorical palette is only as good as its closest pair, so the number that matters is the smallest perceptual distance in the set, measured in CIEDE2000 and then measured again through each kind of colour-vision deficiency. The pair that binds moves between them, which is why we check all four rather than the common one.

VisionLight: closest pairDark: closest pair
Normal visionH/S at dE 19.03H/S at dE 23.85
Deuteranopia (no green cone)H/U at dE 9.76H/U at dE 11.91
Protanopia (no red cone)C/U at dE 8.23C/U at dE 14.71
Tritanopia (no blue cone)C/H at dE 7.33C/H at dE 7.45

These are reported, not graded. In the full monogram each letter also has a distinct shape, so identity survives where hue does not; the measurement matters most on the reductions where colour is the only signal left.

Text roles

Each role resolves its own colour per theme, so the contrast quoted is against the ground the text is actually painted on.

accent glyph_u
dark: #e8689e on #0a0a0a = 6.51:1 meets AA
light: #b83670 on #f7f8fa = 5.2:1 meets AA
body ink
dark: #f7f8fa on #0a0a0a = 18.63:1 meets AA
light: #0a0a14 on #f7f8fa = 18.53:1 meets AA
subtitle muted
dark: #5b6472 on #0a0a0a = 3.31:1 meets AA
light: #5b6472 on #f7f8fa = 5.63:1 meets AA
title ink
dark: #f7f8fa on #0a0a0a = 18.63:1 meets AA
light: #0a0a14 on #f7f8fa = 18.53:1 meets AA

Type

One family, used at a declared scale. The wordmark is the only place a weight is pinned.

body
'Manrope', 'DM Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif
display
'Manrope', 'DM Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif
mono
ui-monospace, 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace
body 13pxcaption 11pxlabel 12pxsubhead 15pxtitle 34pxwordmark 78px

Motion

Named durations and easings, so an animation's timing is a value in the pack rather than a number somebody measured once by hand.

draw 1600ms ease-in-outfade 400ms ease-outframe 900ms ease-outgrow 520ms ease-out-backmorph 900ms ease-in-outpulse 3000ms linearsettle 420ms ease-in-outsplash 1337ms ease-in-outsymbol_hold 1100ms linear

Facets

The only part of the mark that varies. A facet may add a field, a wordmark or a travelling signal; it may not redraw a letter. That constraint is the difference between one system and several logos.

circuit 11 nodes, 1 route

RESTORED 2026-08-15 by direction: this is the authored anim1_pulse route back in charge, ending `h 58` per the static master (anim1 stopped 6 units short at `h 52`; the disagreement is recorded in docs/architecture/brand-mark.md). The 2026-08-02 weaving re-route (two vertical buses crossing seven strokes) is retired -- crossing the letters read as damage, and the beloved site animation never crossed anything. What the generator still improves over the authored file: the corrected U renders behind it, the node delays are measured off the trace instead of hand-estimated ~17% fast, it is CSS instead of SMIL so prefers-reduced-motion actually works, and both themes come from one source.

games 9 nodes, 1 route

RESTORED 2026-08-15 by direction, and REVERSED: the arch is the original symmetric parabola, but the signal now departs from the bottom-RIGHT foot and lands at bottom-LEFT, because the pulse should finish bottom-left. Where the arch passes a letter it passes BEHIND it (the field threads; see fields._note) -- the descending legs are occluded by the letterforms they cross, never drawn over them. `particle: rocket` gives the pulse a vehicle: the travelling dash becomes the exhaust behind a small rocket riding the arc nose-first (see brand_mark._particle), which is what a launch arc was always asking for.

cascade 9 nodes, 19 branches, depth 230.08 of 1091.62 total

An ion entering matter, scattering off nuclei, throwing recoils, and stopping. The other two facets are designed routes: circuit is a bus, games is an arch. This one is a TRAJECTORY, generated by tools/gen_cascade_field.py from seed 20260906 and pasted here as a literal like the others, so the geometry is reviewable in a diff. A node marks where a track stopped, not a via: in SRIM the range distribution is the result and the individual path is only how it got there. This is the facet that connects the corporate mark to the nuclear work, to Bloomword's branching trees, and to the creature body plans, which are all the same shape of idea.

Why it is the way it is

The reasoning behind the mark, kept in the pack next to the values it argues for. It is here because a guideline nobody can question is a rule, and a decision with its reasoning attached is a design.

Why four colours

_palette_note

Four glyph colours ARE the categorical palette: green/magenta/blue/teal, one per letter of S-U-C-H. They are never assigned by data; letter position owns the colour, so the mark reads identically everywhere. Dark variants are the light hues lifted for contrast on #0a0a0a, not separate brand colours. Every value here must be a bare hex string: style/tokens.py iterates this map and parses each entry as a colour, so a prose note among them is a crash, not a comment. Annotations live in the sibling _notes block.

How the monogram is drawn

glyphs._note

The authored dark master had a divergent U (…9.85,14 22,14 … 22,-1.85 22,-14) against the light master's (…9.85,16 22,16 … 22,-3.85 22,-16). That is exactly the hand-maintenance drift this pack exists to end: the LIGHT master is canonical and both themes now render from these paths. The site's beloved anim1_pulse.svg still carries the divergent U, which is why it is now generated rather than kept by hand.

The U's bowl

glyphs._u_note

Bowl depth 16 -> 13 (and the control -3.85 -> -3.1 to hold the curve's shape ratio). At 16 the U stood 50 tall against S and C at 46, roughly 7% oversized, and hung 4.1 units below its row so the top row did not read as a unit. This is the ONE change that edits path data, so brand_mark --verify now fails against the authored masters in Documents/suchsoftware/media/corp/logo/. That is intended: this pack is canonical and those files are the historical record.

The tile and its grid

geometry._note

One 200x200 tile. The four glyphs sit on a 2x2 grid: S and C in the left column, U and H in the right. Stroke geometry is invariant across every tier (T0 flat to T3 extruded) per design/graphics-settings.md — only material and depth change.

Why the frame radius is 12

geometry._frame_note

radius 12, not 16: at inset 14 inside an rx-26 tile, 16 is not concentric and the corners read loose. frameless_scale spends the margin the frame vacates, which is what makes 16px legible.

The column offset

geometry.grid._note

Columns sat 26 units apart against 18 for the rows, so the mark bound vertically and read as four objects instead of the word SUCH. Moving each column 3 inward closes the gutter to 20. Applied as a transform; path data is the cross-tier invariant.

The wordmark row

lockup._note

The horizontal lockup: the 200x200 tile untouched at the left, wordmark set to its right. The tile keeps its own viewBox origin so the monogram is byte-identical between the standalone mark and the lockup — the wordmark is added beside it, never a redraw of it.

Why two facets became three, and why three were cut

fields._note

The FACET layer, and the only part of the mark that varies. Such Software is the circuit substrate that carries everything (`circuit`, the corporate default) and the one thing that gets to leave the grid (`games`). There were five: commerce, crypto and education were cut because they were the same idea drawn three more times -- crypto was circuit with square nodes, and a viewer cannot tell a 'checkout' route from a 'decay track' route without the label. Each facet is a route through geometry.channels plus the nodes along it. Nothing else changes: same tile, same frame, same monogram, same drawing grammar, same 2px stroke. Facets differ by ROUTE, not by new primitives. The field THREADS: it is drawn under the monogram, so wherever a route passes a letter it is occluded and reads as passing behind. The 2026-08-02 weave experiment (routes crossing IN FRONT of letters through declared zones) was retired by direction on 2026-08-15 -- crossing the letterforms read as damage on both facets, and the authored site animations everyone already loved never crossed anything. The weave machinery in _grammar stays as a tested, dormant capability.

How a field is drawn

fields._grammar._note

The shared drawing grammar. opacity_light rose from 0.18 to 0.46 (dark 0.22 -> 0.52) with the weave: at 0.18 the field read as the faint grey construction guides it was mistaken for, and a line that is going to interlock with the monogram has to look like it is there. It still cannot compete -- it is a 2-unit stroke against the glyphs’ 14 at full saturation, so roughly a twentieth of the visual mass per unit of length -- and it sits in the same register as the frame at 0.45, which is the hierarchy: monogram, then frame and field together, then nothing.

What a weave is

fields._grammar.weave._note

How a strand that rides in FRONT of a glyph is drawn. Two coincident strokes on the same `d`, masked to the letterform: a `casing` in the tile background colour, and the `core` in the field colour on top of it. The casing is the whole trick -- it is the cartographer’s bridge casing, and it is what makes the crossing read as a strand passing over rather than as a scratch across the letter. Without it the core sits directly on glyph colour and the two interfere: over U (#b83670) a #1a5c38 line is legible but reads as damage, and over S it would be green on green and vanish. The widths are the result of rendering the range and looking: casing 6 cut 43% out of a 14-unit glyph stroke and the letter came apart at the crossing, casing 3.5 closed up to a scratch. 4.5 leaves 4.75 units of letter either side, which still reads as one stroke interrupted. core is wider than the base stroke (2.5 against 2) and near-solid against the base field’s 0.46 because the near strand of a weave should carry more weight than the far one -- the eye reads contrast as depth.

Where a field may cross a letter

fields._grammar.weave._zones_note

Where a field is ALLOWED to ride over a glyph, as [x0,x1,y0,y1] boxes in tile space. A letter absent from this map may never be ridden over -- which is why the depth rule comes out as "behind the left column, in front of the right": the S and the C have nowhere safe to be crossed. The test is whether the crossed span is anchored at BOTH ends. The U’s bowl and the H’s crossbar are, so interrupting one leaves both remaining pieces attached to something and the letter still reads. Every other span in the monogram ends in a free terminal: cut the U’s right stem and the piece above the cut is holding on to nothing, and the letter reads as broken rather than as crossed. Both boxes are the middle of a span and sit on the letter’s own axis of symmetry, which is also where a crossing looks deliberate rather than incidental. A route must additionally meet the span SQUARE-ON: a traversal much longer than the 14-unit glyph stroke means the trace is shearing along the stroke and shaving a wedge off its edge, which is the defect that ruled out the old games arc across the U’s right stem (29 units for a 14-unit stroke).

The circuit route

fields.circuit._trace_note

RESTORED 2026-08-15 by direction: this is the authored anim1_pulse route back in charge, ending `h 58` per the static master (anim1 stopped 6 units short at `h 52`; the disagreement is recorded in docs/architecture/brand-mark.md). The 2026-08-02 weaving re-route (two vertical buses crossing seven strokes) is retired -- crossing the letters read as damage, and the beloved site animation never crossed anything. What the generator still improves over the authored file: the corrected U renders behind it, the node delays are measured off the trace instead of hand-estimated ~17% fast, it is CSS instead of SMIL so prefers-reduced-motion actually works, and both themes come from one source.

The games arch

fields.games._trace_note

RESTORED 2026-08-15 by direction, and REVERSED: the arch is the original symmetric parabola, but the signal now departs from the bottom-RIGHT foot and lands at bottom-LEFT, because the pulse should finish bottom-left. Where the arch passes a letter it passes BEHIND it (the field threads; see fields._note) -- the descending legs are occluded by the letterforms they cross, never drawn over them. `particle: rocket` gives the pulse a vehicle: the travelling dash becomes the exhaust behind a small rocket riding the arc nose-first (see brand_mark._particle), which is what a launch arc was always asking for.

The games nodes

fields.games._nodes_note

Placed BY the curve, not by eye: every coordinate is svgpath.point_at at a chosen phase, so each node sits exactly on the route. Near-even eighths; the apex node at (100,20) is the largest, because a launch arc has one moment that matters.

The cascade

fields.cascade._note

An ion entering matter, scattering off nuclei, throwing recoils, and stopping. The other two facets are designed routes: circuit is a bus, games is an arch. This one is a TRAJECTORY, generated by tools/gen_cascade_field.py from seed 20260906 and pasted here as a literal like the others, so the geometry is reviewable in a diff. A node marks where a track stopped, not a via: in SRIM the range distribution is the result and the individual path is only how it got there. This is the facet that connects the corporate mark to the nuclear work, to Bloomword's branching trees, and to the creature body plans, which are all the same shape of idea.

The travelling signal

pulse._note

Three dashes at staggered phases of the same loop, lifted from the authored anim1_pulse.svg (which hardcoded len/gap pairs against one trace's 598-unit length, and one begin= per node measured by hand). `phase` is a fraction of the loop; the gap is computed as total_length - len so a single dash is in flight per element regardless of which facet route it runs on. node_grow is the radius multiplier at the moment the signal arrives.

The readability floor

mark._note

The mark's rendering contract. This block used to be called `grade`, which is a SCHEMA-DEFINED key meaning the colour grade (tonemap/exposure/contrast/saturation/glow/vignette/grain) — backends/svg.py reads grade.vignette and grade.grain from it, and style/tokens.py emits every entry as a GRADE_* Godot constant. The corporate pack was quietly answering a different question than the one being asked. At or below min_tile_px the frame and the field are dropped and only the four glyphs render: the readability floor from design/graphics-settings.md. The glyph is invariant; the frame and the field are decoration. draw_stagger_ms lives here rather than in motion.draw because the pack schema closes motion entries to ms/curve/note so renderers can treat them uniformly — stagger is a composition rule, not a curve.

The four-circle reduction

dots._note

The four-circle reduction: one disc per glyph cell, each carrying its letter's colour. The centres are MEASURED, not authored -- x snaps to channels.axis_left/axis_right (the same axes the fields cross on) and y to the mean of each row's glyph-box centres, so the dots track the letterforms if the grid ever moves. Radius 24 gives a 48-unit disc against glyph cells 46-47 tall: the dot carries the same visual mass as the letter it stands for. This is the seed state of the morph (dot -> pillar symbol -> letter) and its own favicon: at 16px four discs survive where four letterforms are mush.

The pillar symbols

symbols._note

Nerd Font glyph outlines extracted once to path data, so nothing depends on the font at render time and the fills inherit brand colour. Emoji could not do this: they are baked multicolour bitmaps and would fight the palette. Each symbol maps to the letter it becomes: cart->S commerce, btc->U crypto, dog->C the doge/Wownero line, atom->H the science and education work. Normalised into a 0..100 box; the renderer scales and centres each into its glyph cell. `pillar` names the company pillar the symbol stands for, and is the identity a standalone pillar tile is filed under. tile_scale is the symbol's span as a fraction of the tile when it IS the tile (the pillar logos): 1.16 fills the frame's interior with the same breathing room the monogram keeps.

The effects

fx._note

Display treatments of the clean mark, emitted into brand/fx/. These replace the four hand-made one-offs that lived only in ~/Build (2026-08-02, no generator committed -- the exact drift this pack exists to end). Each is the clean tile plus an overlay; the monogram geometry is never redrawn. `shine` is the only animated one and parks as the clean mark under prefers-reduced-motion.

What this guide does not say

A guide that fills a gap with a plausible number is worse than one that names the gap.

  • clearspace: No pack key declares an exclusion zone. `geometry.frame.inset` is the frame's inset inside the tile, which is a different measurement, and promoting one to the other would invent a rule.