1.0.5 — 2026-06-18
Multiple windows, on-device AI for session naming and bell notifications, and
terminal themes that follow Light/Dark mode. The AI features require macOS 26 with Apple
Intelligence; on earlier systems Batty runs exactly as before with those features disabled.
New features
-
Multiple windows. Open additional windows with
Shift-Cmd-N (rebindable in Settings → Keyboard) —
handy across multiple displays. Each window is independent, with its own sidebar of
sessions and its own selection; Cmd-N still creates a new
session in the focused window. Windows restore on relaunch with their frames and
per-window sidebar state, bell notifications route to the window that owns the
session, and the app quits when the last window closes. (#0234, #0235–#0239)
-
AI session naming. When a session enters a folder with no
recognizable project markers, Batty can name it using Apple's on-device Foundation
Models, reading the path and a few top-level files to suggest a short name. It runs
entirely on-device, never overrides a name you set yourself, and falls back to the
default when there's no good signal. Toggle it in Settings → General → Session
Naming. (#0231, #0232, #0233)
-
AI bell-notification summaries. A burst of bells used to all read
"Bell". Batty can now summarize each notification into a short, distinguishable
phrase shown in the Bell Feed, generated on-device. On by default; turn it off in
Settings → Notifications. (#0246)
-
Themes follow Light/Dark mode. Batty stores a separate theme per
appearance, so your terminal can use one theme in Light mode and another in Dark,
switching live with the system. Settings → Appearance has separate Light and Dark
theme pickers. (#0241, #0245)
Bug fixes
-
Theme changes, layout application, Open Quickly, paste, and the theme picker now act
on the window you're actually using instead of always the first window. (#0242,
#0244)
-
Changing the global theme re-themes terminal panes in every window, not just the
first. (#0243)
-
Audited and corrected the remaining window-targeting paths so session, tab, pane,
and auto-naming operations apply to the key window in a multi-window setup. (#0248)
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.3 — 2026-05-21
Bug-fix release. Cmd-W in Settings now dismisses the sheet instead of quitting the app.
Bug fixes
-
Cmd-W in the Settings window now dismisses it instead of quitting Batty.
The global shortcut handler was intercepting the keystroke before AppKit could route it
to the sheet. BattyShortcuts is now scoped to the main terminal window, so standard
AppKit sheet dismissal takes over when Settings is frontmost.
(#0196)
Under the hood
- libghostty dependency updated to the latest upstream revision.
- Comprehensive UI test suite added: tab lifecycle, pane focus, sidebar, drag-and-drop,
Open Quickly, tab rename, and modal confirmation flows. The test runner now ships
as
scripts/run-ui-tests.sh to work around a macOS Gatekeeper signing
quirk with the Xcode UI test runner.
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).