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.
Sydney. private alpha.
pumphouse.au
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.
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.
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.
One mark, one colour, one shape.
The product becomes recognisable through repetition, not range. Three signals, used relentlessly.
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.
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.
Say what happened, not how to feel.
Errors stay calm.
Headlines describe, they don't sell.
"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.
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.
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.
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 4 | No guard. The two read as distinct objects without intervention. |
| 2 of 4 | Soft guard. Place the mark and the other valve in clearly different regions of the surface (separate column, separate page section, separate panel). |
| 3 of 4 | Hard guard. Minimum 2x mark-diameter separation, ideally on a different page or region of the document. |
| 4 of 4 | Do 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.
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.
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 |
|---|---|---|
| Favicon | Browser tab. Wordmark cannot fit. | Mark |
| App icon | iOS / Android / PWA. | Mark |
| Loading spinner | The mark is the spinner. | Mark |
| Success burst | The mark opens. Half-second feedback moment. | Mark |
| Marketing nav | The product is being named. | Wordmark |
| Footer | End-of-page anchor. | Wordmark |
| Email signature | Below the human's name. | Wordmark |
| Marketing hero | Brand voice on the home page. | Wordmark |
| Report cover | Printed deliverable. Wordmark only. | Wordmark |
| About page header | Story moment. Wordmark + copy. | Wordmark |
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.
Brighter and redder than Pump or Ember. Used only inside the valve glyph. Do not introduce Signal as a background, button colour, or accent.
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.
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.
Loading. Page or section.
Progress. Upload. Render. Save.
Success. Save. Send. Mark complete.
Stat loading. Capacity meter.
Empty. Loading. Error. Success. Warning.
Every page that fetches or mutates needs all four of these designed. Copy in the voice from section 02.
No buildings yet.
Add a building and Pump House will track every AS1851 inspection from then on.
Something didn't go through.
We couldn't load your buildings just now. Our team has been notified.
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.
Strip colour follows asset status: Pump for current, Ember for overdue. Spark is reserved for the "pending" stamp overlay only.
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.
| Token | Value | Use |
|---|---|---|
space-1 | 4 px | Tight icon padding, inline spacing |
space-2 | 8 px | Small gaps, form field internal padding |
space-3 | 12 px | Button padding, small card spacing |
space-4 | 16 px | Standard card padding, gap between siblings |
space-6 | 24 px | Section spacing within a page |
space-8 | 32 px | Between section groups |
space-12 | 48 px | Between major page regions |
space-16 | 64 px | Section padding top and bottom |
space-24 | 96 px | Hero spacing, page boundaries |
Radius.
Borders soften only where they need to. Default is sharp.
| Token | Value | Use |
|---|---|---|
radius-0 | 0 | Full-bleed elements, table cells, the inspection tag |
radius-1 | 2 px | Tags, small badges |
radius-2 | 3 px | Buttons, inputs, small cards |
radius-3 | 4 px | Standard cards, modals, toasts |
radius-4 | 8 px | Large cards, hero blocks |
radius-pill | 9999 px | Status pills, warning pills, toggles |
Shadow.
The brand prefers borders over shadows. Use shadow sparingly.
| Token | Value | Use |
|---|---|---|
shadow-0 | none | Default for surface cards |
shadow-sm | 0 1px 2px rgba(26,14,10,0.06) | Subtle lift on interactive hover |
shadow-md | 0 4px 12px rgba(26,14,10,0.08) | Modals, dropdowns |
shadow-lg | 0 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.
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.
| Context | Icon size | Paired with |
|---|---|---|
| Inside a button | 16 px | 14 px text |
| Inline with body | 20 px | 16 px text |
| Section header | 24 px | 20 px+ text |
| Status pill | 12 px | 12 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.
| Glyph | lucide name | Where it's used |
|---|---|---|
| Building | building | Building cards, nav, page headers |
| Wrench | wrench | Defects, maintenance, inspection actions |
| Calendar | calendar | Schedules, due dates, next-AFSS |
| File text | file-text | Reports, documents |
| Upload | upload | File uploads, attach photo |
| Search | search | Search bars |
| Settings | settings | Settings nav, gear menus |
| User | user | Profile, account |
| Alert triangle | alert-triangle | Warnings, paired with Spark |
| Check | check | Success states, completed items |
| Arrow right | arrow-right | CTAs, "see more" links |
| More horizontal | more-horizontal | Overflow 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.
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.
| Spec | Value |
|---|---|
| Variants | Primary (Pump bg, Cream text). Secondary (Coal bg, Cream text). Ghost (transparent, Coal text + 1 px Coal bottom border). |
| Sizes | sm (padding 8 x 14, text 13). md (10 x 18, text 14). lg (12 x 22, text 15). |
| States | default. hover (-5% lightness on bg). active (-10%). focus-visible (2 px Pump ring + 2 px offset). disabled (50% opacity, no pointer). |
| Other | Radius 3. Geist Sans 500. Optional leading icon at 16 px. |
Input, Label, Field.
| Spec | Value |
|---|---|
| Input | 1 px Linen border. Cream bg. Padding 12 x 14. Text 15. Radius 3. |
| Focus | Border becomes Pump. No shadow. |
| Error | Border becomes Ember. Error message below in Ember 12 px. |
| Label | Geist Sans 13. Smoke. Lowercase per CLAUDE.md rule. |
| Field | Wraps Label + Input + optional Error. Vertical gap 6 px. |
Card.
| Spec | Value |
|---|---|
| Default | Cream bg. 1 px Linen border. Padding 24. Radius 4. No shadow. |
| Raised | Default + shadow-sm on hover only. |
| Padding scale | sm (16). md (24, default). lg (32). |
Modal / Dialog.
| Spec | Value |
|---|---|
| Backdrop | rgba(26,14,10,0.4). Click closes. |
| Container | Cream bg. Max-width 480. Padding 32. Radius 8. Shadow-lg. |
| Required | Esc-to-close. Focus trap. Focus return on close. |
| A11y | role="dialog". aria-modal="true". aria-labelledby on the title. |
Tabs.
| Spec | Value |
|---|---|
| Active | Border-bottom 2 px Pump. Text Coal. Font 500. |
| Inactive | Text Smoke. Font 400. No border. |
| Hover | Text Coal. Border-bottom 1 px Linen. |
| Spacing | 24 px between tabs. |
Status pill.
| Spec | Value |
|---|---|
| Default | 1 px solid Linen. Padding 6 x 12. Radius pill. Text 12. Font 500. |
| Variants | success (Olive border + 15% bg). warning (Spark border + 12% bg). error (Ember border + 12% bg). info (Slate border + 12% bg). neutral (default). |
| Optional dot | Leading 8 x 8 circle in the matching colour. |
Toast.
| Spec | Value |
|---|---|
| Position | Top-right of viewport. Offset 24. |
| Container | Coal bg. Cream text. Padding 14 x 18. Radius 4. Shadow-lg. Max-width 380. |
| Behaviour | Auto-dismiss at 4 seconds. Manual dismiss via close button. |
| Optional mark | 22 x 22, brand-coloured (Signal for success, Spark for warning, Ember for error). |
| Link inside | Glow colour. Underline. 3 px underline offset. |
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.
| Role | Light | Dark |
|---|---|---|
| Page background | Bone #F5F1E8 | Deep Coal #0E0805 |
| Card surface | Cream #FBFAF5 | Coal #1A0E0A |
| Rules & borders | Linen #C9C0B2 | Char #3A2A1F |
| Primary text | Coal #1A0E0A | Bone #F5F1E8 |
| Secondary text | Smoke #5A5550 | Linen #C9C0B2 |
| Muted text | Ash #8A7F76 | Ash #8A7F76 (unchanged) |
| Brand accent | Pump #C8542A | Pump+ #E26D3D (lifted) |
| Brand red | Ember #8B2C1E | Ember+ #B53A2A (lifted) |
| Mark | Signal #C8252A | Signal+ #D62E32 (lifted) |
| Glow, Spark | unchanged | unchanged |
Two new tokens.
Dark mode introduces three colours that don't exist in the light palette. They never appear in light mode.
| Token | Hex | Role |
|---|---|---|
| Deep Coal | #0E0805 | Page background in dark mode. Slightly darker than Coal so Coal can sit on top as a card surface. |
| Hearth | #261A12 | Raised surfaces (modals, dropdowns, dropped app icon). Above Coal in the elevation stack. |
| Char | #3A2A1F | Rule 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.
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 | #1A0E0A | 60 / 70 / 70 / 90 | Black 6 C | |
| Ember | #8B2C1E | 25 / 90 / 90 / 25 | 1815 C | |
| Pump | #C8542A | 15 / 75 / 95 / 5 | 7578 C | |
| Glow | #E68A50 | 5 / 55 / 75 / 0 | 1575 C | |
| Spark | #D4A017 | 15 / 35 / 100 / 5 | 124 C | |
| Signal (mark) | #C8252A | 15 / 95 / 90 / 5 | 485 C | |
| Bone | #F5F1E8 | 2 / 4 / 8 / 0 | Warm Gray 1 C | |
| Olive | #5C6F3A | 55 / 30 / 90 / 30 | 5757 C | |
| Slate | #3A5566 | 75 / 50 / 35 / 30 | 5395 C |
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:1 | AAA. Default body. |
| Coal on Cream | #1A0E0A on #FBFAF5 | ~16.5:1 | AAA. Cards. |
| Smoke on Bone | #5A5550 on #F5F1E8 | ~7.1:1 | AAA. Secondary text. |
| Ash on Bone | #8A7F76 on #F5F1E8 | ~3.6:1 | AA for large only. Labels & meta. |
| Pump on Bone | #C8542A on #F5F1E8 | ~3.6:1 | AA for large only. CTAs & eyebrows. |
| Ember on Bone | #8B2C1E on #F5F1E8 | ~7.6:1 | AAA. Error text. |
| Cream on Coal | #FBFAF5 on #1A0E0A | ~16.5:1 | AAA. Toast, footer. |
| Cream on Signal | #FBFAF5 on #C8252A | ~4.9:1 | AA. Button text on Signal. |
| Signal on Bone | #C8252A on #F5F1E8 | ~4.8:1 | AA for normal text. |
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 category | 5-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 sizes | Two 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 reproduction | Mathematical 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 mode | Dual-mode shipped in v1. Specified in section 15. Toggle, tokens, and dev wiring documented. Closes audit round 1 finding 10. | Locked. |
| Marketing photography | Field shoot of real Australian inspections still pending. Highest-leverage single asset for the brand. | Pending. |
How we got here.
| Version | Date | What landed |
|---|---|---|
| v0 | 30.05.26 | Inspection tag explored as signature motif. Vertical + horizontal. |
| v1 palette | 30.05.26 | Ember palette built. Twelve colours, three families. |
| v2 logo+type | 30.05.26 | Wordmark C, Geist sans + mono, three principles named. |
| v3 valve mark | 30.05.26 | Tag silhouette dropped as mark. Valve handwheel introduced. Signal red proposed. Four animations built. |
| v4 separation | 30.05.26 | Mark and wordmark separated. UI states drafted. |
| v5 mark workshop | 30.05.26 | Mark study E locked. Surface list cut. Marketing nav fixed. Report cover simplified. |
| brand book v1 | 30.05.26 | Everything consolidated. Print, accessibility, open items added. |
| v1 complete | 30.05.26 | Scales, iconography, component primitives added. Asset SVGs exported. Deployed to Netlify. |
| v1 + dark mode | 30.05.26 | Dual-mode shipped. Toggle in TOC. Three new dark-only tokens (Deep Coal, Hearth, Char). Open item closed. |
| v1 + Pretendard | 31.05.26 | Geist 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. |