Design & build guide

How Meridian
was built.

A boutique private bank, designed and built end-to-end by Claude (Fable 5) — concept, copy, code and AI-generated imagery. This page documents the thinking.

Concept

The brief: quiet power. The digital equivalent of a mahogany room with a single Rothko — precision, discretion, heritage-meets-modern. A fictional Geneva private bank, founded 1962, managing $14.2B for 240 families.

Every decision flows from restraint. No exclamation marks in the copy. No bright accents beyond a single champagne gold. Motion that behaves like the institution: slow, eased, never eager. The one indulgence is the hero — a living market line that draws itself and never stops evolving, because a chart that quietly keeps rising is the entire promise of the firm.

Deep navy

#0A1628

Midnight

#060D1A

Champagne

#D4B886

Porcelain

#F4F1EA

Slate

#8A94A6

Type: Cormorant Garamond (300/400, roman & italic) for display — an old-style serif with genuinely aristocratic proportions — paired with Inter for UI and body. Every number on the site is set with font-variant-numeric: tabular-nums, the way a bank statement would be.

Assets

Three images, generated with GPT Image 2 (quality: high) and used without retouching. The actual prompts:

The corner office

gpt-image-2 · 1536×1024 · assets/office-dusk.webp

“A cinematic editorial photograph taken from inside a high-floor private banking office at dusk, looking out through floor-to-ceiling windows at a vast city skyline dissolving into blue evening haze. In the near foreground, the dark silhouette of a walnut desk edge and the back of an empty leather chair, softly out of focus. The city below glows with thousands of tiny warm champagne-gold window lights against deep navy blue twilight, faint fog between distant towers. Subtle reflections of the dim office interior ghost across the glass. Shot on 35mm film, shallow depth of field, low-key exposure, palette restricted to deep navy #0A1628, midnight blue shadows, and champagne gold #D4B886 highlights. Quiet, powerful, discreet old-money mood. No people, no text, no watermark.”
Generated image: private office at dusk overlooking a city skyline

The instrument

gpt-image-2 · 1536×1024 · assets/pen-macro.webp

“An extreme macro editorial still-life photograph of a champagne-gold fountain pen nib resting on heavy midnight-navy cotton paper, photographed at a low raking angle. The engraved metal of the nib shows fine guilloché line engraving catching a single soft directional light from the left, glinting warm gold against near-black shadow. The navy paper shows subtle fiber texture and a faint embossed horizontal line. Extremely shallow depth of field, the nib tip razor sharp, everything else melting into dark bokeh. Palette: deep navy #0A1628, near-black midnight, champagne gold #D4B886. Restrained, luxurious, quiet-power mood, like a private bank annual report cover. 35mm film grain, no text, no watermark.”
Generated image: macro of a gold fountain pen nib on navy paper

The stone

gpt-image-2 · 1024×1024 · assets/marble.webp

“A full-frame editorial photograph of polished dark navy-black marble stone, shot straight on as a seamless texture. Fine veins of warm champagne gold and pale porcelain thread diagonally through the deep midnight surface like slow rivers, with subtle cloudy mineral depth beneath the polish. Soft even museum lighting with one gentle highlight gradient across the upper third. Ultra-fine detail, luxurious and restrained, palette limited to deep navy #0A1628, near-black, champagne gold #D4B886 and faint porcelain #F4F1EA veining. No objects, no text, no watermark, pure material surface.”
Generated image: dark navy marble with champagne gold veining

Techniques

// the entire market: three octaves of value noise + drift
function series(x) {
  var v = 0.52 * vnoise(x * 0.55, 7)
        + 0.30 * vnoise(x * 1.9, 41)
        + 0.18 * vnoise(x * 6.5, 97);
  return v * 0.72 + 0.14 + 0.055 * Math.sin(x * 0.21);
}
// every frame, the visible window slides through noise-space
var x0 = t * SPEED;  // never resets — the line evolves forever

Everything is vanilla — no frameworks, no animation libraries, no build step. Reduced motion is honoured throughout: the chart renders one static frame, counters print final values, parallax and grain stop.

Process

Three full iteration passes over the finished site, each with desktop + mobile screenshots and console checks.

Pass 01Structure & truth-telling

Screenshots at 1280px and 375px surfaced real bugs: the canvas loop could latch itself paused when a visibility observer fired against a zero-size viewport; canvases sized at 0×0 if layout wasn't ready; the map's city markers, positioned for a desktop width, forced 849px of horizontal overflow on a 375px phone; and the footer grid never collapsed. Fixed with a watchdog frame loop, ResizeObservers on both canvases, an overflow guard on the map, and a stacked footer. The chart's stroke gradient was also rescaled to the drawn width so the leading edge draws in champagne.

Pass 02Rhythm & elevation

Rhythm and hierarchy. On phones the chart now recedes to 55% opacity in the bottom band of the hero so the call-to-action stays primary. Added the champagne scroll-progress hairline, eyebrow rules that draw themselves on reveal, stat hairlines that grow top-down, ken-burns drift layered onto the vista parallax, and champagne focus states on the form. Verified the mobile menu, form validation and hover preview by dispatching real DOM events.

Pass 03Polish & proof

Proof pass at 375 / 768 / 1280: zero console errors, zero horizontal overflow at any width, reduced-motion verified (static chart frame, final counter values, no parallax), focus-visible rings on every interactive element, and this guide's back-link restored on mobile. Page weight audited at ~4.2 MB, all of it the three hero-grade images.

Ship it

The site is fully static — no build step. To deploy:

npx wrangler pages deploy . --project-name meridian
Return to the site