Brand

Brand

How Sonari is drawn, coloured, set, moved and written.

Download this document · PDF · 753 KB · 18 pages

The mark

The mark is an S that is also a sonar wave: a C whose trajectory the wavefront shares, flowing into a second bowl that curls outward. The S is the letter and the wave is the signal - two colours doing two jobs, which is the one thing to understand before using it.

The Sonari mark
483224

The wordmark sets the name in Outfit at 600, tracked −0.03em:

Sonari

Side by side:

Sonari

Writing the name

  • Sonari, one word, capital S and nothing else capitalised. Never SONARI, never sonari, never Sonari.pro in prose.
  • The product is an application, so “Sonari” is a thing you open rather than a company you deal with.
  • The site is sonari.pro. Lower case, including at the start of a sentence - rewrite the sentence rather than capitalise the domain.
  • The wave in the mark is the sonar return / a soundwave. You can use both when describing it.

Logo files, in both colourways and as a zip, are on the press page. This document is how the identity works.

Construction

Two tangent circles on a horizontal axis. The stroke runs most of the way round the large one - the C, and the wavefront's trajectory - crosses the tangent point, then runs most of the way round the small one in the opposite rotational direction. Reversing the bend at the tangent is what makes it an S rather than a C with a hook.

The two tangent circles the S is built from
Tangency fixes the second centre at radius + tailRadius from the first, so shrinking the tail moves it left as well as making it smaller.
The sonar’s circle, concentric with the C
The sonar is a separate arc on the same centre as the C and a larger radius - 20 against 12. It is a wider arc on the same origin, not a tighter one held at a distance.
Where the wave crosses the S - the wave crosses the S by 1.75
Because it is larger and concentric, the wave's inner edge passes through the S's stroke. The clearance is -1.75 - negative, so it is an overlap of 1.75 rather than a gap. That is deliberate, and it is why the wave is set at 0.34 opacity: at full strength the crossing reads as a bar drawn across the mark, and at this strength it reads as a wave passing behind it.

The mark is exact circular arcs with no optical correction - joins unteased, stroke unmodulated where the curve tightens, terminals uncut.

Clear space, size and misuse

Clear space

One stroke width on every side, measured from the mark’s outermost ink - which on the left is the sonar’s arc, not the S. The stroke is the only measurement inside the mark that a reader can see without being told where to look, so the rule can be checked by eye at any size.

Minimum size

Below this the wave stops being a wave. It is set at 0.34 opacity so that it reads as passing behind the S rather than as a bar drawn across it, and that is exactly the quality that fails first as the mark shrinks.

1620 · floor24

Misuse

Six things not to do. Each panel is the real mark with the mistake applied.

The mark recolouredThe S is white and the wave is --color-plum-300. They are two colours doing two jobs: the S is the letter and the wave is the signal. A single-colour mark is available and is the light colourway - use that rather than tinting this one.
The wave at full opacityThe wave crosses the S’s stroke. At full strength that overlap reads as a bar drawn across the mark; the low opacity is what makes it read as depth. This is the single easiest way to make the mark look broken.
The mark stretchedIt is built from circles. Scaling the axes independently turns every one of them into an ellipse, and the stroke weight stops being constant around the curve - which is visible long before the distortion itself is.
The mark rotatedThe two bowls sit on a horizontal axis and that is what keeps the S level and the curl outward. Rotating the logo ruins how it is perceived.
The mark on a busy groundThe wave is the first thing to disappear. On artwork or photography, use the ground the mark is drawn for - or the light colourway on a plain light one.
The wordmark reset in another faceThe logotype is Outfit at 600, tracked −0.03em. It should not be altered or swapped.

Colour

Twenty tokens in four groups. Every value is used in different ways, for different things.

Ink

The ground and the surfaces on it. Nothing here is ever text - --color-ink-700 is a divider and is the one pairing in the contrast table with no minimum.

  • --color-ink-950#0b0a0b
  • --color-ink-900#121013
  • --color-ink-800#1b181c
  • --color-ink-700#2a262c

Text

Three levels and no more. Primary, secondary, and the muted level meta lines are set in - every one of them scored against every ground it is allowed on.

  • --color-white#fafafa
  • --color-mute-200#c9c4cc
  • --color-mute-400#8e8694

Plum

The brand ramp. The lower half is ground and fills, the upper half is interactive colour and the mark’s wave. Desaturated at constant hue so the accent reads as wine rather than as hot pink.

  • --color-plum-950#240017
  • --color-plum-900#43002b
  • --color-plum-800#61053f
  • --color-plum-700#8d0b5e
  • --color-plum-600#a83d80
  • --color-plum-500#c25596
  • --color-plum-400#d67ab2
  • --color-plum-300#edaad0

Bloom

Colors used in the website, not part of the brand. They are painted at low opacity behind everything and are the reason each act has its own temperature. Useful if you need variety - not to be used for main elements.

  • --color-bloom-magenta#d6187f
  • --color-bloom-violet#6e3bff
  • --color-bloom-cyan#14c8c0
  • --color-bloom-amber#ff9a3d
  • --color-ground-mid#14000d

Usage, and what it measures

Our palette is always measured and checked for readability. Every colour needs to pass our metrics based on its use, background, etc.

All 26 declared pairings, measured against WCAG 2.2.
PairingUsed forLevelRatio
Aawhite on ink-950Primary text on the page groundAA, body text18.94:1
Aawhite on ink-900Primary text on a raised surfaceAA, body text18.14:1
Aawhite on ink-800Primary text on an inset surfaceAA, body text16.85:1
Aawhite on plum-900Primary text over the brand groundAA, body text15.80:1
Aawhite on plum-800Primary text over a section washAA, body text12.56:1
Aamute-200 on ink-950Secondary body textAA, body text11.53:1
Aamute-200 on ink-900Secondary body text, raisedAA, body text11.04:1
Aamute-200 on plum-900Secondary body over brand groundAA, body text9.62:1
Aamute-400 on ink-950Muted / meta textAA, body text5.64:1
Aamute-400 on ink-900Muted / meta text, raisedAA, body text5.40:1
Aaplum-300 on ink-950Links, hover, focus ringAA, body text10.60:1
Aaplum-300 on ink-900Links on a raised surfaceAA, body text10.15:1
Aaplum-400 on ink-950Primary interactive colour, as textAA, body text6.86:1
Aawhite on plum-700Button label on the primary fillAA, body text8.59:1
Aawhite on plum-600Button label, primary hoverAA, body text5.52:1
plum-500 on ink-950Primary button border vs groundAA, non-text4.74:1
plum-500 on plum-900Primary button border vs top stopAA, non-text3.95:1
Aaplum-500 on ink-950Display-size accent type (>=24px)AA, large text4.74:1
plum-400 on ink-950Focus indicator against the groundAA, non-text6.86:1
ink-700 on ink-950Decorative divider - never textdecorative - tracked only1.33:1
Aawhite on ground-midPrimary text, mid ground stopAA, body text19.43:1
Aamute-200 on ground-midSecondary text, mid ground stopAA, body text11.83:1
Aamute-400 on ground-midMuted text, mid ground stopAA, body text5.78:1
Aamute-400 on plum-900Muted text, worst-case top stopAA, body text4.70:1
Aaplum-300 on plum-900Links over the top stopAA, body text8.84:1
Aaplum-400 on plum-900Interactive colour over the top stopAA, body text5.72:1

One row has no minimum. --color-ink-700 on the ground is about 1.3:1. That one is a divider, and it is tracked here precisely so that nobody sets text in it (as it would render it unreadable).

Type

Satoshi sets everything, at weights 300–900. Outfit sets one word - the logotype - and is subset to its six letters, about 2 KB. It falls back to Satoshi rather than to a system font, so a failed load still degrades to something recognisably Sonari.

--text-3xl · Hero

Never miss a release again.

--text-2xl · Act headline

The feed that stays in order

--text-xl · Card title

Follow an artist once

--text-lg · Lede

It watches every artist you care about.

--text-prose · Reading copy

A paragraph of a long document.

--text-body · Body

Copy inside a section.

--text-sm · Meta

9 September 2026 · 4 min read

--text-xs · Eyebrow

PRESS

Display type is set at 1.05 line height, −0.03em. Reading copy is its own pair: --text-prose runs 16px to 20px and --measure-prose is derived from it, holding the line to about 80 characters at any width.

Motion

Four durations, two curves, three staggers. Nothing on this site invents a timing: a component that needs one calls a timeline factory, and the numbers live in one file.

The duration scale, in seconds.
NameSecondsUsed forHover to run
micro0.15Hover, focus, a toggle flipping
ui0.3A control changing state
section0.6A section entering
hero1The largest move on the page

The two curves are cubic-bezier(0.16, 1, 0.3, 1) for anything entering or settling, and cubic-bezier(0.65, 0, 0.35, 1) for something that leaves and returns. Staggers are 0.075s between characters, 0.125s between words and 0.3s between the steps of a sequence.

Scroll-linked sections use a smoothed scrub of 1 second and start at top 75%. The scrub is never raw: tying a timeline to the scroll position frame for frame exposes every dropped frame the device has.

Artwork

The artwork on this site is album covers we do not own. Album artwork and artist photography are the property of their respective rights holders.

So the direction is a treatment rather than a look. Covers appear inside the device mockups at the size and crop the app itself uses. The colour behind them is the brand plum as a radial, and the app's own artwork-driven tint stays present throughout.