Ghostty 1.1.0
Release notes for Ghostty 1.1.0, released on January 30, 2025.
Ghostty 1.1.0 features 1 month of work with changes from 84 contributors over 564 commits. The focus of this release remains on critical bug fixes and quality of life improvements based on feedback from the initial 1.0 release.
- GHSA-98wc-794w-gjx3. Fixed an issue where Ghostty would leak some file descriptors to the running shell or command.
On Linux in particular, window decorations have a wide variety of styles and behaviors. Ghostty's previous behavior was to always use client-side decorations (CSD), which made Ghostty look and feel too much like a "GNOME" application. In particular, Ghostty looked out of place on popular desktop environments like KDE Plasma.
Ghostty 1.1 on Linux now supports server-side decorations (SSD) for compositors that support it. This allows Ghostty to look and feel more like a native application on a wider variety of desktop environments. This can be disabled if you prefer CSD or no decorations at all.
(Left/Top: Old Client-Side Decorations, Right/Bottom: New Server-Side Decorations)
The window-decoration
configuration option now has a new value auto
which will use SSD if the compositor supports it and prefers it. A value
of server
will force SSD (if available). A value of client
will force
client-side decorations. And a value of none
will disable decorations
entirely.
SSD is only supported on Wayland. Ghostty uses the KDE Server Decoration protocol. Despite the name, this protocol is supported on almost every major Wayland compositor, not just KDE. For X11, we could not find a well-supported protocol for SSD, so we continue to use CSD.
Future versions of Ghostty will continue to improve the native look and feel across different desktop environments in Linux to the best of our ability and protocol availability. For example, we're looking into native menu bars, currently.
Important
Future versions of Ghostty will remove the
gtk-adwaita
option and force a dependency on libadwaita. This is relevant to this change because we found the vast majority of users who wanted SSD were usinggtk-adwaita = false
to achieve this (which only worked in some cases). With the new SSD support, this workaround is no longer necessary. See the dedication section for more details.
PR: #3567, #4332, #4539, #4854, #4933, #4999
For both macOS and Linux, we've tested IME with the following paradigms: CJK (Chinese, Japanese, Korean), dead keys (such as accented characters), emoji, Unicode hex input, and more and have massively improved the reliability and consistency of IME input.
On Linux, we've tested both fcitx
and ibus
under both X11 and
Wayland. We also tested multiple versions of each (in particular
versions that are common in LTS distributions). We found a bug in
ibus 1.5.29 that caused deadkey input to become "stuck" and worked
around it.
On macOS, we've ensured in particular that the AquaSKK and macSKK Japanese language input methods work out of the box, although we've also tested other IMEs and found them to work well as well.
PR: #4328
Keybinds support a new performable:
prefix. This prefix indicates that
the keybind should only consume the input if the action is performed.
For example, the keybind below will only consume ctrl+c
if there is
text able to be copied. Otherwise, ctrl+c
will be passed to the shell
(typically causing an interrupt signal).
keybind = performable:ctrl+c=copy_to_clipboard
Note
Not all actions support
performable:
. Namely, many actions are always performed (e.g.text
,new_tab
, etc.). The performable prefix only applies to actions that have a meaningful "perform" state.
Alpha blending is the process of determining the result when a semi-transparent foreground color is placed in front of a background color. This affects the edges of text, and any images (displayed with Kitty Graphic Protocol) which have transparency in them.
Before, this was performed by blending colors in the sRGB color space, which causes darkening around the edges of text when the foreground and background colors are different highly saturated colors. With Ghostty 1.1 on macOS, alpha blending is now performed in the P3 color space by default, which reduces the darkening issue thanks to the wider gamut and matches the appearance of native macOS applications like Terminal.app and TextEdit.
Additionally, a configuration, alpha-blending
, has been added to control this.
The default is native
, which has been described, but two more options are
available:
linear
performs blending in a linear color space, which is technically correct but has downsides like dark text seeming too thin and light text seeming too thick.linear-corrected
is likelinear
but applies a correction step to text which makes it appear extremely close tonative
, but without any darkening problems.
Below you can compare (from left to right) the old blending, the new native
blending, linear
blending, and linear-corrected
blending. You may have to
zoom in to see the differences correctly.
This is currently only available on macOS, but work is underway which should bring it to Linux as well in the future.
PR: #4049, #4501, #4999, #5361
The quick terminal now works with native fullscreen windows, space changes while the quick terminal is open, IME widgets, left/right docks, and more.
A new configuration quick-terminal-space-behavior
has been added to
control how the quick terminal reacts to changing macOS spaces while it
is open. The default behavior is to follow the active space (move
).
You can also set it to remain
to stay on the space it was opened on.
Full list of closed issues on GitHub.
In each section, we try to sort improvements before bug fixes.
- Add the new
performable:
prefix to keybindings to only consume the input if the action is performed. See "Performable" Keybindings. #4328 shell-integration-features
now sets the proper environment variables even whenshell-integration
is disabled. This is useful for environments that manually source shell integration. #5046- A new keybinding action
copy_url_to_clipboard
is available to copy the URL (if any) under the cursor to the clipboard. #4633 - A new keybinding action
close_tab
can be used to close the tab and all splits within the tab. This works on both macOS and GTK builds. #4331 - Update default
ctrl+shift+j
/ctrl+shift+alt+j
keybindings to capture full screen contents. #5285 - IPv6 URLs are now automatically turned into hyperlinks. #4743
- Filepaths without an explicit
file://
protocol can now be clicked like any other hyperlink. #4713 - New configuration
split-divider-color
to explicitly set the divider color for splits. If this is not set, the previous default behavior of automatically determining the color based on your terminal background color is used. #4236 - The
palette
configuration option now allows binary, octal, and hexadecimal keys. #4298 goto_split
keybind parametertop
andbottom
have been renamed toup
anddown
, respectively. The old names are still supported for backwards compatibility. #3427- bash: use
\w
instead of$PWD
for abbreviated titles. #4656 - bash: drop dependency on
sed
, which significantly reduces per-prompt overhead #5141, #5142 - fish: fix sudo integration #5276
- Fix scenario where CPU would spin at 100% if
wait-after-command
was enabled. #4884 - Fix a possible memory corruption race condition when the renderer grid size and terminal grid size mismatched. #5265
- Triple-click-and-drag now works when the triple click starts from a blank line. #5068
super+triple-click
properly selects command output if the command line wrapped. #5373- vt: Fix incorrect alpha blending for Kitty image protocol. #5189
- vt: More robust and correct handling of mixed semicolon and colon usage in SGR sequences. Practically, fixes some styling within the Kakoune editor. #5022
- The
cursor-invert-fg-bg
option now works well with the invert VT sequence. #4777 - Remove
VTE_VERSION
from environment prior to executing shell. This fixes issues where VTE's shell integration would mistakingly think Ghostty was libvte-based. #4710 - Fix an issue that didn't allow an initial window size smaller than
640x480
#4688 - vt: ConEmu OSC
9;4
parsing better matches ConEmu logic, fixing an issue with some versions of systemd. #4727 - The
unbind
keybind action now also unbinds any matching physical mapping. #4703 - Non-existent
config-file
now properly shows an error whentheme
is also set. #4509 - vt: ConEmu OSC
9;1
,9;2
,9;3
,9;5
are now parsed and ignored so they don't conflict with OSC 9 desktop notifications. #4644, #4327, #4948, #4447 - Inspector: Memory values now specify units rather than raw bytes #4549
- Fix control sequence (e.g.
ctrl+c
) encoding in legacy mode for various keyboard layouts such as Russian. #4518 - vt: Kitty graphics protocol temporary files must be named according to the specification. #4451
- The default file limit (
RLIMIT_NOFILE
) is restored for the executed shell or command. #4241 - Multiple
font-feature
values can be comma-separated. Previously, you had to repeatfont-feature
multiple times. This is still supported. #3128 - vt: CSI intermediate bytes are now validated for all supported CSI sequences. #3122
- Selected text no longer remains after a
clear_screen
keybinding. #3414 - Tilde (
~
) in filepaths now expands to the user's home directory in path-typed configuration values. #3328 - Cache data now respects
XDG_CACHE_HOME
. #3458 - Default configuration file will now be created even if the parent directories do not exist. #4295
- Inspector: Font size now shows fractional values. #4371
- macOS: Consistent and correct alpha blending for correct colors. Options for matching Apple-style alpha blending as well as an experimental "linear" blending mode that we think produces better results for certain foreground/background color combinations. See macOS Alpha Blending Improvements. #4913
- macOS: New config option
quick-terminal-space-behavior
to configure how the quick terminal reacts to changing macOS spaces while it is open. The default behavior is to follow the active space (remain open). #4049 - macOS: Selection clipboard is now supported. The
copy-on-select
option now defaults to true for macOS. A new "Paste Selection" menu item is available on macOS. This behavior matches Terminal.app. #4733 - macOS: A very short delay has been introduced for the default window title to prevent a FOUC ("flash of unknown content") for new surfaces. #4799
- macOS:
font-thicken
now accepts an optional numeric value to adjust the thickening factor. #4531 - macOS: Explicit Ghostty keybindings now take priority over
system keybindings (e.g.
cmd+h
can now be bound). #4591 - macOS: Non-boolean
font-feature
values such ascv02 = 2
are now supported. #3128 - macOS: Cache data now uses macOS system APIs to store data in the
OS-configured cache directory (typically
~/Library/Caches
). #3458 - macOS: Autohide the dock if the quick terminal would overlap with it. #5361
- macOS: Fix zombie processes leaking when the shell or command exits before the containing UI is closed. #4554
- macOS: Hyperlinks in the top-left no loner appear hovered when command is held anywhere outside the window. #5252
- macOS: When
macos-titlebar-style = hidden
, the titlebar area can no longer be used to drag the window. You must now use option+drag (standard macOS bindings) in the resize area. #2523 - macOS: Closing a tab with Stage Manager enabled no longer causes Ghostty to lose focus. #5108
- macOS: Fix "background flash" for new and resized terminals. #5083
- macOS: Filepaths are shell escaped when files, URLs, are pasted. #5036
- macOS: Quick terminal no longer covers IME widget. #4999
- macOS: Text can now be dragged onto the terminal. #4932
- macOS: IME window position is now correct when
window-padding
is set. #4933 - macOS: Pasting multiple files now separates their path by a space instead of a newline. #4956
- macOS:
toggle_visibility
no longer separates tabs from their parent window. #4329 - macOS: Control-characters such as
ctrl+h
now work as expected for input method editors (IME). #4854 - macOS: Fix crash when
window-step-resize
was used in conjunction with an overly large initial window size. #4801 - macOS: Quick terminal now properly overlays native fullscreen windows. #4049
- macOS: Add strings for more macOS system permission requests that can be triggered by child processes (e.g. Bluetooth access). #4668
- macOS:
new_tab
keybinding without any windows creates a new window. #4691 - macOS: Fix a retain cycle that prevented the
NSWindow
from being released when closed. #4689 - macOS: Preedit text no longer disappears when a modifier key is pressed. #4634
- macOS: AquaSKK/macSKK Japanese language input methods now work. #4539
- macOS: Quick terminal now appears in the correct location with certain multi-monitor configurations. #4501
- macOS:
command+<key>
release events are now properly encoded for the Kitty keyboard protocol. #4591 - macOS:
cmd+period
and other keybinds can now be bound. #4591 - macOS: Window borders with dark mode now match macOS styling. #4308
- macOS: Auto-update no longer defaults to on. On first run, Ghostty will
ask for your permission to check for updates. The
auto-update
option can still be used to configure this. #4433 - macOS: New configurations
window-position-x
andwindow-position-y
can be used to set the initial window position. #3929 - macOS:
macos-titlebar-style = hidden
restores properly after exiting non-native fullscreen. #3535
-
GTK: Support for server-side decorations (SSD) has been added. This utilizes the existing
window-decoration
configuration option. The new value isauto
which will use SSD if the compositor supports it and preferes it. A value ofserver
will force SSD (if available). A value ofclient
will force client-side decorations. And a value ofnone
will disable decorations entirely. See Server Side Decorations (SSD) on Linux. #4630 -
GTK(X11):
background-blur
is now supported for any window manager that respects the_KDE_NET_WM_BLUR_BEHIND_REGION
atom. #4403 -
GTK(Wayland):
background-blur
is now supported for any compositor supporting theorg_kde_kwin_blur_manager
protocol (namely, KDE). #4403 -
GTK: Add new configuration
app-notifications
to control what toasts are shown. #4460 -
GTK: Multiple
custom-shader
values are now supported (matching macOS) #5037 -
GTK: A new configuration option
gtk-titlebar-hide-when-maximized
(default false) added to hide the titlebar when the window is maximized (not fullscreen). #3381 -
GTK: Ghostty can now be pinned in the dock or task manager for supported desktop environments. #4930
-
GTK: Dropping files and selected text now works and matches macOS. #4211
-
"Open in Ghostty" shortcut for Nautilus is now available #4816
-
GTK: Fix adwaita tab bars appearing above the titlebar in some older versions of libadwaita. #5410
-
GTK: Fix slow startup times when XDG desktop portal is not available. #5064
-
GTK:
fcitx
andibus
under both X11 and Wayland work. #4332 -
GTK: Workaround bug in
ibus
1.5.29 that caused deadkey input to become "stuck." #3567 -
GTK(X11): When a new window is initially maximized, the
_NET_WM_STATE
atom is properly set so the titlebar properly reflects the maximized state. #4646 -
GTK:
last_tab
keybind action works #5004 -
GTK: The titlebar is automatically hidden when the window is fullscreen (and restored when the window exits fullscreen). #5008
-
GTK: Mouse no longer appears when the title changes and
mouse-hide-while-typing
is set. #3345 -
GTK: Fix segfault that would happen with older libadwaita versions when
ctrl+d
was used to exit a window. #4971 -
GTK: Ensure close confirmation appears in more scenarios such as pressing the "X" in the tab bar. #4234
-
GTK: OpenGL debug logging is now disabled by default for release builds but can be configured to be turned back on. #4662
-
GTK: Windows with libadwaita enabled can now be sized smaller than 482x322. #4836
-
GTK: Fix a handful of cases where compile-time version checks were done instead of runtime, disabling behavior when we shouldn't have. #4783
-
GTK:
window-title-font-family
now works (previously this was macOS-only) #4560 -
GTK: Menu separator colors now match the system theme. #4421
-
GTK: Fix issues with fractional scaling. The terminal should now appear crisp on GTK displays with fractional scaling. #4255
-
GTK: A new configuration
gtk-custom-css
allows loading custom CSS to theme GTK elements. #4200 -
GTK:
focus-follows-mouse
works properly withgoto_split
keybindings. #3229 -
GTK: Use
gtk-xft-dpi
for font scaling on Wayland (previously we only used the value for X11). This allows the GNOME "Large Text" setting to work properly. #4424 -
GTK:
ctrl+insert
andshift+insert
bindings have been added as secondary defaults forcopy
andpaste
, respectively. #2870 -
GTK: Paste preview text is now monospace. #4227
Note
All of the build changes are minor and should not impact previously functional builds. Feel free to ignore these changes unless you're simply curious about them.
- Build:
-Dstrip
can be used to control binary stripping. Previously, we automatically stripped release binaries. This can now be configured. #3945 - Build:
-Dsentry
can be used to explicitly enable or disable Sentry. Linux builds by default have Sentry disabled. macOS builds by default have Sentry enabled. Sentry only collects crash logs locally, it does not transmit them via the network. #3934 - Build: Terminfo/Termcap sources are no longer installed by default.
Note the compiled version is still properly installed so the terminfo
is available. Build flags
-Demit-terminfo
and-Demit-termcap
can be used to emit the source files. #5311 - Build: Fix incorrect libadwaita pkg-config name. #4818
We plan to release a version 1.1.1 to address some additional bugs that didn't quite make the 1.1.0 release. We don't expect this release to happen quickly unless any critical issues or regressions are raised. Therefore, we recommend all package managers to upgrade to 1.1.0 as quickly as possible.
The focus for the next release will be to continue to resolve some issues
with certain keyboard layouts along with some fundamental issues with
window-step-resize
on macOS. Additional unplanned functionality may
be introduced if unexpected contributors appear (thank you!).
We're reaching general wide-scale stability since our initial 1.0 release. I expect soon we'll move to even longer release cycles (months long) to allow the development team to focus on larger, more impactful features.
Starting with Ghostty 1.2, we plan to remove the gtk-adwaita
option
and force a dependency on libadwaita. libadwaita is defaulted to on
already so unless you've explicitly disabled it, this change should
not affect you.
Important
I expect for some this will be a controversial decision, so please read this section carefully to understand our motivation and the diligence we've done in making this decision. If you still have concerns, please reach out to us on GitHub or Discord.
The primary use case for gtk-adwaita = false
in earlier versions of Ghostty
was to use it in concert with window-decoration = none
to force some
compositors to use server-side decorations (SSD). Note this didn't work
in all cases and was never an explicit configuration goal; it just happened
to work in some cases. With the introduction of
explicit SSD support
in Ghostty 1.1, this workaround is no longer necessary.
Another use case for gtk-adwaita = false
was in relation to theming.
Ghostty 1.1 introduces a
gtk-custom-css
option
to easily inject custom CSS to theme GTK elements. We also introduced
more easily targetable class names across our GTK widgets. You could always
use system-wide CSS to theme Ghostty, but this new option makes it easier
to test and apply custom CSS specific to Ghostty.
For Ghostty maintainers, maintaining "classic GTK" and "libadwaita" code
paths is a significant burden, especially in addition to differences in
behavior across GTK and Adwaita versions and the complex interactions
of various Ghostty configurations (all the gtk-
and adw-
prefixed
options). This has led to a number of bugs and regressions that are
difficult to fix and test without expensive and complex CI setups.
With the SSD support in Ghostty 1.1 and the primary use case for
gtk-adwaita = false
no longer necessary, we believe now is a good
time to make this change. We believe this will result in a more stable,
more maintainable, and more feature-rich Ghostty in the future (the last
point because we can go all-in on libadwaita features).
To better feel confident in this decision, we've also reached out directly to non-GNOME users of Ghostty as well as non-Ghostty users who complained about the look and feel of Ghostty (namely: bloggers, streamers, and YouTubers). The feedback was unanimously supportive of this change, understanding the reasoning and the benefits it would bring and acknowledging that explicit SSD support addresses the major concerns.
If you have strong opinions on this change, please reach out to us on Discord or GitHub. Please justify your argument with specific use cases and scenarios where this change would negatively impact you. Please do not just say "I don't like it" without providing a reason; it's not helpful. We are open to feedback and will consider it carefully. Thank you!