1.0.4 — 2026-06-05
Stability release. Fixes a crash and an infinite render loop in split-pane
focus navigation, makes click-to-select panes reliable, and keeps session auto-naming in
sync with the shell's working directory.
Bug fixes
-
Moving focus across a split with Cmd-Option-arrows no longer
crashes the app. An AppKit layout exception was triggered by a focus feedback loop
between the terminal's focus state and the pane model; the same loop could saturate
the event loop after creating a split. Focus changes are now routed explicitly from
their source — clicks and keyboard commands — instead of being inferred from
terminal focus flips. (#0229, #0230)
-
Clicking a pane that isn't focused now reliably selects it, and pane selection no
longer silently reverts right after creating a split. (#0230)
-
Session auto-naming now follows the shell's working directory dependably — names
update on
cd even when nothing else redraws the pane — and a session
you've renamed by hand keeps its title instead of being overwritten by directory
changes. (#0227)
Under the hood
- Strict Swift concurrency checking enabled across the project.
- UI test coverage added for cd-driven session rename and reset. (#0228)
- New focus-architecture rules documented in-repo; the split-pane focus path was
audited against them end to end. The four click-to-focus UI tests are green again
and act as regression guards for pane selection.
1.0.2 — 2026-05-16
Clickable hyperlinks from shell programs that speak OSC 8.
OSC 8 hyperlink support
Modern shell tools emit clickable links via OSC 8 escape sequences —
ls --hyperlink=auto turns filenames into file:// links,
cargo and gcc diagnostics make
file:line:column jumpable, the gh CLI links PRs and issues,
and eza, git, pytest, and many others have opt-in modes.
Batty now renders those links with an underline and a pointing-hand cursor on hover.
- Cmd-click opens the URL via the system's default handler — browser for
http / https, Finder or the bound app for file://.
- Plain click is preserved so shell programs that consume mouse events
(vim, less, fzf) keep working. Matches Terminal.app and iTerm2 convention.
- URL schemes are restricted to
http, https, file,
mailto, and ftp; anything else is a silent no-op to keep
a malicious shell program from launching arbitrary handlers.
Quick repro in a Batty pane:
printf '\e]8;;https://example.com\e\\example\e]8;;\e\\\n'
— the word example should be underlined and Cmd-clickable.
(#0125)
Under the hood
- Release pipeline auto-derives
CURRENT_PROJECT_VERSION from today's UTC date
(YYYYMMDD) so Sparkle build numbers can't collide between releases.
(#0124)
Known gaps
- Right-click Open Link / Copy Link on a hyperlinked cell is deferred —
the libghostty wrapper doesn't yet expose a menu hook. Cmd-click works; the context menu
will land once the wrapper API is in place.
1.0.1 — 2026-05-14
First update after launch. Cursor-motion shortcuts, friendlier paste, and a fully localized UI.
Cursor motion at the shell prompt
The standard macOS Terminal-style shortcuts for moving and editing
the current command line now work out of the box:
- Option-Left / Right — jump one word at a time.
- Option-Delete — delete the previous word.
- Cmd-Left / Right — jump to the start or end of the line.
- Cmd-Delete — delete to the start of the line.
Previously Option-arrow inserted composed letters and Cmd-arrow did nothing useful.
(#0106)
Paste confirmation
The default for multi-line paste changed from always confirm to
never confirm — multi-line clipboard contents now land in the terminal directly,
matching Terminal.app and iTerm2 defaults.
The picker (Cmd-, → Paste Confirmation) is unchanged for anyone who wants the safety net back —
pick Always confirm multi-line or Confirm only with shell metacharacters.
(#0105)
Localized UI in 14 languages
Menus, settings, alerts, and the Help system now appear in the user's preferred macOS language.
Translations are provided for:
- 日本語 (Japanese), 简体中文 (Simplified Chinese), 繁體中文 (Traditional Chinese),
한국어 (Korean), Deutsch (German), Français (French),
Español — España, Español — Latinoamérica, Português (Brasil),
Italiano (Italian), Polski (Polish), Nederlands (Dutch),
Русский (Russian), Türkçe (Turkish).
Translations were drafted with machine assistance and have not yet been reviewed by native
speakers — corrections welcome via
GitHub Issues or pull request
against Batty/Localizable.xcstrings.
Under the hood
- BattyKit source files reorganized from a flat root into eight concern folders (
Views/, Runtime/, Model/, Commands/, …) for easier navigation. No user-visible change. (#0122)
1.0.0 — 2026-05-13
First public release.
Batty is a native macOS terminal multiplexer built on
libghostty. v1.0.0 covers
the full sessions / panes / tabs feature set, the unified bell
feed, and Sparkle auto-update.
Sessions, panes, and tabs
- Sessions sidebar with per-session bell counters and a per-session notifications mute.
- Recursive horizontal / vertical splits with drag-resize.
- Tab strip with auto-derived titles (project name → live OSC title → cwd basename) and an unseen-bell dot.
Terminal experience
- libghostty under the hood — Metal-accelerated, true-color, ligature-friendly rendering.
- IME support for CJK Romaji, dead-key composition (Option-E + E → é), and the Ctrl-Cmd-Space emoji picker.
- Drag-and-drop of file paths from Finder into a pane, shell-quoted on insert.
- Multi-line paste confirmation sheet (paste strictness configurable in Settings).
- Cmd-W busy-tab confirmation when a foreground process is running; auto-close on shell exit cascades through pane and session.
- Cmd-Q with terminals open prompts; cancel keeps the app running.
Bell feed
- Every BEL and OSC 9 lands in a unified popover (Cmd-Shift-N).
- Click an entry to jump to the originating tab.
- Optional system notifications for background bells; per-session mute when a long build gets noisy.
Themes and settings
- Live theme switching via View → Theme and Settings → Appearance; choice persists.
- Settings (Cmd-,) for font size, cursor style, paste strictness, confirm-quit, bell sound, and system-notification policy.
Distribution
- Signed with Developer ID, notarized, and stapled — launches on a clean Mac with no Gatekeeper warning.
- Sparkle auto-update wired to appcast.xml; toggleable in Settings → Notifications.
- Unsandboxed (terminals run arbitrary user processes) with Hardened Runtime enabled.
Known limitations
- Per-tab close-confirmation is deferred until libghostty exposes a CommandStart shell-integration signal (#0036). Quit-time confirmation still covers the most important case.
- Window-level click-to-jump is a no-op for the single-window default; multi-window expansion comes later (#0027).
- Bundled terminfo / shell-integration is currently unbundled —
$TERM falls back to xterm-256color and some Ghostty-specific extensions silently degrade (#0003).