- Add scrollback search with cmd+f on macOS or ctrl+shift+f on GTK to search terminal scrollback and navigate between matches
- Add native scrollbars with configurable visibility via the scrollbar configuration option
- Add support for click-to-move-cursor in shell prompts via the click-events and cl=line extensions to the OSC 133 Semantic Prompts specification
- Add command finished notifications with notify-on-command-finish, notify-on-command-finish-action, and notify-on-command-finish-after configuration options
- Improve OSC 133 implementation for more accurate behaviors with jump-to-prompt, copy command output, and resize behaviors while at an active prompt
- Fixed an issue where control characters such as 0x03 (Ctrl+C) in pasted or drag-and-dropped text could be used to execute arbitrary commands in some shell environments
From Ghostty
Ghostty 1.3.0 is a significant release which includes many of the most requested features such as scrollback search, native scrollbars, click-to-move-cursor in shell prompts, and more. It also includes hundreds of improvements, bug fixes, and performance optimizations across all platforms.
This release features 6 months of work with changes from 180 contributors over 2,858 commits. Thank you to all the contributors, maintainers, community moderators, translators, packagers, and users who each helped make this release possible.
These release notes are painstakingly and lovingly hand-crafted by human Ghostty maintainers, including the full changelog. They take a combined 16+ hours to write, so please enjoy. 🥰
Security
- CVE-2026-26982.
Fixed an issue where control characters such as
0x03(Ctrl+C) in pasted or drag-and-dropped text could be used to execute arbitrary commands in some shell environments. This requires user interaction (copy-paste or drag-and-drop) to trigger.
Highlights
Scrollback Search
PRs: GH-9585 GH-9602 GH-9687 GH-9702 GH-9709 GH-9756
You can now search your terminal scrollback with cmd+f on macOS or
ctrl+shift+f on GTK. Search highlights all matches in the viewport and allows
you to navigate between them with the arrow buttons or cmd+g / shift+cmd+g
(macOS) or enter / shift+enter (GTK). All of these keybinds are
configurable, of course.
On macOS, the search bar can be dragged to any of the four corners of
the terminal if it gets in the way. The search also integrates with
standard macOS conventions: the menu bar, Find Next / Find Previous
shortcuts, and the system find pasteboard all work as expected.
On GTK, the search bar also appears in one of the corners and can be dragged to any corner.
Search is implemented using a dedicated search thread that operates concurrently with terminal I/O. The thread grabs the terminal lock in small time slices to make forward progress on searching while minimizing impact on I/O throughput or rendering. If you do not use search, or you close the search bar, the search thread exits and does not consume any resources.
Scrollbars
PRs: GH-9225 GH-9232
Ghostty now has native scrollbars. A new scrollbar configuration controls
whether scrollbars are visible, defaulting to system which lets the
OS decide.
The scrollbar on both macOS and GTK uses native widgets and styling, and supports all the standard interactions you would expect, such as dragging the knob, clicking the track, using scroll gestures, etc.
On both platforms, we use a minimal overlay-style scrollbar so that the terminal grid doesn't have to reserve space for the scrollbar with an aesthetically unpleasant gap or gutter. The scrollbar is overlaid on top of the terminal contents with minimal styling to prevent impacting selection.
Click to Move Cursor In Shell Prompts
PR: GH-10455
Ghostty now supports the click-events
and cl=line
extensions to the OSC 133 Semantic Prompts specification.
This lets you click your mouse within an active shell prompt to move
the cursor, like a normal text field.
This feature is supported natively by Fish (4.1+) and Nushell (0.111+). For other shells, support varies based on Ghostty's injected shell integration. If you're using a supported shell, this will just magically work.
Additionally, Ghostty now has a much more complete and accurate implementation of OSC 133 which enables more accurate behaviors for our long-supported jump-to-prompt or copy command output features. This also results in better resize behaviors while at an active prompt.
As a fun detail, we also added a really cool debug overlay that shows the OSC 133 areas, which were a significant help for shell developers working to better support this. This can be enabled by anyone in the terminal inspector.
Command Finished Notifications
PRs: GH-8992 GH-10934
Ghostty can now notify you when a long-running command finishes. This is useful when you kick off a build or test suite and switch to another window and want to be notified when it's done, for example.
Three new configuration options control this feature:
notify-on-command-finish = unfocused
notify-on-command-finish-action = no-bell,notify
notify-on-command-finish-after = 30s
notify-on-command-finish controls when notifications are sent: never
(default), unfocused (only when the terminal is not focused), or
always. notify-on-command-finish-action controls how you're notified,
supporting bell (default) and notify (desktop notification), which
can be combined or negated (e.g. no-bell,notify).
notify-on-command-finish-after sets the minimum command duration before
a notification is sent, defaulting to 5 seconds.
This feature uses OSC 133 escape sequences to track command execution, so it requires shell integration to be enabled or a shell that sends OSC 133 sequences natively such as Fish or Nushell.
Key Tables, Chained Keybinds, and catch_all
PRs: GH-9984 GH-9961 GH-9977 GH-10098
Ghostty 1.3 adds many new features to our keybind system for keybind
power users: key tables, chained keybinds, and the catch_all special key.
Key tables enable tmux-like modal keybinding workflows. A key table is a named set of keybindings that can be activated or deactivated on demand. When a table is active, key presses are looked up within that table first, allowing you to create entirely separate keybinding modes.
Tables are defined using a <name>/<binding> syntax on the existing keybind
configuration. For example:
keybind = resize/arrow_up=resize_split:up,10
keybind = resize/arrow_down=resize_split:down,10
keybind = resize/arrow_left=resize_split:left,10
keybind = resize/arrow_right=resize_split:right,10
keybind = resize/escape=deactivate_key_table
keybind = resize/catch_all=ignore
keybind = ctrl+a=activate_key_table:resize
In this example, pressing ctrl+a activates the resize table. While active,
the arrow keys resize splits and all other keys are ignored. Pressing escape
deactivates the table and returns to normal keybinding behavior.
On both macOS and GTK, a dedicated UI indicator shows when a key table is active, similar to the existing key sequence indicator.
Chained keybinds let you bind multiple actions to a single key. Using
the chain key, actions are appended to the most recently defined binding:
keybind = ctrl+shift+f=toggle_fullscreen
keybind = chain=toggle_window_decorations
This triggers both actions when ctrl+shift+f is pressed. Chains work within
key tables and with key sequences.
catch_all is a new special key that matches any key not explicitly bound.
It can be combined with modifiers (ctrl+catch_all=ignore) and used within key
sequences (ctrl+a>catch_all=end_key_sequence), making it easy to build
self-contained modal keybinding sets that don't leak unintended input to the
terminal.
Fine-grained Working Directory Inheritance Controls
PR: GH-9158
New configurations tab-inherit-working-directory and
split-inherit-working-directory allow you to control working directory
inheritance independently for new tabs, windows, and split panes. This
was one of the most requested configuration features.
window-inherit-working-directory = false
tab-inherit-working-directory = true
split-inherit-working-directory = true
Longer term, we plan on supporting better conditional configuration in a more general way, but this specific use case was so highly requested that we added these specific options for now to get it in sooner.
Rich Clipboard Copy
PRs: GH-9418 GH-9431
Clipboard copy now sets multiple content types on the clipboard
(both text/plain and text/html) to enable rich text pasting with
formatting so when you paste into a rich text editor, you get formatted
text with colors and other styles preserved.
The copy_to_clipboard binding now supports a parameter specifying
the format to copy. In addition to mixed, plain, and HTML formats, the
binding also supports vt which copies text with terminal escape sequences
to preserve formatting when pasting into another terminal.
Unicode and International Text Rendering
PRs: GH-8757 GH-10895 GH-9680 GH-10465 GH-9883 GH-10179 GH-10295 GH-10332
Text in Brahmic scripts such as Devanagari, Bengali, Tibetan, Javanese, Tai Tham, and Chakma now renders correctly. These scripts rely on font shaping to form ligatures, position combining marks, and join characters, and all of these are significantly improved.
An update to Unicode 17 with full conformance to the grapheme clustering specification means multi-codepoint characters are correctly treated as single units for selection, cursor movement, and cell width calculation.
The first row shows the previous version and the second row shows 1.3.0 rendering the same text. Notice the improved ligature formation, combining mark placement, and grapheme clustering — in the first column, the selection highlight now correctly covers the entire character as a single unit.
Performance Improvements
PRs: GH-9662 GH-9645
Thanks to asciinema, we received ~4GB of public terminal recording data to analyze and optimize Ghostty's performance. This is exciting because it's based on real-world terminal usage, not just synthetic workloads.
Using this data, we improved I/O processing considerably, lowering the time it took Ghostty to replay everything in the dataset from minutes to tens of seconds (with asciinema configured to ignore all pauses, of course). These improvements were also visible in synthetic benchmarks such as Alacritty's vtebench.
In addition to I/O updates, the renderer was rearchitected, lowering the time the renderer holds the terminal lock by 2x to 5x. And in most frames, the renderer doesn't hold the lock at all thanks to improved dirty/damage tracking. This applies to both Metal and OpenGL.
Stability Improvements
PRs: GH-10337 GH-10401 GH-11089 GH-11109 GH-9594
Ghostty 1.3 includes a significant investment in stability and robustness.
This release fixes a major memory leak that Claude Code regularly triggered in prior Ghostty releases. This leak has existed since Ghostty 1.0 but was difficult or rare to trigger until Claude Code began exhibiting the perfect conditions to trigger this at scale, especially with their large user base. Details of the leak and the fix can be found in this specific blog post about it.
We also ran this release through extensive AFL++ …