Full-stack inner development operating system built on Next.js 16 + Prisma 7 + PostgreSQL + OpenAI + Clerk. Generates personalized daily mental training tasks, collects reflection, updates user state, and provides internal reward feedback. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.6 KiB
6.6 KiB
Design System — Inner OS
Product Context
- What this is: AI-driven inner development operating system — generates one personalized daily mental training task, explains why it's chosen, collects post-session reflection, updates user state, and delivers internal reward feedback.
- Who it's for: Solo inner development practitioners who want structured mental training without a human coach.
- Space/industry: Mental wellness / inner development (adjacent to Headspace, Calm, Waking Up)
- Project type: Web app (mobile-first, journal-width constrained)
Aesthetic Direction
- Direction: Editorial/Organic hybrid — typographic warmth with natural earth tones
- Decoration level: Intentional — subtle warmth cues (cream background, soft rounded corners) without decorative blobs or gradients. The "decoration" IS the typography and whitespace.
- Mood: Calm companion. The UI should feel like a well-printed private journal, not a SaaS dashboard. Paper texture, ink-color text, breathing room. The app recedes; the practice is center stage.
- Memorable thing: "It feels like a private journal, not an app."
- Reference sites: None (greenfield design system)
Typography
- Display/Headings: Fraunces (serif, wght 300-700, opsz 16-48) — Literary, warm serif with variable optical size. Feels like a book, not a browser. Soft curves and humanist proportions serve the private journal metaphor.
- Body: DM Sans (sans-serif, wght 400-500-700) — Clean geometric sans with humanist warmth. High x-height for readability at 16px.
- UI/Labels: DM Sans (500 weight) — Same family, slightly bolder.
- Data/Tables: DM Sans (tabular-nums enabled) — Built-in tabular figures for progress charts and metrics.
- Code: JetBrains Mono (developer tooling only, never user-facing)
- Loading: Google Fonts CDN with
font-display: swap - Scale:
| Level | Size / Line-height | Use |
|---|---|---|
| xs | 12px / 1.5 (18px) | Captions, timestamps |
| sm | 14px / 1.5 (21px) | Secondary text, labels |
| base | 16px / 1.6 (25.6px) | Body text |
| md | 18px / 1.5 (27px) | Card headings, emphasized body |
| lg | 22px / 1.4 (30.8px) | Section headings |
| xl | 28px / 1.3 (36.4px) | Page titles |
| 2xl | 36px / 1.2 (43.2px) | Hero/day heading |
Color
- Approach: Restrained — one accent (amber), one secondary (sage), warm neutrals. Color is rare and meaningful — it signals action, progress, or reward, never decoration.
Light Mode
| Token | Hex | Role |
|---|---|---|
| Primary/Accent | #C8834A (Amber) |
CTAs, active states, streak indicators |
| Secondary | #7A9A8B (Sage) |
Success states, progress fill, calm indicators |
| Background | #FAF7F2 (Cream) |
Page background |
| Surface | #F3EFE8 (Sand) |
Cards, elevated surfaces |
| Border | #E6E0D4 (Stone) |
Dividers, input borders |
| Text Primary | #2C2416 (Ink) |
Body text, headings |
| Text Secondary | #6B5E4A (Muted ink) |
Captions, secondary labels |
| Text Tertiary | #9B8E7A (Faded ink) |
Placeholders, disabled |
Semantic
| Token | Hex | Use |
|---|---|---|
| Success | #7A9A8B (Sage) |
Completion confirmations, progress |
| Warning | #C8834A (Amber) |
Streak-at-risk, attention needed |
| Error | #C45A4A |
Session expired, validation errors |
| Info | #5A8AB5 |
Neutral status, tips |
Dark Mode
- Strategy: Redesign surfaces, reduce saturation 15%. Warm dark background instead of cool dark. Amber and sage stay — they read warm against dark.
- Tokens:
| Token | Hex | Role |
|---|---|---|
| Background | #1E1A14 (Night ink) |
Page background |
| Surface | #292418 (Dark sand) |
Cards, elevated surfaces |
| Border | #3D3528 (Dark stone) |
Dividers, input borders |
| Text Primary | #F3EFE8 (Warm sand) |
Body text, headings |
| Text Secondary | #B8A892 (Muted cream) |
Captions, secondary labels |
| Text Tertiary | #8A7D6B |
Placeholders, disabled |
Spacing
- Base unit: 8px
- Density: Comfortable
| Token | Value | Use |
|---|---|---|
| 2xs | 4px | Icon-text gap, inline spacing |
| xs | 8px | Tight gaps, chip padding |
| sm | 12px | Card padding (compact) |
| md | 16px | Standard padding, card gaps |
| lg | 24px | Section gap, card padding (comfortable) |
| xl | 32px | Page-level spacing |
| 2xl | 48px | Major section divisions |
| 3xl | 64px | Top/bottom page breathing room |
Shape
- Border radius (hierarchical):
| Token | Value | Use |
|---|---|---|
| sm | 6px | Inputs, buttons |
| md | 12px | Cards, modals |
| lg | 16px | Large surfaces |
| full | 9999px | Pills, badges, stage indicators |
Layout
- Approach: Hybrid — single-column journal-width (640px max, centered) for reading/reflection pages; grid-disciplined for progress charts
- Grid: 1 column (mobile), centered 640px (desktop)
- Max content width: 640px
- Navigation: Bottom tab bar, 4 tabs (Today, Progress, Rewards, Settings), fixed position, 56px height, 44px minimum touch targets
Motion
- Approach: Intentional — transitions that aid comprehension without calling attention
- Easing: enter(ease-out), exit(ease-in), move(ease-in-out)
- Duration:
- Micro: 150ms (button hover)
- Short: 200ms (page transitions, fade + 4px Y shift)
- Medium: 400ms (reward animations, scale + fade)
- Long: 600ms (progress bar fill)
Accessibility
- Baseline: WCAG AA
- Touch targets: 44px minimum
- Contrast: All body text meets 4.5:1 against background
- Keyboard: All interactive elements keyboard-navigable
- Focus: Visible focus ring (amber outline, 2px) on all interactive elements
- Screen readers: ARIA landmarks on all pages (banner, main, navigation, complementary)
Decisions Log
| Date | Decision | Rationale |
|---|---|---|
| 2026-05-20 | Initial design system created | Created by /design-consultation based on CEO plan, eng review, and 10 design review decisions |
| 2026-05-20 | Practice journal aesthetic | User's memorable thing: "It feels like a private journal, not an app" |
| 2026-05-20 | Fraunces + DM Sans typography | Literary serif for journal feel; clean sans for readability |
| 2026-05-20 | Cream/Amber/Sage/Ink palette | Warm, grounded, non-clinical colors that serve the journal metaphor |
| 2026-05-20 | Journal-width max 640px centered | Matches reading column width; mobile-first, not responsive-gimmick |
| 2026-05-20 | Bottom tab bar navigation | Standard mobile pattern, no learning curve, 4 primary destinations |
| 2026-05-20 | Calm companion emotional tone | Warm but not saccharine, grounded but not clinical |