···11+# Changelog
22+33+## [2026.4.5](https://github.com/onevcat/Prowl/releases/tag/v2026.4.5)
44+55+Prowl gains a command-line tool for scripted terminal control.
66+77+### New
88+99+- **`prowl` CLI**: Control Prowl from the command line with `open`, `focus`, `send`, `read`, `list`, and `key` commands. Run `prowl --help` to get started.
1010+- **Install the CLI from within the app**: Go to Settings > Advanced, the Prowl menu, or the Command Palette (Cmd+P) and choose "Install Command Line Tool" to add `prowl` to `/usr/local/bin`.
1111+- **Auto-launch on `prowl open`**: If Prowl is not running when you invoke `prowl open <path>`, it launches automatically and then opens the requested path.
1212+- **Auto-target resolution**: All selector commands (`focus`, `send`, `read`, `key`) now accept a positional `<target>` argument or `-t`/`--target` flag. Pass any pane UUID, tab UUID, or worktree name and Prowl resolves the type automatically.
1313+- **`prowl send --capture`**: Snapshots the screen buffer before and after command execution and returns the diff as captured output, useful for scripted workflows that need to inspect command results.
1414+- **Layout restore warning**: When a saved terminal layout snapshot cannot be restored, Prowl now shows a warning in the toolbar instead of silently resetting.
1515+1616+### Fixed
1717+1818+- Clicking anywhere on the Canvas row in the sidebar (including padding) now correctly selects Canvas. Previously only the icon and label text were responsive.
1919+- Exiting Canvas could leave the terminal blank until you switched away and back. The surface state is now refreshed immediately on Canvas exit.
2020+2121+## [2026.4.2](https://github.com/onevcat/Prowl/releases/tag/v2026.4.2)
2222+2323+Fully customizable keyboard shortcuts and persistent terminal layout across app launches.
2424+2525+### New
2626+2727+- **Fully customizable keyboard shortcuts**: A dedicated Shortcuts page in Settings gives you complete control over every key binding in Prowl. Remap app actions, terminal tab and pane navigation, split management, and the command palette to any key combination you prefer. The editor records shortcuts directly from your keyboard, detects conflicts with existing bindings inline, and lets you replace or cancel on the spot. Whether you are a Vim user remapping splits or just want `Cmd+T` to do something different, every shortcut is now yours to define.
2828+- **Terminal layout restore**: Prowl now remembers your full terminal layout — tabs, splits, and their arrangement — and restores it exactly when you relaunch. Enable "Restore Layout on Launch" in Settings > Advanced, and your workspace is back in seconds, no matter how complex the setup. Use "Clear saved terminal layout" to reset to the default empty state whenever you want a fresh start.
2929+- **Custom commands revamp**: The repository custom commands editor is now a fully inline-editable table with an SF Symbol icon picker, shortcut recording, and no cap on the number of commands. Commands beyond the first three appear in a toolbar overflow menu.
3030+- **Script environment variables**: Scripts run by Prowl now receive `PROWL_WORKTREE_PATH` and `PROWL_ROOT_PATH` environment variables (renamed from the old `SUPACODE_` prefix).
3131+- **Window menu additions**: Tab and pane selection shortcuts are now accessible from the Window menu.
3232+3333+### Fixed
3434+3535+- Font size no longer resets when switching between worktrees or when Ghostty reloads its config due to custom command changes.
3636+- `Cmd+0` (reset font size) now affects the current pane only; new tabs inherit the reset size. The old tab-0 and worktree-0 shortcuts (`Cmd+0` / `Ctrl+0`) have been removed to free up these key combinations.
3737+- Terminal layout restore now works correctly for plain folders and correctly suppresses re-saving after clicking "Clear saved terminal layout."
3838+- Pane focus is correctly restored after toggling zoom on a split pane.
3939+- Scripts running in fish shell no longer hang due to an `exit $?` incompatibility.
4040+4141+## [2026.3.28](https://github.com/onevcat/Prowl/releases/tag/v2026.3.28)
4242+4343+Persistent terminal font size and freed-up keybindings.
4444+4545+### New
4646+4747+- Terminal font size now persists across sessions. Prowl saves your preferred size and restores it when you relaunch. Font size controls are available in the View menu.
4848+- Cmd+0 has been freed from its previous font-size binding, making it available for custom Ghostty keybindings.
4949+5050+### Fixed
5151+5252+- Plain folder repositories now show the correct open tab count in the sidebar header.
5353+5454+## [2026.3.27](https://github.com/onevcat/Prowl/releases/tag/v2026.3.27)
5555+5656+Sidebar tab count badges and Homebrew distribution.
5757+5858+### New
5959+6060+- The sidebar now shows a small tab count badge next to each repository name, reflecting the total number of open terminal tabs across all worktrees for that repo. The badge appears automatically when tabs are open and disappears when none remain.
6161+- Prowl is now available via Homebrew: `brew install --cask onevcat/tap/prowl`. Updates are also delivered through the tap automatically.
6262+6363+## [2026.3.25](https://github.com/onevcat/Prowl/releases/tag/v2026.3.25)
6464+6565+Canvas multi-select broadcast input — select multiple terminal cards and type once to send the same input to all of them.
6666+6767+### New
6868+6969+- Canvas multi-select: Cmd+Click to select multiple cards, Cmd+Opt+A to select all. Selected cards show a visual distinction between primary (accent ring) and followers (subtle tint).
7070+- Broadcast input: typing in the primary card mirrors committed text and special keys (Enter, Backspace, arrows, Tab, Escape, Ctrl+key) to all selected follower cards.
7171+- IME-safe broadcast: followers receive only committed text (e.g. 你好), not intermediate phonetic input (e.g. nihao). Works correctly with Chinese, Japanese, and other input methods.
7272+- Cmd+V paste and right-click Paste are broadcast to all selected cards.
7373+- Cmd+Backspace (delete line) and Cmd+Arrow (line navigation) are broadcast to followers.
7474+- Escape clears broadcast selection. Click a follower to promote it to primary without clearing selection.
7575+7676+### Fixed
7777+7878+- Terminal scrollback position is now preserved during output, preventing unwanted scroll jumps.
7979+- Cmd+W now correctly closes the focused surface in Canvas mode.
8080+8181+## [2026.3.24](https://github.com/onevcat/Prowl/releases/tag/v2026.3.24)
8282+8383+Plain folder support and several UX and stability improvements.
8484+8585+### New
8686+8787+- Plain folders can now be added alongside Git repositories. They open directly into terminal tabs with their own toolbar, settings, and command palette entries. Git-only actions are hidden when a plain folder is selected. Folders are automatically upgraded to Git repositories when a `.git` directory is detected, and conservatively downgraded when it is removed.
8888+- Hotkey actions for archive and delete worktree are now scoped to the sidebar, preventing accidental triggers from the terminal. Close Window (⌘W) now works when no terminal is focused, and Show Window (⌘0) brings the main window to front.
8989+- App size reduced by approximately 7 MB thanks to an optimized YiTong web bundle.
9090+- Added diagnostic logging for scroll jump events to help investigate an intermittent snap-to-bottom issue during scrollback reading.
9191+9292+### Fixed
9393+9494+- Exiting Canvas could leave terminal surfaces blank. Occlusion state is now correctly restored whenever a surface is reattached, regardless of how the transition happened.
9595+- The Settings toolbar no longer shows an unnecessary separator on macOS 26.
9696+9797+## [2026.3.23](https://github.com/onevcat/Prowl/releases/tag/v2026.3.23)
9898+9999+Canvas double-click navigation and smoother card animations.
100100+101101+### New
102102+103103+- Double-click a card's title bar in Canvas to switch directly to that tab's normal view. First click focuses the card with immediate visual feedback, second click switches the view.
104104+- Canvas Arrange and Organize now animate smoothly when repositioning cards.
105105+106106+### Fixed
107107+108108+- Blank terminal surface when exiting Canvas via the toggle shortcut.
109109+110110+## [2026.3.22](https://github.com/onevcat/Prowl/releases/tag/v2026.3.22)
111111+112112+Command finished notifications and Canvas notification highlights.
113113+114114+### New
115115+116116+- Command finished notifications now alert you when a long-running terminal command completes. Configure the duration threshold in Settings.
117117+- In Canvas, unseen notifications now highlight the entire title bar of the affected tab card, tracked per-tab for better granularity.
118118+- Notifications are automatically marked as read when you type into the focused terminal, and command finished notifications are suppressed if you've recently interacted with that terminal.
119119+- Terminal key repeat now works immediately — the macOS press-and-hold accent menu is disabled in terminal surfaces.
120120+- Updated the embedded terminal engine to Ghostty v1.3.1.
121121+- VSCodium is now recognized as a supported editor.
122122+123123+### Fixed
124124+125125+- Worktree selection is now cleared when entering Canvas mode, preventing stale focus state.
126126+127127+## [2026.3.21](https://github.com/onevcat/Prowl/releases/tag/v2026.3.21)
128128+129129+Ghostty keybindings and actions that previously had no effect now work in Prowl.
130130+131131+### New
132132+133133+- You can now rename a tab or terminal surface title from the command palette or a bound key. "Change Tab Title" locks the title until you clear it; "Change Terminal Title" sets the surface title and resumes auto-updates when cleared.
134134+- "Open Config" now opens your Ghostty configuration file in the default text editor.
135135+- Fullscreen (`toggle_fullscreen`), maximize (`toggle_maximize`), and background opacity (`toggle_background_opacity`) Ghostty actions now work as expected. Opacity toggling requires `background-opacity < 1` in your Ghostty config and has no effect in fullscreen.
136136+- The `quit` action now routes through the standard macOS termination flow, so any confirm-before-quit prompt still triggers. `close_window` closes the window containing the active terminal.
137137+138138+### Fixed
139139+140140+- The command palette no longer shows duplicate or inapplicable entries (removed redundant "Check for Updates", single-window actions like "New Window", Ghostty debug tools, and iOS-only actions).
141141+142142+## [2026.3.20](https://github.com/onevcat/Prowl/releases/tag/v2026.3.20)
143143+144144+Faster and more reliable startup with snapshot-based repository restore.
145145+146146+### New
147147+148148+- Repositories now appear immediately on launch by restoring from a local snapshot cache, rather than waiting for the full live refresh to complete. The cache is stored at `~/.prowl/repository-snapshot.json` and is always followed by a background refresh to stay up to date.
149149+- Worktree discovery now runs in parallel across all repositories, and the bundled `wt` tool is invoked directly instead of through a login shell, reducing startup latency.
150150+151151+### Fixed
152152+153153+- Prowl no longer deletes `~/.supacode` on first launch when co-installed with Supacode. Migration now copies data to `~/.prowl` instead of moving it.
154154+155155+## [2026.3.19](https://github.com/onevcat/Prowl/releases/tag/v2026.3.19)
156156+157157+Canvas improvements: better card layout, smarter focus behavior, and a keyboard shortcut to toggle the view.
158158+159159+### New
160160+161161+- Press `⌥⌘↩` to toggle Canvas view. The command has also moved to the View menu.
162162+- Canvas now auto-arranges cards on first entry using a masonry-style packing algorithm, which produces a more compact, better-scaled layout.
163163+- When entering Canvas, focus automatically returns to the card you were last working on. When exiting, focus restores to the exact worktree and tab you had active inside Canvas.
164164+- Added notification settings for focus events, allowing you to control when Prowl alerts you about focus changes.
165165+166166+### Fixed
167167+168168+- File paths containing Unicode characters (e.g., Chinese filenames) were not shown correctly in diffs and untracked file lists.
169169+170170+## [2026.3.18.2](https://github.com/onevcat/Prowl/releases/tag/v2026.3.18.2)
171171+172172+Canvas layout and polish improvements.
173173+174174+### New
175175+176176+- Added an "Arrange" button to the Canvas toolbar that automatically lays out cards in a waterfall pattern, making it easy to tidy up a crowded canvas.
177177+- Increased the default card size and raised the maximum resize limit, giving more room to work with agent output at a glance.
178178+179179+### Fixed
180180+181181+- The Canvas toolbar title no longer appears as a tappable navigation button.
182182+- The Canvas sidebar button label is now properly centered, and no longer bleeds through overlapping content when scrolling.
183183+184184+## [2026.3.18](https://github.com/onevcat/Prowl/releases/tag/v2026.3.18)
185185+186186+Initial public release of Prowl, rebranded from Supacode.
187187+188188+### New
189189+190190+- Prowl is now the app's name and identity, with an updated app icon to match.
191191+- Sparkle auto-update support is included, so future releases will be delivered automatically.
+37-24
doc-onevcat/scripts/release.sh
···1212# APPLE_TEAM_ID Apple Team ID (inferred from identity if unset)
1313# APPLE_NOTARY_KEYCHAIN_PROFILE Keychain profile for notarytool (default: supacode-notary)
1414# SPARKLE_PRIVATE_KEY_FILE Path to EdDSA private key file (default: ~/.prowl-sparkle-private-key)
1515-# PROWL_SITE_DIR Path to Prowl-Site repo (default: ../Prowl-Site)
1615set -euo pipefail
17161817SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
···8281SPARKLE_KEY_FILE="${SPARKLE_PRIVATE_KEY_FILE:-$HOME/.prowl-sparkle-private-key}"
8382[[ -f "$SPARKLE_KEY_FILE" ]] || die "Sparkle private key not found: $SPARKLE_KEY_FILE"
84838585-PROWL_SITE="${PROWL_SITE_DIR:-$PROJECT_DIR/../Prowl-Site}"
8686-8784NOTES_FILE="build/release-notes.md"
8885[[ -s "$NOTES_FILE" ]] || die "$NOTES_FILE not found — run release-notes.sh first"
8986···124121else
125122 log "bumping version in project..."
126123 make bump-version VERSION="$VERSION" BUILD="$BUILD"
124124+fi
125125+126126+# ── Update CHANGELOG ────────────────────────────────────────────────────────
127127+128128+CHANGELOG="CHANGELOG.md"
129129+ENTRY_HEADER="## [$VERSION](https://github.com/$REPO/releases/tag/$TAG)"
130130+131131+if [[ -f "$CHANGELOG" ]] && grep -qF "$ENTRY_HEADER" "$CHANGELOG"; then
132132+ log "CHANGELOG already contains entry for $VERSION, skipping"
133133+else
134134+ log "updating CHANGELOG.md..."
135135+ {
136136+ echo "# Changelog"
137137+ echo ""
138138+ echo "$ENTRY_HEADER"
139139+ echo ""
140140+ cat "$NOTES_FILE"
141141+ echo ""
142142+ if [[ -f "$CHANGELOG" ]]; then
143143+ # Skip the "# Changelog" header and leading blank line
144144+ tail -n +3 "$CHANGELOG"
145145+ fi
146146+ } > "${CHANGELOG}.tmp"
147147+ mv "${CHANGELOG}.tmp" "$CHANGELOG"
148148+ git add "$CHANGELOG"
149149+ git commit -m "Update CHANGELOG for $VERSION"
150150+ # Move tag to include the CHANGELOG commit
151151+ git tag -f "$TAG" HEAD
127152fi
128153129154# ── Show release notes ───────────────────────────────────────────────────────
···261286cp "$ZIP_PATH" "$STAGING/"
262287cp "$NOTES_FILE" "$STAGING/$ARCHIVE_BASE.md"
263288264264-# Fetch existing appcast for history
265265-curl -fsSL "https://prowl.onev.cat/appcast.xml" -o "$STAGING/appcast.xml" 2>/dev/null || true
289289+# Fetch existing appcast from the latest GitHub release for version history
290290+curl -fsSL "https://github.com/$REPO/releases/latest/download/appcast.xml" -o "$STAGING/appcast.xml" 2>/dev/null || true
266291267292"$PROJECT_DIR/bins/generate_appcast" \
268293 --ed-key-file "$SPARKLE_KEY_FILE" \
···302327RELEASE_URL="https://github.com/$REPO/releases/tag/$TAG"
303328log "release created: $RELEASE_URL"
304329305305-# ── Update Prowl-Site ────────────────────────────────────────────────────────
330330+# ── Trigger Prowl-Site rebuild ───────────────────────────────────────────────
306331307307-if [[ -d "$PROWL_SITE" ]]; then
308308- log "updating Prowl-Site appcast..."
309309- mkdir -p "$PROWL_SITE/public"
310310- cp build/appcast.xml "$PROWL_SITE/public/appcast.xml"
311311- pushd "$PROWL_SITE" >/dev/null
312312- if [[ -n "$(git status --porcelain)" ]]; then
313313- git add public/appcast.xml
314314- git commit -m "Update appcast for Prowl $VERSION"
315315- git push
316316- log "Prowl-Site pushed (Netlify deploy will follow)"
317317- else
318318- log "Prowl-Site appcast unchanged"
319319- fi
320320- popd >/dev/null
321321-else
322322- log "Prowl-Site not found at $PROWL_SITE — skipping appcast deploy"
323323- log "copy build/appcast.xml manually or set PROWL_SITE_DIR"
324324-fi
332332+log "triggering Prowl-Site rebuild..."
333333+gh api repos/onevcat/Prowl-Site/dispatches \
334334+ -f event_type=changelog-updated \
335335+ -f "client_payload[version]=$VERSION" 2>/dev/null \
336336+ && log "Prowl-Site rebuild triggered" \
337337+ || log "Prowl-Site dispatch failed (non-critical)"
325338326339echo
327340log "done! Release: $RELEASE_URL"