diff --git a/openspec/changes/visual-redesign/.openspec.yaml b/openspec/changes/visual-redesign/.openspec.yaml
new file mode 100644
index 0000000..65bf7c9
--- /dev/null
+++ b/openspec/changes/visual-redesign/.openspec.yaml
@@ -0,0 +1,2 @@
+schema: spec-driven
+created: 2026-03-28
diff --git a/openspec/changes/visual-redesign/design.md b/openspec/changes/visual-redesign/design.md
new file mode 100644
index 0000000..5254af6
--- /dev/null
+++ b/openspec/changes/visual-redesign/design.md
@@ -0,0 +1,179 @@
+## Context
+
+The Planner was built function-first with default Tailwind styling. A design
+exploration ("D1 warmth + D3 lightness") produced desktop and mobile mockups.
+The reference HTML mockup is at `mockup.html`.
+
+## Goals / Non-Goals
+
+**Goals:**
+- Implement the visual design from the mockup across all Planner components
+- Establish a design token system (CSS vars + Tailwind) for consistency
+- Make the Planner mobile-responsive with a bottom sheet sidebar
+- Style aspirational features (day breakdown, waypoint notes) as muted/coming-soon
+
+**Non-Goals:**
+- Redesigning the Journal app (separate change)
+- Implementing multi-day splitting logic (just the visual containers)
+- Implementing waypoint notes logic (just the UI placeholders)
+- Dark mode (later)
+- Landing page redesign (separate)
+
+## Decisions
+
+### D1: Design tokens as CSS custom properties
+
+```css
+:root {
+ /* Surface */
+ --bg: #F5F2EB; /* warm off-white, main background */
+ --bg-subtle: #EDEAE1; /* card backgrounds */
+ --bg-raised: #FAF8F4; /* topbar, sidebar, elevated surfaces */
+ --map-tint: #E4DFD2; /* map background tone */
+
+ /* Text */
+ --text-hi: #1A1916; /* primary */
+ --text-md: #5C5847; /* secondary labels */
+ --text-lo: #9A9484; /* tertiary, placeholders */
+ --text-inv: #FAF8F4; /* on dark surfaces */
+
+ /* Accent: muted sage-forest green */
+ --accent: #4A6B40;
+ --accent-dim: #6A8B5E;
+ --accent-bg: rgba(74,107,64,.08);
+ --accent-border: rgba(74,107,64,.2);
+
+ /* Overnight stop: warm amber-brown */
+ --stop: #8B6D3A;
+ --stop-bg: rgba(139,109,58,.1);
+ --stop-border:rgba(139,109,58,.25);
+
+ /* Danger / no-go */
+ --nogo: rgba(160,60,60,.12);
+ --nogo-border:rgba(160,60,60,.3);
+
+ /* UI chrome */
+ --border: #DDD9D0;
+ --border-md: #CAC6BC;
+ --shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
+ --shadow-md: 0 4px 12px rgba(0,0,0,.08), 0 1px 4px rgba(0,0,0,.05);
+
+ /* Elevation gradient (route + chart) */
+ --eg-lo: #5A8F46; /* green, low elevation */
+ --eg-mid: #C4A840; /* amber, mid elevation */
+ --eg-hi: #C46040; /* terracotta, high elevation */
+
+ /* Typography */
+ --font-body: 'Outfit', sans-serif;
+ --font-mono: 'Geist Mono', monospace;
+}
+```
+
+Extended into Tailwind via `tailwind.config.ts` theme extension so utility
+classes work: `text-text-hi`, `bg-bg-raised`, `border-border`, etc.
+
+### D2: Typography & Logo
+
+- **Body**: Outfit (clean, geometric, friendly) — 14px base
+- **Stats/distances**: Geist Mono — used for km, elevation, coordinates
+- **Logo**: Two-part system:
+ - **Mark**: "Waypoint Dot" — three connected dots with a curved route line
+ (sage green, SVG). Used as favicon, app icon, and topbar mark.
+ - **Wordmark**: "trails" (Outfit 700) + ".cool" (Outfit 300, muted). Used
+ alongside the mark in the topbar, standalone for large displays.
+ - See `logo-concepts.html` for all sizes (24px, 48px, 128px).
+- Loaded via Google Fonts or self-hosted for performance
+
+### D3: Topbar layout
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ [∧ trails.cool] │ [🚴 Cycling (safe) ▾] │ [Y] You │ [A][S][M] +3 │ [+ Invite] ││ [Plain │ Elevation │ Surface] │ [↓ Export GPX] │
+└─────────────────────────────────────────────────────────────┘
+```
+
+- Waypoint Dot mark + "trails .cool" wordmark, separated by vertical divider
+- Profile selector with bike icon
+- Participant avatars with "You" label and Host badge
+- "+ Invite" button (copies session link)
+- Segmented toggle for color mode (replaces dropdown)
+- Export GPX right-aligned
+
+### D4: Sidebar layout
+
+```
+┌─────────────────────────┐
+│ [WAYPOINTS] [NOTES] │
+├─────────────────────────┤
+│ ACTIVE ROUTE │
+│ Berlin → Erfurt │
+│ via Dessau │
+│ 343 km ↑868m 3 days │
+├─────────────────────────┤
+│ DAY BREAKDOWN [SOON] │
+│ ┌─────────────────────┐ │
+│ │ 01 Berlin→Dessau │ │
+│ │ ↑340m 120 km │ │
+│ │ ● Berlin Alexplatz │ │
+│ │ ○ Zossen │ │
+│ │ ○ Jüterbog │ │
+│ │ ● Dessau OVERNIGHT │ │
+│ │ "Elbe crossing" │ │
+│ └─────────────────────┘ │
+│ ▸ 02 Dessau→Halle 130km│
+│ ▸ 03 Halle→Erfurt 93km│
+└─────────────────────────┘
+```
+
+- Route summary always visible at top
+- Day breakdown collapsible, with waypoints nested inside
+- Overnight stops marked with amber badge
+- Waypoint notes as italic text under waypoint name
+- Day 01 expanded by default, others collapsed
+
+### D5: Map marker styling
+
+- **Waypoint markers**: Dark olive circles (#4A6B40) with white number, not blue
+- **Overnight stops**: Amber-brown (#8B6D3A) circle with "NIGHT N" badge above
+- **Waypoint notes**: Small note icon on marker, hover/tap to read
+- **Day labels**: White pill on route line ("Day 1 · 120 km")
+- **No-go areas**: Use `--nogo` / `--nogo-border` tokens (muted red)
+- **Ghost marker**: Sage green circle matching accent
+
+### D6: Elevation chart redesign
+
+- Day dividers as dashed vertical lines with "Day 1", "Day 2" labels
+- Elevation gradient uses `--eg-lo` → `--eg-mid` → `--eg-hi`
+- Min/max elevation labels on Y axis
+- Km marker tooltip on hover (not just crosshair)
+- Stats right-aligned: "343.3 km distance ↑ 868 m ascent"
+
+### D7: Mobile bottom sheet
+
+Replace hidden sidebar with a draggable bottom sheet:
+- **Collapsed**: Route summary + elevation mini-chart visible
+- **Half-expanded**: Tabs (Days/Waypoints/Notes) + scrollable content
+- **Full-expanded**: Full sidebar content
+- Swipe up/down to toggle states
+- Map takes full viewport, sheet overlays from bottom
+
+### D8: Implementation phases
+
+1. **Design tokens + fonts**: CSS vars, Tailwind config, font loading
+2. **Topbar**: New layout, segmented toggle, invite button, avatar styling
+3. **Sidebar**: Route summary, day breakdown placeholder, waypoint styling
+4. **Map markers**: New waypoint icons, overnight badges, ghost marker color
+5. **Elevation chart**: New gradient, day dividers, hover label
+6. **Mobile**: Bottom sheet component, responsive header
+7. **Polish**: Transitions, hover states, loading states, empty states
+
+## Risks / Trade-offs
+
+- **Font loading**: Two Google Fonts add ~40KB. Mitigate with `display=swap`
+ and preconnect. Can self-host later.
+- **Aspirational features shown as muted**: Users might expect them to work.
+ Mitigate with clear "SOON" badges.
+- **Custom CSS vars + Tailwind**: Slight complexity. But ensures consistency
+ and makes future dark mode straightforward.
+- **Bottom sheet on mobile**: Complex to build well. Can use a library like
+ `vaul` or build minimal version first.
diff --git a/openspec/changes/visual-redesign/logo-concepts.html b/openspec/changes/visual-redesign/logo-concepts.html
new file mode 100644
index 0000000..1a5e039
--- /dev/null
+++ b/openspec/changes/visual-redesign/logo-concepts.html
@@ -0,0 +1,231 @@
+
+
+
+
+
+trails.cool — Logo Concepts
+
+
+
+
+
+trails.cool — Logo Concepts
+5 directions. Sage green (#4A6B40) on warm off-white. Avoiding mountain silhouettes (AllTrails territory).
+
+
+
+
+
+
1. Route Trace
+
An organic curved line — the shape of a real route. Suggests movement, planning, flow.
+
+
+
+
trails .cool
+
+
+
+
+
+
2. Contour Ring
+
Topographic contour lines seen from above. Says "terrain" without being a mountain.
+
+
+
+ trails .cool
+
+
+
+
+
+
3. Waypoint Dot
+
Three connected dots — the core gesture of the app. Place waypoints, get a route. Most ownable.
+
+
+
+
128px
+
+
+
+
+
+
+
trails .cool
+
+
+
+
+
+
4. Elevation Mark
+
A mini elevation profile — the signature feature of the app. Not a mountain, it's data.
+
+
+
+
+
+
+
5. Wordmark Only
+
No mark. The typography IS the brand. The dot in ".cool" is the visual anchor.
+
+
+
+ trails .cool
+
+
large
+
+
+
+ trails.cool
+
+
medium
+
+
+
+
+
+ trails.cool
+
+
+
on dark
+
+
+
+
+
+
diff --git a/openspec/changes/visual-redesign/mockup.html b/openspec/changes/visual-redesign/mockup.html
new file mode 100644
index 0000000..da2e4ff
--- /dev/null
+++ b/openspec/changes/visual-redesign/mockup.html
@@ -0,0 +1,1550 @@
+
+
+
+
+
+trails.cool — Revised Direction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Revised direction — merging D1 warmth + D3 lightness
+
trails.cool — Desktop
+
+
+
+
+
+
+
+
+
+ trails.cool
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Y
+
+
+ You
+ Host
+
+
Editing route
+
+
+
+
+
+
A
+
+
Alex
+
Viewing · near Dessau
+
+
+
+
+
+
+
+
+
+
+
+
T
+
+
Tom
+
Moving waypoint 2
+
+
+
+
+
+
+
+
+
Share link — anyone can join
+
+
trails.cool/s/cb6ada8e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Connected · cb6ada8e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1
+
Berlin Alexanderplatz
+
+
+
+
+
+
+
+
+
+
Day 1 · 120 km
+
Day 2 · 130 km
+
+
+
+
+
+
+
© OpenStreetMap
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Revised direction
+
trails.cool — Mobile
+
+
+
+
+
+
+
+
+
+ 🚲 Cycling (safe)
+ ▾
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Day 1 · 120 km
+
+
+
+
+
© OpenStreetMap
+
+
+
+
+
+
+
+
+
Berlin → Erfurt
+
3 days · via Dessau · Elevation gradient
+
+
+ 343 km
+ ↑ 868 m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
01
+
+
Berlin → Dessau
+
↑ 340 m ascent
+
+
120 km
+
+
+
02
+
+
Dessau → Halle
+
↑ 310 m ascent
+
+
130 km
+
+
+
03
+
+
Halle → Erfurt
+
↑ 218 m ascent
+
+
93 km
+
+
+
+
+
+
+
+
+
+
+
diff --git a/openspec/changes/visual-redesign/proposal.md b/openspec/changes/visual-redesign/proposal.md
new file mode 100644
index 0000000..6e713a9
--- /dev/null
+++ b/openspec/changes/visual-redesign/proposal.md
@@ -0,0 +1,49 @@
+## Why
+
+The current UI is functional but unstyled — default Tailwind colors, no visual
+identity, no typography system. As features mature (route coloring, no-go areas,
+multiplayer), the app needs a design language that matches the quality of the
+interactions. Early testers find the tool powerful but visually generic.
+
+A design exploration produced a "Trail Worn warmth + Nordic Precision lightness"
+direction: warm off-whites, sage green accent, earthy overnight markers, Outfit
+font, Geist Mono for stats. The reference mockup lives at
+`mockup.html` (desktop + mobile views).
+
+## What Changes
+
+- **Design system**: CSS custom properties for colors, typography, spacing.
+ Tailwind config extended with project tokens. Outfit (body) + Geist Mono
+ (stats) fonts.
+- **Topbar redesign**: Logo with mountain mark, segmented color mode toggle,
+ participant avatars with names, "+ Invite" button, Export GPX right-aligned
+- **Sidebar redesign**: Route summary header (name, stats, duration), collapsible
+ day breakdown (aspirational, "SOON" badge), waypoints nested inside days,
+ overnight badges on stop waypoints, waypoint notes
+- **Map marker styling**: Olive/dark numbered circles instead of blue, "NIGHT"
+ badges on overnight stops, day segment labels on route
+- **Elevation chart**: Day dividers as dashed vertical lines, elevation gradient
+ matching route colors, km hover label, min/max elevation labels
+- **Mobile responsive**: Bottom sheet pattern replacing hidden sidebar, simplified
+ header, swipeable tabs (Days/Waypoints/Notes)
+
+## Capabilities
+
+### New Capabilities
+
+- `design-system`: Shared design tokens, typography, color palette, component
+ styling patterns for the Planner app
+
+### Modified Capabilities
+
+- `map-display`: New waypoint marker styling, overnight badges, day labels
+- `planner-session`: Sidebar layout with route summary and day breakdown
+
+## Impact
+
+- **Tailwind config**: Extended with project color tokens and font families
+- **All Planner components**: Updated styling (colors, typography, spacing)
+- **New fonts**: Outfit + Geist Mono loaded via Google Fonts or self-hosted
+- **No functional changes**: All existing interactions preserved, only visual
+- **ElevationChart**: Canvas drawing updated for new color gradient + day dividers
+- **Mobile**: New bottom sheet component for sidebar content
diff --git a/openspec/changes/visual-redesign/tasks.md b/openspec/changes/visual-redesign/tasks.md
new file mode 100644
index 0000000..c6ee3c7
--- /dev/null
+++ b/openspec/changes/visual-redesign/tasks.md
@@ -0,0 +1,61 @@
+## 1. Design Tokens & Typography
+
+- [ ] 1.1 Add CSS custom properties (`:root` vars) for colors, shadows, borders
+- [ ] 1.2 Extend Tailwind config with project color tokens and font families
+- [ ] 1.3 Add Outfit + Geist Mono fonts (Google Fonts or self-hosted)
+- [ ] 1.4 Update base styles: body background, default text color, font-family
+- [ ] 1.5 Update elevation gradient colors in ColoredRoute + ElevationChart to use tokens
+
+## 2. Topbar Redesign
+
+- [ ] 2.1 New logo: Waypoint Dot mark SVG (3 dots + route curve) + "trails .cool" wordmark (Outfit 700/300)
+- [ ] 2.1b Generate favicon from Waypoint Dot mark (16px, 32px, 180px apple-touch)
+- [ ] 2.2 Replace color mode dropdown with segmented toggle (Plain/Elevation/Surface)
+- [ ] 2.3 Restyle participant avatars with name labels and Host badge
+- [ ] 2.4 Add "+ Invite" button (copies session link to clipboard)
+- [ ] 2.5 Restyle profile selector with bike/hike icon
+- [ ] 2.6 Move Export GPX to right-aligned position
+- [ ] 2.7 Apply token colors to topbar (--bg-raised, --border, etc.)
+
+## 3. Sidebar Redesign
+
+- [ ] 3.1 Add route summary header (route name, distance, ascent, duration)
+- [ ] 3.2 Add day breakdown section with "SOON" badge (collapsible, placeholder)
+- [ ] 3.3 Nest waypoints inside day sections (expandable/collapsible)
+- [ ] 3.4 Style overnight stop waypoints with amber badge
+- [ ] 3.5 Add waypoint note display (italic text under waypoint name, placeholder)
+- [ ] 3.6 Apply token colors to sidebar (--bg-raised, --text-md, --accent, etc.)
+
+## 4. Map Marker Styling
+
+- [ ] 4.1 Replace blue waypoint markers with olive/dark circles (#4A6B40 accent)
+- [ ] 4.2 Add overnight stop marker variant (amber-brown with "NIGHT N" badge)
+- [ ] 4.3 Update ghost marker color to match accent
+- [ ] 4.4 Update no-go area colors to use --nogo tokens
+- [ ] 4.5 Add day segment labels on route ("Day 1 · 120 km") — placeholder/aspirational
+
+## 5. Elevation Chart Redesign
+
+- [ ] 5.1 Update chart gradient to use --eg-lo / --eg-mid / --eg-hi tokens
+- [ ] 5.2 Add day divider vertical dashed lines with labels (aspirational)
+- [ ] 5.3 Add min/max elevation labels on Y axis
+- [ ] 5.4 Update hover tooltip to show km marker
+- [ ] 5.5 Right-align stats display: "343 km distance ↑ 868 m ascent"
+
+## 6. Mobile Responsive
+
+- [ ] 6.1 Create bottom sheet component (collapsed/half/full states)
+- [ ] 6.2 Move sidebar content into bottom sheet on mobile
+- [ ] 6.3 Show route summary + mini elevation in collapsed state
+- [ ] 6.4 Add swipeable tabs in bottom sheet (Days/Waypoints/Notes)
+- [ ] 6.5 Simplify topbar on mobile (hide text labels, compact avatars)
+- [ ] 6.6 Test touch interactions (map drag, waypoint tap, sheet swipe)
+
+## 7. Polish
+
+- [ ] 7.1 Add hover/focus states matching design tokens
+- [ ] 7.2 Add transitions for sidebar collapse, bottom sheet, tab switches
+- [ ] 7.3 Style loading states (connecting, computing route)
+- [ ] 7.4 Style empty states (no waypoints, no route)
+- [ ] 7.5 Add i18n keys for any new UI text (en + de)
+- [ ] 7.6 Visual verification in cmux browser (desktop + mobile viewport)