* Sidebar status as text + detect git HEAD changes instantly
- Replace sidebar status pills with plain text + show more/less toggle
for a cleaner, more readable sidebar layout
- Watch .git/HEAD mtime in zsh precmd to detect branch changes from
aliases (gco), tools (gh pr checkout), etc. without waiting for the
3s polling interval
- Fix NSImage shared instance mutation in DraggableFolderNSView by
copying before resizing to prevent layout side-effects
- Fix set_status --tab flag being swallowed by -- stop token via
new parseOptionsNoStop parser
- Update sidebar test to cover alias-based branch switching
* Append status text to notification body automatically
When creating notifications, include the tab's current status entries
in the notification body so users see context (e.g. git branch, ports)
alongside the notification message.
* Add screenshot to README
`surfaceConfig.env_vars` are overrides layered on top of Ghostty's
default subprocess environment. Starting the env map from
`ProcessInfo.processInfo.environment` re-introduced variables that
Ghostty intentionally strips (e.g. LANGUAGE, Xcode DYLD vars),
bypassing its env filtering.
Start with an empty map and add `getenv()` fallbacks for PATH, SHELL,
ZDOTDIR, and GHOSTTY_RESOURCES_DIR so critical values are still
resolved without leaking the full app environment.
- Restore real ZDOTDIR early in zsh startup so HISTFILE uses user history\n- Preserve user ZDOTDIR without treating Ghostty injected ZDOTDIR as user\n- Add regression tests and terminfo overlay for bright colors
Error 4005 (updater permission) with underlying code 10 (cache
directory creation failure) has the same root cause as 1003/1005:
the app isn't in Applications.
The pill never appeared because:
1. SwiftUI .frame(width:0, height:0) when idle poisoned fittingSize
2. AppKit constraints locked at 0x0 prevented expansion on state change
3. fittingSize always returned 0 due to active 0x0 constraints
Fix: Remove zero-frame from SwiftUI (always render at natural size,
use opacity only). Deactivate constraints before measuring fittingSize
so they don't clamp the measurement. Pass visibility to sizeToolbarItem
to set constraints to zero when idle or natural size when active.
NSHostingView with frame (0,0) won't layout SwiftUI content, so
fittingSize always returns 0 when transitioning from EmptyView.
Instead, always render the pill button and use opacity/frame(0)
to hide when idle. This ensures the hosting view always has content
to measure.
@Published fires on willSet, so the Combine sink measured fittingSize
while SwiftUI still saw the old state (idle/EmptyView), getting 0x0.
Defer measurement to next run loop cycle so SwiftUI processes the
new state before we read fittingSize.
Errors from Sparkle were bypassing the minimum check display duration,
causing the error to appear instantly (1ms) without the user ever
seeing the "Checking for updates" state. Use setStateAfterMinimumCheckDelay
for errors too so the checking spinner shows for at least 2 seconds.
The transparency setup (non-opaque window + clear subview backgrounds)
required for the glass effect breaks SwiftUI content rendering on
macOS 26. Disable background glass when NSGlassEffectView is available
until a proper macOS 26 implementation is found.
* Fix zsh ZDOTDIR wrapper + log parsing with -- messages
* Fix CI race condition: serialize self-hosted builds with concurrency group
Two workflows racing on the same self-hosted runner caused DerivedData
corruption (release's rm -rf nuked DerivedData while CI was building).
Add shared concurrency group and scope DerivedData cleanup to project.
WindowGlassEffect.apply() replaced the window's contentView with the
glass/blur view on all macOS versions. On macOS 13-15, swapping the
contentView on a window with fullSizeContentView + transparent titlebar
breaks the titlebar view hierarchy, causing traffic light buttons to
disappear behind the content.
Split into two paths:
- macOS 26+ (NSGlassEffectView): full contentView replacement (safe)
- macOS 13-15: insert NSVisualEffectView as a background subview of the
existing contentView, preserving the titlebar hierarchy
Also fix the custom titlebar overlay overlapping the traffic lights and
left titlebar accessories (sidebar/bell/+ buttons) when the sidebar is
hidden. Use TitlebarLeadingInsetReader to dynamically measure the actual
width of traffic lights + left accessories and apply it as leading padding.
* Add sidebar blur effect with withinWindow blending
- Add NSVisualEffectView-based blur backdrop for sidebar
- Support withinWindow blending mode to blur terminal content behind sidebar
- Auto-switch to overlay layout when withinWindow mode is selected
- Add sidebar debug panel with material, blending, tint, and opacity controls
- Add preset options (HUD Glass, Popover Glass, etc.)
- Default to HUD Glass preset with withinWindow blur
* Simplify tab close button visibility and remove hover background
Show close button only on hover instead of when active/multi-selected.
Remove the hover background color from tabs for cleaner appearance.
* Add config reload support with notification system
- Add reloadConfiguration() methods for app-wide and per-surface reload
- Handle GHOSTTY_ACTION_RELOAD_CONFIG action from Ghostty
- Add ghosttyConfigDidReload notification for views to react
- TerminalSplitTreeView reloads GhosttyConfig on notification
- Add openConfigurationInTextEdit() helper
- Fix activeMainWindow() to correctly find main window
* Add custom tab titles and pinned tabs support
- Add customTitle and isPinned properties to Tab
- Separate process title from custom title with applyProcessTitle()
- Add setCustomTitle()/clearCustomTitle() for user-defined tab names
- Add togglePin()/setPinned() with automatic reordering
- Pinned tabs stay at the top, new tabs insert after pinned section
- moveTabToTop/moveTabsToTop respect pinned tab ordering
* Add --panel option to new-split command
- CLI: Parse --panel <id|index> option for new-split
- Controller: Resolve panel argument to split specific surface
- Return new panel UUID on successful split creation
* Fix notifications popover positioning with layout-aware anchor
- Use AnchorNSView with layout callback for reliable positioning
- Force layout before showing popover to ensure current geometry
- Convert anchor bounds to window content view coordinates
- Add fallback positioning near top-left when anchor unavailable
- Fix button hit testing with explicit frame and contentShape
* Improve app termination in reload script
Use osascript to gracefully quit by bundle ID before pkill fallback.
Add more robust pkill patterns to catch instances from any DerivedData path.
* Add sidebar blur effect with live-adjustable glass settings
- Add WindowGlassEffect for window-level NSGlassEffectView (macOS 26+)
- Add SidebarBackdrop with configurable material, blend mode, tint, and opacity
- Add Sidebar Debug panel (Debug menu) for live adjustment of sidebar appearance
- Add Background Debug panel for window glass tint settings
- Support both behindWindow and withinWindow blur modes
- Live tint updates without requiring window reload
* Align titlebar text to left edge of content area
* Add --panel flag to new-split command
Allows splitting a specific panel without changing focus first.
Usage: cmuxterm new-split <direction> [--panel <id|index>]
Example: cmuxterm new-split down --panel 1
* Return new panel ID from new-split command
new-split now returns the UUID of the newly created panel, enabling
reliable chaining of split operations without index drift issues.
Before: OK
After: OK F2675177-3838-49AF-A1A0-1744C0048E99
Example workflow to create left + 2x2 grid on right:
RIGHT=$(cmuxterm new-split right | awk '{print $2}')
BOTTOM=$(cmuxterm new-split down --panel $RIGHT | awk '{print $2}')
cmuxterm new-split right --panel $RIGHT
cmuxterm new-split right --panel $BOTTOM
Set Sentry environment to "development" for DEBUG builds and "production"
for Release builds. Also disable debug logging in production to reduce
noise and potential performance impact.
- Fix auto-updating Text(date, style: .time) causing continuous SwiftUI updates
by using static formatting with .formatted(date:time:)
- Fix notification popover keeping SwiftUI observers active when closed by
clearing contentViewController on popover close and recreating on open
- Fix focus loss when notifications arrive while typing by only setting
focus in NotificationsPage when the page is visible
- Make Update Pill and Update Logs debug-only features
- Add CPU regression tests: test_cpu_usage.py, test_cpu_notifications.py
- Add lint test for auto-updating Text patterns: test_lint_swiftui_patterns.py