32°N Instruments

Instruments

Configure once. Drop it anywhere.

Twenty-two instruments — wind, depth, battery, fuel, anchor — share one theming contract. Pick what each one shows. Pick how it looks. Then place it on the helm, the phone, a share link, the chartplotter overlay. Same instrument. Same theme. No reconfiguring per screen.

The catalogue · sub-project C

Twenty-two instruments. Three base themes. One contract.

Each tile is the same component family — readings, dials, fills, state — themed by the same fourteen tokens. Switch the theme to see what 32°N gives you out of the box: saturated helm-station colour for the dark hours, a single-hue amber that preserves night vision, and a reflective daylight setting that gets crisper the brighter it is.

Components 22 ship at 1.0. The set grows when an instrument earns its keep.
Surfaces Helm · phone · share link · chartplotter overlay.
Theme picker Switch above — the whole grid re-themes through one CSS variable cascade. Alarm behaviour adapts to the medium.
Alarm cueBorder pulses
Compass
direction
Heading
042°M
direction
COG
047°T
direction
SOG
6.2kn
motion
Position
36°14′N005°21′W
value
Wind
environment
TWS
12.4kn
environment
AWA
67°P
environment
Depth
8.4m
environment
AIS
3within 5nm
environment
Battery
healthy
Solar
420W
healthy
Alternator
24A in
motion
Shore
0A in
motion
Fresh water
healthy
Fuel
caution
Waste
healthy
Black water
alarm
RPM
motion
Coolant
82°C
motion
Bilge
DRY
healthy
Anchor
ON
alarm

Anatomy

Fourteen tokens. The whole theming contract.

A theme is not a colour scheme. It is a small declarative file: fourteen named tokens that map to every paintable part of every instrument. Users set tokens. The system maps tokens to dials, readings, labels, fills, alarm states. Inherit a base theme, override only what you change. The full set is small enough to memorise.

WIND 12.4 kn surface value.secondary dial.needle + glow dial.graduation value.primary environment
frame surface Tile and panel ground
value value.primary The main reading
value value.secondary Labels, units, sub-values
meaning motion Speed, VMG, SOG
meaning environment Wind, depth, sea
meaning direction HDG, COG, TWD
meaning healthy Battery good, active
meaning caution Warnings, near-limit
meaning alarm Critical only
meaning derived Laylines, predicted
feel glow On / off + intensity 0–100
feel alarm.motion pulse | blink | invert
dial dial.graduation Dial graduation lines
dial dial.needle Dial needle / indicator

The model

Three concepts. Code, data, position.

The instrument abstraction has exactly three pieces. Components are code I write. Catalog rows are data you own per boat. Panels are where you place them. Change a catalog row and every panel that references it updates. That is the whole contract.

01 · Components

The code I ship

Twenty-two React components — Compass, Numeric, LinearGauge, AnchorAlarm, and the rest. Stateless. They take data and theme via context. They render the same on web, mobile, and (later) inside the chartplotter overlay.

02 · Catalog rows

The configuration you own

A catalog row is a named, configured instrument: "My Wind Speed" — a Compass, in sci-fi, bound to true wind, showing knots. One row. Many surfaces. Change the row and every surface picks it up. Stored in your boat's database.

03 · Panel layouts

Where you place them

A panel layout is one surface for one boat — the helm, the phone, a share link. It references catalog rows by id and positions them on a grid. A catalog row can appear on many panels. It cannot appear twice on the same one.

Themes are open-source like everything else.

The three base themes ship with 32°N. Beyond them, full customisation arrives post-1.0 — a small declarative file, contrast-checked on save, shared on GitHub, verified themes earn a badge.

MIT · 100% open-source · forever