Style guide
The system
Reference: nautical charts and technical drawing sheets. Structure comes from a graticule of hairlines and a numbered rail, not from cards. Numbers are content. One accent, used only where it means something.
Principles
- Hairlines, not containers. Structure is drawn with 1px rules on a shared grid. No cards, no shadows, no rounded corners —
border-radius: 0is set globally and is a system rule, not an oversight. - Compression marks data. Anything that is a value rather than prose — a date, a period, a stack, a label — is set in the condensed width. This is what reads as technical. It replaces the monospace eyebrow that every other engineer site uses.
- Monospace is for code only. Nothing else on the site is monospaced. Reserving it keeps it meaningful.
- Numbers get room. Tabular figures everywhere, so columns of dates and durations align down the page.
- One accent, load-bearing. Magenta means active, current, or the one thing to click. It is never decoration. If a page has more than three magenta marks, one of them is wrong.
- Density is a courtesy. Do not pad to fill space. An engineer reading this should get a lot per screen.
Typeface
Archivo
Variable, weight and width. Carries every textual role on the site: display, headings, body, labels, data.
ABCDEFGHIJKLM
abcdefghijklm 0123456789
JetBrains Mono
Code blocks and inline code. Nothing else.
const slot = 09:00 — 10:00
{ ilI1 0O }
Width axis
- Condensed · 87%Labels, dates, periods, stacks
- Display · 94%Headings and titles
- Normal · 100%Body copy and long-form prose
Type scale
- DisplayEuan Cowie
- Page titleNotes from production
- LedeInfrastructure for places you cannot redeploy into
- Row titleShipping software to the North Sea
- BodySatellite links offshore are narrow, expensive and intermittent.
- LabelSelected work
- Data2023—Present · 4 min read
Colour
Surface
--paperGround. Cool drawing paper, not warm cream.
--paper-sunkCode blocks, insets, pressed states.
--paper-raisedForm fields.
Ink
--inkPrimary text. 16.9:1 on paper.
--graphiteSecondary text and body copy. 6.4:1.
--faintLabels and metadata. 4.8:1 — clears AA at 11px.
Linework
--ruleHairline. The graticule. Decorative.
--rule-strongSection boundaries. Decorative.
--fieldInteractive borders — inputs, buttons, pickers. 3.5:1, so it clears WCAG 1.4.11 for non-text contrast. Decorative rules do not need this; controls do.
Accent
--accentChart magenta. Lights, hazards, live things. 6.2:1.
--accent-quietSelection and focus halo.
Every value has a dark-mode counterpart defined in the same file. The dark palette is a night chart: deep blue-black, magenta lifted to stay above 4.5:1. Measured: ink 16.9:1 light / 15.1:1 dark, graphite 6.4 / 7.6, faint 4.8 / 5.1, accent 6.2 / 6.1. Switch your OS theme to see it — nothing here is hard-coded to a mode.
Components
Control strip
Actions share hairlines rather than floating apart. The first is the primary; hovering any of them fills with accent.
Row
The workhorse. Title and summary left, metadata right-aligned in condensed caps over a data line.
Shipping software to the North Sea
DevOps lead for a maritime detection product deployed on oil rigs, offshore wind farms and cruise ships.
Hybrid cloud / Kubernetes / CI/CD / Networking
Title block
Article metadata as labelled fields, like the block naming a drawing’s scale, date and revision.
Field
Rules of thumb
- Never introduce a second accent hue. If something needs to stand out and magenta is taken, use weight or a rule.
- Never add a border-radius, a shadow, or a gradient.
- Never use monospace outside a code block.
- Section rails are numbered in document order and reset per page.
- Vertical padding lives on
.sheet-body, never on the grid container — that is what keeps the rail hairline unbroken. - A new colour needs a contrast check against both palettes before it goes in. Text ≥ 4.5:1, interactive borders ≥ 3:1.
- Anything a person can click or type into is bordered with
--field, never--rule-strong.