Skip to content

Commit a7ebb79

Browse files
author
Laurent Guitton
committed
docs(website): shared full feature matrix on /compare and /features
Extract the feature-by-feature comparison from FeaturesPage into a reusable CompareMatrix component (single source of truth) and render it on the /compare hub too — restores the full matrix the compare pages were missing. Fact-checked July 2026, adds a GitButler column, and includes honest rows where GitWand isn't ahead (virtual/stacked branches).
1 parent a2aa83c commit a7ebb79

4 files changed

Lines changed: 128 additions & 31 deletions

File tree

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<script setup lang="ts">
2+
type CV = boolean | 'partial' | 'soon'
3+
interface Row {
4+
category?: boolean; label: string; note?: string; highlight?: boolean
5+
gw?: CV; gk?: CV; fork?: CV; sm?: CV; ghd?: CV; gb?: CV; tower?: CV
6+
}
7+
8+
// Competitor data fact-checked July 2026. Order matches the deep-dive pages,
9+
// with Tower appended (it has no deep dive but is in the landscape).
10+
const COLS = [
11+
{ key: 'gw', name: 'GitWand', sub: 'Free · MIT', gw: true },
12+
{ key: 'gk', name: 'GitKraken', sub: 'Free / ~$5/mo Pro' },
13+
{ key: 'fork', name: 'Fork', sub: '$59.99 · Native' },
14+
{ key: 'sm', name: 'Sublime Merge', sub: '$99 · Native' },
15+
{ key: 'ghd', name: 'GitHub Desktop', sub: 'Free · Electron' },
16+
{ key: 'gb', name: 'GitButler', sub: 'Free · Tauri/Rust' },
17+
{ key: 'tower', name: 'Tower', sub: '$69/yr · Native' },
18+
] as const
19+
20+
const ROWS: Row[] = [
21+
{ category: true, label: 'Workflow' },
22+
{ label: 'Free & open source', gw: true, gk: false, fork: false, sm: false, ghd: true, gb: true, tower: false },
23+
{ label: 'Native app (no Electron)', gw: true, gk: false, fork: true, sm: true, ghd: false, gb: true, tower: true },
24+
{ label: 'Linux support', gw: true, gk: true, fork: false, sm: true, ghd: false, gb: true, tower: false },
25+
{ label: 'CLI tool', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: true, tower: false },
26+
{ label: 'VS Code extension', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: false, tower: false },
27+
28+
{ category: true, label: 'Conflict resolution' },
29+
{ label: 'Deterministic auto-resolve', gw: true, gk: 'partial', fork: false, sm: false, ghd: 'partial', gb: false, tower: false, highlight: true },
30+
{ label: 'Confidence score per hunk', gw: true, gk: false, fork: false, sm: false, ghd: false, gb: false, tower: false, highlight: true },
31+
{ label: 'Decision trace per hunk', gw: true, gk: false, fork: false, sm: false, ghd: false, gb: false, tower: false, highlight: true },
32+
{ label: 'Zero-impact merge/rebase preview', gw: true, gk: false, fork: false, sm: false, ghd: false, gb: false, tower: false, highlight: true },
33+
{ label: 'Predict rebase & cherry-pick', gw: true, gk: false, fork: false, sm: false, ghd: false, gb: false, tower: false, highlight: true },
34+
{ label: 'Scratch-worktree resolution', gw: true, gk: false, fork: false, sm: false, ghd: false, gb: false, tower: false, highlight: true },
35+
36+
{ category: true, label: 'Power Git' },
37+
{ label: 'Interactive rebase', gw: true, gk: true, fork: true, sm: true, ghd: false, gb: true, tower: true },
38+
{ label: 'Split commit by hunks', gw: true, gk: false, fork: false, sm: true, ghd: false, gb: false, tower: false },
39+
{ label: 'Worktrees', gw: true, gk: true, fork: true, sm: false, ghd: true, gb: false, tower: true },
40+
{ label: 'Virtual / stacked branches',gw: false, gk: false, fork: false, sm: false, ghd: false, gb: true, tower: false },
41+
{ label: 'Multi-repo workspaces', gw: true, gk: true, fork: true, sm: false, ghd: false, gb: false, tower: 'partial' },
42+
{ label: 'Cross-repo dashboard', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: false, tower: false },
43+
44+
{ category: true, label: 'Code review & forges' },
45+
{ label: 'In-app PR/MR review', gw: true, gk: true, fork: 'partial', sm: false, ghd: 'partial', gb: 'partial', tower: false },
46+
{ label: 'GitHub · GitLab · Bitbucket · Azure', gw: true, gk: true, fork: true, sm: false, ghd: false, gb: false, tower: true },
47+
{ label: 'Inline CI check annotations', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: false, tower: false },
48+
49+
{ category: true, label: 'AI & agents', note: 'GitWand uses the coding-agent CLIs you already have (Claude Code, Codex, opencode…). No built-in model, no account.' },
50+
{ label: 'Launch coding agents in-app', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: true, tower: 'partial' },
51+
{ label: 'MCP server for AI agents', gw: true, gk: true, fork: false, sm: false, ghd: false, gb: true, tower: false },
52+
{ label: 'AI conflict explanation', gw: true, gk: 'partial', fork: false, sm: false, ghd: 'partial', gb: false, tower: false },
53+
{ label: 'AI commit messages', gw: true, gk: true, fork: true, sm: false, ghd: true, gb: 'partial', tower: true },
54+
]
55+
56+
function ic(v?: CV) { return v === true ? '' : v === 'partial' ? '~' : v === 'soon' ? 'soon' : '' }
57+
function cc(v?: CV) { return v === true ? 'y' : v === 'partial' ? 'p' : v === 'soon' ? 's' : 'n' }
58+
</script>
59+
60+
<template>
61+
<div class="cmp-block">
62+
<div class="cmp-wrap">
63+
<table class="cmp">
64+
<thead>
65+
<tr>
66+
<th></th>
67+
<th v-for="c in COLS" :key="c.key" :class="{ 'cmp-gw': c.key === 'gw' }">
68+
{{ c.name }}<span>{{ c.sub }}</span>
69+
</th>
70+
</tr>
71+
</thead>
72+
<tbody>
73+
<template v-for="r in ROWS" :key="r.label">
74+
<tr v-if="r.category" class="cmp-cat">
75+
<td :colspan="COLS.length + 1">{{ r.label }}<span v-if="r.note" class="cmp-note">{{ r.note }}</span></td>
76+
</tr>
77+
<tr v-else :class="{ 'cmp-hl': r.highlight }">
78+
<td class="cmp-feat">{{ r.label }}<span v-if="r.highlight" class="cmp-uniq">GitWand</span></td>
79+
<td v-for="c in COLS" :key="c.key" :class="{ 'cmp-gw': c.key === 'gw' }">
80+
<span :class="'c-' + cc((r as any)[c.key])">{{ ic((r as any)[c.key]) }}</span>
81+
</td>
82+
</tr>
83+
</template>
84+
</tbody>
85+
</table>
86+
</div>
87+
<p class="cmp-legend"><span class="c-y">✓</span> yes &nbsp; <span class="c-p">~</span> partial &nbsp; <span class="c-n">✗</span> no &nbsp;·&nbsp; Fact-checked July 2026 — spot something off? <a href="https://github.com/devlint/GitWand/issues">open an issue</a>.</p>
88+
</div>
89+
</template>
90+
91+
<style scoped>
92+
.cmp-block{
93+
--purple:#8B5CF6;--green:#10B981;
94+
--bg:#0c0c1a;--border:rgba(124,58,237,0.18);--border-soft:rgba(255,255,255,0.08);
95+
--text:#e2e8f0;--muted:#94a3b8;
96+
margin:24px 0;font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
97+
}
98+
.cmp-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:12px;background:var(--bg);}
99+
.cmp{width:100%;border-collapse:collapse;font-size:13.5px;min-width:760px;color:var(--text);}
100+
.cmp th,.cmp td{padding:11px 13px;text-align:center;border-bottom:1px solid var(--border-soft);}
101+
.cmp thead th{color:var(--muted);font-weight:700;vertical-align:top;}
102+
.cmp thead th span{display:block;font-size:11px;font-weight:500;opacity:0.7;margin-top:3px;}
103+
.cmp thead th.cmp-gw{color:var(--purple);}
104+
.cmp-feat{text-align:left;font-weight:500;color:var(--text);}
105+
.cmp-uniq{margin-left:8px;font-size:10px;color:var(--purple);border:1px solid var(--border);border-radius:6px;padding:1px 6px;white-space:nowrap;}
106+
.cmp-gw{background:rgba(124,58,237,0.09);}
107+
.cmp-cat td{text-align:left;font-weight:700;font-size:12px;text-transform:uppercase;letter-spacing:0.05em;color:var(--muted);background:rgba(255,255,255,0.02);padding-top:18px;}
108+
.cmp-note{display:block;text-transform:none;letter-spacing:0;font-weight:400;font-size:12px;color:var(--muted);margin-top:4px;}
109+
.cmp-hl{background:rgba(124,58,237,0.03);}
110+
.c-y{color:var(--green);font-weight:700;}
111+
.c-n{color:var(--muted);opacity:0.45;}
112+
.c-p{color:#fbbf24;}
113+
.c-s{font-size:11px;color:var(--purple);}
114+
.cmp-legend{font-size:12.5px;color:var(--muted);margin:10px 2px 0;}
115+
.cmp-legend a{color:var(--purple);}
116+
</style>

website/.vitepress/theme/FeaturesPage.vue

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ function cc(v?: CV){ return v===true?'y':v==='partial'?'p':v==='soon'?'s':'n' }
7878
<section class="ph-hero">
7979
<div class="ph-inner">
8080
<span class="ph-badge">Features</span>
81-
<h1 class="ph-h1">Everything you need for Git <span class="grad">native and free.</span></h1>
81+
<h1 class="ph-h1">Everything you need for Git <br> <span class="grad">native and free.</span></h1>
8282
<p class="ph-sub">A complete daily workflow with no performance compromise, across three consistent interfaces: desktop app, CLI and VS Code. Below: the full feature set, and an honest feature-by-feature comparison with the popular clients.</p>
8383
<div class="ph-ctas">
8484
<a href="/" class="ph-btn ph-btn--primary">Download GitWand</a>
@@ -104,37 +104,10 @@ function cc(v?: CV){ return v===true?'y':v==='partial'?'p':v==='soon'?'s':'n' }
104104
<section class="ph-section ph-section--alt">
105105
<div class="ph-inner">
106106
<h2 class="ph-h2">How GitWand compares</h2>
107-
<p class="ph-secsub">Feature-by-feature against the most popular Git clients. Data accurate as of May 2026.</p>
108-
<div class="cmp-wrap">
109-
<table class="cmp">
110-
<thead>
111-
<tr>
112-
<th></th>
113-
<th class="cmp-gw">GitWand<span>Free · MIT</span></th>
114-
<th>GitHub Desktop<span>Free · Electron</span></th>
115-
<th>GitKraken<span>$8/mo · Electron</span></th>
116-
<th>Fork<span>$50 · Native</span></th>
117-
<th>Tower<span>$69/yr</span></th>
118-
<th>Sublime Merge<span>$99</span></th>
119-
</tr>
120-
</thead>
121-
<tbody>
122-
<template v-for="r in ROWS" :key="r.label">
123-
<tr v-if="r.category" class="cmp-cat"><td colspan="7">{{ r.label }}<span v-if="r.note" class="cmp-note">{{ r.note }}</span></td></tr>
124-
<tr v-else :class="{ 'cmp-hl': r.highlight }">
125-
<td class="cmp-feat">{{ r.label }}<span v-if="r.highlight" class="cmp-uniq">unique</span></td>
126-
<td class="cmp-gw"><span :class="'c-'+cc(r.gw)">{{ ic(r.gw) }}</span></td>
127-
<td><span :class="'c-'+cc(r.ghd)">{{ ic(r.ghd) }}</span></td>
128-
<td><span :class="'c-'+cc(r.gk)">{{ ic(r.gk) }}</span></td>
129-
<td><span :class="'c-'+cc(r.fork)">{{ ic(r.fork) }}</span></td>
130-
<td><span :class="'c-'+cc(r.tower)">{{ ic(r.tower) }}</span></td>
131-
<td><span :class="'c-'+cc(r.sm)">{{ ic(r.sm) }}</span></td>
132-
</tr>
133-
</template>
134-
</tbody>
135-
</table>
136-
</div>
107+
<p class="ph-secsub">Feature-by-feature against the most popular Git clients. Fact-checked July 2026.</p>
108+
<CompareMatrix />
137109
<div class="ph-ctas ph-ctas--center">
110+
<a href="/compare/" class="ph-btn">Full comparisons →</a>
138111
<a href="/conflict-engine" class="ph-btn">See the conflict engine →</a>
139112
<a href="/ai-agents" class="ph-btn">AI &amp; agents →</a>
140113
</div>

website/.vitepress/theme/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import HomeLanding from './HomeLanding.vue'
44
import FeaturesPage from './FeaturesPage.vue'
55
import ConflictEnginePage from './ConflictEnginePage.vue'
66
import AiAgentsPage from './AiAgentsPage.vue'
7+
import CompareMatrix from './CompareMatrix.vue'
78
import './custom.css'
89

910
export default {
@@ -13,5 +14,6 @@ export default {
1314
app.component('FeaturesPage', FeaturesPage)
1415
app.component('ConflictEnginePage', ConflictEnginePage)
1516
app.component('AiAgentsPage', AiAgentsPage)
17+
app.component('CompareMatrix', CompareMatrix)
1618
},
1719
} satisfies Theme

website/compare/index.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ These comparisons are written by the GitWand team, so read them with that in min
2929
| AI / agent integration | Agent sessions + MCP server | Agent sessions + cloud AI ||| Copilot commits + conflicts | Agents Tab + MCP |
3030
| Account required | Never | For advanced features | No | No | GitHub | No |
3131

32+
## Every feature, side by side
33+
34+
The table above is the at-a-glance version. Here's the full matrix — workflow, conflict resolution, power-Git, code review and AI — across all seven clients. Rows tagged **GitWand** are where the deterministic conflict engine has no equivalent elsewhere; the honest inverse is there too (virtual/stacked branches, where GitButler leads).
35+
36+
<CompareMatrix />
37+
3238
## The deep dives
3339

3440
- **[GitWand vs GitKraken](/compare/gitwand-vs-gitkraken)** — free & local-first vs the commercial suite

0 commit comments

Comments
 (0)