Ghostty 1.4.0 is a major release that includes large performance and memory improvements, a 100% complete Kitty graphics implementation including animation and relative placements (the first non-Kitty terminal to do so), SSH integration improvements, and hundreds more improvements and fixes across all platforms.
This release features 7 months of work with changes from 172 contributors over 2,889 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. 🥰
scrollback-limit such as 0. The default isn't known to be affected.cd-ing into a directory from untrusted content, such as a cloned
repository.link configuration,
including the default URL matcher. This requires user interaction
(cmd-click) to trigger.Note: I requested CVEs for the above advisories weeks ago, but GitHub hasn't assigned them yet. If/when they're assigned, I will update the above with proper CVE numbers.
PRs: #12999 #13069 #13393 #14413 #14414
Ghostty 1.4 supports macOS 27 (Golden Gate). Most of the work was compatibility fixes:
macos-titlebar-style = tabs) lay out correctly
again.macos-titlebar-style = hidden no longer covers the top lines of the
terminal when Reduce Transparency is on.Ghostty 1.4 remains fully compatible with prior macOS versions back to and including macOS 13 (Ventura). See the system requirements for more details.
Ghostty 1.3.1 works on macOS 27, but it has some of the visual issues listed above, such as the gray tab bar.
PRs: #13943 #13939 #13935 #13934 #13893 #13933 #13389 #13270 #13281
Ghostty now supports Kitty graphics animation and relative placements. These were the last major features of the Kitty graphics protocol that Ghostty didn't support.
Programs that display animated images with the Kitty protocol, such as an
animated GIF shown with kitten icat, now animate in Ghostty instead of
showing a single still frame. Frame transmission, composition, and playback
control are all supported, and animations pause while the terminal isn't
visible. Relative placements let a program position one image relative to
another image's placement, so the child image moves along with its parent.
We also did a full conformance pass against the specification and Kitty itself, fixing dozens of behavioral differences. For example, images now scroll with text inside scroll regions (#4323 ), retransmitting an image ID replaces the old image (#6711 ), and invalid image data now gets an error response instead of silence, which could leave clients hanging. The full list is in the terminal capabilities section.
Kitty graphics are faster, too. Image payloads are now parsed in bulk with SIMD instead of one byte at a time, making large image transfers about 16x faster to parse in our benchmarks (64 MiB of image data, x86_64 Linux), and drawing images costs much less per frame.
Our Kitty graphics implementation now covers 100% of the published specification, making Ghostty (and libghostty) the first terminal to do this outside of Kitty itself.
PRs: #13264 #13473 #13240 #13245 #14130 #14137 #14138 #14017
Ghostty now transparently compresses scrollback that isn't visible, reducing the physical memory those pages use by 70% to 90% for typical text-heavy history. Compression only runs while the terminal is idle and pages are decompressed on demand when you scroll back or search, so it has no measurable impact on I/O throughput.
Thanks to compression, the default scrollback limit has been raised from 10 MB to 50 MB per terminal. On platforms that support compression, a full scrollback still generally uses less physical memory than the old 10 MB limit did.
Compression lowers resident (physical) memory, not virtual memory, so look at resident memory when measuring it. It is currently available on macOS and 64-bit Linux.
Beyond scrollback, memory usage is lower in many places:
PRs: #13209 #13220 #13226 #13227 #13537 #13827 #13587 #14011 #13722 #14035 #12760
There are performance improvements across the board in Ghostty 1.4 that yield significant gains compared to prior Ghostty versions.
The biggest win came from a surprising discovery: on macOS, the kernel caps every read from a pty at about 1 KiB no matter how large the read buffer is. Previously, Ghostty processed each read as it arrived, so per-read overhead was paid every kilobyte, and the program writing output sat blocked while we parsed. Ghostty now drains the pty on one thread while parsing on another, raising end-to-end I/O throughput by 25% to 55% on macOS (M4 Max, plain and Unicode text) over Ghostty 1.3.x.
VT processing itself is also much faster. In parser benchmarks, plain
ASCII text went from 128 MB/s to 725 MB/s (5.7x), CJK text got 3.4x
faster, and a 2.6 GB dataset of real-world terminal recordings
from asciinema is processed about 25% faster.
Together, these changes took cat-ing a 150 MB text file on macOS from
1.5 seconds to 566 milliseconds.
Other notable improvements:
write_screen_file, and scrollback
search, is 1.5x to 8x faster.The GTK app has a new rendering pipeline. It no longer uses GtkGLArea.
Instead, the renderer draws with EGL on its own thread, exports each frame
as a DMABUF, and hands it to GTK to display. Rendering is now
triple-buffered, which should greatly reduce tearing, and no OpenGL calls
run on the main thread anymore, which let us remove a number of
workarounds.
The most visible result is crisp text under fractional scaling. Text and box-drawing characters are no longer blurry with fractional display scaling such as 125% or 150% (#1938 ). We fixed this once before, but it came back after upstream GTK changes. Ghostty now renders at the window's true fractional scale, so every rendered pixel maps to exactly one pixel on screen.
The new render surface needs a system EGL library (see Changes for Package Maintainers). On GPU drivers that can't export DMABUFs, Ghostty falls back to copying frames through the CPU, which is slower but works.
PRs: #13962 #13993 #13995 #13998 #14002 #14061
Ghostty now implements the Kitty clipboard protocol (OSC 5522) on both macOS and GTK. Ghostty 1.3 could parse the protocol but didn't implement it.
OSC 52 can only read and write plain text. The Kitty clipboard protocol lets programs running in the terminal read and write any kind of clipboard data, such as images or HTML, and lets them pick among the formats on the clipboard. Programs can also enable paste events (mode 5522), which tell the program what formats a paste contains so it can read the one it wants. This is how a terminal program can accept a pasted image, for example.
Clipboard access follows the existing clipboard-read and
clipboard-write configurations. By default, reads prompt for permission
and writes are allowed. The permission prompt shows a preview of the
clipboard contents, including images. Programs that send a password can
have your answer remembered for the rest of that terminal session. A new
clipboard-write-limit-bytes configuration limits the size of a single
write (default 64 MiB). A write over the limit fails and leaves the
clipboard untouched.
You can now rearrange splits on GTK by dragging them, matching the macOS feature introduced in Ghostty 1.3. When a tab has two or more splits, each split shows a drag handle at the top. Grab the handle and drop the split onto any other split, including splits in other tabs and windows. An overlay shows which side of the target split it will land on. The terminal contents, working directory, and running processes all move with it.
A new drag-handle configuration controls when drag handles are shown on
both macOS and GTK: auto (default), always, or never. With never,
splits can't be rearranged with the mouse. Hiding the handles was a
common request from users who found them in the way.
On GTK, splits can only be dropped onto other splits. Dragging a split out to create a new tab or window is macOS-only.
PRs: #14454 #13494 #14483 #14538 #14673 #14375 #14144
Ghostty 1.4 includes dozens of improvements to core terminal emulation. We now run esctest, Thomas Dickey's terminal conformance suite, against Ghostty's terminal core in CI. Alongside that, we fixed many differences from xterm in cursor movement within margins, tab stops, character sets, mode reports, and more. You can find the full list of related changes in the terminal capabilities section.
Ghostty also supports several new sequences, including soft terminal reset
(DECSTR), extended cursor position reports (DECXCPR), backarrow key mode
(DECBKM), and screen size reports in characters (CSI 19 t). Programs can
also now ask whether the terminal is visible using
visibility reports
(mode 2033), so they can stop rendering while hidden.
Keyboard encoding also matches xterm more closely, with fixes for
modifyOtherKeys mode 2 and legacy Alt-as-Escape encoding of non-ASCII
keys.
Two new sequences are disabled by default because they can be abused by untrusted programs, including ones running on a remote machine:
# Allow programs to resize the window (CSI 8 t)
vt-window-resize-allowed = true
# Allow programs to request screen checksums (DECRQCRA)
vt-xt-checksum-report = true
PRs: #12582 #12814 #13533 #13844 #14472 #14854
Ghostty 1.2 introduced SSH shell integration features
as a work in progress. In Ghostty 1.4, they're backed by a new
ghostty +ssh CLI action: a drop-in ssh wrapper that prepares the
remote session for Ghostty and then runs the real ssh with your
arguments forwarded unchanged.
ghostty +ssh user@example.com
alias ssh='ghostty +ssh --'
Before connecting, +ssh installs Ghostty's terminfo on the remote host
so the proper xterm-ghostty TERM value can be used, and forwards
COLORTERM, TERM_PROGRAM, and TERM_PROGRAM_VERSION. If the terminfo
install fails (for example, tic isn't available on the remote), it falls
back to TERM=xterm-256color. Flags such as --terminfo=false,
--forward-env=false, and --verbose control each step.
The ssh-env and ssh-terminfo shell integration features (still opt-in)
now call +ssh too. Previously, each shell integration carried its own copy
of this logic, which made up roughly a third of our shell integration
scripts. Now bash, zsh, fish, elvish, and Nushell all behave identically,
and you can get the same behavior from scripts or anywhere else by calling
ghostty +ssh directly.
The terminfo install itself is also more reliable. Ghostty now always
installs its own bundled terminfo rather than accepting whatever
xterm-ghostty entry the remote already has, and it reinstalls
automatically when a Ghostty update changes the terminfo. It also no longer
needs infocmp or Ghostty's terminfo on the local machine. Installs are
cached per host and port, so two machines behind one address no longer
share a cache entry. And ssh-env no longer silently overrides SetEnv
entries in your ~/.ssh/config (#11518 ).
The +ssh-cache command that manages this cache now takes positional
destinations (ghostty +ssh-cache user@example.com) and has a new
--prune=30d flag. See the breaking changes if you
script against +ssh-cache.
macOS: The minimum required macOS version for Ghostty 1.4 remains unchanged (macOS 13 Ventura). Ghostty is now compatible with macOS 27.
GTK: Ghostty 1.4 requires GTK 4.18 and libadwaita 1.7, up from GTK 4.14 and libadwaita 1.5 in Ghostty 1.3. This aligns with our GTK/Adwaita version policy. Notably, Ubuntu 24.04 LTS doesn't meet this requirement. Systems with older GTK or Adwaita versions can work around this requirement by using an older version of Ghostty or the Flatpak package. #14330
OpenGL (GTK): The minimum required OpenGL version remains 4.3, but Ghostty now renders through EGL instead of GTK's OpenGL widget. This should be invisible for nearly everyone, but if Ghostty fails to start with an EGL error, please make sure your GPU driver provides a working EGL implementation.
We previously announced that Ghostty 1.4 would require macOS 14. Nothing forced our hand to do this in this release, so we kept macOS 13 support. We still plan to drop macOS 13 in a future release. Apple dropped security support for macOS 13 in the fall of 2025, so we recommend upgrading regardless.
The following behaviors have changed in 1.4.0:
copy-on-select has been reworked and now accepts none, primary,
clipboard, or both. The meaning of clipboard has changed: it
previously copied to both the selection clipboard and the system
clipboard, and now copies only to the system clipboard. If you set
copy-on-select = clipboard and want the old behavior, change it to
both. #12600 #12604 copy-on-select now defaults to none (previously true), so
selecting text no longer copies it anywhere and middle-click paste of the
selection no longer works by default. To restore the 1.3 behavior, set
copy-on-select = primary. Note that an explicit copy-on-select = true
on macOS now copies selections to the system clipboard, which is
different from 1.3. #12600 #12604 cmd+arrow_up and cmd+arrow_down now run jump_to_prompt again,
matching Terminal.app and Ghostty 1.2. In 1.3, these keys were hardcoded
to scroll to the top and bottom and couldn't be rebound. To keep the 1.3
behavior, set keybind = cmd+arrow_up=scroll_to_top and
keybind = cmd+arrow_down=scroll_to_bottom. #12245 ctrl+shift+page_up and ctrl+shift+page_down keybinds
now move the current tab left and right (move_tab), matching Firefox,
GNOME Terminal, and VS Code. jump_to_prompt moved to
ctrl+shift+arrow_up and ctrl+shift+arrow_down, so programs running in
the terminal no longer receive those keys. If a program you use needs
them, unbind them with keybind = ctrl+shift+arrow_up=unbind and
keybind = ctrl+shift+arrow_down=unbind. #4998 #12458 The list below contains deprecations that remain compatible today through a compatibility layer, but may break in a future release if they are ignored:
scrollback-limit has been renamed to scrollback-limit-bytes, to make
room for the new scrollback-limit-lines. #13473 copy-on-select = true is replaced with copy-on-select = primary on
Linux and FreeBSD, or copy-on-select = clipboard on macOS.
copy-on-select = false is replaced with copy-on-select = none.
#12600 #12604 There is no set timeline to remove these deprecations, but we recommend adapting to the new configurations sooner rather than later to avoid any possible disruptions in the future.
scrollback-compression
configuration. Because of this, the default scrollback limit has been
raised from 10 MB to 50 MB, which on average still uses less memory than
a full scrollback did previously. #13264 scrollback-limit-lines limits scrollback by number
of lines instead of bytes. The existing scrollback-limit configuration
has been renamed to scrollback-limit-bytes (the old name continues to
work). If both are set, the first limit reached applies, and both accept
unlimited. #13473 copy-on-select now accepts none, primary, clipboard, and both
and no longer affects middle-click paste (see middle-click-action).
clipboard now copies only to the system clipboard, so use both for the
previous behavior. The default on macOS is now none. See the
breaking changes for migration details. #12600 middle-click-action configures the behavior of
middle-clicking: primary-paste (default) pastes from the selection
clipboard, clipboard-paste pastes from the system clipboard, and
ignore does nothing. #12478 move_tab_to_new_window moves the current tab into
a new window of its own. It is also available in the command palette.
#2630 +explain-config prints the documentation for a
configuration option or binding action, e.g.
ghostty +explain-config font-size. #11546 +explain-config and +show-config CLI commands now page their
output through $GHOSTTY_PAGER or $PAGER (falling back to less) when
run interactively. Paging can be disabled with --no-pager or by setting
the pager to an empty value. #11940 drag-handle controls when the split drag handles
are shown: auto (default), always, or never. #13706 #13709 link-osc8 (default true) can be set to false to
disable OSC 8 hyperlinks entirely. Disabled OSC 8 hyperlinks are not
highlighted, previewed, copied, or opened. #13634 GHOSTTY_SURFACE_ID
environment variable that uniquely identifies the terminal they are
running in. #12027 REP),
hyperlink-heavy output, and scroll regions are all faster. #13220
#13226 #13231 #13294 #13625 #13826 #14356 write_screen_file and related
actions, and scrollback search. #13587 command-palette-entry = clear removes all command palette entries,
including the default entries. #12682 window-padding-balance has a new value equal that balances padding
equally on all four sides without capping the top padding. #11491 theme now expands ~ to the home directory in theme file paths,
including in separate light and dark themes. #13840 +list-themes now supports g and G to jump to the first and
last theme, and ctrl+d and ctrl+u to page down and up. #13681
#14607 +edit-config works when $EDITOR or $VISUAL contains arguments,
such as zed --new. #11897 adjust-cursor-height works again. #13225 ctrl/cmd triple-click
output selection now extends the selection by command output, autoscroll
stops when the screen switches (e.g. to the alternate screen), a force
touch on macOS selects the word at the press location without starting a
drag, and releasing a drag no longer activates a link or prompt click.
#12830 cmd/ctrl-click no longer include trailing
spaces, which broke opening paths printed by some TUIs. #13505 ctrl+r history
search. #14710 command-palette-entry actions with string parameters, such as
set_tab_title, no longer have their parameters escaped when run from
the command palette. #13609 copy_to_clipboard:vt) and VT screen files now preserve
OSC 8 hyperlinks, empty gaps between text, and cells that only have
a background color, such as colored status bars. VT screen files also
keep trailing blank rows. #14711 #14725 #14766 +list-themes no longer crashes on some keys when the search
matches no themes, and the keypad down key now moves one row instead of
21. #14612 #14605 write_screen_file, write_scrollback_file, and
write_selection_file actions leaking two file descriptors on each use,
which could eventually prevent opening new terminals. #13644 input configuration.
#13574 #13579 #13931 P=, Q=, H=, V=) are now
supported, allowing images to be positioned relative to other images.
#13939 clipboard-read and clipboard-write, and a new
clipboard-write-limit-bytes configuration limits the size of a single
write. #10549 #13962 #13993 #13995 #13998 #14002 #14061 CSI ? 998 n), which tell
programs when the terminal is not visible, such as in a background tab
or on another workspace, so they can stop rendering. #13494 CSI 8 ; rows ; cols t
sequence if the new vt-window-resize-allowed configuration is enabled
(default off). The request is ignored in splits, windows with multiple
tabs, the quick terminal, and fullscreen, maximized, or tiled windows.
#1115 #14375 click_events=2, which reports prompt clicks with
row coordinates relative to the prompt. #10865 #12953 CSI ! p), which resets
modes, margins, and text attributes without clearing the screen.
#14538 DEL (0x7f, the default) or BS
(0x08). #12226 vt-xt-checksum-report configuration is enabled. The new
vt-xt-checksum-extension configuration controls how the checksum is
calculated. #14483 CSI 19 t (report screen size in characters) and to
DECXCPR (CSI ? 6 n) extended cursor position requests. #14633
#14673 CSI Ps $ p), reports DECECM
and other unimplemented ANSI modes as permanently reset like xterm, and
no longer truncates mode numbers above 32767 in its reply. #12505
#14236 #14237 #14672 Smol/Rmol),
which lets tmux pass overlines through. DECRQSS SGR replies now include
overline and curly, double, dotted, and dashed underline styles.
#13649 #13653 #13470 Se capability now resets the cursor to the configured
cursor-style instead of a steady block. This fixes programs like Neovim
leaving a block cursor behind on exit. #12482 25a1), which lets programs register custom glyphs. Ghostty parses
and answers requests but doesn't render registered glyphs yet.
#12352 #12930 #12937 tmux -CC could trigger. tmux control mode is still not hooked up to
the GUI. #11395 #11935 #14262 #14680 ctrl+l in bash or zsh) now
moves prior output into scrollback even when the prompt is not on the
last row. Previously, the output was erased. #14660 #14668 CSI S, CSI T, or scroll margins, and are clipped to the scroll
region. #4323 #13935 d=p, d=c) only remove placements at that cell, d=a only
removes placements on the visible screen, range deletes accept empty
ranges, and deleting a missing placement no longer frees the image.
#13652 #13895 #13898 #13932 S size, and loads interrupted by
a non-chunk transmission. #13889 #13892 #13896 #13897 #13933
#14811 X/Y offsets are kept within the first cell. #13890 #13891 image-storage-limit to the
default. #13951 alt+escape now encode like xterm. F13 to F25, Help, and Menu now send
xterm's function key sequences in all legacy encoding modes. #14144
#14145 ctrl+alt+shift+backspace now sends ESC BS in legacy key encoding,
matching xterm. #14508 0x10 to 0x1F are now executed instead of printed
as text, and UTF-8 encoded C1 controls are ignored, matching xterm.
#14022 #14023 CSI 2 K) now clears its soft-wrap state, so
erased rows no longer join together when the window is resized. #13637 CSI 0 g no longer sets a tab stop where
there wasn't one, and CSI g with no parameter clears the tab stop at
the cursor. #13900 #14644 ghostty +ssh CLI action wraps ssh and sets up Ghostty on remote
hosts: it forwards Ghostty's environment and installs Ghostty's terminfo
on the first connection to each host, caching successful installs. It can
be used directly (ghostty +ssh user@example.com) or as an alias
(alias ssh='ghostty +ssh --') without shell integration. The ssh-env
and ssh-terminfo shell integration features now use it for every
shell. #12582 ssh-terminfo now always installs Ghostty's bundled terminfo on remote
hosts instead of keeping an existing, possibly outdated, xterm-ghostty
entry, and reinstalls it when a newer Ghostty changes its terminfo.
#13844 ghostty +ssh-cache has been reworked with positional destinations, a
new --prune option, consistent output and exit codes, and error
messages that name the cache file. See the
breaking changes above. #12814 #13533 ssh-terminfo now tells apart the same host on different ports, so
terminfo is installed on each of them. ghostty +ssh-cache accepts
host:port destinations. #14472 ssh-env no longer overrides SetEnv entries in your ~/.ssh/config.
#11518 #14854 ssh and sudo now works with external
completers such as carapace. #13310 /bin/bash, has been updated to 0.7.0. #14120 { in the prompt and broken prompt marking when PS1
or PS2 ends with a bare %. #11832 PROMPT_COMMAND. #11690 PROMPT_COMMAND ends with a
newline. #11621 PROMPT_COMMAND. #14266 abnormal-command-exit-runtime
are highlighted in red. #7649 #12251 terminal class and the Shortcuts terminal entity
now expose pid (of the foreground process) and tty. #11592
#10756 #11922 name override property to set or clear a custom title. #12048
#14733 macos-titlebar-style = tabs. #11962 #11963 toggle_background_opacity now applies to every tab in the
window, and new windows inherit the current state. #11583 cmd+arrow_up and cmd+arrow_down now run their configured
keybinds, which default to jump_to_prompt. Ghostty 1.3 always scrolled
to the top or bottom of the scrollback instead, ignoring the
configuration. To scroll to the top or bottom, use cmd+home and
cmd+end. #12245 ctrl+j no longer send control
characters to the terminal. #11461 #12447 #12518 #12547 font-thicken now also applies to IME preedit text. #14230 option+backspace and other modified Backspace keys now report
their modifiers with the Kitty keyboard protocol instead of sending a
bare DEL. #13871 sftp:// URL. #13152 #13170 #13212 navigate_search and end_search keybinds now work correctly,
including while the search field is focused. #12070 #12492 cmd+t to create many tabs now leaves the newest tab
focused. #13725 #13985 macos-titlebar-style = tabs. #12219 macos-titlebar-style = tabs on macOS 26 no
longer briefly shows the neighboring tab. #14847 macos-glass-regular and macos-glass-clear options for
background-blur now layer the glass over the background color, and
focused windows are no longer less transparent than unfocused ones.
#13914 #13928 window-title-font-family. #14135 #14217 window-save-state = never now also stops macOS from taking
window restoration snapshots, which could stall focus changes between
windows. #14506 GHOSTTY_QUICK_TERMINAL=1. #12895 #12896 %1~ prompts.
#12614 #14051 ghostty -e no longer opens the command's file arguments as
extra terminals, e.g. ghostty -e vim file.txt. #13748 .command file from Finder no longer corrupts
non-ASCII characters in its path. #13862 send key now works for character keys, not only
special keys like enter, and respects macos-option-as-alt. #13205 super+backquote), uppercase letters, forward delete, and
the scroll_to_selection and search_selection actions. #13888
#12039 #12011 #12281 undo-timeout = 0. #13359 #13364 GtkGLArea. Ghostty now renders with
EGL entirely on the render thread and hands finished frames to GTK as
DMABUFs, so the main thread no longer does any OpenGL work. #14052
#14636 prompt_window_title and set_window_title binding actions.
#10469 #10999 +new-tab CLI command opens a new tab in a running Ghostty
instance. When run from inside Ghostty, the tab opens in the same
window. It accepts the same -e, --working-directory, and --title
flags as +new-window. #11762 +toggle-quick-terminal CLI command toggles the quick
terminal of a running Ghostty instance, useful for binding in window
managers without global shortcut support. #12661 vicinae-hotkey-v1 Wayland protocol
when the compositor supports it (e.g. Hyprland 0.56+), falling back to
the XDG desktop portal otherwise. Ghostty shows a desktop notification if
a global keybind can't be registered. #13464 quick-terminal-screen is now supported on Wayland. The default,
main, places the quick terminal on the compositor's primary output
(or the first monitor if the compositor doesn't report one). Set it to
mouse to let the compositor choose, which was the previous behavior.
#11117 background-blur now uses the compositor-agnostic
ext-background-effect-v1 protocol instead of KDE's blur protocol,
enabling blur on compositors such as Niri. The blur region also no longer
covers the window's client-side shadows. #10721 #10720 #10727 background-blur uses GTK's built-in
background blur, which covers the window more accurately. #13581
#13586 open_config binding action now accepts new_window to
edit the configuration in $VISUAL or $EDITOR in a new Ghostty
window. The default, os_open, keeps the previous behavior. #11905 gtk-horizontal-tab-scroll (default true)
can be set to false to stop two-finger horizontal scrolling from
switching tabs, passing the scroll to the terminal application instead.
#12659 gtk-tabs-inverted moves the close button to
the start of each tab, in both the tab bar and the tab overview.
#14657 ctrl+shift+page_up and ctrl+shift+page_down now move the current
tab left and right (move_tab), matching Firefox, GNOME Terminal, and
VS Code. jump_to_prompt moved to ctrl+shift+arrow_up and
ctrl+shift+arrow_down. #4998 #12458 xdg-open if the portal is unavailable. Ghostty passes an activation
token so the opened application, such as your browser, can come to the
front on compositors that require one. #5991 #11754 #14785
#14787 resize_split keybinds, no
longer flickers. #13414 resize_split on nested splits no longer causes large jumps in
size. #12699 resize_split. #14476 gtk-enable-primary-paste is disabled in
GSettings. #12940 #13108 quick-terminal-autohide is enabled. #11679 #12471 quick-terminal-autohide is enabled. #12843 +new-window -e now works when shell-integration is set to a
specific shell. +new-window and +new-tab also accept a new
--shell-integration flag. #12378 #13741 ISO_Level3_Shift) no longer also send the original key. #13967 toggle_fullscreen). #14474 window-theme = ghostty. #14662 xdg-open)
produces large output. #12797 gtk-xft-dpi values once instead of
repeatedly. #14410 #14085 #14434 clear, now find the
xterm-ghostty terminfo entry. #12662 Ghostty 1.4 introduces full localization for the command palette and adds support for 4 new languages:
Localization is maintained by volunteer contributors. If you want to help localize Ghostty in your language, please open a discussion on the GitHub repo. Thank you to all the volunteers who contributed to Ghostty's localization!
egl, usually
provided by libglvnd or Mesa) for the new renderer. At runtime, Ghostty
uses GTK's EGL display when it can, and otherwise needs an EGL driver
that supports the surfaceless platform. #14052 #14636 -Dinstalled-exe-path build option sets the absolute executable
path written into the desktop file, D-Bus services, and systemd user
service. Previously this path came from the install prefix. Without the
option, these files now name ghostty alone, which systemd only finds in
/usr/bin or /usr/local/bin, so set it for any other prefix.
#14805 #14806 -fsys=gtk4-layer-shell),
version 1.0.4 or newer is now required. Ghostty no longer disables the
quick terminal on older versions, which can crash on some compositors.
#11559 As with 1.3, libghostty isn't directly part of the Ghostty 1.4 release. But a large part of the 1.4 development cycle went into libghostty, so here's an update.
Over the past 6 months, the C API for libghostty-vt has grown from a parser and a few encoders into a complete terminal emulator API, adopted by dozens of free and commercial terminal emulators used by millions of people. It's hard to quantify exactly, but the number of people using a libghostty-based terminal is confidently several times the number of people using the Ghostty GUI.
libghostty-vt now builds for macOS, Linux, Windows (MSVC and GNU), FreeBSD, Android, iOS, and WebAssembly, and CI continuously verifies every one of these targets. The goal is for libghostty-vt to be generally usable everywhere, within reason, so if you want more target support, let us know!
It's also easier to integrate libghostty-vt into existing build systems. There's CMake support, Nix packaging, an xcframework, and a source tarball, in addition to the existing pkg-config file. libghostty-vt no longer needs libc++, and it can build freestanding.
The API is still marked as a work in progress and broke compatibility
several times during this cycle, so expect more breaking changes before
a tagged release. The API documentation
and the Zig, C, C++, Swift, and WebAssembly examples
(now over 30) are kept up to date with main.
We're going to do a final pass over the C API, break ABI one more time, and then likely tag a libghostty 1.0 release very soon.
Ghostty is a non-profit project, fiscally sponsored by Hack Club. All of our finances are public on HCB, so you can see exactly where every dollar goes.
During the 1.4 cycle, we paid $41,820 to contributors under contract and spent about $1,260 on infrastructure such as website hosting.
I'm happy to share that we've now signed our first two 12-month contracts, which give contributors stable, long-term paid work on Ghostty and help ensure the ongoing stability and sustainability of the project:
@cImport, updated the bundled Fontconfig,
and more. He's also the author of
z2d, the 2D graphics library Ghostty
uses to draw box-drawing characters and other sprite glyphs.If you'd like to support Ghostty, please visit our sponsorship page.
The primary focus of the roadmap continues to be libghostty functionality, stability, and portability. During the last release cycle, I said I aimed to tag a libghostty release. We haven't done that yet, but I'm confident we will do so before Ghostty 1.5.
libghostty is a project that continues to be the tide that lifts all boats. libghostty improvements tie directly to Ghostty GUI improvements as well as dozens of other large projects in the ecosystem. As more large projects adopt libghostty, libghostty tends to get more testing and attention, and this creates a cycle that yields the most gain for terminal emulators everywhere.
macOS and GTK builds of Ghostty have talented, capable maintainer teams that are continuing to improve them, so they're not neglected by any means! As a project, we've decided to drop any roadmap for Windows support in the Ghostty GUI. libghostty fully supports Windows (and we test it in CI), and the official stance now is that downstream projects should use that.
Our release cycle remains 6 months. This release was delayed by one month, but Ghostty 1.5 is planned for March 2027. libghostty will have a separate release cycle.