Ghostty v1.3.0

v1.3.0
Added 4
  • 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
Changed 1
  • Improve OSC 133 implementation for more accurate behaviors with jump-to-prompt, copy command output, and resize behaviors while at an active prompt
Security 1
  • 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++ …

View original

Upgraded? How did it go?

Discussion