Interface: App UI

Rule

Quality bar: Build app interfaces worthy of Linear, Vercel, or Notion. Functional, clear, refined — and distinctly this product, not a template.

Intent First

Before any visual decisions, answer explicitly:

  • Who is this human? Specific role and context, not "users"
  • What must they accomplish? Specific verb — create, monitor, configure, analyze
  • What should this feel like? Concrete descriptors, not clichés

If your answer is "it's common" or "it's clean" — you haven't chosen. You've defaulted.

Product Domain Exploration

Every product exists in a world. Discover it before designing:

  • Domain vocabulary: 5+ concepts, metaphors, or terms from the product's actual world (not its features)
  • Color world: Colors that naturally exist in the physical version of this product space
  • Signature element: One visual, structural, or interaction element unique to THIS product
  • Defaults to avoid: Name 3 obvious choices for this interface type — to consciously avoid them

Test: Remove the product name from the design. Can someone identify what it's for?

The Swap Test

For every visual choice, ask: if I substituted the alternative, would the design's meaning change?

  • Same font as every other SaaS dashboard → defaulted
  • Same sidebar layout as the last 5 projects → defaulted
  • Same gray palette with blue accent → defaulted

If the swap wouldn't matter, the choice isn't a choice.

Depth Strategy

Pick ONE approach and commit across the entire app:

StrategyFeelWhen to use
Borders onlyTechnical, preciseDeveloper tools, data-heavy apps
Subtle shadowsApproachable, softGeneral SaaS, collaborative tools
Layered shadowsPremium, dimensionalDesign tools, luxury products
  • NEVER: Mix strategies in the same interface
  • NEVER: Dramatic elevation jumps between adjacent surfaces

Subtle Layering

Surfaces should be barely different but still distinguishable. Study Vercel, Supabase, Linear for whisper-quiet hierarchy.

  • SHOULD: Squint test — blur your eyes and still perceive hierarchy without harshness
  • SHOULD: Background differences of 2-4% lightness between layers
  • NEVER: Pure white cards on colored backgrounds (dead contrast)
  • NEVER: Harsh borders as the only separator

Navigation

Navigation teaches users how to think about the product space. It IS the product, not around it.

  • MUST: Current location always visible
  • MUST: Consistent placement across all screens
  • SHOULD: Breadcrumbs for 3+ level depth
  • SHOULD: Navigation structure mirrors the mental model of the domain, not the database schema
  • NEVER: Navigation that requires scrolling to find

Information Density

  • MUST: Match density to context (sparse for onboarding, dense for dashboards)
  • SHOULD: Consistent density within a screen
  • NEVER: Mix sparse and dense patterns in the same view without clear hierarchy

States

  • MUST: Design empty states with helpful CTAs — these are onboarding moments
  • MUST: Loading states — skeleton preferred over spinners for layouts
  • MUST: Error states with recovery actions (not just "something went wrong")
  • SHOULD: Partial/permission states if applicable
  • SHOULD: Empty states that teach the product, not just fill space

Data Display

  • MUST: Tables sortable by at least one column
  • SHOULD: Pagination or virtualization for 50+ items
  • SHOULD: Filters visible, not buried in menus
  • SHOULD: Numbers with context — what's good, what's bad, what changed
  • NEVER: Truncate data without tooltip or expansion
  • NEVER: Display raw data without considering what action the user takes with it

Interactive Patterns

  • MUST: Hover states on all clickable elements
  • MUST: Loading indicator for async actions
  • SHOULD: Optimistic updates where safe
  • SHOULD: Undo for destructive actions instead of confirmation dialogs
  • SHOULD: Keyboard shortcuts for frequent actions

Typography

  • SHOULD: Body text 14-16px (not smaller for prolonged use)
  • SHOULD: Labels 12-13px, medium weight or caps for differentiation
  • SHOULD: Monospace for data that needs alignment (IDs, timestamps, code)
  • SHOULD: Tabular numerals for columns of numbers
  • NEVER: Display-size fonts in app chrome (save for marketing)

Color

  • MUST: Semantic colors for status (success, warning, error, info)
  • SHOULD: Muted palette — color draws attention, so use it sparingly
  • SHOULD: Accent color for primary actions only
  • SHOULD: Saturated greys (warm or cool) rather than dead neutral
  • NEVER: Decorative color that doesn't convey meaning
  • NEVER: Color as the only indicator of status (accessibility)

Token Naming

CSS variable names are design decisions. They carry meaning:

/* Evokes a world */
--ink: #1a1a1a;
--surface: #fafafa;
--accent: #e11d48;

/* Evokes a template */
--gray-700: #374151;
--white: #ffffff;
--blue-500: #3b82f6;
  • SHOULD: Name tokens by role, not by value
  • SHOULD: Names that a designer would understand without a color picker

The 8-Hour Test

Could someone use this interface for 8 hours without visual fatigue? If not:

  • Reduce contrast between background layers
  • Soften borders
  • Check for competing visual weight
  • Ensure the eye has clear resting places