Skip to content
CLEPSOdocs

Clepso · Brand and design system · v1.0

The limit, and the live signal.

The identity, type, colour, icons, components and voice of Clepso, the menu bar monitor for AI coding-agent limits. Every logo, glyph and colour on this page is generated from the same source the app and the downloads are built from.

  • 10theme appearances
  • 58pixel icons
  • 46component states
  • 4.56:1worst text contrast

Preview the page in a theme

01 / LOGO

A heartbeat inside a ring. The ring is the limit, the same ring that sits in the menu bar; the beat is the live reading. One idea that reads at 16 pixels, in one colour, in any theme.

Clepso watches something you cannot see, a usage limit, and tells you before you hit it. The mark puts the two things that matter one inside the other: the container that fills and the signal that keeps arriving.

Because the ring is the existing menu bar ring, the logo and the status icon are one object. The beat is the live reading; the same ring holds a warning, a flatline, a clock, a broken ring for demo data, dots while it waits for a first reading and nothing at all when not connected, without the brand changing shape.

It is drawn on a 16-pixel grid with a 1-pixel stroke, the way the original Macintosh icons were drawn: judged at actual size first, large second.

How it came about

Six directions on the same grid, judged at menu bar size. The two small renders beside each are actual size (16 px) and 2×.

  1. A ECG lineRejected

    The favicon's heartbeat, alone. Says 'health app'; every fitness tracker owns it. Without a container it has no silhouette at 16 px and cannot carry a status.

  2. B Lit coreRejected

    The 1.11 menu bar ring with a 2 × 2 core. Clean, but reads as a radio button or a record light: a control, not a product.

  3. C P monogramRejected

    Ownable as a letter, empty as an idea, and tied to a working name that may change. A pixel P also blurs into 'D' and 'R' at 16 px.

  4. D GaugeRejected

    Speedometer cliché. The needle's angle is illegible at 16 px, and it promises a precise reading the app often cannot give (stale and missing are first-class states).

  5. E Signal barsRejected

    Reads as Wi-Fi, audio level or cell signal. Strong silhouette, wrong meaning.

  6. F Beat in the ringChosen

    Chosen. The ring is the limit (and the existing menu bar ring); the beat is the live reading. One idea, legible at 16 px, and it can flatline, warn or go stale without changing shape.

Refining the beat

Four drawings of the chosen idea. The last floats with a 2 p margin and is centred on both axes.

  1. F1 Trace edge to edge

    The line splits the ring into halves: reads as a theta or a null sign.

  2. F2 Heavy beat

    Two-pixel peak clots at 16 px and fights the 1 p ring.

  3. F3 Square screen

    An oscilloscope, but also a generic chart icon; loses the menu bar ring.

  4. F4 Floating trace

    Chosen: the beat floats with a 2 p margin, centred on both axes.

Lockups

The horizontal lockup is primary. Use the stacked lockup where width is scarce, and the symbol alone where the name is already present: the menu bar, the app icon, a favicon.

Horizontal lockup · primary
Stacked lockup
Symbol
Wordmark

Construction

Unit p is 1/16 of the symbol. Every edge falls on whole p; the stroke is 1 p everywhere. Wordmark capitals are 7 p, tracked 2 p; the horizontal gap is 5 p; clear space is 4 p on every side.

Construction grid: the symbol on its 16 p grid with keylines, the lockups with clear space, the small symbol and minimum sizes
Construction sheet · full size · symbol SVG

Clear space

4 p on every side: a quarter of the symbol's height. Nothing else enters it, including the edge of the screen or page.

Minimum size

Symbol 16 px (1 p = 1 px). Horizontal lockup 54 × 16 px. In print, symbol 6 mm, lockup 20 mm wide.

Scaling

Below 64 px, scale only in whole multiples (16, 32, 48, 64 px) so no pixel is resampled. Above 64 px, any size.

Small symbol

A 12 p drawing of the same mark, for the 16 px app icon and the favicon only, where 16 p cannot sit 1:1.

Colour

Always one flat colour. On dark grounds the signature is phosphor green; on paper, deep green; anywhere else, black or white.

Phosphor on ink
Deep green on paper
Black, one colour
White, reversed

Across themes

In the app the mark takes the active theme's accent. The shape never changes, so recognition never depends on green.

Phosphor · dark
#4DFF8F
Phosphor · light
#0A7238
Amber · dark
#FFB547
Amber · light
#8A5000
Cobalt · dark
#6DB8FF
Cobalt · light
#1650BE
Orchid · dark
#DA8CFF
Orchid · light
#8619AD
Graphite · dark
#E4E4E9
Graphite · light
#1E1E22

Misuse

The mark is pixels on a grid, in one colour, with room around it. Each example below breaks one of those.

  • Don’t stretch or squash it

  • Don’t rotate it

  • Don’t fill it with a gradient

  • Don’t outline it

  • Don’t add glows, shadows or bevels

  • Don’t resample it off the grid

  • Don’t retype the wordmark

  • Don’t rearrange the lockup

  • Don’t set it on low contrast

App icon

The symbol as a lit dot matrix on a phosphor screen. Every size is drawn on whole device pixels; 16 and 32 px are placed by hand, not scaled.

Clepso app icon
  • Clepso app icon, 1024 px1024 px · shown 128
  • Clepso app icon, 256 px256 px · shown 128
  • Clepso app icon, 128 px128 px
  • Clepso app icon, 64 px64 px
  • Clepso app icon, 32 px32 px
  • Clepso app icon, 16 px16 px

Menu bar

A template image: opaque pixels on transparency, tinted by macOS for light, dark and tinted menu bars. The beat is the brand; the status family keeps the ring and changes what is inside, so no state rests on colour. When none of the readings behind the shape is live, the ring opens at five o'clock with a dot in the gap. The flatline appears only for a limit that reached 100% in its window, never with a % beside it; otherwise the % beside the mark is the highest live reading among the limits behind the shape, and there is none when those readings are old.

  • beatLive reading (the brand mark)

  • approachingApproaching a limit

  • flatlineLimit reached: the beat flatlines

  • staleStale: last reading is old

  • demoDemo data: broken ring

  • waitingWaiting for the first reading

  • not-connectedNot connected: no trace

Template images: 16 pt, @2x, 18 pt, @2x, pixel matrix. Favicon: SVG, ICO.

The exploration sheet
Exploration sheet: six directions and four refinements
Full size

02 / COLOUR

Colour

Components ask for a role (background, textSecondary, accent); only the theme knows the value. Every theme below is read from the Swift source at build time, and every text role is checked against every surface: 4.5:1 or better.

Signature colours

The brand's own palette, independent of any app theme. Phosphor on ink is the default; amber and rust only ever mean attention and blocked.

  • Phosphor#4DFF8F

    The signature. Marks, accents, the live signal.

  • Ink#060907

    Near-black glass. The default ground.

  • Paper#F3F1E7

    The light ground. Warm, never pure white.

  • Deep#0A7238

    Phosphor on paper: the accent in light mode.

  • Amber#FFC04D

    Attention. Approaching a limit.

  • Rust#FF6B5E

    Blocked. A limit reached, an error.

Themes

10 appearances from 5 themes. Each card shows the same limit row in that theme, its tokens and its contrast matrix. A theme added to Tokens.swift appears here on the next build.

Phosphor · dark

The signature: phosphor green on near-black glass; warm paper in light mode.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#060907
  • surfaceElevated#0D1410
  • surfaceMuted#16211A
  • separator#2C4034
  • textPrimary#EAF7EE
  • textSecondary#93B9A0
  • accent#4DFF8F
  • statusSuccess#4DFF8F
  • statusAttention#FFC04D
  • statusBlocked#FF6B5E
  • statusStale#9AAFA2
  • statusUnknown#98A79E
Contrast: 24/24 pass AA · worst 5.93:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary18.1316.9315.03
textSecondary9.238.617.65
accent15.2614.2412.65
statusSuccess15.2614.2412.65
statusAttention12.2911.4710.18
statusBlocked7.166.685.93
statusStale8.608.037.13
statusUnknown7.967.436.60

Phosphor · light

The signature: phosphor green on near-black glass; warm paper in light mode.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#F3F1E7
  • surfaceElevated#FBFAF4
  • surfaceMuted#E4E0D0
  • separator#B9B29C
  • textPrimary#0F1A13
  • textSecondary#44564A
  • accent#0A7238
  • statusSuccess#0A7238
  • statusAttention#7E4C00
  • statusBlocked#AD241C
  • statusStale#52605A
  • statusUnknown#56615B
Contrast: 24/24 pass AA · worst 4.56:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary15.7517.0613.48
textSecondary6.937.515.93
accent5.335.784.56
statusSuccess5.335.784.56
statusAttention6.356.885.43
statusBlocked6.096.595.21
statusStale5.836.324.99
statusUnknown5.706.174.87

Amber · dark

a warm amber CRT. Gold accent; "approaching" is a distinct orange so it never reads as the accent.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#0C0803
  • surfaceElevated#17110A
  • surfaceMuted#241A0F
  • separator#4D3A22
  • textPrimary#FFF2DE
  • textSecondary#CDB08A
  • accent#FFB547
  • statusSuccess#9EDC78
  • statusAttention#FF8F45
  • statusBlocked#FF6E61
  • statusStale#BBA78E
  • statusUnknown#B6A48F
Contrast: 24/24 pass AA · worst 6.23:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary18.0716.9615.46
textSecondary9.679.078.27
accent11.3710.669.72
statusSuccess12.3311.5610.54
statusAttention8.818.277.54
statusBlocked7.286.836.23
statusStale8.598.067.34
statusUnknown8.277.767.07

Amber · light

a warm amber CRT. Gold accent; "approaching" is a distinct orange so it never reads as the accent.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#F6F0E4
  • surfaceElevated#FCF9F2
  • surfaceMuted#EBDFC9
  • separator#C4AE88
  • textPrimary#2A1C0B
  • textSecondary#5C4830
  • accent#8A5000
  • statusSuccess#2E6A14
  • statusAttention#9E3D00
  • statusBlocked#AE2219
  • statusStale#5F5446
  • statusUnknown#625749
Contrast: 24/24 pass AA · worst 4.94:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary14.5815.7312.55
textSecondary7.638.246.57
accent5.736.194.94
statusSuccess5.806.265.00
statusAttention5.936.405.10
statusBlocked6.086.565.24
statusStale6.517.025.60
statusUnknown6.216.705.35

Cobalt · dark

cool ice-blue on deep navy glass; mint for "available" so it stays apart from the blue accent.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#050910
  • surfaceElevated#0B1322
  • surfaceMuted#141F33
  • separator#2B3D5C
  • textPrimary#E9F1FF
  • textSecondary#98ACD0
  • accent#6DB8FF
  • statusSuccess#4FE0B0
  • statusAttention#FFC95A
  • statusBlocked#FF7C88
  • statusStale#9CA8BE
  • statusUnknown#99A4B8
Contrast: 24/24 pass AA · worst 6.56:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary17.5616.3614.52
textSecondary8.698.097.18
accent9.458.807.81
statusSuccess11.9911.169.91
statusAttention13.0612.1710.80
statusBlocked8.067.516.67
statusStale8.327.756.88
statusUnknown7.947.396.56

Cobalt · light

cool ice-blue on deep navy glass; mint for "available" so it stays apart from the blue accent.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#EEF2F8
  • surfaceElevated#FAFBFE
  • surfaceMuted#DCE3EF
  • separator#A8B5CB
  • textPrimary#0B1526
  • textSecondary#3E4D66
  • accent#1650BE
  • statusSuccess#0B6B4D
  • statusAttention#885000
  • statusBlocked#B01F2D
  • statusStale#515C6F
  • statusUnknown#545E6F
Contrast: 24/24 pass AA · worst 5.05:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary16.2617.6614.16
textSecondary7.608.266.62
accent6.396.945.56
statusSuccess5.806.295.05
statusAttention5.856.355.10
statusBlocked6.076.595.28
statusStale6.016.535.23
statusUnknown5.836.335.07

Orchid · dark

violet glass with an orchid-magenta accent, synthwave without the neon glare.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#0B0712
  • surfaceElevated#150E22
  • surfaceMuted#221734
  • separator#412E5E
  • textPrimary#F7EEFF
  • textSecondary#BDA7DA
  • accent#DA8CFF
  • statusSuccess#5EE3A6
  • statusAttention#FFC75E
  • statusBlocked#FF7299
  • statusStale#AC9FBB
  • statusUnknown#AA9EB8
Contrast: 24/24 pass AA · worst 6.55:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary17.6916.6715.02
textSecondary9.218.687.82
accent8.718.217.40
statusSuccess12.3511.6410.49
statusAttention12.8912.1510.95
statusBlocked7.717.266.55
statusStale8.007.546.80
statusUnknown7.877.426.69

Orchid · light

violet glass with an orchid-magenta accent, synthwave without the neon glare.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#F6F1F9
  • surfaceElevated#FDFBFE
  • surfaceMuted#E9DFF1
  • separator#C0AED2
  • textPrimary#1C1027
  • textSecondary#53426A
  • accent#8619AD
  • statusSuccess#116A44
  • statusAttention#8A4C00
  • statusBlocked#AD1C48
  • statusStale#5C5367
  • statusUnknown#5E5569
Contrast: 24/24 pass AA · worst 5.14:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary16.3717.7014.13
textSecondary8.018.666.92
accent6.857.405.91
statusSuccess5.956.445.14
statusAttention6.066.555.23
statusBlocked6.216.725.36
statusStale6.537.075.64
statusUnknown6.336.855.47

Graphite · dark

monochrome, ink and paper; the accent is the type colour itself, so only states carry hue.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#0A0A0B
  • surfaceElevated#141416
  • surfaceMuted#1F1F22
  • separator#3B3B41
  • textPrimary#F2F2F3
  • textSecondary#A6A6AE
  • accent#E4E4E9
  • statusSuccess#6FD69A
  • statusAttention#F0B85A
  • statusBlocked#FF7C72
  • statusStale#9E9EA6
  • statusUnknown#9C9CA4
Contrast: 24/24 pass AA · worst 6.03:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary17.6916.4514.69
textSecondary8.197.616.80
accent15.6214.5212.97
statusSuccess11.0810.309.21
statusAttention11.0310.269.17
statusBlocked7.907.346.56
statusStale7.446.926.18
statusUnknown7.266.756.03

Graphite · light

monochrome, ink and paper; the accent is the type colour itself, so only states carry hue.

5-HOUR

83%

Approaching limit

Resets 20:01 · in 2h 14m

  • background#F2F2F0
  • surfaceElevated#FCFCFB
  • surfaceMuted#E2E2DF
  • separator#B4B4AF
  • textPrimary#121214
  • textSecondary#4B4B53
  • accent#1E1E22
  • statusSuccess#186E3E
  • statusAttention#885000
  • statusBlocked#B1251D
  • statusStale#58585F
  • statusUnknown#5B5B62
Contrast: 24/24 pass AA · worst 4.85:1
Text onbackgroundsurfaceElevatedsurfaceMuted
textPrimary16.6918.2314.41
textSecondary7.718.426.66
accent14.8216.1812.80
statusSuccess5.616.134.85
statusAttention5.866.405.06
statusBlocked5.946.495.13
statusStale6.306.875.44
statusUnknown6.016.565.19

Never colour alone

Every state has a symbol, words and a bar pattern as well as a colour (tested in the app). Recolouring can never merge two meanings.

Accent is for signal

Use the accent for the live figure, the mark and links, not for decoration or large fills.

Status colours are reserved

Attention and blocked colours appear only when a limit is near or reached.

03 / TYPOGRAPHY

Typography

Two faces drawn for Clepso, one geometry. Clepso Pixel speaks in numbers and labels; Clepso Mono explains. Both are built in code from the same grid logic, so the display face and the body face share corners, rhythm and figures.

Display

Clepso Pixel

Capitals 7 pixels tall on a 10-pixel em. Drawn so a number is never misread: dotted 0, flagged 1 with a foot, square-shouldered 5. Tabular figures; kerning that tucks open shapes in without ever touching a stroke.

Weights
Regular
Characters
217, incl. Latin-1 letters, arrows, ⌘ ⌥ ⇧
Use
Figures, titles, labels, buttons, the wordmark
Replaces
Silkscreen

OTF · TTF · WOFF2

Body

Clepso Mono

A monospace constructed from the rounded rectangle behind the pixel face's chamfered corners. Vertical strokes heavier than horizontal for an even texture; three weights from one drawing.

Weights
Regular · Medium · Bold
Characters
211, ASCII and Latin-1 letters
Use
Sentences, captions, data labels
Replaces
SF Mono for sentences (kept as fallback)

Regular OTF · TTF · WOFF2
Medium OTF · TTF · WOFF2
Bold OTF · TTF · WOFF2

Try them

Reported limits available · 83% · resets 20:01

Reported limits available · 83% · resets 20:01

Never misread

The figures were drawn around the confusions a monitor cannot afford. The founder's own review found “8.5B” read as “8.SB” in the previous pixel face.

0O 1Il 5S 8B 6G 9g

Il1| 0Oo 5S 8B 6G 9g rn m

Scale · app

The app's typography tokens. Pixel sizes are multiples of 5 pt, so on a Retina display every pixel of Clepso Pixel lands on whole device pixels.

TokenSampleFace · size / line
metricHeroThe big percentage83% · RESETS 20:01Clepso Pixel Regular · 35/40 ptwas Silkscreen 34
metricMediumSecondary figures5-HOUR LIMIT · 83%Clepso Pixel Regular · 20/24 ptwas Silkscreen 22
titleCard titles, tabs, buttons5-HOUR LIMIT · 83%Clepso Pixel Regular · 15/20 ptwas Silkscreen 15
labelStatus words, row labelsResets 20:01 · in 2h 14mClepso Mono Medium · 13/18 ptwas SF Mono Medium 13 (.body)
supportingReset lines, freshness, notesResets 20:01 · in 2h 14mClepso Mono Regular · 12/17 ptwas SF Mono 12 (.callout)
microBadges, tiny captionsRESETS 20:01 · IN 2H 14MClepso Mono Medium · 12/16 pt · +0.4was SF Mono Semibold 12
menuBarPercentage beside the menu bar icon5-HOUR LIMIT · 83%Clepso Pixel Regular · 10/12 ptwas Silkscreen 11

Scale · web

On the web, pixel sizes are multiples of 10 px. Headings drop a step on phones (h1 50 → 30).

TokenSampleFace · size / line
displayHero wordmark-scale lines (50 on phones)83% USEDClepso Pixel Regular · 80/80 px (shown at 60)
h1Page titles (30 on phones)83% USEDClepso Pixel Regular · 50/56 px
h2Section titles83% · RESETS 20:01Clepso Pixel Regular · 30/36 px
h3Sub-sections, card titles5-HOUR LIMIT · 83%Clepso Pixel Regular · 20/24 px
figureStat figures83% USEDClepso Pixel Regular · 60/60 px
eyebrowKickers, table heads, labelsRESETS 20:01 · IN 2H 14MClepso Mono Medium · 12/16 px · +1.7
bodyRunning textResets 20:01 · in 2h 14mClepso Mono Regular · 15/24 px
smallCaptions, notesResets 20:01 · in 2h 14mClepso Mono Regular · 13/20 px

Pairing

Pixel for numbers and short labels, usually uppercase. Mono for anything that is a sentence. Never a sentence in Clepso Pixel; never a big figure in Clepso Mono.

Pixel snapping

Clepso Pixel's pixel is 1/10 em. Use 15, 20, 25, 30, 35, 40 pt in the app and 10, 20, 30, 50, 60, 80 px on the web; anything else blurs.

No faux styles

No synthetic bold or italic of the pixel face, no tracking on it (its spacing is in whole pixels already), no outlines or shadows on type.

Fallback

Clepso Mono covers ASCII and Latin-1. Keep the system monospace behind it: names outside the set fall back per character.

Clepso Pixel specimen rendered by CoreText
Clepso Pixel specimen, rendered by CoreText · full size
Clepso Mono specimen rendered by CoreText, with SF Mono beside it
Clepso Mono specimen, beside SF Mono at the app’s sizes · full size

04 / ICONOGRAPHY

Iconography

58 icons, each drawn on a 12 × 12 pixel grid with a 1-pixel stroke: the mark's rules at a smaller grid. Read from PixelGlyphBitmaps.swift at build time, so this is exactly the set the app draws.

  • home
  • gauge
  • terminal
  • calendar
  • people
  • card
  • target
  • person
  • gear
  • power
  • percent
  • bell
  • link
  • dollar
  • bars
  • export
  • demo
  • trash
  • heartbeat
  • envelope
  • chevron left
  • chevron right
  • info
  • warning
  • square
  • check square
  • x square
  • dashed square
  • flame
  • cursor
  • flag
  • code
  • circle
  • circle alert
  • circle alert fill
  • nosign
  • reset
  • check circle
  • minus circle
  • ellipsis circle
  • link plus
  • bolt slash
  • live
  • clock
  • clock alert
  • seal
  • person check
  • question
  • bubble
  • trend
  • arrow c c w
  • half circle
  • key
  • chevron back
  • palette
  • external
  • grid
  • refresh

Grid

12 × 12 p, 1 p stroke, no anti-aliasing. Sizes are multiples of 6 pt (12, 18, 24) so pixels stay whole.

Colour

An icon takes the colour of the text beside it. Status colour only when the icon is the status.

Shape carries meaning

Within a family no two states share a shape. A new icon is drawn here first, at 1×, before it ships.

Never mix

No smooth system symbols beside pixel icons, and no icon redrawn at a finer grid to make it fit.

05 / COMPONENTS

Components

The SwiftUI components behind the app, rendered from the Swift code by clepso-design-render. Every image here is the real component or the running app, in demo data.

A number always says where it came fromEvery value shows its source and age. Components take provenance-carrying values; there is no bare-number input.
Missing is never zeroAbsent, null, stale and not connected are four states with their own words. None renders as 0%.
Never colour aloneEach state has a symbol, words, a bar pattern and a spoken phrase.
Restyle without changing meaningPalette, spacing and layout can change. State names, labels and accessibility text are locked and tested.

Screens

The running app in demo data, captured from the signed bundle.

Menu bar popover
Menu bar popover
Provider detail
Provider detail
Where this number comes from
Where this number comes from
Details · Limits: history and pace
Details · Limits: history and pace
Details · Session
Details · Session
Details · Stats overview
Details · Stats overview
Details · Stats models
Details · Stats models
Onboarding · consent
Onboarding · consent
Delete all, confirmation
Delete all, confirmation

Phosphor components

The pixel layer. Every shape is drawn in code on a pixel grid, so it stays sharp and scales with text size.

PixelLimitRow

One allowance pool in the pixel style. Same status words, freshness, reset line and VoiceOver sentence as QuotaProgress (tested); the optional pace line always says “Estimate”.

PixelLimitRow: Available, live
Available, livelimit-available
PixelLimitRow: Approaching, with a pace estimate
Approaching, with a pace estimatelimit-approaching
PixelLimitRow: Nearly exhausted
Nearly exhaustedlimit-critical
PixelLimitRow: Limit reached, reset known
Limit reached, reset knownlimit-exhausted
PixelLimitRow: Reset time passed, no fresh reading
Reset time passed, no fresh readinglimit-reset-expected
PixelLimitRow: Stale: dithered bar, last seen
Stale: dithered bar, last seenlimit-stale
PixelLimitRow: Not reported (F06): words, empty outlined bar, never 0%
Not reported (F06): words, empty outlined bar, never 0%limit-not-available

PixelBar

The segmented bar. The fill follows the frame's stepped pixels: the lit and empty runs step one pixel in from the frame, so a one-pixel gap runs all the way round, corners included. Stale values are dithered and missing values draw only an outline, so meaning never rests on colour.

PixelBar: Solid, dithered (stale) and outlined (no value): the non-colour cues. The fill steps one pixel in from the frame
Solid, dithered (stale) and outlined (no value): the non-colour cues. The fill steps one pixel in from the framebars

PixelColumns

Every bar chart (Home's last 30 days, when you work, tokens per day) is drawn here: whole-pixel widths, heights in whole pixels from the baseline, top corners stepped like the frame's, and a faint one-pixel stub for none.

PixelColumns: Bar charts: whole-pixel bars with stepped tops, a faint stub for none
Bar charts: whole-pixel bars with stepped tops, a faint stub for nonecolumns

PixelButtonStyle

Bevelled pixel buttons: a lit top edge and a shaded bottom edge that swap when pressed.

PixelButtonStyle: Prominent, normal and disabled; the bevel swaps when pressed
Prominent, normal and disabled; the bevel swaps when pressedbuttons

PixelTabs

Tabs in the pixel-pack manner, used in the Details window and Stats.

PixelTabs: Selected tab lit, others recessed
Selected tab lit, others recessedtabs

PixelStat

A value over a small pixel caption, for the session strip and Stats.

PixelStat: Value over a pixel caption
Value over a pixel captionstats

PixelLineChart

History drawn as steps snapped to a pixel grid, with dotted 80/95/100 guides, NOW, and the dashed pace projection. VoiceOver reads a sentence instead of the drawing.

PixelLineChart: Usage history: steps on a pixel grid, 80/95/100 guides, NOW, dashed pace
Usage history: steps on a pixel grid, 80/95/100 guides, NOW, dashed pacechart

PixelHeatmap

Activity like Claude Code's /stats: one column per week, Monday on top, four levels plus empty. Each day is a PixelLevelTile, so the level is pixel density, not shade.

PixelHeatmap: Activity like /stats: Monday on top, four levels as pixel density, Less → More
Activity like /stats: Monday on top, four levels as pixel density, Less → Moreheatmap

PixelLevelTile

One day of an activity calendar on the 2 pt pixel grid, with notched corners. Levels are pixel density: a few lit pixels, a checkerboard, solid with holes, solid; the pattern says the level without relying on colour. No data is the outline only. In the 30-day view the figures sit on the plain ground and the level lights a band of the bottom pixel rows.

PixelLevelTile: No data (outline), levels 0–4 as pixel density, and the 30-day view's band under the figures
No data (outline), levels 0–4 as pixel density, and the 30-day view's band under the figurestiles

PixelPanel

The frame every pixel screen sits in: stepped corners, an outer frame and an inner rule; glass behind it in the app.

PixelPanel: Stepped corners, outer frame, inner rule (glass in the app)
Stepped corners, outer frame, inner rule (glass in the app)panel

Typography

Clepso Pixel for figures, titles and labels; Clepso Mono for sentences. Both are drawn for Clepso and bundled in the app.

Typography: Clepso Pixel for figures and labels, Clepso Mono for sentences
Clepso Pixel for figures and labels, Clepso Mono for sentencestype

Status styles

The single lookup from a state to how it looks and reads. Within each family no two states share a shape (tested).

FamilyStateGlyphLabelVoiceOverColour rolePattern
valuelivedot.radiowaves.left.and.right (light)dot.radiowaves.left.and.right (dark)Live“live”textSecondarysolid
valuestaleclock.badge.exclamationmark (light)clock.badge.exclamationmark (dark)Last seen“last seen”statusStalehatched
valuenotAvailableminus.circle (light)minus.circle (dark)Not available“not available”statusUnknownoutline
valuenotReportedYetellipsis.circle (light)ellipsis.circle (dark)Not reported yet“not reported yet”statusUnknownoutline
valuenotConnectedlink.badge.plus (light)link.badge.plus (dark)Not connected“not connected”statusUnknowndashed
valueproviderErrorexclamationmark.triangle (light)exclamationmark.triangle (dark)Couldn't read last update“couldn't read last update”statusBlockedoutline
cardavailablecircle (light)circle (dark)Available“available”statusSuccesssolid
cardapproachingcircle.badge.exclamationmark (light)circle.badge.exclamationmark (dark)Approaching limit“approaching limit”statusAttentionsolid
cardcriticalexclamationmark.circle.fill (light)exclamationmark.circle.fill (dark)Nearly exhausted“nearly exhausted”statusAttentionsolid
cardexhaustednosign (light)nosign (dark)Limit reached“limit reached”statusBlockedsolid
cardexhaustedNoResetnosign (light)nosign (dark)Limit reached · reset time not reported“limit reached, reset time not reported”statusBlockedsolid
cardexhaustedOveragenosign (light)nosign (dark)Limit reached · paid usage may continue“limit reached, paid usage may continue”statusBlockedsolid
cardresetExpectedclock.arrow.circlepath (light)clock.arrow.circlepath (dark)Reset expected · awaiting next update“reset expected, awaiting next update”statusAttentionhatched
cardavailableAgaincheckmark.circle (light)checkmark.circle (dark)Available again“available again”statusSuccesssolid
cardavailableAgainUsercheckmark.circle (light)checkmark.circle (dark)Available again · you confirmed“available again, you confirmed”statusSuccesssolid
cardquotaNotAvailableminus.circle (light)minus.circle (dark)Account quota not available“account quota not available”statusUnknownoutline
carddisconnectedbolt.slash (light)bolt.slash (dark)Not connected“not connected”statusUnknowndashed
planproviderVerifiedcheckmark.seal (light)checkmark.seal (dark)Provider verified“provider verified”statusSuccesssolid
planuserConfirmedperson.crop.circle.badge.checkmark (light)person.crop.circle.badge.checkmark (dark)User confirmed“user confirmed”textSecondarysolid
planselectedUnverifiedperson.crop.circle (light)person.crop.circle (dark)Selected · not verified“selected, not verified”statusUnknownoutline
plannotSetquestionmark.circle (light)questionmark.circle (dark)Plan not set“plan not set”statusUnknownoutline

Spacing, radius, stroke

Classic theme values; Phosphor squares the corners (radius 2) and opens spacing to 20.

  • Spacing
  • compact4 pt
  • standard8 pt
  • spacious16 pt
  • windowPadding12 pt
  • section32 pt
  • Radius
  • control6 pt
  • card10 pt
  • pill999 pt
  • Stroke
  • hairline1 pt
  • emphasis2 pt
  • focus2 pt
Classic components (29 states)

The first six components in the system theme that preceded Phosphor. Still in the code; the pixel components reuse their wording and accessibility text. Light or dark follows the theme you preview.

ProviderCard

One provider: identity, plan, one row per allowance pool, the active session. Compact in the menu bar popover, expanded in provider detail.

ProviderCard: Compact: menu bar popover (light)ProviderCard: Compact: menu bar popover (dark)
Compact: menu bar popovercard-compact
ProviderCard: Expanded: provider detail, reset passed (light)ProviderCard: Expanded: provider detail, reset passed (dark)
Expanded: provider detail, reset passedcard-expanded
ProviderCard: No rate limits reported, plan not set (F06, F15) (light)ProviderCard: No rate limits reported, plan not set (F06, F15) (dark)
No rate limits reported, plan not set (F06, F15)card-no-rate-limits

QuotaProgress

One allowance pool. Takes a provenance-carrying value, never a bare number, so missing data cannot render as 0%. Every state has its own symbol, words and bar pattern as well as colour.

QuotaProgress: Available · 41% (light)QuotaProgress: Available · 41% (dark)
Available · 41%quota-available
QuotaProgress: Approaching · crossed 80% (light)QuotaProgress: Approaching · crossed 80% (dark)
Approaching · crossed 80%quota-approaching
QuotaProgress: Nearly exhausted · crossed 95% (light)QuotaProgress: Nearly exhausted · crossed 95% (dark)
Nearly exhausted · crossed 95%quota-critical
QuotaProgress: Limit reached (light)QuotaProgress: Limit reached (dark)
Limit reachedquota-exhausted
QuotaProgress: Limit reached, no reset time reported (light)QuotaProgress: Limit reached, no reset time reported (dark)
Limit reached, no reset time reportedquota-exhausted-no-reset
QuotaProgress: Limit reached, paid usage evidenced (light)QuotaProgress: Limit reached, paid usage evidenced (dark)
Limit reached, paid usage evidencedquota-overage
QuotaProgress: Reset time passed, no fresh reading yet (light)QuotaProgress: Reset time passed, no fresh reading yet (dark)
Reset time passed, no fresh reading yetquota-reset-expected
QuotaProgress: Available again, verified by a fresh reading (light)QuotaProgress: Available again, verified by a fresh reading (dark)
Available again, verified by a fresh readingquota-available-again
QuotaProgress: Manual snapshot (light)QuotaProgress: Manual snapshot (dark)
Manual snapshotquota-entered-by-you
QuotaProgress: Stale: last reading 42 minutes ago (light)QuotaProgress: Stale: last reading 42 minutes ago (dark)
Stale: last reading 42 minutes agoquota-stale
QuotaProgress: Provider did not send rate limits (F06) (light)QuotaProgress: Provider did not send rate limits (F06) (dark)
Provider did not send rate limits (F06)quota-not-available
QuotaProgress: Provider sent null (first event, F07) (light)QuotaProgress: Provider sent null (first event, F07) (dark)
Provider sent null (first event, F07)quota-not-reported
QuotaProgress: Value failed validation (light)QuotaProgress: Value failed validation (dark)
Value failed validationquota-provider-error
QuotaProgress: Not connected (light)QuotaProgress: Not connected (dark)
Not connectedquota-disconnected

ResetCountdown

Counts down from a verified reset instant. At the reset time it says “Reset expected”, never “Ready”: only a fresh reading can say that.

ResetCountdown: Verified reset ahead (light)ResetCountdown: Verified reset ahead (dark)
Verified reset aheadreset-upcoming
ResetCountdown: Reset time reached: never says Ready (light)ResetCountdown: Reset time reached: never says Ready (dark)
Reset time reached: never says Readyreset-expected
ResetCountdown: No reset time reported (light)ResetCountdown: No reset time reported (dark)
No reset time reportedreset-unknown

PlanPill

The plan label always carries how it is known. The plan never feeds any arithmetic.

PlanPill: User confirmed (light)PlanPill: User confirmed (dark)
User confirmedplan-user-confirmed
PlanPill: Provider verified (light)PlanPill: Provider verified (dark)
Provider verifiedplan-provider-verified
PlanPill: Selected, not verified (light)PlanPill: Selected, not verified (dark)
Selected, not verifiedplan-selected
PlanPill: Plan not set (light)PlanPill: Plan not set (dark)
Plan not setplan-not-set

ConnectionHealth

Whether readings are arriving, with the age of the last one. Never “100% connected”.

ConnectionHealth: Live (light)ConnectionHealth: Live (dark)
Livehealth-live
ConnectionHealth: No new readings (light)ConnectionHealth: No new readings (dark)
No new readingshealth-stale
ConnectionHealth: Not connected (light)ConnectionHealth: Not connected (dark)
Not connectedhealth-not-connected

DataSourceLabel

Source and freshness, on every value. Freshness is never omitted; stale values say “last seen”.

DataSourceLabel: Source and freshness (light)DataSourceLabel: Source and freshness (dark)
Source and freshnesssource-live
DataSourceLabel: Stale (light)DataSourceLabel: Stale (dark)
Stalesource-stale

06 / VOICE AND TONE

Voice and tone

One voice: a precise instrument that tells the truth. The tone shifts with the moment; the voice never does.

ExactNumbers carry their source and age. Units always. No rounding that changes a decision.
PlainShort words, active verbs, sentence case. The product's job is to be glanced at.
Honest about uncertaintyAn estimate says so; a missing value says so; a guess is never shown as a fact.
CalmNo alarms for their own sake. Attention when a limit is near, plain facts when it is reached.

Tone by moment

Available

Reported limits available

Quiet. One line, then out of the way.

Approaching

Approaching limit · resets 20:01

Direct. Lead with what will happen and when.

Reached

Limit reached · resets in 2h 14m

Factual. What it is, when it ends. No blame, no exclamation marks.

Missing

Not reported yet

Neutral. Name the absence; never fill it.

Write this, not that

From the app's own copy decisions.

WriteNotWhy
Reported limits availableAll limits availableSay only what the data supports. The status line reports two limits; there may be a third.
Reset expectedReadyAt the reset time no fresh reading has arrived yet. Only a reading can say “ready”.
Estimate: at this pace, 100% around 18:29You'll run out at 18:29A projection always says it is one.
Not reported yet0%Missing is never zero. Name what is absent.
Last seen 12 min agoStaleGive the fact that makes it stale, not the jargon.
Couldn't update settings. Nothing was changed.Oops! Something went wrong.Say what happened and what it means for the user's files. No apology theatre.

07 / DOWNLOADS

Downloads

Every file is generated by design/brand/pipeline/build.sh from source in the repository, so the downloads always match these guidelines.

Clepso Pixel and Clepso Mono are original drawings, licensed under the SIL Open Font License 1.1 with the Reserved Font Names “Clepso Pixel” and “Clepso Mono”: you may use, modify and redistribute them under the OFL, and a modified version must be renamed. The Clepso name, mark and logo, app icon and menu bar mark are not covered by that licence (or by the code's MIT licence) and stay reserved; see TRADEMARKS.md. “Clepso” is a working name.