Date: February 2026 Status: Design review consolidation for next iteration Reviewers: Information Architect, Power User Workflow, Visual Systems, Product Strategy
Whisper-Git has a solid technical foundation (custom Vulkan rendering, proper text handling, spline-based graph) but currently uses that power to recreate the same generic git client aesthetic. The application is approaching "just another git client" - functional but not special.
Core problem: The design treats worktrees and submodules as secondary features when they should be the primary differentiator.
Strategic recommendation: Pivot from "repository state viewer" to "work context navigator for multi-repo projects."
- Two repositories tested: whisper-git (16 commits) and Raven-Firmware (50 commits, 5 submodules)
- Full 1920x1080 views plus cropped regions (header, graph, staging, secondary repos)
- Commit graph topology rendering with colored lanes
- Clean dark theme with proper elevation hierarchy
- Bezier curve connections between commits
- Basic staging workflow (stage/unstage/commit)
- Secondary repos panel showing worktrees and submodules
| Gap | Impact |
|---|---|
| No commit size visualization (+N/-M lines) | Can't distinguish typo fix from major refactor |
| No commit age/recency | Can't see activity patterns |
| No author information | Can't track who worked on what |
| No ahead/behind per branch | Only shown in header for current branch |
| No dirty indicators on secondary repos | Defeats the purpose of showing them |
| ~40% wasted screen space | Empty state boxes, sparse header, underutilized secondary panel |
User requirements state: Graph (P1) > Submodules/Worktrees (P2) > Staging (P3)
Current UI shows: Staging dominates attention, Graph is plain text, Secondary repos buried at bottom
COMMIT ROW - CURRENT:
0dd9b30 Add SecondaryReposView for submodules and worktrees
COMMIT ROW - PROPOSED:
0dd9b30 Add SecondaryReposView... +247/-89 2h ago cdw
^^^^^^ ^^^^^^ ^^^^^^ ^^^
hash delta age author
Header bar: 80% empty gray space. Should show tracking status, last fetch time, working directory summary.
Empty staging states: "No staged changes" consumes ~80px for a single line of text. Should collapse to single line.
Secondary repos panel: One worktree card consumes same space as 5 submodule cards. Massive empty space below.
- Inline commit metadata (size, age, author) - right-aligned, dimmed
- Submodule expected vs actual commit status
- Branch ahead/behind counts in graph
- Last fetch timestamp in header
- Remote tracking relationship display
Current layout prioritizes staging over the stated priorities. Proposed adjustment:
CURRENT LAYOUT:
+------------------+------------------+
| | Staging |
| Graph | (45% x 45%) |
| (55%) +------------------+
| | Secondary Repos |
| | (45% x 51%) |
+------------------+------------------+
PROPOSED LAYOUT (Option A - Elevate Secondary):
+------------------+------------------+
| | Secondary Repos |
| Graph | (45% x 40%) |
| (55%) +------------------+
| | Staging |
| | (45% x 56%) |
+------------------+------------------+
PROPOSED LAYOUT (Option B - Integrated Secondary):
+----------------------------------------+
| [Worktree tabs: main | feature | hotfix]|
+------------------+---------------------+
| | |
| Graph | Staging |
| (55%) | (45%) |
| | |
+------------------+---------------------+
| Submodule status strip (single row) |
+----------------------------------------+
CURRENT:
+------------------------------------------------------------+
| main | main Fetch Push(+6) Commit |
+------------------------------------------------------------+
PROPOSED:
+------------------------------------------------------------+
| whisper-git/main <- origin/main (even) | 2 unstaged | Fetch |
| Last fetch: 4m ago Remotes: origin ok | 0 staged | Push+6|
+------------------------------------------------------------+
Two-line header showing: tracking relationship, sync status, working directory summary, last fetch age.
Commits should have variable visual weight based on lines changed:
Node radius scaling:
Small (1-10 lines): 5px
Medium (10-100 lines): 8px
Large (100-500 lines): 12px
Massive (500+ lines): 16px
Additional: dual-tone fill showing +/- ratio
- All green = pure addition
- All red = pure deletion
- Mixed = refactoring
Row spacing should reflect time gaps (logarithmic):
- Commits within 1 hour: 20px (dense clustering)
- Commits within 1 day: 34px (normal)
- Commits within 1 week: 50px (expanded)
- Older: 28px (compressed)
Creates visual "bursts" of activity.
4px vertical color strip on left edge of each commit row, colored by author hash. Shows ownership patterns and handoffs at a glance.
Branch line styling based on staleness:
- Active (< 1 week): Full opacity, 3px width
- Aging (1-4 weeks): 80% opacity, 2.5px width
- Stale (> 1 month): 50% opacity, 2px width, dashed
- Abandoned (> 3 months): 30% opacity, 1.5px width, dashed
- Verbose card format (2 lines per repo)
- No dirty/sync status indicators
- No expected vs actual commit comparison for submodules
- Massive empty space when few repos
+-- WORKTREES ---------------------------------------------+
| main @ main clean [*] |
| feature-x @ feature +2 dirty [!] |
+---------------------------------------------------------+
+-- SUBMODULES (5) ----------------------------------------+
| Cushion-Controller @ HEAD DETACHED [ ] |
| embassy @ raven_m4 +3 dirty [!] |
| nanoarrow-rs @ main clean [ ] |
| oggopus-embedded @ main clean [ ] |
| trouble @ srv_uuid +1 staged [~] |
+---------------------------------------------------------+
Legend: [*]=current [!]=dirty [~]=staged [ ]=clean
One line per repo. Status indicators. Click to focus.
Visualize submodule relationships and divergence:
+-- CONSTELLATION -----------------------------------------+
| |
| whisper-git/main --*---------------* HEAD (2 dirty) |
| | |
| +- embassy --------+--*------------* raven_m4 (+3) |
| | ^ |
| | +2 ahead of pinned |
| | |
| +- nanoarrow ------*---------------* main (clean) |
| | |
| +- trouble --------*------*--------* srv_uuid (+1) |
| ^ |
| pinned here, remote has +4 |
| |
+----------------------------------------------------------+
Shows: submodule position relative to parent's pinned commit, dirty state, remote divergence.
CURRENT MODEL:
Repository -> has Worktrees (secondary)
PROPOSED MODEL:
Worktree Collection -> each is first-class workspace
Repository is metadata connecting them
+-- WORKSPACES ------------------------------------[+ New]+
| +---------------+ +---------------+ +---------------+ |
| | main | | feature/auth | | hotfix/crash | |
| | @ main | | @ feature/auth| | @ hotfix/crash| |
| | ~~~~~~~~~~~~~ | | ~~~~~~~~~~~~~ | | ~~~~~~~~~~~~~ | |
| | o Update docs | | o Add OAuth | | * Fix crash | |
| | o Refactor API| | o Add tests | | [WIP] | |
| | | | | | | |
| | CLEAN | | CLEAN | | 2 DIRTY | |
| +---------------+ +---------------+ +---------------+ |
| |
| [Double-click to focus] [Drag to compare] |
+---------------------------------------------------------+
Each worktree gets a mini-graph preview. Click to focus. Drag between to compare.
Side-by-side branch comparison showing divergence point and unique commits:
+-- COMPARING: main <-> feature/async-refactor ---[Swap][X]+
+----------------------------+-----------------------------+
| main | feature/async-refactor |
| ========================== | =========================== |
| | |
| o abc123 Update docs <----+---- (common ancestor) |
| | | | |
| o def456 Fix API | o 111aaa Convert to async |
| | | | |
| o ghi789 Add validation ==+==o 222bbb Add tokio |
| | ^ | | |
| o jkl012 Refactor MERGE | o 333ccc Refactor pool |
| | POINT | | |
| | o 444ddd Add retry |
| | | |
| - - - - - - - - - - | o 555eee WIP: Testing |
| | |
+----------------------------+-----------------------------+
| DIVERGENCE: main +4 behind, feature +5 unique commits |
| MERGE PREVIEW: 5 commits, 23 files (+1,847 / -234) |
| |
| [Preview Merge] [Preview Rebase] [Cherry-pick] [Create PR]|
+----------------------------------------------------------+
- Common ancestor highlighting with horizontal connector
- Cherry-pick detection (ghost commits if duplicated)
- Conflict prediction with file-level warnings
- Interactive: drag commits for cherry-pick, click for merge preview
- Working directory pulse - Dirty indicator breathes; rate increases with dirty file count
- Branch breathing - Active branches oscillate width subtly (2-4s cycle)
- Selection morphing - Smooth transitions instead of snaps
- Momentum scrolling - Smooth scroll with bounce at edges
- HEAD glow - Radial falloff shader instead of layered circles
- Heat map mode - Commit density as background gradient
- Anti-aliased curves - Distance-field Bezier for perfect curves at any zoom
- Force-directed layout - For complex merge histories
- Lane assignment - Parallel processing for large repos
- Real-time re-layout - During interaction without frame drops
To make Whisper-Git instantly recognizable:
Working directory indicator pulses when dirty. Pulse rate scales with dirty file count:
- 1-5 files: 2s period (gentle)
- 6-20 files: 1s period (medium)
- 20+ files: 0.5s period (urgent, color shifts to orange)
Creates subconscious awareness of commit hygiene.
Commit nodes have tapered gradient "tails" pointing to parent. Tail length/brightness scales with commit size:
- Small commits: short, dim tail (distant star)
- Large commits: long, bright tail (comet)
- Massive merges: particle-like dispersion effect
Every screenshot shows this unique visual language.
Active branches (commits < 7 days) have lines that subtly oscillate width. Breath rate correlates with recency:
- Commit today: 2s cycle (faster)
- Commit this week: 4s cycle (slower)
- Stale: static (no animation)
Branches feel "alive" when worked on, "dormant" when neglected.
Every 30 seconds, silently capture:
- Working directory status of all tracked repos
- Branch positions
- Stash contents
- Index state
Users can scrub through time to see past states:
+-- PROJECT STATE TIMELINE -------------------------[3h]+
| |
| [*]--[*]--[*]--[*]--[*]--[*]--[*]--[*]--[*]--[NOW] |
| | | |
| | +-- "Started auth work" |
| +-- "Fresh after pull" |
| |
| Scrubbing to: 45 minutes ago |
| +------------------------------------------------+ |
| | main-app/ dirty(2) auth.rs, config.rs | |
| | lib-ui/ clean | |
| | lib-crypto/ dirty(1) hash.rs | |
| +------------------------------------------------+ |
| |
| [Restore This State] [View Diff to Now] [Continue] |
| |
+-------------------------------------------------------+
- Eliminates context loss - #1 productivity killer for multi-context developers
- Zero discipline required - No manual saves, commits, or tags
- Impossible in web apps - Requires local FS access and fast storage
- GPU makes it beautiful - Smooth timeline scrubbing with instant preview
- Debugging superpower - "When did this file start looking wrong?"
- Store state snapshots in local SQLite (timestamps, file hashes, dirty states)
- Don't store file contents (too large) - store working tree state + index state
- "Restore" generates git commands (checkout, stash pop, etc.)
- GPU rendering makes timeline feel magical vs loading spinners
| Feature | Value |
|---|---|
| Branch intent summarization | "What is this branch FOR?" not just "what files changed" |
| Wrong-branch detection | "These changes look like feature work, not hotfix" |
| Divergence explanation | "Why did main and feature diverge? Here's what each received" |
| Multi-repo coordination | "Commit lib-crypto first, then update dependents, here's the sequence" |
| Auto-tagging | Classify commits as FEATURE/BUGFIX/REFACTOR/CONFIG without user input |
| Context restoration | "Welcome back! Here's where you left off yesterday at 5:32 PM" |
Guide users through cross-repo commits:
You staged changes in lib-crypto/
Dependent repos: main-app, backend-service
Suggested commit order:
1. Commit lib-crypto (version bump to 2.1.0)
2. Update main-app/Cargo.toml to reference 2.1.0
3. Update backend-service/Cargo.toml to reference 2.1.0
4. Commit both dependents
[Execute Sequence] [Customize]
On commit node:
- Checkout this commit
- Create branch here...
- Create worktree here...
- Cherry-pick to... -> [branch list]
- Revert this commit
- Copy commit hash / message
On branch label:
- Checkout
- Open in new worktree
- Compare with... -> [branch list]
- Merge into current
- Rebase onto current
- Push / Delete / Rename
On submodule card:
- Open in primary view
- Update to expected commit
- Update to latest upstream
- Show diff from expected
- Stage pointer change
+-- > _ -----------------------------------------------+
| Recent: |
| commit Create commit |
| push Push to origin |
| checkout main Checkout main branch |
| ---------------------------------------------------- |
| Suggestions: |
| compare... Compare two branches |
| worktree new Create new worktree |
| submodule update Update all submodules |
+------------------------------------------------------+
Expand from single commit to rich selection:
pub enum Selection {
None,
SingleCommit(Oid),
CommitRange { from: Oid, to: Oid },
MultipleBranches(Vec<String>),
MultipleWorktrees(Vec<String>),
}Enables: Shift+click range, Ctrl+click multi-select, operations on selection.
| Drag Source | Drop Target | Action |
|---|---|---|
| Commit node | Branch label | Cherry-pick to branch |
| Commit node | Worktree card | Cherry-pick to worktree |
| Branch label | Branch label | Merge source into target |
| File (staging) | Commit | Amend file into commit |
| Submodule card | Main view | Focus submodule |
Work environment:
- Maintains 3-15 repositories forming a coherent system
- Uses worktrees for parallel feature development
- Has submodules for shared libraries or vendored dependencies
- Context-switches between repos throughout the day
- Often works on changes spanning multiple repositories
Daily pain points:
- "Which worktree was I working on that API change?" (Lost context)
- "Did I push the submodule before updating the parent?" (Dependency ordering)
- "Three repos are dirty - which ones matter for this feature?" (Attention fragmentation)
- "What was the state of everything when I left Friday?" (Temporal context loss)
Why existing tools fail:
- Git clients are repository-scoped
- Cannot answer "What's happening across my whole project?"
- Cannot answer "Where was I working an hour ago?"
- Cannot answer "Which changes belong together across repos?"
| Tool | Their Space |
|---|---|
| GitKraken/SourceTree | "Friendly git GUI for everyone" |
| VSCode Source Control | Integrated-into-editor git |
| GitHub Desktop | Single-repo open-source contribution |
| Git CLI | Power users who prefer text |
"The cockpit for polyrepo/multi-context development"
Not a git client that happens to show submodules, but a tool that treats your entire project ecosystem as the fundamental unit.
"Whisper-Git: The first git client that remembers what you were doing."
- Add +N/-M line counts to commit rows
- Add commit age (relative time)
- Add author initials/colors
- Collapse empty staging states
- Add dirty indicators to secondary repo cards
- Redesign to status strip format (one line per repo)
- Add expected vs actual for submodules
- Make cards clickable to focus
- Add submodule batch operations (update all, fetch all)
- Implement variable commit node sizes
- Add "The Pulse" for dirty working directory
- Add branch line staleness visualization
- Implement "The Breath" for active branches
- Project Rewind / Time Machine
- Parallel branch comparison view
- Worktree-centric main view
- Constellation view for submodules
- LLM multi-repo coordination
- Branch intent summarization
- Context restoration on app launch
- Wrong-branch detection
| Feature | GitKraken | Fork | SourceTree | Whisper-Git Opportunity |
|---|---|---|---|---|
| Worktree management | Hidden in menus | Decent | Poor | Make PRIMARY |
| Submodule batch ops | Per-submodule only | Limited | Limited | Matrix view + batch |
| Parallel branch view | Tabs only | Tabs only | Tabs only | True side-by-side |
| Commit size viz | None | None | None | Visual encoding |
| Time machine | None | None | None | Unique feature |
| Multi-repo coordination | Separate windows | Separate windows | Separate tabs | Unified view |
- User requirements:
docs/user_needs.md - Current layout:
src/ui/layout/screen.rs - Commit graph:
src/views/commit_graph.rs - Secondary repos:
src/views/secondary_repos.rs - Staging well:
src/views/staging_well.rs - Theme colors:
src/ui/widget.rs(lines 222-253)