Skip to content

Commit 2938ed0

Browse files
committed
feat(website): blog posts and full zh-tw/en support w/ v1.1.0 release notes
1 parent 0ab8e0c commit 2938ed0

12 files changed

Lines changed: 1090 additions & 25 deletions

apps/website/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/blog/
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
title: "Release Notes - v1.1.0"
3+
date: 2026-04-05
4+
summary: "Rewrote the Git backend and rendering logic for significantly faster response times, plus several terminal usability improvements."
5+
tag: Release
6+
---
7+
8+
# v1.1.0
9+
10+
After a few weeks of dogfooding Codelegate at work every day, a couple of terminal paper cuts surfaced - and while mitigating a database incident I hit a much bigger problem: the Git subsystem ground to a halt on the large changeset involved. This release is primarily about fixing that by rebuilding the Git subsystem from the ground up.
11+
12+
## Git Subsystem Rewrite
13+
14+
The previous implementation shelled out to `git` and tried to read and render **every** diff upfront. With a large number of changed files or a single massive diff, that meant runaway memory and CPU usage - often enough to freeze the whole app.
15+
16+
The new backend is written against the Rust-native `git2` library while keeping the UI and UX unchanged. File diffs are now fetched lazily and asynchronously so the interface stays responsive, and `@tanstack/react-virtual` handles the heavy lifting for rendering large changesets.
17+
18+
A few related quality-of-life tweaks came along for the ride: only the first 10 files auto-expand when you open the Git pane, files with excessive changes stay collapsed by default, and syntax highlighting is skipped for very large files.
19+
20+
## Terminal Improvements
21+
22+
- **Scroll position memory**: switching sessions no longer loses your place in the scrollback.
23+
- **Selection fix**: terminal text selection was being dropped on state updates; this is now preserved.
24+
- Switched to the default xterm.js renderer, which simplifies the rendering pipeline and fixes incorrect font rendering.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
title: "v1.1.0"
3+
date: 2026-04-05
4+
summary: "重寫 Git 後端與渲染邏輯以大幅提昇反應速度、新增數項終端機易用性相關功能"
5+
tag: Release
6+
---
7+
8+
# v1.1.0
9+
10+
在經過數個禮拜在工作上每日的實際使用後,除了發現一些關於終端機相關的易用性問題外,某次在進行資料庫相關的事件後續處理中我還發現了原有 Git 子系統設計的效能問題,這次的新版本主要的改動就在於將整個 Git 子系統重新設計並實作,增進對於大量檔案變動與大型檔案的反應速度。
11+
12+
## 完全重寫 Git 子系統
13+
14+
原本 Git 子系統在處理大量檔案更動或是大型檔案時會導致整個程式試圖透過系統本身的 git CLI 一次讀取並渲染 **所有** 的改變,導致程式本身使用過多的記憶體與 CPU 資源,進而讓整個系統當機。
15+
16+
這個版本的更動,在保留原有的使用者介面與體驗下,改用了 Rust 原生的 `git2` 函式庫完整重寫了 Git 子系統的後端,讀取每個檔案的實際改動時也採用非同步的讀取,避免使用者介面的卡頓,並且使用 `@tanstack/react-virtual` 讓大型更動的渲染更加高效。
17+
18+
同時在初次進入 Git 面板時,預設只會展開前 10 個檔案,變動過多的檔案會保持摺疊,同時對於過大的檔案會取消語法高亮以增進速度。
19+
20+
## 終端機改善
21+
22+
- **捲動位置記憶** :切換 session 時不再遺失終端機的捲動位置。
23+
- **選取修正** :修正狀態更新時終端機文字選取遺失的問題。
24+
- 切換至 xterm.js 預設渲染器,簡化渲染流程,避免字體不正確顯示。

apps/website/index.html

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,23 @@
1212
<link rel="stylesheet" href="/src/style.css" />
1313
<link rel="preload" href="/videos/overview.mp4" as="video" type="video/mp4" />
1414
</head>
15-
<body>
15+
<body data-lang="en">
16+
<!-- Language Toggle -->
17+
<div class="lang-toggle-fixed">
18+
<div class="blog-lang-toggle">
19+
<button class="blog-lang-btn" data-lang="en">EN</button>
20+
<button class="blog-lang-btn" data-lang="zh-tw">中文</button>
21+
</div>
22+
</div>
23+
1624
<!-- Hero + Product Viewer -->
1725
<section class="hero">
1826
<div class="hero-content fade-in-load">
1927
<img src="/logo.png" alt="Codelegate logo" class="hero-logo" />
2028
<h1 class="hero-title">Codelegate</h1>
2129
<p class="hero-subtitle">
22-
Multiple Agents, Same Repo.<br />
23-
Full Keyboard Navigation, on Mac/Linux.
30+
<span data-lang="en">Multiple Agents, Same Repo.<br />Full Keyboard Navigation, on Mac/Linux.</span>
31+
<span data-lang="zh-tw">多 Agent 共用同一個 Repo。<br />完整鍵盤導航,支援 Mac/Linux</span>
2432
</p>
2533

2634
<!-- Product Viewer -->
@@ -32,46 +40,46 @@ <h1 class="hero-title">Codelegate</h1>
3240
<span class="pv-nav-icon">
3341
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>
3442
</span>
35-
<span class="pv-nav-label">Overview</span>
43+
<span class="pv-nav-label"><span data-lang="en">Overview</span><span data-lang="zh-tw">總覽</span></span>
3644
<span class="pv-nav-shortcut" aria-hidden="true">O</span>
3745
</button>
3846
<button class="pv-nav-item" data-tour="agents" data-shortcut="A">
3947
<span class="pv-nav-icon">
4048
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
4149
</span>
42-
<span class="pv-nav-label">Agent Support</span>
50+
<span class="pv-nav-label"><span data-lang="en">Agent Support</span><span data-lang="zh-tw">Agent 支援</span></span>
4351
<span class="pv-nav-shortcut" aria-hidden="true">A</span>
4452
</button>
4553
<button class="pv-nav-item" data-tour="worktree" data-shortcut="G">
4654
<span class="pv-nav-icon">
4755
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><path d="M13 6h3a2 2 0 0 1 2 2v7"/><path d="M6 9v12"/></svg>
4856
</span>
49-
<span class="pv-nav-label">Git Worktree</span>
57+
<span class="pv-nav-label"><span data-lang="en">Git Worktree</span><span data-lang="zh-tw">Git Worktree</span></span>
5058
<span class="pv-nav-shortcut" aria-hidden="true">G</span>
5159
</button>
5260
<button class="pv-nav-item" data-tour="keyboard" data-shortcut="K">
5361
<span class="pv-nav-icon">
5462
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M6 8h.01"/><path d="M10 8h.01"/><path d="M14 8h.01"/></svg>
5563
</span>
56-
<span class="pv-nav-label">Keyboard Navigation</span>
64+
<span class="pv-nav-label"><span data-lang="en">Keyboard Navigation</span><span data-lang="zh-tw">鍵盤導航</span></span>
5765
<span class="pv-nav-shortcut" aria-hidden="true">K</span>
5866
</button>
5967
<button class="pv-nav-item" data-tour="tui" data-shortcut="T">
6068
<span class="pv-nav-icon">
6169
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>
6270
</span>
63-
<span class="pv-nav-label">All TUI Tools</span>
71+
<span class="pv-nav-label"><span data-lang="en">All TUI Tools</span><span data-lang="zh-tw">所有 TUI 工具</span></span>
6472
<span class="pv-nav-shortcut" aria-hidden="true">T</span>
6573
</button>
6674
<button class="pv-nav-item" data-tour="notifications" data-shortcut="N">
6775
<span class="pv-nav-icon">
6876
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
6977
</span>
70-
<span class="pv-nav-label">Notifications</span>
78+
<span class="pv-nav-label"><span data-lang="en">Notifications</span><span data-lang="zh-tw">通知</span></span>
7179
<span class="pv-nav-shortcut" aria-hidden="true">N</span>
7280
</button>
7381
</div>
74-
<span class="pv-nav-hint">Ctrl+Shift for Navigation</span>
82+
<span class="pv-nav-hint"><span data-lang="en">Ctrl+Shift for Navigation</span><span data-lang="zh-tw">Ctrl+Shift 導航</span></span>
7583
</nav>
7684

7785
<!-- Stage -->
@@ -89,8 +97,8 @@ <h1 class="hero-title">Codelegate</h1>
8997
<video class="pv-video" muted playsinline preload="none" data-src="/videos/agents.mp4"></video>
9098
</div>
9199
<div class="pv-tour-text">
92-
<h2 class="pv-tour-headline">Supports Claude Code and Codex CLI</h2>
93-
<p class="pv-tour-description">Run multiple agents side by side, each in its own workspace.<br />Dedicated terminal and built-in Git pane per session.<br />Pick up right where you left off with automatic session restore.</p>
100+
<h2 class="pv-tour-headline"><span data-lang="en">Supports Claude Code and Codex CLI</span><span data-lang="zh-tw">支援 Claude Code 與 Codex CLI</span></h2>
101+
<p class="pv-tour-description"><span data-lang="en">Run multiple agents side by side, each in its own workspace.<br />Dedicated terminal and built-in Git pane per session.<br />Pick up right where you left off with automatic session restore.</span><span data-lang="zh-tw">多個 Agent 並行運作,各自擁有獨立工作區。<br />每個 session 配有專屬終端機與內建 Git 面板。<br />自動 session 還原,從上次離開的地方繼續。</span></p>
94102
</div>
95103
</div>
96104

@@ -100,8 +108,8 @@ <h2 class="pv-tour-headline">Supports Claude Code and Codex CLI</h2>
100108
<video class="pv-video" muted playsinline preload="none" data-src="/videos/gitworktree.mp4"></video>
101109
</div>
102110
<div class="pv-tour-text">
103-
<h2 class="pv-tour-headline">Git Worktree Management</h2>
104-
<p class="pv-tour-description">Let multiple agents work on the same repo at the same time.<br />Each session gets its own isolated worktree so nothing conflicts.</p>
111+
<h2 class="pv-tour-headline"><span data-lang="en">Git Worktree Management</span><span data-lang="zh-tw">Git Worktree 管理</span></h2>
112+
<p class="pv-tour-description"><span data-lang="en">Let multiple agents work on the same repo at the same time.<br />Each session gets its own isolated worktree so nothing conflicts.</span><span data-lang="zh-tw">讓多個 Agent 同時在同一個 repo 上工作。<br />每個 session 擁有獨立的 worktree,互不衝突。</span></p>
105113
</div>
106114
</div>
107115

@@ -111,8 +119,8 @@ <h2 class="pv-tour-headline">Git Worktree Management</h2>
111119
<video class="pv-video" muted playsinline preload="none" data-src="/videos/keyboard.mp4"></video>
112120
</div>
113121
<div class="pv-tour-text">
114-
<h2 class="pv-tour-headline">Full Keyboard Navigation</h2>
115-
<p class="pv-tour-description">Every action is a shortcut away.<br />Switch sessions, review diffs, commit, and manage branches.<br />Without ever reaching for the mouse.</p>
122+
<h2 class="pv-tour-headline"><span data-lang="en">Full Keyboard Navigation</span><span data-lang="zh-tw">完整鍵盤導航</span></h2>
123+
<p class="pv-tour-description"><span data-lang="en">Every action is a shortcut away.<br />Switch sessions, review diffs, commit, and manage branches.<br />Without ever reaching for the mouse.</span><span data-lang="zh-tw">每個操作都有快捷鍵。<br />切換 session、審查 diff、commit、管理分支。<br />完全不需要碰滑鼠。</span></p>
116124
</div>
117125
</div>
118126

@@ -122,8 +130,8 @@ <h2 class="pv-tour-headline">Full Keyboard Navigation</h2>
122130
<video class="pv-video" muted playsinline preload="none" data-src="/videos/cli.mp4"></video>
123131
</div>
124132
<div class="pv-tour-text">
125-
<h2 class="pv-tour-headline">Use Whatever All TUI Tools You Like</h2>
126-
<p class="pv-tour-description">Every session comes with a real terminal.<br />Dev server, lazygit, even zellij/tmux.<br />If it runs in your terminal, it runs here. No compromises.</p>
133+
<h2 class="pv-tour-headline"><span data-lang="en">Use Whatever All TUI Tools You Like</span><span data-lang="zh-tw">使用任何你喜歡的 TUI 工具</span></h2>
134+
<p class="pv-tour-description"><span data-lang="en">Every session comes with a real terminal.<br />Dev server, lazygit, even zellij/tmux.<br />If it runs in your terminal, it runs here. No compromises.</span><span data-lang="zh-tw">每個 session 都配備真正的終端機。<br />Dev server、lazygit、甚至 zellij/tmux。<br />只要能在終端機跑的,這裡都能跑。毫不妥協。</span></p>
127135
</div>
128136
</div>
129137

@@ -133,8 +141,8 @@ <h2 class="pv-tour-headline">Use Whatever All TUI Tools You Like</h2>
133141
<video class="pv-video" muted playsinline preload="none" data-src="/videos/notification.mp4"></video>
134142
</div>
135143
<div class="pv-tour-text">
136-
<h2 class="pv-tour-headline">Live Agent Status and Notifications</h2>
137-
<p class="pv-tour-description">Animated status indicators on every session tab so you always know what each agent is doing.<br />CLI notifications piped to your system tray when agents need attention.<br />No more switching tabs to check progress.</p>
144+
<h2 class="pv-tour-headline"><span data-lang="en">Live Agent Status and Notifications</span><span data-lang="zh-tw">即時 Agent 狀態與通知</span></h2>
145+
<p class="pv-tour-description"><span data-lang="en">Animated status indicators on every session tab so you always know what each agent is doing.<br />CLI notifications piped to your system tray when agents need attention.<br />No more switching tabs to check progress.</span><span data-lang="zh-tw">每個 session 標籤上的動態狀態指示,讓你隨時掌握每個 Agent 的動態。<br />CLI 通知推送至系統匣,Agent 需要注意時立即提醒。<br />不再需要切換標籤查看進度。</span></p>
138146
</div>
139147
</div>
140148
</div>
@@ -143,7 +151,7 @@ <h2 class="pv-tour-headline">Live Agent Status and Notifications</h2>
143151
<div class="hero-buttons">
144152
<a href="https://github.com/brucehsu/codelegate/releases" target="_blank" rel="noopener" class="btn btn-primary">
145153
<svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z"/><path d="M2 12h20"/><path d="M12 2a14.5 14.5 0 0 1 4 10 14.5 14.5 0 0 1-4 10 14.5 14.5 0 0 1-4-10A14.5 14.5 0 0 1 12 2z"/></svg>
146-
Download
154+
<span data-lang="en">Download</span><span data-lang="zh-tw">下載</span>
147155
<span class="btn-badge">
148156
<!-- Apple logo -->
149157
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
@@ -159,9 +167,27 @@ <h2 class="pv-tour-headline">Live Agent Status and Notifications</h2>
159167
</div>
160168
</section>
161169

170+
<!-- Blog Carousel -->
171+
<section class="blog-section fade-up">
172+
<div class="blog-header">
173+
<h2 class="blog-title"><span data-lang="en">Latest</span><span data-lang="zh-tw">最新</span></h2>
174+
<div class="blog-nav-arrows">
175+
<button class="blog-arrow blog-arrow-prev" aria-label="Scroll left" disabled>
176+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"></polyline></svg>
177+
</button>
178+
<button class="blog-arrow blog-arrow-next" aria-label="Scroll right">
179+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 6 15 12 9 18"></polyline></svg>
180+
</button>
181+
</div>
182+
</div>
183+
<div class="blog-carousel" role="list">
184+
<!-- Cards rendered by JS from virtual:blog-data -->
185+
</div>
186+
</section>
187+
162188
<!-- Footer -->
163189
<footer class="footer">
164-
<p>&copy; 2026 Codelegate. Open source on <a href="https://github.com/brucehsu/codelegate" target="_blank" rel="noopener">GitHub</a>.</p>
190+
<p><span data-lang="en">&copy; 2026 Codelegate. Open source on <a href="https://github.com/brucehsu/codelegate" target="_blank" rel="noopener">GitHub</a>.</span><span data-lang="zh-tw">&copy; 2026 Codelegate。開源於 <a href="https://github.com/brucehsu/codelegate" target="_blank" rel="noopener">GitHub</a></span></p>
165191
</footer>
166192

167193
<script type="module" src="/src/main.js"></script>

apps/website/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
"preview": "vite preview"
1010
},
1111
"devDependencies": {
12+
"gray-matter": "^4.0.3",
13+
"marked": "^17.0.5",
1214
"vite": "^5.4.0"
1315
}
1416
}

0 commit comments

Comments
 (0)