Add "Failed to activate application" to the retry/skip patterns so
the self-hosted runner gracefully skips UI tests when the app can't
come to foreground (Running Background state).
Bump navbar, docs, legal, and community layouts from max-w-5xl to
max-w-6xl. Widen docs content from max-w-2xl to max-w-3xl. Home and
blog pages unchanged. Disable next-themes transition on change.
- Theme icon now uses dark:hidden/dark:block CSS classes instead of
JS state, eliminating the flash on hydration entirely
- Remove useSyncExternalStore mounted pattern (no longer needed)
- Add theme-color meta tag updated by blocking script and toggle
for iOS Safari status bar
- Revert body fade-in animation (not needed with CSS-only icons)
Inline script in <head> reads localStorage theme before first paint
and applies .dark class synchronously. Defaults to dark to match
next-themes defaultTheme config.
Next.js App Router serves app/icon.png (32x32 favicon) at /icon.png,
shadowing the 256x256 public/icon.png. Rename to /logo.png so the
high-res image is served for the site logo.
- Overlay covers entire viewport (inset-0 z-40) including header
- Drawer at z-50 spans full height with its own header row
- Duplicate theme toggle + close (X) button inside drawer
- Docs sidebar/FAB bumped to z-50 to stay above overlay
- Move overlay and drawer nav outside <header> to avoid iOS Safari
backdrop-filter breaking fixed positioning
- Overlay starts below header (top-12) instead of covering full screen
so header stays clean when drawer is open
- Add invisible class when drawer closed as fallback
- Remove auto-focus on first link to prevent focus ring flash
ThemeToggle was fixed-positioned over the hamburger menu on mobile.
Move it into SiteHeader so both controls sit together. Add
whitespace-nowrap to hero Download/GitHub buttons and flex-wrap
to their container so they don't break across lines on narrow screens.
Extract drawer logic (overlay, focus trap, scroll lock, escape key)
from DocsNav into shared mobile-drawer.tsx hook and components.
SiteHeader now shows a hamburger menu on mobile that opens a
right-side drawer with nav links and download button. Footer
wraps gracefully on small screens.
- CI: replace Node/npm with Bun
- Add view-transition animations for theme toggle
- Set html background for flash-free theme switches
- UI refinements to download button, brew command, and layout
- Replace package-lock.json with bun.lock
- Minimal centered layout with Geist sans font
- Typing animation cycling through agent names
- Light/dark mode toggle via next-themes
- Download for Mac button linking to latest DMG
- Feature list, GitHub + Docs footer links
- Meta tags and Open Graph for SEO
- CI: add web typecheck job (tsc --noEmit)
* 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.