Brand
Navy that speaks, one teal that never speaks, and a pale band to breathe between. Square controls against round containers. Motion that travels in a direction rather than decorating. The product's argument is that it tells you when it does not know, so the interface never performs a confidence it has not earned.
Foundations
The mark is settled. Ascent, adopted 31 August 2026: three slabs cut at 17.5 degrees, the same angle as the button chamfer. The two behind are strides already run and carry the ink, the one ahead carries the teal. Two values, and nothing in the drawing smaller than a slab, which is why it holds at 16px where the drawing it replaces did not. It supersedes the Field Guide mountain, which never got past “proposal” on this page.
The wordmark, and the one teal word
Space Grotesk 500 at −0.05em, lowercase. “trail” is ink and “wise” is teal, on light and dark alike. That is the single exception to the rule that teal is a fill and never a word, and it does not travel: a heading set in teal is still wrong. WCAG exempts logotype text from contrast, but the ratio is 2.5:1 on white and 2.0:1 on the sky band, which is why the wordmark has a floor. 24px cap height on white, 28px on sky. Below that, use the mark on its own. The wordmark and both lockups ship as outlines rather than live text, so they render correctly with no fonts installed: email, PDF, print.
Clear space and minimum size
Clear space on all sides equals the width of one slab, 12 units on the 72 grid. Below 24px on a plain background, use the favicon drawing: two slabs redrawn thicker, not the mark scaled down. On the ink tile the three slabs stay apart all the way to 16px, which is what the browser tab and the app icon use.
Ink and paper do the work. Teal is the one accent and it is a fill, never a word: at 2.5 against white it fails as text at every size. Where teal has to be read it becomes teal deep. Sky separates one section from the next and is never a full page.
--ws-ink#15344B12.93:1 · AADisplay type and dark surfaces
--ws-teal#03B8A52.5:1 · Never textThe brand. Fills only, never a word
--ws-teal-deep#00786C5.38:1 · AAThe text-safe teal
--ws-sky#E2F5FFSurface · ink 11.53:1The band that separates sections
--ws-paper#FFFFFFSurface · ink 12.93:1The default surface
--ws-body#00000021.0:1 · AABody copy is true black, not ink
--ws-duo#1C5F916.78:1 · AAThe blue every duotone photograph prints in
--ws-muted#6A7F8E4.17:1 · Large onlySecondary and axis text
Chart series · assign in this order, never cycled
Validated against white for lightness, chroma, colour-vision separation and contrast. All eight are safe where series sit next to each other, as in lines and bars. In a scatter or a small multiple, where any pair can meet, only the first three hold; past three, fold into Other or facet.
Sequential and diverging
Two families, and the split is strict. Space Grotesk at −0.05em is for anything that speaks. Noto Sans at +0.02em is for anything that explains. Hierarchy comes from size and weight, never from a third face. Emphasis is weight or colour, never italic.
Tissue takes load, adapts, takes more load, adapts again. When the load arrives faster than the adaptation can keep pace, the tissue does not fail on the spot.
Read the note| Role | Size | Face | Where it appears |
|---|---|---|---|
| Mega | clamp(3.6rem,17.6vw,261px) | Display | Closing bands only |
| H1 | clamp(2.9rem,8.1vw,120px) | Display | Page titles |
| H2 | clamp(2.2rem,4.05vw,60px) | Display | Section heads, article titles |
| H3 | clamp(1.9rem,3.1vw,46px) | Display | Block heads |
| Lede | clamp(1.1rem,1.82vw,27px) | Body | One paragraph under a title |
| Body | clamp(1rem,1.21vw,18px) | Body | Everything else |
| Prose | clamp(1.05rem,1.32vw,20px) | Body | Long-form, capped at 68ch |
| Label | 16px, uppercase | Body | Nav, buttons, kickers |
The highlighter
Containers are round, controls are square, and the contrast between the two is the look. Do not soften the controls and do not sharpen the cards.
| Radius and space | Value |
|---|---|
| Cards, dialogs | --ws-radius 32px |
| Tool panels | 8px |
| Every control | 0px |
| Content cap | --ws-maxw 1416px |
| Gutter | 20px, 32px above 1024 |
| Header | 104px, 88px below 1024 |
| Spacing | 4 8 12 16 24 32 48 64 96 |
| Elevation and motion | Value |
|---|---|
| Card | 0 30px 60px −40px / 45% |
| Lift on hover | 0 40px 80px −40px / 55% |
| Dialog | 0 60px 120px −50px / 70% |
| Easing | cubic-bezier(.22,.61,.36,1) |
| Micro | 220ms · hover, focus, colour |
| Reveal | 800ms · opacity and a 24px rise |
| Focus ring | 3px solid, 3px offset |
Components
A chamfer at the top left running the full height, so the control leans in the direction everything else travels. One primary action per view. Hover deepens the notch rather than swapping a colour, which is the only place on the site where a hover is a gesture instead of a state change.
Uppercase, tracked, square. Four reserved status colours that never become a chart series. A status colour never carries meaning alone: it always arrives with a dot or a word.
Garmin connected. Last sync 4 minutes ago.
Polar has not synced in 6 days. Detail past 28 days cannot be recovered once the window closes.
We could not reach Strava. Reconnect to resume importing.
Labels are always visible, set in uppercase micro type above the field. Hints are persistent rather than appearing on error. Fields are square, 54px tall, and focus is a 3px teal ring at 1px offset.
Numbers are set in the display face with tabular figures, so a column compares down rather than shifting. Every computed signal carries its confidence, and a signal running on thin data says so instead of producing a plausible number. That last part is the one piece of this system no other brand has.
| Session | Type | Distance | Avg pace | Load |
|---|---|---|---|---|
| Monday | Easy | 8.0 km | 5:38 | 44 |
| Wednesday | Intervals | 10.2 km | 4:21 | 92 |
| Saturday | Long | 24.0 km | 5:55 | 176 |
Patterns
One easing curve and two durations. Scroll-driven motion writes a single custom property per frame to a stage element and lets CSS do the rest, never a listener per item. The signatures are the card stack riding up into the band, the staircase that reveals a step at a time and then exits left, and the fan that opens on a scroll fraction.
| Pattern | Timing | What it does |
|---|---|---|
| Reveal on enter | 800ms | Opacity and a 24px rise. Never staggered to death. |
| Pin the stage | tied to scroll | Media holds while copy travels through it |
| Hand-off | tied to scroll | One passage exits left as the next arrives from the right |
| Button notch | 260ms | The cut deepens. The label does not move. |
| Dialog | 420ms | Opacity and a 20px rise |
| Reduced motion | respected | Every reveal resolves instantly and nothing is left hidden |
Real trail and real weather, never stock athleticism. Hero imagery prints in a
single blue: the photograph supplies luminance and --ws-duo supplies the hue, so a
misty forest and an athletics track end up in the same world. Everywhere else, evidence imagery
keeps its own colour, because a chart of your own data should not be styled.
Brand
Expert and plain-spoken. Direct second person, short sentences mixed with longer ones, concrete over abstract. We explain the reasoning behind every call and we state the limit rather than hiding it. Where we do not know, we say so, because a signal you have quietly learned to distrust will not change what you do on the day it matters.
The system as a page you can read, a stylesheet you can link, and the tokens as data. The brand book is the reference; the stylesheet is what an internal tool should use rather than reimplementing any of this.
Thirty days of Trailwise Pro, your history imported on day one, and a plan that answers to what your body is actually doing.
Get startedThese optional details help us understand who is joining and what matters most to them.
Thanks for joining the Trailwise private beta waitlist. We’ll share more information about beta access in September.
We’ve sent a confirmation to . Click the link in it to confirm your address and keep your place.
We’ll use your email to manage your beta waitlist registration. See our Privacy Policy.
We’ll share more information in September. If your address was still unconfirmed, we’ve sent a fresh confirmation link.