design/superhuman

4 min czytania 1025 słów
design/superhuman screenshot

Superhuman

„Nie budujemy po prostu klienta pocztowego. Budujemy doświadczenie, w którym szybkość jest produktem."

Filozofia

Superhuman ucieleśnia jedną obsesję: szybkość jako główna funkcja. Każda decyzja projektowa, od czasów odpowiedzi 50ms po nawigację opartą na klawiaturze, służy tej jedynej wizji. Rezultatem jest klient pocztowy, który sprawia wrażenie przedłużenia myśli, a nie narzędzia, które obsługujesz.

Założyciele zastosowali zasady projektowania gier do oprogramowania produktywnościowego: historia (jesteś bohaterem podbijającym pocztę), estetyka (piękna, minimalistyczna), mechanika (skróty klawiaturowe jako rozgrywka) i technologia (nieustanna optymalizacja wydajności).


Kluczowe wnioski

  1. 50ms to prawdziwy cel, nie 100ms - Superhuman publicznie podaje 100ms jako próg, ale wewnętrznie celuje w 50-60ms; różnica między „szybkim" a „czuje się jak myśl" jest odczuwalna
  2. Palety poleceń uczą użytkowników awansować - Pokazuj skróty klawiaturowe za każdym razem, gdy ktoś używa Cmd+K; po kilku użyciach pamięć mięśniowa przejmuje kontrolę i przestają potrzebować palety
  3. Wzorce nawigacji Vim są sprawdzone - J/K dla ruchu pionowego, H/L dla poziomego tworzy przestrzenny model mentalny, który zaawansowani użytkownicy znają z dekad używania edytorów
  4. Onboarding to praktyka, nie wyjaśnianie - 30-minutowe sesje 1:1 Superhuman trenują pamięć mięśniową na syntetycznych e-mailach; użytkownicy nie oglądają demo, rozwijają nawyki
  5. Optymistyczne UI jest koniecznością dla szybkości - Akcje kończą się wizualnie przed potwierdzeniem serwera; cofnięcie jest siatką bezpieczeństwa, nie wskaźniki ładowania

Biblioteka wzorców

Zasada 100ms (w rzeczywistości 50-60ms)

Słynna „zasada 100ms" Superhuman jest w rzeczywistości bardziej agresywna wewnętrznie. Badania pokazują, że postrzegana responsywność znacząco spada powyżej 100ms, więc Superhuman celuje w 50-60ms dla wszystkich interakcji.

// Performance budget constants
const PERFORMANCE_TARGETS = {
  // Internal targets (what Superhuman actually aims for)
  keyRepeatRate: 65,        // ms - faster than macOS default (100ms)
  actionResponse: 50,       // ms - archive, send, move
  searchResults: 100,       // ms - first results appear
  composeOpen: 60,          // ms - new compose window

  // User perception thresholds (from research)
  instantaneous: 100,       // Feels instant
  responsive: 300,          // Still feels responsive
  noticeable: 1000,         // User notices delay
} as const;

// Optimistic UI pattern - action completes before server confirms
function archiveEmail(emailId: string) {
  // 1. Immediately update UI (0ms perceived)
  removeFromList(emailId);
  showUndoToast();

  // 2. Move focus to next email (keyboard flow uninterrupted)
  focusNextEmail();

  // 3. Server sync happens in background
  syncQueue.add({ action: 'archive', emailId });
}

Spostrzeżenie projektowe: Częstotliwość powtarzania klawiszy jest ustawiona na 65ms w porównaniu z domyślną wartością macOS wynoszącą 100ms. Szybsza częstotliwość sprawia, że przytrzymanie j/k do przewijania e-maili jest zauważalnie szybsze.


Paleta poleceń jako kółka treningowe

Paleta poleceń Cmd+K pełni podwójną funkcję jako system szkoleniowy, który stopniowo uczy skrótów klawiaturowych.

interface CommandPaletteResult {
  action: string;
  shortcut?: string;
  description: string;
}

function CommandPalette({ query }: { query: string }) {
  const results = searchCommands(query);

  return (
    <div className="command-palette">
      {results.map(result => (
        <div className="command-row" key={result.action}>
          <span className="command-name">{result.action}</span>
          <span className="command-description">{result.description}</span>

          {/* The teaching moment: always show the shortcut */}
          {result.shortcut && (
            <kbd className="command-shortcut">{result.shortcut}</kbd>
          )}
        </div>
      ))}

      {/* Subtle reinforcement after selection */}
      <div className="palette-footer">
        Pro tip: Next time, try <kbd>{selectedResult?.shortcut}</kbd>
      </div>
    </div>
  );
}

// Usage tracking shows the training effect
const ONBOARDING_IMPACT = {
  shortcutUsage: '+20%',      // After 30-min onboarding
  reminderUsage: '+67%',      // Feature adoption
  week1Activation: '+17%',    // Retention metric
};

Spostrzeżenie projektowe: Za każdym razem, gdy używasz Cmd+K do znalezienia polecenia, widzisz jego skrót. Po kilku użyciach pamięć mięśniowa przejmuje kontrolę i przestajesz używać palety do tej akcji.


Architektura podzielonej skrzynki odbiorczej

Podzielona skrzynka odbiorcza Superhuman automatycznie kategoryzuje e-maile na 3-7 skoncentrowanych strumieni, redukując obciążenie poznawcze jednolitej skrzynki.

interface InboxSplit {
  id: string;
  name: string;
  filter: EmailFilter;
  position: number;
  color: string;
}

const DEFAULT_SPLITS: InboxSplit[] = [
  {
    id: 'important',
    name: 'Important',
    filter: { from: 'vip-list', or: { hasReply: true } },
    position: 0,
    color: 'blue'
  },
  {
    id: 'team',
    name: 'Team',
    filter: { domain: 'company.com' },
    position: 1,
    color: 'green'
  },
  {
    id: 'calendar',
    name: 'Calendar',
    filter: { from: ['[email protected]'] },
    position: 2,
    color: 'purple'
  },
  {
    id: 'news',
    name: 'News & Updates',
    filter: { category: 'newsletter' },
    position: 3,
    color: 'orange'
  },
  {
    id: 'other',
    name: 'Other',
    filter: { default: true },
    position: 4,
    color: 'gray'
  }
];

// Navigation with H/L keys
function SplitNavigation({ splits, activeSplit, onSelect }) {
  const handleKeyDown = (e: KeyboardEvent) => {
    if (e.key === 'h' || e.key === 'H') {
      // Previous split
      const prev = splits[Math.max(0, activeSplit - 1)];
      onSelect(prev);
    }
    if (e.key === 'l' || e.key === 'L') {
      // Next split
      const next = splits[Math.min(splits.length - 1, activeSplit + 1)];
      onSelect(next);
    }
  };

  return (
    <nav className="split-tabs">
      {splits.map((split, i) => (
        <button
          key={split.id}
          className={`split-tab ${i === activeSplit ? 'active' : ''}`}
          style={{ '--accent': split.color }}
        >
          {split.name}
          <span className="unread-count">{getUnreadCount(split)}</span>
        </button>
      ))}
    </nav>
  );
}

Spostrzeżenie projektowe: Podziały używają nawigacji w stylu vim H/L (lewo/prawo), podczas gdy J/K nawiguje wewnątrz podziału (góra/dół). Model przestrzenny jest spójny.


Projektowanie z priorytetem klawiatury

Z ponad 100 skrótami klawiaturowymi, Superhuman traktuje klawiaturę jako główne urządzenie wejściowe.

// Core navigation shortcuts (vim-inspired)
const NAVIGATION_SHORTCUTS = {
  // Email list
  'j': 'next-email',
  'k': 'previous-email',
  'o': 'open-email',
  'u': 'go-back',

  // Split navigation
  'h': 'previous-split',
  'l': 'next-split',

  // Actions
  'e': 'archive',
  '#': 'trash',
  'r': 'reply',
  'a': 'reply-all',
  'f': 'forward',
  'c': 'compose',

  // Power features
  'Cmd+k': 'command-palette',
  'Cmd+/': 'shortcuts-help',
  '/': 'search',
  'z': 'undo',
};

// Visual feedback on every keypress
function KeypressIndicator({ lastKey }: { lastKey: string }) {
  return (
    <div className="keypress-toast" role="status">
      <kbd>{lastKey}</kbd>
      <span>{getActionName(lastKey)}</span>
    </div>
  );
}

// Zero-delay action feedback
function handleArchive() {
  // Haptic-like visual feedback
  animateEmailOut('slide-right', { duration: 150 });

  // Immediately focus next email
  focusNextEmail();

  // Show undo toast
  showToast({
    message: 'Archived',
    action: { label: 'Undo', shortcut: 'z' }
  });
}

Spostrzeżenie projektowe: Akcje mają zerowe opóźnienie animacji. Naciśnij E, e-mail znika natychmiast. Animacja służy wizualnemu zamknięciu, nie jest blokującą operacją.


Ekskluzywny onboarding

Słynne 30-minutowe sesje onboardingowe 1:1 Superhuman tworzą pamięć mięśniową poprzez praktykę, nie wyjaśnianie.

interface OnboardingSession {
  duration: '30-minutes';
  format: '1:1-video-call';
  structure: OnboardingPhase[];
}

const ONBOARDING_PHASES: OnboardingPhase[] = [
  {
    name: 'Synthetic Inbox',
    duration: '10-min',
    description: 'Practice with fake emails before touching real inbox',
    exercises: [
      'Archive 10 emails using E key',
      'Reply to 3 emails using R key',
      'Navigate using J/K keys',
      'Find a command with Cmd+K'
    ]
  },
  {
    name: 'Split Setup',
    duration: '10-min',
    description: 'Configure splits for their workflow',
    exercises: [
      'Create VIP split for important contacts',
      'Set up team split for work domain',
      'Navigate splits with H/L'
    ]
  },
  {
    name: 'Power Features',
    duration: '10-min',
    description: 'Introduce advanced features',
    exercises: [
      'Schedule send with Cmd+Shift+Enter',
      'Snooze email with H key',
      'Set reminder with Cmd+Shift+R'
    ]
  }
];

// Onboarding impact metrics
const ONBOARDING_RESULTS = {
  shortcutUsageIncrease: 0.20,    // +20%
  reminderFeatureAdoption: 0.67,  // +67%
  week1ActivationLift: 0.17,      // +17%
  npsScore: 70,                    // Industry-leading
};

Spostrzeżenie projektowe: Syntetyczna skrzynka pozwala użytkownikom budować pamięć mięśniową przy zerowym ryzyku. Zanim dotkną prawdziwych e-maili, skróty już stają się automatyczne.


System projektowania wizualnego

Typografia: rodzina Messina

Superhuman używa rodziny czcionek Messina od Luzi Type, skoordynowanego systemu sans, serif i monospace.

:root {
  /* Messina Sans - Primary UI */
  --font-sans: 'Messina Sans', -apple-system, sans-serif;

  /* Messina Serif - Email body, long-form */
  --font-serif: 'Messina Serif', Georgia, serif;

  /* Messina Mono - Code, timestamps, metadata */
  --font-mono: 'Messina Mono', 'SF Mono', monospace;

  /* Type scale - optimized for scanning */
  --text-xs: 11px;    /* Timestamps, metadata */
  --text-sm: 12px;    /* Secondary info */
  --text-base: 14px;  /* Primary UI text */
  --text-lg: 16px;    /* Email body */
  --text-xl: 18px;    /* Email subject */
}

/* Email list: optimized for rapid scanning */
.email-row {
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: 1.4;
}

.email-subject {
  font-size: var(--text-xl);
  font-weight: 500;
  letter-spacing: -0.01em;  /* Tighter for headlines */
}

.email-sender {
  font-weight: 600;
  color: var(--text-primary);
}

.email-preview {
  color: var(--text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.email-timestamp {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  color: var(--text-tertiary);
}

System kolorów: minimalna ozdobność

Superhuman używa koloru oszczędnie, głównie dla statusu i fokusu, nigdy dla dekoracji.

:root {
  /* Neutral foundation */
  --bg-primary: #ffffff;
  --bg-secondary: #f5f5f5;
  --bg-tertiary: #ebebeb;

  /* Text hierarchy */
  --text-primary: #1a1a1a;
  --text-secondary: #666666;
  --text-tertiary: #999999;

  /* Accent: Blue for interactive, Purple for premium */
  --accent-primary: #0066ff;
  --accent-secondary: #7c3aed;

  /* Status colors */
  --status-unread: #0066ff;
  --status-starred: #f59e0b;
  --status-snoozed: #8b5cf6;

  /* Focus states - high contrast */
  --focus-ring: 0 0 0 2px var(--accent-primary);
}

/* Unread emails: subtle but clear distinction */
.email-row[data-unread="true"] {
  background: linear-gradient(
    to right,
    var(--accent-primary) 3px,
    var(--bg-primary) 3px
  );
}

.email-row[data-unread="true"] .email-sender {
  font-weight: 700;  /* Bolder for unread */
}

Wzorce animacji

Natychmiastowe akcje, płynne przejścia

Akcje kończą się natychmiast; animacje zapewniają wizualne zamknięcie bez blokowania.

/* Email archive: instant removal, smooth visual */
.email-row.archiving {
  animation: slide-out-right 150ms ease-out forwards;
}

@keyframes slide-out-right {
  from {
    transform: translateX(0);
    opacity: 1;
  }
  to {
    transform: translateX(100px);
    opacity: 0;
  }
}

/* Next email slides up to fill gap */
.email-row.moving-up {
  animation: slide-up 150ms ease-out;
}

@keyframes slide-up {
  from {
    transform: translateY(var(--row-height));
  }
  to {
    transform: translateY(0);
  }
}

/* Command palette: snappy spring */
.command-palette {
  animation: palette-in 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
}

@keyframes palette-in {
  from {
    opacity: 0;
    transform: translateY(-8px) scale(0.96);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

Wzorzec powiadomienia cofania

function UndoToast({ action, onUndo }: { action: string; onUndo: () => void }) {
  const [timeLeft, setTimeLeft] = useState(5);

  useEffect(() => {
    const timer = setInterval(() => {
      setTimeLeft(t => {
        if (t <= 1) {
          clearInterval(timer);
          return 0;
        }
        return t - 1;
      });
    }, 1000);

    return () => clearInterval(timer);
  }, []);

  return (
    <div className="undo-toast">
      <span>{action}</span>
      <button onClick={onUndo}>
        Undo <kbd>Z</kbd>
      </button>
      <div
        className="toast-timer"
        style={{ '--progress': timeLeft / 5 }}
      />
    </div>
  );
}

Wyciągnięte wnioski

1. Szybkość to funkcja

Wydajność nie jest wymogiem technicznym — to produkt. Każda milisekunda ma znaczenie, ponieważ responsywność kształtuje emocjonalne doświadczenie korzystania z oprogramowania.

2. Paleta poleceń jako progresywne szkolenie

Nie tylko udostępniaj funkcje przez paletę poleceń. Używaj jej do nauki skrótów. Pokazuj skrót klawiaturowy za każdym razem, a użytkownicy naturalnie przejdą do bezpośredniego wywoływania.

3. Priorytet klawiatury jest inspirowany Vim

Wzorzec nawigacji j/k/h/l z vim zapewnia sprawdzony model mentalny dla zaawansowanych użytkowników. Spójność z tą konwencją zmniejsza krzywą uczenia się dla programistów i power userów.

4. Onboarding to praktyka, nie wyjaśnianie

30-minutowe sesje 1:1 nie wyjaśniają funkcji. Trenują pamięć mięśniową. Użytkownicy ćwiczą z syntetycznymi danymi, aż skróty staną się automatyczne.

5. Optymistyczne UI jest wymagane dla szybkości

Oczekiwanie na potwierdzenie serwera przerywa iluzję szybkości. Akcje muszą kończyć się wizualnie przed odpowiedzią serwera, z cofaniem jako siatką bezpieczeństwa.

6. Podziały redukują obciążenie poznawcze

Jednolita skrzynka odbiorcza wymusza ciągłe przełączanie kontekstu. Wstępnie posortowane podziały pozwalają użytkownikom wchodzić w różne tryby mentalne i przetwarzać wsadowo podobne e-maile.


Często zadawane pytania

Czym jest „zasada 100ms" Superhuman i dlaczego faktycznie celują w 50ms?

Superhuman publicznie promuje zasadę 100ms — próg, przy którym interakcje wydają się natychmiastowe. Jednak wewnętrznie celują w 50-60ms dla wszystkich akcji. Różnica między 50ms a 100ms jest odczuwalna; 50ms sprawia wrażenie, że interfejs odpowiada zanim skończysz akcję, podczas gdy 100ms jedynie wydaje się „szybkie". Ten agresywny cel pochodzi z badań nad projektowaniem gier dotyczących postrzeganej responsywności.

Jak paleta poleceń Superhuman uczy użytkowników skrótów klawiaturowych?

Za każdym razem, gdy używasz Cmd+K do znalezienia polecenia, paleta wyświetla obok niego skrót klawiaturowy. Tworzy to pasywne uczenie: widzisz skrót (np. „E" dla archiwizacji) wielokrotnie bez próby zapamiętania. Po kilku użyciach formuje się pamięć mięśniowa i naturalnie zaczynasz naciskać E bezpośrednio zamiast otwierać paletę. Paleta zasadniczo czyni siebie zbędną dla zaawansowanych użytkowników.

Dlaczego Superhuman używa nawigacji w stylu vim (j/k/h/l)?

Wzorzec nawigacji Vim — J/K dla góra/dół, H/L dla lewo/prawo — tworzy przestrzenny model mentalny, gdzie palce spoczywają na głównym rzędzie klawiszy. Miliony programistów już znają te klawisze z edytorów kodu. Superhuman rozszerza to na pocztę: J/K przemieszcza między e-mailami na liście, H/L przemieszcza między podziałami skrzynki. Spójność oznacza, że zaawansowani użytkownicy mogą nawigować z prędkością myśli bez patrzenia na klawiaturę.

Co dzieje się podczas 30-minutowych sesji onboardingowych Superhuman?

Specjaliści ds. onboardingu nie wyjaśniają funkcji — trenują pamięć mięśniową. Użytkownicy ćwiczą z syntetyczną skrzynką fałszywych e-maili, archiwizując 10 e-maili klawiszem E, odpowiadając klawiszem R i nawigując J/K. Dopiero gdy skróty stają się półautomatyczne, dotykają swojej prawdziwej skrzynki. To podejście oparte na praktyce zwiększa użycie skrótów o 20% i adopcję funkcji o 67% w porównaniu z samodzielnym onboardingiem.

Jak Superhuman osiąga natychmiastowe wrażenie akcji przy synchronizacji z serwerem?

Superhuman używa optymistycznego UI: gdy naciskasz E, aby zarchiwizować, e-mail natychmiast znika, a fokus przenosi się na następną wiadomość. Synchronizacja z serwerem dzieje się w tle. Jeśli się nie powiedzie (rzadko), e-mail pojawia się ponownie z błędem. Powiadomienie cofania ze skrótem „Z" zapewnia siatkę bezpieczeństwa. Ten wzorzec oznacza zero odczuwalnego opóźnienia dla użytkownika, mimo że faktyczna operacja trwa setki milisekund do ukończenia na serwerze.


Źródła

  • Prezentacje filozofii projektowania Superhuman
  • Wywiady z Rahulem Vohrą (CEO) o projektowaniu produktów
  • Projektowanie gier zastosowane do oprogramowania produktywnościowego
  • Studia przypadków optymalizacji wydajności
  • Metryki wpływu onboardingu i badania użytkowników