All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.1 - 2026-03-24
- Chromium default-profile case-insensitive app name comparison now uses
trinstead of Bash 4+${var,,}syntax, fixing launch failures on macOS (which ships Bash 3.2)
1.0.0 - 2026-03-24
- Generic browser configuration via
[browser]withchromium,firefox,open, andnoneengines - Dedicated browser launcher smoke coverage in
tests/browser_launch_smoke.sh - README browser migration guidance and common config examples for Chrome, Brave, Firefox, Safari, and Arc-style setups
- Browser launch config now uses
[browser]instead of[chrome] - Browser launch env emission now uses
GARTH_BROWSER_*instead ofGARTH_CHROME_* - Workspace launch docs and references now describe browser launch behavior generically instead of assuming Chrome-only integration
- Existing configs that still set
defaults.workspacenow emitwarning: Unknown key: defaults.workspace; delete that key after upgrading
[chrome]config support and the deadprofile_directoryfieldgarth_launch_chrome_profile()in favor of engine-based browser dispatch- AeroSpace integration has been removed entirely, including the
--workspaceCLI flag, automatic workspace movement during launch, setup and doctor references, and thetemplates/aerospace.example.tomltemplate defaults.workspaceis no longer part of the config schema andGARTH_DEFAULTS_WORKSPACEis no longer emitted by the config parser
garth new,garth open, andgarth upnow fail fast on deprecatedGARTH_SKIP_CHROMEandGARTH_CHROME_PROFILES_DIRenv vars instead of silently ignoring them- macOS Chrome default-profile launch now treats
app = "google chrome"the same asapp = "Google Chrome"when deciding whether to use the AppleScript new-window path
0.3.4 - 2026-03-19
GITHUB_TOKENis now exported inside Docker containers via/etc/profile.d/garth-gh-token.sh, soghCLI and other tools that read the env var can authenticate (previously onlygitworked via the credential helper)garth doctor --deepverifiesGITHUB_TOKENis exported in Docker containers and flags stale images missing the profile.d scriptgarth doctorwarns whenTMPDIRis long enough that zellij session names risk exceeding the macOS 104-byte Unix socket path limitgarth_zellij_validate_session_namechecks socket path length before launch and prints a clear error instead of letting zellij hang silently
- Session names now dynamically compute their max length from the actual
TMPDIRpath, reserving room for the zellij socket prefix and conflict- avoidance suffix (-NN). Previously the 36-char cap was sufficient for the session name alone but the-2,-3, ...-15suffix fromgarth_unique_session_namecould push the full socket path past macOS's 104-bytesun_pathlimit, causing zellij to hang silently. - Ghostty terminal launcher on macOS now skips the CLI binary path (which
cannot launch terminal windows on macOS per Ghostty docs) and goes directly
to the
open -na Ghostty.appapp launcher. Theghosttyandautolauncher modes now fall through to the app launcher instead of falling back tocurrent_shellwhen the CLI path fails. - Docker images must be rebuilt (
garth refresh-images) to pick up theGITHUB_TOKENprofile.d script
0.3.3 - 2026-03-19
agents.<name>.api_key_refmay now be set to""in config for setups that rely on local Claude/Codex CLI login auth instead of API keys- Config examples and README auth guidance now document empty
api_key_refvalues as the supported way to skip placeholder secret refs when using auth passthrough or--sandbox none
0.3.2 - 2026-03-17
defaults.zellij_mouse_modeconfig (disabledorenabled) to control whether Garth asks Zellij to consume mouse events
- Zellij launches now disable mouse mode by default so mouse wheel scrolling
reaches the host terminal scrollback again; this fixes the case where
agent-level
--no-alt-screenwas set but Zellij still intercepted scroll events
0.3.1 - 2026-03-10
op signinnow works in non-TTY contexts (e.g. Claude Code's Bash tool) by usingop signin --accountto trigger system-auth through the 1Password daemon instead of silently no-oping- Session names now capped at 36 characters (with hash suffix for uniqueness) to comply with Zellij 0.43+ session name limits via Ghostty's login wrapper
- Terminal launchers (Ghostty, Ghostty.app, Terminal.app) now strip
ZELLIJ,ZELLIJ_SESSION_NAME, andZELLIJ_PANE_IDenv vars before spawning, fixing Zellij nesting protection blocking new sessions when garth is invoked from inside an existing Zellij pane
0.3.0 - 2026-03-10
- Setup-managed cron image refresh job (weekly by default) with idempotent
updates and schedule override via
GARTH_IMAGE_REFRESH_CRON_SCHEDULE garth refresh-imagescommand (alias:garth refresh) to force Docker image rebuilds with--pull --no-cachefor configured or selected agents- New smoke test coverage for Docker refresh command behavior
(
tests/refresh_images_smoke.sh) features.packagessupport forbunvia upstream installer script, including image validation checks for thebunbinarygarth open <id>support to resume sessions directly by ID/prefix- Short flag aliases for branch/worktree/session selectors:
-b/-w/-s(forgarth openandgarth up) garth agentnow supports launching from non-git directories (skips GitHub token minting when no repository metadata is available)garth agentnow usesdefaults.agentswhen no agent is provided and can launch multi-agent adhoc sessions (or use--agents)garth agentnow auto-detects local Claude/Codex CLI auth state and auto-enables Docker auth passthrough to avoid unnecessary API key fallback- Context-aware GitHub page opening: Chrome now opens the PR page when the current branch has an open pull request, the branch tree view for other non-default branches, and the base repo URL on the default branch
garth gccommand for non-interactive cleanup of stopped session state dirs, orphan Zellij sessions, orphan Docker containers, and local git branches whose upstream has been deleted ([gone]); supports--repos <dir>to sweep branches across all git repos under a parent directorygarth stop --cleanflag to remove session state after stopping, preventing stale state accumulation without requiring a fullgarth downgarth doctornow warns whenclaude_shareauth mount mode is set torwdocs/security-model.md: a dedicated security reference covering trust boundaries, container hardening, credential handling, configuration controls, and tradeoffs- New smoke tests for security/auth edge cases:
tests/token_cache_lock_smoke.sh,tests/github_app_override_smoke.sh,tests/zellij_launcher_smoke.sh, andtests/secrets_auto_signin_guard_smoke.sh
- Empty
forwardarray expansion crash underset -uincmd_up,cmd_new, andcmd_openlaunch paths - Pre-existing ShellCheck warnings (SC2221, SC2259, SC2034, SC1090, SC2088)
cli_open_smoketest failure on CI due to missing config in XDG fallback path- Session ID lookup now prefers exact matches before prefix matches, preventing
false ambiguity for
garth stop,garth down, andgarth containers garth psnow reports the correct repository name for worktree-backed sessions instead of showing the worktree directory name
- CI now runs
make checkas single source of truth (no duplicated steps) garth openpositional syntax now treats the first argument as session ID; directory-based branch open is now explicit via-d/--dir- Documentation now includes Docker refresh command usage and troubleshooting guidance
- Added
defaults.terminal_launcherconfig (auto,current_shell,ghostty,ghostty_app,terminal) to control zellij launch behavior on macOS and reduce host app permission prompt friction - README now links to the dedicated security model documentation and includes explicit guidance for auth-refresh popup mitigation settings
- Default auth mount mode for
claude_sharechanged fromrwtoroto prevent container auto-updaters from overwriting host binaries with wrong-platform builds (#29661) claude_dot_claude,claude_config,claude_state, andclaude_cacheremainrw(Claude writes auth/config data there;rocausesEROFS)- Token minting now uses a per-repository cache lock to prevent multi-workspace concurrent refresh stampedes (which previously caused repeated 1Password prompts)
- Added
token_refresh.cache_github_app_secrets(opt-in) to preload GitHub App credentials for refresher reuse and reduce mid-session secret reads - Added
token_refresh.background_auto_signin(opt-in, defaultstrue) to disable backgroundop signinattempts when desired, eliminating unattended popup loops at the cost of possible degraded refresh state until manual re-auth
0.1.0 - 2026-03-04
- Homebrew tap and curl installer distribution
--versionflag and version display in usage header- XDG config path fallback for non-clone installs
- Release workflow (GitHub Actions, triggered on VERSION change to main)
- CHANGELOG.md