guanghu/docs/adr/0003-single-note-model.md
Guanghu Domestic Migration 9b41d51231
Some checks are pending
Auto-update PR branches / Update open PR branches (push) Waiting to run
CI / Frontend Static Quality Checks (push) Waiting to run
CI / Frontend Tests & Coverage (push) Waiting to run
CI / Rust Tests & Quality Checks (push) Waiting to run
CI / Linux build verification (push) Waiting to run
Deploy docs / Build VitePress site (push) Waiting to run
Deploy docs / Deploy to GitHub Pages (push) Blocked by required conditions
Release (Alpha) / Compute alpha version (push) Waiting to run
Release (Alpha) / Build release artifacts (push) Blocked by required conditions
Release (Alpha) / GitHub Release (alpha) (push) Blocked by required conditions
Release (Alpha) / Update docs and release pages (push) Blocked by required conditions
chore: import sanitized domestic snapshot for REPO-004
Source snapshot: 514ab1975951d94342ea38e64101d5a0f1c51c77
2026-07-17 15:55:28 +08:00

1.6 KiB

type, id, title, status, date
type id title status date
ADR 0003 Single note open at a time (no tabs) active 2026-03-24

Context

The app originally had a tab bar allowing multiple notes to be open simultaneously (similar to a browser or code editor). After building and shipping it, the tab model was found to add significant UI complexity, state management overhead, and confusion — without a proportional benefit for a notes app.

Decision

Remove the tab bar. Only one note is open at a time. Navigation history (Back/Forward with Cmd+[/]) replaces tabs for moving between recently visited notes. Closed tab history and useTabManagement are removed.

Alternatives considered

  • Keep tabs: familiar UX, allows comparing notes side by side. Rejected — adds ~2000 lines of complexity, confusing state (which tab is "active"?), and breaks the "editor is sacred" principle.
  • Tabs + single-note toggle: configurable per user. Rejected — doubles the state surface and testing burden.
  • Split pane (two notes at once): useful for reference. Deferred — can be added later without tabs, via a dedicated split layout.

Consequences

  • Removes ~2000 lines of code (TabBar, useClosedTabHistory, useEditorTabSwap, tabLayout)
  • handleSelectNote replaces the current note instead of adding a tab
  • Cmd+W (close tab) and Cmd+Shift+T (reopen closed tab) removed from shortcuts
  • Back/Forward navigation (Cmd+[/Cmd+]) preserves history without tab state
  • Significant simplification of App.tsx and editor state
  • Triggers re-evaluation if: multi-note workflows become a top user request