brand book. v1. 30.05.26.

Pump House

The reference document. Everything we've agreed on, in one place, so any decision touching the brand can be checked back against this. Lives at brand-identity/pump-house/brand-book-v1.html. Updates land as v2, v3.

AS1851 made digital.
Sydney. private alpha.
pumphouse.au
01. principles.

Four rules everything else hangs off.

Before any brand element ships, it has to pass these. If a decision contradicts one of the four, the principle wins.

01. Clarity.

Information wins over decoration.

If a brand element makes the page harder to scan, it is wrong. The visual language exists to make the data easier to read.

02. Density.

Earn the whitespace.

Calm comes from rhythm, not emptiness. A property manager looking after 30 buildings needs a fast, dense dashboard. Space separates; it does not inflate.

03. Recognition.

One mark, one colour, one shape.

The product becomes recognisable through repetition, not range. Three signals, used relentlessly.

04. Restraint.

The brand earns its place or it goes.

The mark lives in four places. The wordmark lives in six. Everywhere else, neither appears. Brand presence is a choice, not a default.

02. voice.

Peer. Direct. Australian.

Pump House writes the way a property manager talks to another property manager who's already busy. No SaaS cheer. No headline-as-feeling. Say what happened, what's next, and stop. AU English everywhere (colour, organise, realise). No em dashes. ASCII apostrophes only. Sentence case headings. Lowercase form labels.

Lead with the verb.

Add a building.
Get started with your first building today!
Don't pad CTAs with anticipation. The user already arrived.

Say what happened, not how to feel.

Bunnerong Tower added. Open building.
Great job! You added your first building.
Toasts are a confirmation, not a high-five.

Errors stay calm.

Something didn't go through. Our team has been notified.
Oops! Something went wrong. Please try again later.
No exclamation, no apology, no vague fallback. Concrete + a reference id.

Headlines describe, they don't sell.

The inspection record, made digital.
Revolutionise your AS1851 workflow.
Hero headlines name what the product is, then stop.
03. wordmark.

"Pump House" in Pretendard Bold 700. Two-tone.

"Pump" sits in Coal #1A0E0A. "House" sits in Pump orange #C8542A. No punctuation. The colour is the signature; the word "House" is the brand mark. Mixed case, letter-spacing -0.03em. Below 14px the wordmark is illegible and the mark should be used instead.

The two-tone treatment is deliberate differentiation from "wordmark + small coloured circle" patterns common in Australian brands (Camera House being the closest). The whole word is the signature; no glyph required.

Pump House
Pretendard Bold 700 . 64px shown . letter-spacing -0.03em . "House" in #C8542A
04. mark.

The five-spoke valve handwheel.

Mark study E. Heavier outer rim, lighter spokes, calm centre hub. Five spokes because real fire main wheels have five. Reads as a brand mark and as a recognisable valve at the same time. Always sits in Signal red on light surfaces; in Cream on Signal surfaces. Never in any other colour.

Rim 11. Spokes 6. Hub 7.
Signal red #C8252A.
80 x 80 viewBox. SVG only.

Scale.

Below 40px, stroke weights step up so the rim doesn't disappear. The 16px favicon and 24px sizes use thicker strokes.

16 px
24 px
40 px
72 px
120 px

Mark drift guard.

Valves are a category symbol for the fire safety trade. The mark therefore overlaps with generic valve imagery by design. The brand does not claim the valve as a category symbol or assert ownership over valve diagrams. What the brand owns is the specific Study E composition (rim 11, spokes 6, hub 7, 5 spokes, Signal red) used as a logo.

When a non-Pump House valve illustration or photo appears on the same surface as the mark, count how many of these four specs the other valve matches: 5 spokes, circular handwheel, red colour, Signal red specifically. The match count decides the separation rule.

Match count Required separation
0 or 1 of 4No guard. The two read as distinct objects without intervention.
2 of 4Soft guard. Place the mark and the other valve in clearly different regions of the surface (separate column, separate page section, separate panel).
3 of 4Hard guard. Minimum 2x mark-diameter separation, ideally on a different page or region of the document.
4 of 4Do not use the mark on this surface. Use the wordmark instead. If a mark is structurally required (favicon, app icon), audit the layout and break visual adjacency at the structure level.

Full decision tree and worked examples in brand-identity/pump-house/section-18-mark-drift-guard.md. The brand stays in its lane: depicting valves is fine for anyone; the specific Study E composition is the limit of the claim.

05. lockup & separation.

The mark and the wordmark do not sit together.

The separation principle: mark for action, wordmark for identity. Mark appears where the brand is in motion or at icon scale. Wordmark appears where the brand is being named. There is no canonical lockup. The two elements speak in different registers and never share a row.

Including the report cover, where v4 had both. v5 removed it. The wordmark stands alone in printed deliverables.

06. surface list.

Four mark surfaces. Six wordmark surfaces.

If a surface is not in this table, the brand does not appear on it. Adding a new surface requires updating this list and the principle in section 01.04.

Surface Why Carries
FaviconBrowser tab. Wordmark cannot fit.Mark
App iconiOS / Android / PWA.Mark
Loading spinnerThe mark is the spinner.Mark
Success burstThe mark opens. Half-second feedback moment.Mark
Marketing navThe product is being named.Wordmark
FooterEnd-of-page anchor.Wordmark
Email signatureBelow the human's name.Wordmark
Marketing heroBrand voice on the home page.Wordmark
Report coverPrinted deliverable. Wordmark only.Wordmark
About page headerStory moment. Wordmark + copy.Wordmark
07. palette.

The Ember palette. Twelve colours plus Signal.

Three families. Fire carries the brand. Warm neutrals carry the body. Olive and Slate stay cool so success and info don't bleed into the brand temperature. Signal red is reserved for the mark only and is not for general use.

fire. brand.
Coal
#1A0E0A
Ember
#8B2C1E
Pump
#C8542A
Glow
#E68A50
Spark
#D4A017
warm neutrals. body.
Smoke
#5A5550
Ash
#8A7F76
Linen
#C9C0B2
Bone
#F5F1E8
Cream
#FBFAF5
semantic. cool counter-point.
Olive (success)
#5C6F3A
Spark (warning)
#D4A017
Ember (error)
#8B2C1E
Slate (info)
#3A5566
mark only. not for general use.
Signal
#C8252A
Signal is reserved for the mark.
Brighter and redder than Pump or Ember. Used only inside the valve glyph. Do not introduce Signal as a background, button colour, or accent.
08. typography.

Pretendard + JetBrains Mono. No serif pair.

Pretendard loads via jsDelivr CDN. Korean-origin (Toss, Naver, much of the polished Korean tech stack). Carries UI, body, headings. Picked over Geist because Geist has become the AI / dev-tool default font of 2024-2026 (Vercel, v0, Cursor) and any tech-adjacent viewer reads a Geist-set product as "another AI startup". Pretendard is rare in Western tech and signals impeccable taste without shouting.

JetBrains Mono carries data, dates, eyebrows, and labels. A serif pair would borrow voice from a media or editorial brand; Pump House is an operational tool. Stay with one family.

display44 / 1.05 / 600
The inspection record, made digital.
headline30 / 1.15 / 600
Every defect, signed and dated.
subhead20 / 1.4 / 500
Built around AS1851 from the first row to the last.
body16 / 1.6 / 400
Pump House turns every fire safety inspection into a signed, dated, auditable record.
caption14 / 1.5 / 500
Last sent 14.05.26 by M. Khedoori. Three open defects.
mono eyebrow12 / tracked / 500
AS1851. for the people who actually do it.
mono data18 / 500
PH-1284. 30.05.26. M. Khedoori.
mono label10 / tracked / 500
Next AFSS due
09. motion.

Four animations. Each one has a job.

No decorative motion anywhere. If an animation cannot be named in one verb (loading, progress, success, capacity) it does not ship. Every animation respects prefers-reduced-motion at the OS level. Turn Reduce Motion on, and this page freezes.

01. Valve spinner.

Loading. Page or section.

3.6s per turn. Machinery cadence, not browser-spinner urgency.
02. Pipe fill.

Progress. Upload. Render. Save.

Steel flange caps. Pump-to-Glow gradient gives pressure direction.
03. Valve opens.

Success. Save. Send. Mark complete.

90 degree rotation + glow bloom. Fires once on success, then settles.
04. Pressure builds.

Stat loading. Capacity meter.

Fluid rises in a vertical column. Reads as data filling in, or capacity climbing.
10. ui states.

Empty. Loading. Error. Success. Warning.

Every page that fetches or mutates needs all four of these designed. Copy in the voice from section 02.

Empty.

No buildings yet.

Add a building and Pump House will track every AS1851 inspection from then on.

Loading.
Loading buildings
Error.
!

Something didn't go through.

We couldn't load your buildings just now. Our team has been notified.

Reference 9XR-K3Q-44B
Success.
Bunnerong Tower added.Open
Two inspections due this week.
11. inspection tag.

UI artefact, not brand mark.

The yellow AS1851 tag that lives on every fire main valve and hose reel is a load-bearing object for property managers. Pump House owns a digital version of it as a UI element. The tag appears on the asset detail page, on the report inside-page, and (only) as the loading screen empty version with "PENDING" stamped over it. The tag is never the brand mark. The brand mark is the valve, section 04.

Inspected
Asset
PH-1284
Inspected
30.05.26
Next due
30.05.27

Strip colour follows asset status: Pump for current, Ember for overdue. Spark is reserved for the "pending" stamp overlay only.

12. scales.

Spacing, radius, shadow.

Three scales the dev needs to build anything from the book. Without these, every component drifts to its own padding and the system breaks within a week. Use these values; do not invent intermediate steps.

Spacing.

Multiples of 4. Used for padding, margin, and gap.

TokenValueUse
space-14 pxTight icon padding, inline spacing
space-28 pxSmall gaps, form field internal padding
space-312 pxButton padding, small card spacing
space-416 pxStandard card padding, gap between siblings
space-624 pxSection spacing within a page
space-832 pxBetween section groups
space-1248 pxBetween major page regions
space-1664 pxSection padding top and bottom
space-2496 pxHero spacing, page boundaries

Radius.

Borders soften only where they need to. Default is sharp.

TokenValueUse
radius-00Full-bleed elements, table cells, the inspection tag
radius-12 pxTags, small badges
radius-23 pxButtons, inputs, small cards
radius-34 pxStandard cards, modals, toasts
radius-48 pxLarge cards, hero blocks
radius-pill9999 pxStatus pills, warning pills, toggles

Shadow.

The brand prefers borders over shadows. Use shadow sparingly.

TokenValueUse
shadow-0noneDefault for surface cards
shadow-sm0 1px 2px rgba(26,14,10,0.06)Subtle lift on interactive hover
shadow-md0 4px 12px rgba(26,14,10,0.08)Modals, dropdowns
shadow-lg0 8px 24px rgba(26,14,10,0.14)Toasts, dropped app icon

Shadows are warm-tinted (Coal hue at low alpha) for consistency with the warm palette.

13. iconography.

lucide-react. Twelve essential glyphs.

Library: lucide-react. 1100+ icons. MIT. Tree-shakeable, around 12 KB gzipped for typical usage. The Tailwind community's de-facto. Reads as 2025-considered.

Icon system.

Default size 20 px (matches body text x-height). Stroke width 2 (lucide default; do not customise). Colour inherits via currentColor.

ContextIcon sizePaired with
Inside a button16 px14 px text
Inline with body20 px16 px text
Section header24 px20 px+ text
Status pill12 px12 px text

Essential set.

The twelve most-used in the app. Other lucide icons are available; these are the ones the team should know by name.

Glyphlucide nameWhere it's used
BuildingbuildingBuilding cards, nav, page headers
WrenchwrenchDefects, maintenance, inspection actions
CalendarcalendarSchedules, due dates, next-AFSS
File textfile-textReports, documents
UploaduploadFile uploads, attach photo
SearchsearchSearch bars
SettingssettingsSettings nav, gear menus
UseruserProfile, account
Alert trianglealert-triangleWarnings, paired with Spark
CheckcheckSuccess states, completed items
Arrow rightarrow-rightCTAs, "see more" links
More horizontalmore-horizontalOverflow menus, three-dot actions

Import per-icon for tree-shaking:

import { Building, Calendar, FileText } from 'lucide-react'

The valve mark is a brand glyph, not an icon. Do not use it in lucide's place. If you must add a custom icon (lucide doesn't have it), follow the same rules: 2-stroke, 24 x 24 viewBox, currentColor only.

14. component primitives.

Seven primitives the rest of the system builds on.

Each primitive lists variants, sizes, and states. If a screen needs something outside this set, add it to the book first.

Button.

SpecValue
VariantsPrimary (Pump bg, Cream text). Secondary (Coal bg, Cream text). Ghost (transparent, Coal text + 1 px Coal bottom border).
Sizessm (padding 8 x 14, text 13). md (10 x 18, text 14). lg (12 x 22, text 15).
Statesdefault. hover (-5% lightness on bg). active (-10%). focus-visible (2 px Pump ring + 2 px offset). disabled (50% opacity, no pointer).
OtherRadius 3. Geist Sans 500. Optional leading icon at 16 px.

Input, Label, Field.

SpecValue
Input1 px Linen border. Cream bg. Padding 12 x 14. Text 15. Radius 3.
FocusBorder becomes Pump. No shadow.
ErrorBorder becomes Ember. Error message below in Ember 12 px.
LabelGeist Sans 13. Smoke. Lowercase per CLAUDE.md rule.
FieldWraps Label + Input + optional Error. Vertical gap 6 px.

Card.

SpecValue
DefaultCream bg. 1 px Linen border. Padding 24. Radius 4. No shadow.
RaisedDefault + shadow-sm on hover only.
Padding scalesm (16). md (24, default). lg (32).

Modal / Dialog.

SpecValue
Backdroprgba(26,14,10,0.4). Click closes.
ContainerCream bg. Max-width 480. Padding 32. Radius 8. Shadow-lg.
RequiredEsc-to-close. Focus trap. Focus return on close.
A11yrole="dialog". aria-modal="true". aria-labelledby on the title.

Tabs.

SpecValue
ActiveBorder-bottom 2 px Pump. Text Coal. Font 500.
InactiveText Smoke. Font 400. No border.
HoverText Coal. Border-bottom 1 px Linen.
Spacing24 px between tabs.

Status pill.

SpecValue
Default1 px solid Linen. Padding 6 x 12. Radius pill. Text 12. Font 500.
Variantssuccess (Olive border + 15% bg). warning (Spark border + 12% bg). error (Ember border + 12% bg). info (Slate border + 12% bg). neutral (default).
Optional dotLeading 8 x 8 circle in the matching colour.

Toast.

SpecValue
PositionTop-right of viewport. Offset 24.
ContainerCoal bg. Cream text. Padding 14 x 18. Radius 4. Shadow-lg. Max-width 380.
BehaviourAuto-dismiss at 4 seconds. Manual dismiss via close button.
Optional mark22 x 22, brand-coloured (Signal for success, Spark for warning, Ember for error).
Link insideGlow colour. Underline. 3 px underline offset.
15. dark mode.

Dual-mode from launch.

Toggle in the top-left of this book. Flip the switch to feel how the brand behaves at night. Property managers run inspections at 6am with the curtains drawn and review reports at 11pm in bed; the product should be comfortable in low light.

Roles shift. Palette stays.

The literal palette never changes. Coal is always #1A0E0A. Bone is always #F5F1E8. What changes between modes is which palette colour fills which role. In light mode, Bone is the page; in dark mode, the page is a new deep coal and the original Coal becomes the card surface. The values are constants; the assignments shift.

RoleLightDark
Page backgroundBone #F5F1E8Deep Coal #0E0805
Card surfaceCream #FBFAF5Coal #1A0E0A
Rules & bordersLinen #C9C0B2Char #3A2A1F
Primary textCoal #1A0E0ABone #F5F1E8
Secondary textSmoke #5A5550Linen #C9C0B2
Muted textAsh #8A7F76Ash #8A7F76 (unchanged)
Brand accentPump #C8542APump+ #E26D3D (lifted)
Brand redEmber #8B2C1EEmber+ #B53A2A (lifted)
MarkSignal #C8252ASignal+ #D62E32 (lifted)
Glow, Sparkunchangedunchanged

Two new tokens.

Dark mode introduces three colours that don't exist in the light palette. They never appear in light mode.

TokenHexRole
Deep Coal#0E0805Page background in dark mode. Slightly darker than Coal so Coal can sit on top as a card surface.
Hearth#261A12Raised surfaces (modals, dropdowns, dropped app icon). Above Coal in the elevation stack.
Char#3A2A1FRule and border colour in dark mode. Warm dark grey.

Lifts, explained.

Pump, Ember, and Signal lift roughly ten percent in dark mode for legibility on dark surfaces. Glow and Spark stay as-is because they're already bright enough. The mark keeps its shape; only its colour shifts. The lifts are subtle enough that a screenshot in light mode and a screenshot in dark mode still read as the same brand.

First load.

The book follows the OS preference (prefers-color-scheme) on first visit. The toggle in the top-left overrides it; the choice persists across sessions via localStorage.

For the dev.

When wiring this into the Next.js app, the implementation is:

:root[data-mode="dark"] {
  --paper:  #0E0805;
  --cream:  #1A0E0A;
  --linen:  #3A2A1F;
  --coal:   #F5F1E8;
  --smoke:  #C9C0B2;
  --pump:   #E26D3D;
  --ember:  #B53A2A;
  --signal: #D62E32;
}

Plus a small toggle component, a localStorage read on mount, and data-mode on the html element. The half-wired @media (prefers-color-scheme: dark) block currently in globals.css should be removed and replaced with the explicit [data-mode="dark"] selector. Closes audit round 1 finding 10.

16. print & CMYK.

Approximate Pantone equivalents. Verify before lock.

The three reds (Pump, Ember, Signal) sit in the part of the spectrum CMYK reproduces unreliably. Use the Pantone equivalents below for any print artefact. Spot colour is preferred over process build for the mark wherever budget allows. Verify against a Pantone chip book before any print run.

Name Hex CMYK (approx.) Pantone (approx.)
Coal#1A0E0A60 / 70 / 70 / 90Black 6 C
Ember#8B2C1E25 / 90 / 90 / 251815 C
Pump#C8542A15 / 75 / 95 / 57578 C
Glow#E68A505 / 55 / 75 / 01575 C
Spark#D4A01715 / 35 / 100 / 5124 C
Signal (mark)#C8252A15 / 95 / 90 / 5485 C
Bone#F5F1E82 / 4 / 8 / 0Warm Gray 1 C
Olive#5C6F3A55 / 30 / 90 / 305757 C
Slate#3A556675 / 50 / 35 / 305395 C
17. accessibility.

Safe text and background pairings.

WCAG 2.1 AA requires 4.5:1 contrast for normal text and 3:1 for large text (18px bold or 24px regular and above). The pairings below have been calculated; verify any new pairing with a contrast checker before shipping. Ash on Bone is borderline; do not use Ash for body copy, only for labels and metadata.

Text Background Ratio Verdict
Coal on Bone#1A0E0A on #F5F1E8~15.8:1AAA. Default body.
Coal on Cream#1A0E0A on #FBFAF5~16.5:1AAA. Cards.
Smoke on Bone#5A5550 on #F5F1E8~7.1:1AAA. Secondary text.
Ash on Bone#8A7F76 on #F5F1E8~3.6:1AA for large only. Labels & meta.
Pump on Bone#C8542A on #F5F1E8~3.6:1AA for large only. CTAs & eyebrows.
Ember on Bone#8B2C1E on #F5F1E8~7.6:1AAA. Error text.
Cream on Coal#FBFAF5 on #1A0E0A~16.5:1AAA. Toast, footer.
Cream on Signal#FBFAF5 on #C8252A~4.9:1AA. Button text on Signal.
Signal on Bone#C8252A on #F5F1E8~4.8:1AA for normal text.
18. open items.

What we know is unfinished.

Five risks and gaps surfaced during v1. Each is named so it doesn't get forgotten and can be closed deliberately rather than by drift. Three of the five have been closed since v1 issue, one by feature shipment (dark mode) and two by sidecar resolution docs (Signal vs Pump device test, CMYK and Pantone reference). One remains pending a field shoot.

Item Why it matters Status
Mark drift outside category5-spoke valve reads as fire main valve to property managers, but as a ship's wheel or steering wheel to anyone else. Mitigated by colour + context, but worth knowing. Adjacent-valve confusion case is now handled by the Mark drift guard in section 04.Note.
Signal vs Pump at small sizesTwo close reds in the brand. Verdict: distinct on all four screen backgrounds at every tested size 4 px to 96 px. Physical proof still required before any close-adjacent print use. Full test page at section-18-red-device-test.html.Closed.
CMYK reproductionMathematical conversions and nearest Pantone Solid Coated matches computed for all 13 brand colours (Ember palette plus Signal) and three dark-mode lifts. Physical chip verification still required before any printed deliverable. Full table at section-18-cmyk-pantone.md.Tooled.
Dark modeDual-mode shipped in v1. Specified in section 15. Toggle, tokens, and dev wiring documented. Closes audit round 1 finding 10.Locked.
Marketing photographyField shoot of real Australian inspections still pending. Highest-leverage single asset for the brand.Pending.
19. version history.

How we got here.

Version Date What landed
v030.05.26Inspection tag explored as signature motif. Vertical + horizontal.
v1 palette30.05.26Ember palette built. Twelve colours, three families.
v2 logo+type30.05.26Wordmark C, Geist sans + mono, three principles named.
v3 valve mark30.05.26Tag silhouette dropped as mark. Valve handwheel introduced. Signal red proposed. Four animations built.
v4 separation30.05.26Mark and wordmark separated. UI states drafted.
v5 mark workshop30.05.26Mark study E locked. Surface list cut. Marketing nav fixed. Report cover simplified.
brand book v130.05.26Everything consolidated. Print, accessibility, open items added.
v1 complete30.05.26Scales, iconography, component primitives added. Asset SVGs exported. Deployed to Netlify.
v1 + dark mode30.05.26Dual-mode shipped. Toggle in TOC. Three new dark-only tokens (Deep Coal, Hearth, Char). Open item closed.
v1 + Pretendard31.05.26Geist swapped for Pretendard (avoids AI-default look). Wordmark redesigned to two-tone ("Pump" Coal + "House" Pump orange) to avoid Camera House visual rhyme. Sections 03 and 08 rewritten. Mono swapped from Geist Mono to JetBrains Mono.