Web redesign — concept (2026-07-21)
Web redesign — concept (2026-07-21)
Concept direction for apps/web/. Pairs with prd.md (already updated m0011).
Final implementation will be drafted into Stitch after sign-off.
What this is
A redesign of apps/web/ so the product looks like a tool a branding
agency refines, not a service they hire. Same backend, same flow, new
visual + information design. Minimal surface area, maximal restraint.
What this is NOT
- Not a brand-marketing refresh. The wordmark changes; the design system
changes; the IA changes. Copy onprd.mdalready updated. - Not bespoke illustration. No custom motion library. No 3D. No Lottie.
- Not a 6-step wizard. Intake collapses to 3 steps with optional context
tucked behind a single “Tell us more” affordance.
Brand foundation
- Voice: tool-first. The agency operates it; we don’t consult.
- Moat: white-label, copyright-free, platform-agnostic generated
audio. Agency ships it on client site / product / app / ads / social
/ retail / phone / decks. Suno / ElevenLabs / Epidemic Sound can’t. - Output metaphor: “your kit.” Not “your strategy.” The strategy is
the artifact; the kit is the deliverable. - Mechanism: a tool the agency refines. UI should feel like a
studio tool — knobs, previews, regenerate — not a form.
Design tokens
Color
Monochrome ground, maroon pulse, no warm earth palette.
| Token | Value | Use |
|---|---|---|
--ink |
#0e0a08 |
Type, primary |
--ink-soft |
#3a3530 |
Body text, secondary |
--paper |
#faf7f2 |
Page background (warm off-white, near-white) |
--paper-2 |
#f0ebe1 |
Subtle elevation (cards, hover) |
--rule |
#e3dccf |
Hairlines, dividers |
--maroon |
#5a1a1f |
Pulse highlight, primary CTA, focus |
--maroon-ink |
#3a0f12 |
Maroon text on paper |
The maroon is the only chroma in the system. Everything else is
monochrome. Background is near-white paper, not the cream that read as
artisan bakery. Type is near-black, not warm brown.
Type
| Role | Family | Weights |
|---|---|---|
| Display (wordmark, H1, hero) | Fraunces | Black (900), Bold (700), Regular (400) |
| Body / UI / microcopy | Satoshi | Regular, Medium, Bold |
- Wordmark: “brioso.” — lowercase, Fraunces Black (pinned at wght=900, opsz=144 in the variable source), trailing period.
- Type scale (Satoshi): 12 / 14 / 16 / 18 / 20 / 24 / 32 / 44.
- Display (Fraunces): only 44 / 64 / 96 for hero + section openers.
- Line height: 1.4 body, 1.05 display.
- Letter-spacing: -0.02em display, -0.01em H2, 0 body, +0.04em micro.
- Never set body copy in Fraunces; it is a wordmark/display face.
Fraunces is OFL (Undercase Type). Source .ttf files live under
apps/web/public/fonts/source/ (gitignored); the bundled woff2 outputs
in apps/web/public/fonts/ are generated by
scripts/build-fraunces-woff2.py and re-run via bun run build:assets.
Satoshi is OFL/FLF and ships with the full family in
Downloads/Satoshi_Complete.zip.
Spacing
8px base. Scale: 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128.
Radius
Default 12px. Cards 16px. Pills 999px. Inputs 10px.
Motion
| Element | Motion | Duration | Easing |
|---|---|---|---|
| Pulse (radial burst) | breathe + slow rotate | 6s breathe, 60s rotate | sine in-out |
| Page enter | fade + 8px up | 400ms | cubic-bezier(.2,.8,.2,1) |
| Hover (buttons, links) | opacity / underline | 150ms | ease-out |
| Modal / dialog | fade + scale 0.98→1 | 200ms | ease-out |
The pulse is the only “ambient” motion. Everything else is reactive.
Information architecture
Single product, two entry paths surfaced equally in the top nav.
Home / Landing — both audiences, with a tab toggle
Strategy / Free Audio Strategy (logo + URL → PDF)
Studio / The kit generator ($99 paid intake → kit delivery)
For Musicians / B2C variant of Studio (same engine, simpler copy)
Pricing / One card: $99 per kit. Free strategy is the lead magnet.
Docs / (later) — public-facing guides for white-label usage.
Top nav (5 items): Studio · For Musicians · Pricing · Docs · Sign in.
No “Strategy” in the nav — it’s a marketing surface, linked from
hero, not a destination in IA.
Page-by-page
Landing (/)
- Hero: wordmark left-aligned, Fraunces 96px (text-hero), single line.
Below it, one sentence: the moat — “White-label audio for every place your brand lives.” (Iterate.)
Right of hero: the pulse. Breathing radial burst, ~360px,
centered, hollow core. Maroon highlights active spokes.
No headline adjective soup. No carousel. - Below hero: a single quiet section. Three columns of one line each.
- “Generate” (logo + URL)
- “Refine” (3-step intake, regen)
- “Ship” (white-label ZIP + guidelines, zero Brioso branding)
- Mid: comparison strip. Suno / ElevenLabs / Epidemic Sound / Brioso.
Columns: where it can ship. Brioso column wins by being the only one
with all rows green. No editorializing, the table makes the case. - Bottom CTA: “Make your kit.” →
/studio. - Footer: minimal. Brand wordmark, two columns (Product / Company),
social row. No newsletter.
Intake (/studio)
Three steps, one screen tall each. Right rail: live preview of the
emerging kit (logo uploaded → first waveform renders as soon as the
strategy step completes).
- Brand — logo upload, URL paste, brand name. Required.
- Vibe — one question: “Pick three words your brand should sound
like.” Chip-grid. Twenty-eight words total, four columns on desktop,
three on mobile. Multi-select to three. The chosen words drive
archetype + emotional-goals inference server-side. - Context (optional) — single collapsible panel. “Tell us more.”
Inside: long-form prompt, brand voice notes, references. Default
closed; agent feels short by default.
Submit → strategy doc lands in ~/library (B2C) or ~/clients/:slug
(B2B) → payment → generation → kit delivery.
Strategy doc (/strategy/:slug)
The free deliverable. Public read-only URL.
- Hero: brand name (Fraunces 64, text-display), one-line summary (Satoshi 18).
- Body: Audio Strategy document. Five sections: Brand in sound /
Personality / Archetype / Emotional goals / Sonic palette. - Each section renders with a small inline waveform glyph next to the
header — 24px, monochrome. Subtle. - Bottom CTA: “Generate your kit — $99” →
/studio?prefill=:slug.
Kit delivery (/studio/:id/kit)
The product. The artifact.
- Top: brand wordmark left, “kit.” right (lowercase, Fraunces, period).
- Audio blocks (3–5). Each block has:
- Title (Fraunces 32): e.g., “Hero loop” / “Loading state” /
“Hold music” / “Notification chime” / “Son outro”. - Live waveform (wavesurfer.js, maroon playhead).
- Duration, BPM, key, mood chips.
- Action row: Play · Regenerate · Download (
.flac+.mp3) ·
Mark for client.
- Title (Fraunces 32): e.g., “Hero loop” / “Loading state” /
- Right rail: package export. White-label ZIP preview.
- Files:
logo/folder (SVG + PNG),audio/(flac + mp3),guidelines.pdf. - Branding toggle: “Strip Brioso from export” — on by default.
- Download button: maroon, primary.
- Files:
- Below: usage table. Where this kit can ship (web / product / app /
social / retail / phone / decks). Each row: green check. This is the
moat made visible at the deliverable.
B2C variant (/for-musicians)
Same /studio engine, different surface copy. Top of the page replaces
the agency framing with personal-music framing. Same 3-step intake
minus the brand-logo step (replaced with track title). Kit delivery
renders the same. No white-label toggle — it’s their own music.
Components
Build small. Reuse shadcn primitives in apps/web/components/ui/.
Custom-built (in apps/web/components/brioso/):
Pulse— the radial burst. SVG, ~80 lines. Props:size,phase,
highlightSpokes. Animates via CSS custom properties +requestAnimationFrame.
~30 lines of motion logic.Wordmark— Fraunces, “brioso.”, trailing period. Single SVG (auto-generated paths from the variable source), no JS.KitCard— one audio block in the kit. wavesurfer.js inside, action
row beneath.ChipGrid— multi-select to N, used in intake vibe step.MaroonButton— primary CTA, single component, used everywhere a CTA
appears. No “variants.” One visual treatment, monochrome hover.
Reused as-is (no rebuild):
- shadcn
Button,Input,Dialog,Tabs,Tooltip,Sheet. react-hook-form+ zod for intake validation (already in app).wavesurfer.jsfor playback.- Stripe Checkout (already wired).
Motion details — the pulse
- 36 spokes around a hollow core.
- Per-spoke base length, base phase offset, base amplitude.
- Animation: amplitude breathes from 0.6 → 1.0 → 0.6 over 6s (sine).
- Phase offsets per spoke give the breathing a “heartbeat” — not a
metronome. - Rotation: 360° over 60s, linear, infinite.
- Maroon highlight: a small subset of spokes (e.g., 6) ride the peak of
the breathe — when amplitude is highest, they fire to maroon. The rest
stay ink. - Implementation: SVG,
<line>per spoke,transform="rotate(...)",
stroke-dasharraymodulated by amplitude via CSS variables. JS only
setstransform: rotate(...)and the amplitude CSS var per frame. - Respect
prefers-reduced-motion: skip rotation, slower breathe, no
maroon cycling.
Out of scope (this pass)
- Account dashboard polish (deferred — kit delivery is the primary surface).
- Agency multi-client management UI (future — for v2).
- Public docs site (linked from kit delivery, built later).
- Animations beyond the pulse + standard hover/enter.
- A “blog” or any content marketing surface.
- A/B testing infrastructure.
Open after sign-off
- Display-face migration is resolved — Fraunces (OFL) ships six static
72pt cuts + the variable source underapps/web/public/fonts/source/,
rebuild viabun run build:assets. - Final hero copy + comparison table copy.
- Implementation plan broken into Stitch-shaped chunks.
- GitHub Project issue: file under project briosoco/projects/1 with
the Epic: “Web redesign v2.”