* Show update-available banner automatically on launch
Probe for updates immediately on launch via Sparkle's
checkForUpdateInformation() so the sidebar surfaces a passive update
indicator without waiting for the 24h scheduler. When Sparkle detects
an available update in the background, the pill now shows
"Update Available: X.Y.Z" with accent styling while the updater is
idle. Clicking it triggers the full interactive update flow.
Also fixes thread safety in delegate callbacks by dispatching
@Published mutations to the main queue.
Closes#1643
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add periodic background update probe every 15 minutes
The launch-only probe wouldn't catch updates published while the app
is already running. Add a repeating 15-minute timer that calls
checkForUpdateInformation() so the sidebar banner appears within a
reasonable window after a new version is published.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Change background update probe interval to 30 minutes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Change update check interval to 1 hour and migrate existing users
Reduce Sparkle's scheduled check interval from 24h to 1h so update
banners appear sooner. Migrate users stuck on the old 24h default by
bumping the migration key to v2. Align background probe interval with
the Sparkle check interval instead of hardcoding 30 minutes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add .textSelection(.enabled) to the success body text so users can
select and copy the founders@manaflow.com email address.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
Add chip (e.g. Apple M1 Pro), RAM, hardware model, architecture
(arm64/x86_64), and display info to feedback metadata. All fields are
non-sensitive system properties collected via sysctlbyname, ProcessInfo,
and NSScreen. Server-side route accepts and renders the new fields in
both plain text and HTML email bodies.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
- Swift app: feedback API endpoint, docs URLs, changelog URL, CLI help
- PostHog proxy: r.cmux.dev -> r.cmux.com
- All 20 README files: docs and blog links
- Homebrew cask: homepage URL in update-homebrew workflow
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
* test(terminal): cover Return after Korean IME commit
* fix(terminal): execute Return after Korean IME commit
---------
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
The synchronizeScrollView() method was constantly resetting the scroll
position to match the terminal's scrollbar state, even when the user had
manually scrolled up to review scrollback. This caused the 'doomscroll'
bug where panes would fight the user's scroll position.
- Add userScrolledAwayFromBottom flag to track scroll intent
- Only auto-scroll when at bottom or when scrollbar indicates following
- Reset flag when user scrolls back to bottom
- Add 5-point threshold to tolerate minor float drift
Fixes#1577
Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
Add lastFocusState tracking to TerminalSurface to avoid sending duplicate
focus events to the terminal surface. This fixes double prompt / extra redraw
issues when using zsh with Powerlevel10k and switching workspaces.
Fixes#1566
Co-authored-by: BillionClaw <267901332+BillionClaw@users.noreply.github.com>
ensureApplicationIcon() was explicitly loading and setting the light icon
via NSImage(named: NSImage.applicationIconName) even in automatic mode,
overriding the asset catalog's appearance-based icon selection.
Delegate to AppIconSettings.applyIcon() which correctly sets
applicationIconImage = nil for automatic mode, allowing macOS 15+ to
select the dark variant from the asset catalog automatically.
Fixes#1509
Related: #688
The ghostty_surface_quicklook_font function returns an unretained pointer to a font object. Using takeRetainedValue() transferred non-existent ownership to ARC, leading to an over-release and an eventual EXC_BAD_ACCESS (SIGSEGV) crash when creating new surfaces (like cmd+t or cmd+d) on certain systems such as Intel Macs.
Replaced takeRetainedValue() with takeUnretainedValue() to correctly manage memory.
Co-authored-by: LeonLeung <leonleung.tech@gmail.com>