{"article":{"slug":"ghostty-1-4-0-release-notes","title":"Ghostty 1.4.0 Release Notes","subtitle":null,"summary":"Ghostty 1.4.0, seven months of work from 172 contributors, adds macOS 27 support, the first complete non-Kitty implementation of Kitty graphics (animation and relative placements), scrollback compression and lower memory use, a new OpenGL renderer on Linux, the Kitty clipboard protocol, a ghostty +ssh integration, security fixes, and a roadmap that drops Windows GUI plans in favour of libghostty.","content_type":"changelog","language":"en","canonical_url":"https://ghostty.org/docs/install/release-notes/1-4-0","author":{"name":"Ghostty maintainers","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Ghostty","url":"https://ghostty.org/","listing_slug":null,"listing":null},"topics":[{"name":"Developer Tools","slug":"developer-tools","url":"https://listedarticles.com/topics/developer-tools"},{"name":"Terminal","slug":"terminal","url":"https://listedarticles.com/topics/terminal"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":10094,"reading_minutes":44,"published_at":"2026-10-27T00:00:00.000Z","added_at":"2026-10-27T20:09:07.638Z","updated_at":"2026-10-27T20:09:07.638Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/ghostty-1-4-0-release-notes","markdown_url":"https://listedarticles.com/articles/ghostty-1-4-0-release-notes.md","example":false,"citation":"Ghostty maintainers, Ghostty. \"Ghostty 1.4.0 Release Notes.\" 27 Oct 2026. https://ghostty.org/docs/install/release-notes/1-4-0 (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://ghostty.org/docs/install/release-notes/1-4-0"},"body_markdown":"# Ghostty 1.4.0\n\nRelease notes for Ghostty 1.4.0, released on October 27, 2026.\n\nGhostty 1.4.0 is a major release that includes large performance and\nmemory improvements, a 100% complete Kitty graphics implementation including\nanimation and relative placements (the first non-Kitty terminal to do so),\nSSH integration improvements, and hundreds more improvements and fixes\nacross all platforms.\n\nThis release features **7 months of work** with changes from\n**172 contributors** over **2,889 commits**. Thank you to all the contributors,\nmaintainers, community moderators, translators, packagers, and users\nwho each helped make this release possible.\n\nThese release notes are painstakingly and lovingly hand-crafted\nby human Ghostty maintainers, including the full changelog. They take\na combined 16+ hours to write, so please enjoy. 🥰\n\n*Ghostty is non-profit. [Support development](https://ghostty.org/docs/sponsor).*\n\n## Security\n\n- [GHSA-4hwh-wx3w-3fqg](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-4hwh-wx3w-3fqg).\n  Paste protection didn't treat carriage returns as line endings, so a\n  paste could run a command without confirmation in programs that don't\n  use bracketed paste. This requires user interaction (copy-paste) to\n  trigger.\n- [GHSA-mhff-mv4q-fp63](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mhff-mv4q-fp63).\n  Malicious Kitty graphics commands could crash or hang Ghostty, force\n  huge allocations, or in limited cases read or delete files outside the\n  allowed temporary directories. This only requires displaying malicious\n  output.\n- [GHSA-hcr9-7hcr-mjm8](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-hcr9-7hcr-mjm8).\n  Malicious terminal output could crash Ghostty, closing every window,\n  via tmux control mode. tmux doesn't need to be installed. This affects\n  Ghostty 1.3.0 and 1.3.1.\n- [GHSA-hp9c-qp4q-cpw3](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-hp9c-qp4q-cpw3).\n  The same impact as above, via a tmux control mode layout with a\n  zero-sized or oversized pane. This affects Ghostty 1.3.0 and 1.3.1.\n- [GHSA-w9q4-5jvv-mcv4](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-w9q4-5jvv-mcv4).\n  Clearing the screen into scrollback could corrupt memory if it deleted\n  the scrollback page holding a styled or hyperlinked cursor. This only\n  requires displaying malicious output, but only with a small\n  `scrollback-limit` such as `0`. The default isn't known to be affected.\n- [GHSA-2r63-vmw6-3m3c](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-2r63-vmw6-3m3c).\n  A crafted directory name could make the zsh shell integration send\n  arbitrary escape sequences, such as silently replacing the clipboard via\n  OSC 52. bash was affected in a more limited way. This only requires\n  `cd`-ing into a directory from untrusted content, such as a cloned\n  repository.\n- macOS: [GHSA-cw69-wm67-5pv8](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-cw69-wm67-5pv8).\n  Cmd-clicking a crafted OSC 8 hyperlink could open unsafe local files or\n  custom URL schemes, leading to arbitrary command execution. Ghostty now\n  blocks unsafe targets and confirms custom URL schemes. This requires\n  user interaction (cmd-click) to trigger.\n- macOS: [GHSA-mfw9-xcr3-7gfp](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mfw9-xcr3-7gfp).\n  The same issue as above for links detected by the `link` configuration,\n  including the default URL matcher. This requires user interaction\n  (cmd-click) to trigger.\n- macOS: [GHSA-v8cw-fg4j-jcc4](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-v8cw-fg4j-jcc4).\n  Drag-and-drop text skipped paste protection, with the same impact as\n  above. This requires user interaction (drag-and-drop) to trigger.\n- macOS: [GHSA-mxqx-236q-wrv7](https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mxqx-236q-wrv7).\n  Opening a file whose name contains control characters could run a\n  different command than the one shown in the confirmation dialog. This\n  requires a crafted file on your system and confirming the dialog.\n\nNote: I requested CVEs for the above advisories weeks ago, but GitHub\nhasn't assigned them yet. If/when they're assigned, I will update the\nabove with proper CVE numbers.\n\n## Highlights\n\n### macOS 27 Support\n\nPRs: [#12999](https://github.com/ghostty-org/ghostty/issues/12999)  [#13069](https://github.com/ghostty-org/ghostty/issues/13069)  [#13393](https://github.com/ghostty-org/ghostty/issues/13393)  [#14413](https://github.com/ghostty-org/ghostty/issues/14413)  [#14414](https://github.com/ghostty-org/ghostty/issues/14414)\n\nGhostty 1.4 supports macOS 27 (Golden Gate). Most of the work was\ncompatibility fixes:\n\n- Tabs in the titlebar (`macos-titlebar-style = tabs`) lay out correctly\n  again.\n- The native tab bar no longer draws as a solid gray bar on top of your\n  theme. It now lets the new glass style blend with your terminal\n  background.\n- `macos-titlebar-style = hidden` no longer covers the top lines of the\n  terminal when Reduce Transparency is on.\n- The app icon no longer has a thin border.\n- The Shortcuts \"New Window\" action no longer opens two windows when\n  Ghostty is running without any windows.\n\nGhostty 1.4 remains fully compatible with prior macOS versions back to\nand including macOS 13 (Ventura). See the\n[system requirements](#system-requirements) for more details.\n\n> Note\n>\n> Ghostty 1.3.1 works on macOS 27, but it has some of the visual issues\n> listed above, such as the gray tab bar.\n\n### Kitty Graphics Animation and Relative Placements\n\nPRs: [#13943](https://github.com/ghostty-org/ghostty/issues/13943)  [#13939](https://github.com/ghostty-org/ghostty/issues/13939)  [#13935](https://github.com/ghostty-org/ghostty/issues/13935)  [#13934](https://github.com/ghostty-org/ghostty/issues/13934)  [#13893](https://github.com/ghostty-org/ghostty/issues/13893)  [#13933](https://github.com/ghostty-org/ghostty/issues/13933)  [#13389](https://github.com/ghostty-org/ghostty/issues/13389) \n[#13270](https://github.com/ghostty-org/ghostty/issues/13270)  [#13281](https://github.com/ghostty-org/ghostty/issues/13281)\n\nGhostty now supports Kitty graphics\n[animation](https://sw.kovidgoyal.net/kitty/graphics-protocol/#animation)\nand [relative placements](https://sw.kovidgoyal.net/kitty/graphics-protocol/#relative-placements).\nThese were the last major features of the Kitty graphics protocol that\nGhostty didn't support.\n\nPrograms that display animated images with the Kitty protocol, such as an\nanimated GIF shown with `kitten icat`, now animate in Ghostty instead of\nshowing a single still frame. Frame transmission, composition, and playback\ncontrol are all supported, and animations pause while the terminal isn't\nvisible. Relative placements let a program position one image relative to\nanother image's placement, so the child image moves along with its parent.\n\nWe also did a full conformance pass against the specification and Kitty\nitself, fixing dozens of behavioral differences. For example, images now\nscroll with text inside scroll regions ([#4323](https://github.com/ghostty-org/ghostty/issues/4323) ), retransmitting an image\nID replaces the old image ([#6711](https://github.com/ghostty-org/ghostty/issues/6711) ), and invalid image data now gets an\nerror response instead of silence, which could leave clients hanging. The\nfull list is in the [terminal capabilities](#terminal-capabilities) section.\n\nKitty graphics are faster, too. Image payloads are now parsed in bulk\nwith SIMD instead of one byte at a time, making large image transfers\n**about 16x faster** to parse in our benchmarks (64 MiB of image data,\nx86\\_64 Linux), and drawing images costs much less per frame.\n\nOur Kitty graphics implementation now covers 100% of the published\nspecification, making Ghostty (and libghostty) the first terminal\nto do this outside of Kitty itself.\n\n### Scrollback Compression and Lower Memory Usage\n\nPRs: [#13264](https://github.com/ghostty-org/ghostty/issues/13264)  [#13473](https://github.com/ghostty-org/ghostty/issues/13473)  [#13240](https://github.com/ghostty-org/ghostty/issues/13240)  [#13245](https://github.com/ghostty-org/ghostty/issues/13245)  [#14130](https://github.com/ghostty-org/ghostty/issues/14130)  [#14137](https://github.com/ghostty-org/ghostty/issues/14137)  [#14138](https://github.com/ghostty-org/ghostty/issues/14138) \n[#14017](https://github.com/ghostty-org/ghostty/issues/14017)\n\nGhostty now transparently compresses scrollback that isn't visible,\nreducing the physical memory those pages use by **70% to 90%** for typical\ntext-heavy history. Compression only runs while the terminal is idle and\npages are decompressed on demand when you scroll back or search, so it\nhas no measurable impact on I/O throughput.\n\nThanks to compression, **the default scrollback limit has been raised from\n10 MB to 50 MB** per terminal. On platforms that support compression, a\nfull scrollback still generally uses less physical memory than the old\n10 MB limit did.\n\n> Note\n>\n> Compression lowers *resident* (physical) memory, not *virtual* memory, so\n> look at resident memory when measuring it. It is currently available on\n> macOS and 64-bit Linux.\n\nBeyond scrollback, memory usage is lower in many places:\n\n- A new, empty terminal now uses about **16 KiB** of terminal page memory\n  on macOS, down from 128 KiB in Ghostty 1.3.1.\n- On macOS and Linux, memory freed by clearing or trimming scrollback is\n  now returned to the OS instead of being held until the terminal closes.\n- Hidden tabs release their GPU resources. On macOS, with one visible tab\n  and 20 hidden tabs, GPU memory dropped from about 385 MiB to 18 MiB.\n  Rebuilding them when a tab becomes visible again takes under a\n  millisecond.\n\n### Performance Improvements\n\nPRs: [#13209](https://github.com/ghostty-org/ghostty/issues/13209)  [#13220](https://github.com/ghostty-org/ghostty/issues/13220)  [#13226](https://github.com/ghostty-org/ghostty/issues/13226)  [#13227](https://github.com/ghostty-org/ghostty/issues/13227)  [#13537](https://github.com/ghostty-org/ghostty/issues/13537)  [#13827](https://github.com/ghostty-org/ghostty/issues/13827)  [#13587](https://github.com/ghostty-org/ghostty/issues/13587) \n[#14011](https://github.com/ghostty-org/ghostty/issues/14011)  [#13722](https://github.com/ghostty-org/ghostty/issues/13722)  [#14035](https://github.com/ghostty-org/ghostty/issues/14035)  [#12760](https://github.com/ghostty-org/ghostty/issues/12760)\n\nThere are performance improvements across the board in Ghostty 1.4\nthat yield significant gains compared to prior Ghostty versions.\n\nThe biggest win came from a surprising discovery: on macOS, the kernel\ncaps every read from a pty at about 1 KiB no matter how large the read\nbuffer is. Previously, Ghostty processed each read as it arrived, so per-read\noverhead was paid every kilobyte, and the program writing output sat\nblocked while we parsed. Ghostty now drains the pty on one thread while\nparsing on another, raising end-to-end I/O throughput by **25% to 55%**\non macOS (M4 Max, plain and Unicode text) over Ghostty 1.3.x.\n\nVT processing itself is also much faster. In parser benchmarks, plain\nASCII text went from 128 MB/s to 725 MB/s (5.7x), CJK text got 3.4x\nfaster, and a 2.6 GB dataset of real-world terminal recordings\nfrom [asciinema](https://asciinema.org/) is processed about 25% faster.\nTogether, these changes took `cat`-ing a 150 MB text file on macOS from\n1.5 seconds to 566 milliseconds.\n\nOther notable improvements:\n\n- **Resize:** resizing a terminal with a large scrollback is about **6x\n  faster** (120x80 with 10,000 lines of scrollback), and 3x to 5x faster\n  with history full of CJK text or emoji.\n- **Rendering:** the renderer holds the terminal lock **2.7x to 11x**\n  less per frame, leaving more time for the I/O thread during heavy\n  output.\n- **Copy and search:** formatting terminal contents as plain text, HTML,\n  or VT, which backs clipboard copy, `write_screen_file`, and scrollback\n  search, is 1.5x to 8x faster.\n- **Launch (macOS):** about 15% faster from launch to visible window, and\n  27% faster to the first rendered frame.\n- **Idle energy:** on macOS, the renderer's display link now sleeps when\n  there's nothing to draw. On GTK, hidden tabs stop rendering, matching\n  macOS.\n- **Large OSC sequences:** OSC 52 clipboard payloads parse about **30x\n  faster**, and even short sequences like title changes are about 6x\n  faster.\n\n### New OpenGL Renderer (Linux, FreeBSD)\n\nPRs: [#14052](https://github.com/ghostty-org/ghostty/issues/14052)  [#14269](https://github.com/ghostty-org/ghostty/issues/14269)\n\nThe GTK app has a new rendering pipeline. It no longer uses `GtkGLArea`.\nInstead, the renderer draws with EGL on its own thread, exports each frame\nas a DMABUF, and hands it to GTK to display. Rendering is now\ntriple-buffered, which should greatly reduce tearing, and no OpenGL calls\nrun on the main thread anymore, which let us remove a number of\nworkarounds.\n\nThe most visible result is crisp text under fractional scaling. Text and\nbox-drawing characters are no longer blurry with fractional display\nscaling such as 125% or 150% ([#1938](https://github.com/ghostty-org/ghostty/issues/1938) ). We fixed this once before, but it\ncame back after upstream GTK changes. Ghostty now renders at the window's\ntrue fractional scale, so every rendered pixel maps to exactly one pixel\non screen.\n\nThe new render surface needs a system EGL library (see\n[Changes for Package Maintainers](#changes-for-package-maintainers)).\nOn GPU drivers that can't export DMABUFs, Ghostty falls back to copying\nframes through the CPU, which is slower but works.\n\n### Kitty Clipboard Protocol\n\nPRs: [#13962](https://github.com/ghostty-org/ghostty/issues/13962)  [#13993](https://github.com/ghostty-org/ghostty/issues/13993)  [#13995](https://github.com/ghostty-org/ghostty/issues/13995)  [#13998](https://github.com/ghostty-org/ghostty/issues/13998)  [#14002](https://github.com/ghostty-org/ghostty/issues/14002)  [#14061](https://github.com/ghostty-org/ghostty/issues/14061)\n\nGhostty now implements the\n[Kitty clipboard protocol](https://sw.kovidgoyal.net/kitty/clipboard/)\n(OSC 5522) on both macOS and GTK. Ghostty 1.3 could parse the protocol\nbut didn't implement it.\n\nOSC 52 can only read and write plain text. The Kitty clipboard protocol\nlets programs running in the terminal read and write any kind of clipboard\ndata, such as images or HTML, and lets them pick among the formats on the\nclipboard. Programs can also enable paste events (mode 5522), which tell\nthe program what formats a paste contains so it can read the one it\nwants. This is how a terminal program can accept a pasted image, for\nexample.\n\nClipboard access follows the existing `clipboard-read` and\n`clipboard-write` configurations. By default, reads prompt for permission\nand writes are allowed. The permission prompt shows a preview of the\nclipboard contents, including images. Programs that send a password can\nhave your answer remembered for the rest of that terminal session. A new\n`clipboard-write-limit-bytes` configuration limits the size of a single\nwrite (default 64 MiB). A write over the limit fails and leaves the\nclipboard untouched.\n\n### Split Drag and Drop (GTK)\n\nPRs: [#10423](https://github.com/ghostty-org/ghostty/issues/10423)  [#13706](https://github.com/ghostty-org/ghostty/issues/13706)\n\nYou can now rearrange splits on GTK by dragging them, matching the macOS\nfeature introduced in Ghostty 1.3. When a tab has two or more splits, each\nsplit shows a drag handle at the top. Grab the handle and drop the split\nonto any other split, including splits in other tabs and windows. An\noverlay shows which side of the target split it will land on. The terminal\ncontents, working directory, and running processes all move with it.\n\nA new `drag-handle` configuration controls when drag handles are shown on\nboth macOS and GTK: `auto` (default), `always`, or `never`. With `never`,\nsplits can't be rearranged with the mouse. Hiding the handles was a\ncommon request from users who found them in the way.\n\nOn GTK, splits can only be dropped onto other splits. Dragging a split out\nto create a new tab or window is macOS-only.\n\n### Terminal Emulation Accuracy\n\nPRs: [#14454](https://github.com/ghostty-org/ghostty/issues/14454)  [#13494](https://github.com/ghostty-org/ghostty/issues/13494)  [#14483](https://github.com/ghostty-org/ghostty/issues/14483)  [#14538](https://github.com/ghostty-org/ghostty/issues/14538)  [#14673](https://github.com/ghostty-org/ghostty/issues/14673)  [#14375](https://github.com/ghostty-org/ghostty/issues/14375)  [#14144](https://github.com/ghostty-org/ghostty/issues/14144)\n\nGhostty 1.4 includes dozens of improvements to core terminal emulation. We\nnow run [esctest](https://github.com/ThomasDickey/esctest2), Thomas Dickey's\nterminal conformance suite, against Ghostty's terminal core in CI.\nAlongside that, we fixed many differences from xterm in cursor movement\nwithin margins, tab stops, character sets, mode reports, and more. You\ncan find the full list of related changes in the\n[terminal capabilities](#terminal-capabilities) section.\n\nGhostty also supports several new sequences, including soft terminal reset\n(DECSTR), extended cursor position reports (DECXCPR), backarrow key mode\n(DECBKM), and screen size reports in characters (`CSI 19 t`). Programs can\nalso now ask whether the terminal is visible using\n[visibility reports](https://rockorager.dev/misc/visibility-reports/)\n(mode 2033), so they can stop rendering while hidden.\n\nKeyboard encoding also matches xterm more closely, with fixes for\n`modifyOtherKeys` mode 2 and legacy Alt-as-Escape encoding of non-ASCII\nkeys.\n\nTwo new sequences are disabled by default because they can be abused by\nuntrusted programs, including ones running on a remote machine:\n\n```\n# Allow programs to resize the window (CSI 8 t)\nvt-window-resize-allowed = true\n\n# Allow programs to request screen checksums (DECRQCRA)\nvt-xt-checksum-report = true\n```\n\n### SSH Integration with `ghostty +ssh`\n\nPRs: [#12582](https://github.com/ghostty-org/ghostty/issues/12582)  [#12814](https://github.com/ghostty-org/ghostty/issues/12814)  [#13533](https://github.com/ghostty-org/ghostty/issues/13533)  [#13844](https://github.com/ghostty-org/ghostty/issues/13844)  [#14472](https://github.com/ghostty-org/ghostty/issues/14472)  [#14854](https://github.com/ghostty-org/ghostty/issues/14854)\n\nGhostty 1.2 introduced [SSH shell integration features](https://ghostty.org/docs/features/ssh)\nas a work in progress. In Ghostty 1.4, they're backed by a new\n`ghostty +ssh` CLI action: a drop-in `ssh` wrapper that prepares the\nremote session for Ghostty and then runs the real `ssh` with your\narguments forwarded unchanged.\n\n```\nghostty +ssh user@example.com\n\n# Or alias it so every ssh invocation goes through it\nalias ssh='ghostty +ssh --'\n```\n\nBefore connecting, `+ssh` installs Ghostty's terminfo on the remote host\nso the proper `xterm-ghostty` `TERM` value can be used, and forwards\n`COLORTERM`, `TERM_PROGRAM`, and `TERM_PROGRAM_VERSION`. If the terminfo\ninstall fails (for example, `tic` isn't available on the remote), it falls\nback to `TERM=xterm-256color`. Flags such as `--terminfo=false`,\n`--forward-env=false`, and `--verbose` control each step.\n\nThe `ssh-env` and `ssh-terminfo` shell integration features (still opt-in)\nnow call `+ssh` too. Previously, each shell integration carried its own copy\nof this logic, which made up roughly a third of our shell integration\nscripts. Now bash, zsh, fish, elvish, and Nushell all behave identically,\nand you can get the same behavior from scripts or anywhere else by calling\n`ghostty +ssh` directly.\n\nThe terminfo install itself is also more reliable. Ghostty now always\ninstalls its own bundled terminfo rather than accepting whatever\n`xterm-ghostty` entry the remote already has, and it reinstalls\nautomatically when a Ghostty update changes the terminfo. It also no longer\nneeds `infocmp` or Ghostty's terminfo on the local machine. Installs are\ncached per host *and* port, so two machines behind one address no longer\nshare a cache entry. And `ssh-env` no longer silently overrides `SetEnv`\nentries in your `~/.ssh/config` ([#11518](https://github.com/ghostty-org/ghostty/issues/11518) ).\n\nThe `+ssh-cache` command that manages this cache now takes positional\ndestinations (`ghostty +ssh-cache user@example.com`) and has a new\n`--prune=30d` flag. See the [breaking changes](#breaking-changes) if you\nscript against `+ssh-cache`.\n\n## System Requirements\n\n**macOS:** The minimum required macOS version for Ghostty 1.4 remains\nunchanged (macOS 13 Ventura). Ghostty is now compatible with macOS 27.\n\n**GTK:** Ghostty 1.4 requires **GTK 4.18** and **libadwaita 1.7**, up from\nGTK 4.14 and libadwaita 1.5 in Ghostty 1.3. This aligns with our\n[GTK/Adwaita version policy](https://ghostty.org/docs/linux/#supported-gtkadwaita-versions).\nNotably, Ubuntu 24.04 LTS doesn't meet this requirement. Systems with\nolder GTK or Adwaita versions can work around this requirement by using an\nolder version of Ghostty or the Flatpak package. [#14330](https://github.com/ghostty-org/ghostty/issues/14330)\n\n**OpenGL (GTK):** The minimum required OpenGL version remains 4.3, but\nGhostty now renders through EGL instead of GTK's OpenGL widget. This\nshould be invisible for nearly everyone, but if Ghostty fails to start\nwith an EGL error, please make sure your GPU driver provides a working\nEGL implementation.\n\n> Important\n>\n> We previously announced that Ghostty 1.4 would require macOS 14.\n> Nothing forced our hand to do this in this release, so we kept macOS\n> 13 support. **We still plan to drop macOS 13 in a future release.** Apple\n> dropped security support for macOS 13 in the fall of 2025, so we\n> recommend upgrading regardless.\n\n## Breaking Changes\n\nThe following behaviors have changed in 1.4.0:\n\n- `copy-on-select` has been reworked and now accepts `none`, `primary`,\n  `clipboard`, or `both`. **The meaning of `clipboard` has changed:** it\n  previously copied to both the selection clipboard and the system\n  clipboard, and now copies only to the system clipboard. If you set\n  `copy-on-select = clipboard` and want the old behavior, change it to\n  `both`. [#12600](https://github.com/ghostty-org/ghostty/issues/12600)  [#12604](https://github.com/ghostty-org/ghostty/issues/12604)\n- macOS: `copy-on-select` now defaults to `none` (previously `true`), so\n  selecting text no longer copies it anywhere and middle-click paste of the\n  selection no longer works by default. To restore the 1.3 behavior, set\n  `copy-on-select = primary`. Note that an explicit `copy-on-select = true`\n  on macOS now copies selections to the system clipboard, which is\n  different from 1.3. [#12600](https://github.com/ghostty-org/ghostty/issues/12600)  [#12604](https://github.com/ghostty-org/ghostty/issues/12604)\n- macOS: `cmd+arrow_up` and `cmd+arrow_down` now run `jump_to_prompt` again,\n  matching Terminal.app and Ghostty 1.2. In 1.3, these keys were hardcoded\n  to scroll to the top and bottom and couldn't be rebound. To keep the 1.3\n  behavior, set `keybind = cmd+arrow_up=scroll_to_top` and\n  `keybind = cmd+arrow_down=scroll_to_bottom`. [#12245](https://github.com/ghostty-org/ghostty/issues/12245)\n- GTK: The default `ctrl+shift+page_up` and `ctrl+shift+page_down` keybinds\n  now move the current tab left and right (`move_tab`), matching Firefox,\n  GNOME Terminal, and VS Code. `jump_to_prompt` moved to\n  `ctrl+shift+arrow_up` and `ctrl+shift+arrow_down`, so programs running in\n  the terminal no longer receive those keys. If a program you use needs\n  them, unbind them with `keybind = ctrl+shift+arrow_up=unbind` and\n  `keybind = ctrl+shift+arrow_down=unbind`. [#4998](https://github.com/ghostty-org/ghostty/issues/4998)  [#12458](https://github.com/ghostty-org/ghostty/issues/12458)\n\n### Deprecations\n\nThe list below contains deprecations that remain compatible today through\na compatibility layer, but may break in a future release if they are\nignored:\n\n- `scrollback-limit` has been renamed to `scrollback-limit-bytes`, to make\n  room for the new `scrollback-limit-lines`. [#13473](https://github.com/ghostty-org/ghostty/issues/13473)\n- `copy-on-select = true` is replaced with `copy-on-select = primary` on\n  Linux and FreeBSD, or `copy-on-select = clipboard` on macOS.\n  `copy-on-select = false` is replaced with `copy-on-select = none`.\n  [#12600](https://github.com/ghostty-org/ghostty/issues/12600)  [#12604](https://github.com/ghostty-org/ghostty/issues/12604)\n\nThere is no set timeline to remove these deprecations, but we recommend\nadapting to the new configurations sooner rather than later to avoid\nany possible disruptions in the future.\n\n## Full Changelog\n\n- Scrollback history is now transparently compressed while the terminal\n  is idle, reducing the physical memory used by compressed scrollback by\n  70% to 90% for typical text. Compression is available on macOS and 64-bit\n  Linux and can be disabled with the new `scrollback-compression`\n  configuration. Because of this, the default scrollback limit has been\n  raised from 10 MB to 50 MB, which on average still uses less memory than\n  a full scrollback did previously. [#13264](https://github.com/ghostty-org/ghostty/issues/13264)\n- A new configuration `scrollback-limit-lines` limits scrollback by number\n  of lines instead of bytes. The existing `scrollback-limit` configuration\n  has been renamed to `scrollback-limit-bytes` (the old name continues to\n  work). If both are set, the first limit reached applies, and both accept\n  `unlimited`. [#13473](https://github.com/ghostty-org/ghostty/issues/13473)\n- `copy-on-select` now accepts `none`, `primary`, `clipboard`, and `both`\n  and no longer affects middle-click paste (see `middle-click-action`).\n  `clipboard` now copies only to the system clipboard, so use `both` for the\n  previous behavior. The default on macOS is now `none`. See the\n  [breaking changes](#breaking-changes) for migration details. [#12600](https://github.com/ghostty-org/ghostty/issues/12600)\n- A new configuration `middle-click-action` configures the behavior of\n  middle-clicking: `primary-paste` (default) pastes from the selection\n  clipboard, `clipboard-paste` pastes from the system clipboard, and\n  `ignore` does nothing. [#12478](https://github.com/ghostty-org/ghostty/issues/12478)\n- A new binding action `move_tab_to_new_window` moves the current tab into\n  a new window of its own. It is also available in the command palette.\n  [#2630](https://github.com/ghostty-org/ghostty/issues/2630)\n- A new CLI command `+explain-config` prints the documentation for a\n  configuration option or binding action, e.g.\n  `ghostty +explain-config font-size`. [#11546](https://github.com/ghostty-org/ghostty/issues/11546)\n- The `+explain-config` and `+show-config` CLI commands now page their\n  output through `$GHOSTTY_PAGER` or `$PAGER` (falling back to `less`) when\n  run interactively. Paging can be disabled with `--no-pager` or by setting\n  the pager to an empty value. [#11940](https://github.com/ghostty-org/ghostty/issues/11940)\n- A new configuration `drag-handle` controls when the split drag handles\n  are shown: `auto` (default), `always`, or `never`. [#13706](https://github.com/ghostty-org/ghostty/issues/13706)  [#13709](https://github.com/ghostty-org/ghostty/issues/13709)\n- Scrollback search now wraps around when navigating past the first or\n  last match. [#11449](https://github.com/ghostty-org/ghostty/issues/11449)\n- A new configuration `link-osc8` (default `true`) can be set to `false` to\n  disable OSC 8 hyperlinks entirely. Disabled OSC 8 hyperlinks are not\n  highlighted, previewed, copied, or opened. [#13634](https://github.com/ghostty-org/ghostty/issues/13634)\n- Processes running in Ghostty now receive a `GHOSTTY_SURFACE_ID`\n  environment variable that uniquely identifies the terminal they are\n  running in. [#12027](https://github.com/ghostty-org/ghostty/issues/12027)\n- The right-click context menu now has a \"Close Split\" item. [#11173](https://github.com/ghostty-org/ghostty/issues/11173) \n  [#11174](https://github.com/ghostty-org/ghostty/issues/11174)\n- Upgrade to Unicode 18. [#14293](https://github.com/ghostty-org/ghostty/issues/14293)\n- I/O throughput is 25% to 55% higher on macOS by reading from the pty\n  concurrently with parsing previously read output. [#13209](https://github.com/ghostty-org/ghostty/issues/13209)\n- VT processing is significantly faster across the board. Plain text is up\n  to ~6x faster, real-world output (measured against a large asciinema\n  dataset) is ~24% faster, grapheme-heavy output is ~3x faster, and DEC\n  special graphics (line drawing), repeated characters (`REP`),\n  hyperlink-heavy output, and scroll regions are all faster. [#13220](https://github.com/ghostty-org/ghostty/issues/13220) \n  [#13226](https://github.com/ghostty-org/ghostty/issues/13226)  [#13231](https://github.com/ghostty-org/ghostty/issues/13231)  [#13294](https://github.com/ghostty-org/ghostty/issues/13294)  [#13625](https://github.com/ghostty-org/ghostty/issues/13625)  [#13826](https://github.com/ghostty-org/ghostty/issues/13826)  [#14356](https://github.com/ghostty-org/ghostty/issues/14356)\n- Large OSC sequences, such as OSC 52 clipboard writes, are parsed ~30x\n  faster and small OSC sequences, such as title changes, ~6x faster.\n  [#14011](https://github.com/ghostty-org/ghostty/issues/14011)  [#13565](https://github.com/ghostty-org/ghostty/issues/13565)\n- Resizing with reflow is ~6x faster with large scrollback and 3x to 5x\n  faster with scrollback heavy in wide characters such as CJK or emoji.\n  [#13537](https://github.com/ghostty-org/ghostty/issues/13537)  [#13827](https://github.com/ghostty-org/ghostty/issues/13827)\n- Terminals use significantly less memory. A new terminal now uses ~16 KiB\n  of physical memory for its screen instead of 128 KiB on macOS, every\n  terminal page uses 30% less memory, and memory freed from scrollback\n  (such as by clearing it) is now returned to the operating system.\n  [#13240](https://github.com/ghostty-org/ghostty/issues/13240)  [#13245](https://github.com/ghostty-org/ghostty/issues/13245)  [#14130](https://github.com/ghostty-org/ghostty/issues/14130)  [#14137](https://github.com/ghostty-org/ghostty/issues/14137)  [#14138](https://github.com/ghostty-org/ghostty/issues/14138)\n- Kitty graphics are faster. Large image transfers are parsed in bulk using\n  SIMD, zlib-compressed images decompress ~17% faster, pixel format\n  conversion avoids an extra copy, and the per-frame cost of drawing images\n  is much lower, especially with Unicode placeholder images on screen or\n  long scrollback. [#13270](https://github.com/ghostty-org/ghostty/issues/13270)  [#13281](https://github.com/ghostty-org/ghostty/issues/13281)  [#13987](https://github.com/ghostty-org/ghostty/issues/13987)  [#14422](https://github.com/ghostty-org/ghostty/issues/14422)  [#14780](https://github.com/ghostty-org/ghostty/issues/14780)  [#14789](https://github.com/ghostty-org/ghostty/issues/14789)\n- Formatting terminal contents is 1.5x to 8x faster, which speeds up\n  clipboard copy (plain, HTML, and VT), `write_screen_file` and related\n  actions, and scrollback search. [#13587](https://github.com/ghostty-org/ghostty/issues/13587)\n- The renderer holds the terminal lock 2.7x to 11x less time per frame,\n  and glyph and font lookups are faster. [#13227](https://github.com/ghostty-org/ghostty/issues/13227)  [#14300](https://github.com/ghostty-org/ghostty/issues/14300)  [#14301](https://github.com/ghostty-org/ghostty/issues/14301)  [#14420](https://github.com/ghostty-org/ghostty/issues/14420) \n  [#14406](https://github.com/ghostty-org/ghostty/issues/14406)  [#13258](https://github.com/ghostty-org/ghostty/issues/13258)\n- `command-palette-entry = clear` removes all command palette entries,\n  including the default entries. [#12682](https://github.com/ghostty-org/ghostty/issues/12682)\n- `window-padding-balance` has a new value `equal` that balances padding\n  equally on all four sides without capping the top padding. [#11491](https://github.com/ghostty-org/ghostty/issues/11491)\n- `theme` now expands `~` to the home directory in theme file paths,\n  including in separate light and dark themes. [#13840](https://github.com/ghostty-org/ghostty/issues/13840)\n- `+list-themes` now supports `g` and `G` to jump to the first and\n  last theme, and `ctrl+d` and `ctrl+u` to page down and up. [#13681](https://github.com/ghostty-org/ghostty/issues/13681) \n  [#14607](https://github.com/ghostty-org/ghostty/issues/14607)\n- The terminal inspector can now copy terminal I/O events or export them\n  to a file. [#13519](https://github.com/ghostty-org/ghostty/issues/13519)\n- Bundled themes updated to [release-20261019-151001-86a776d](https://github.com/mbadolato/iTerm2-Color-Schemes/releases/tag/release-20261019-151001-86a776d).\n  This adds 356 new themes and renames or removes none. The colors of 10\n  existing themes changed upstream: Adwaita, Adwaita Dark, Atom One Light,\n  Catppuccin Frappe, Catppuccin Latte, Catppuccin Macchiato, Catppuccin\n  Mocha, Cursor Dark, Dark Modern, and Electron Highlighter.\n- Fix configuration parsing silently ignoring all settings after a comment\n  or blank line that happened to end at an internal buffer boundary. This\n  typically only affected long configuration files. [#13638](https://github.com/ghostty-org/ghostty/issues/13638)\n- Fix a performance degradation where, after a long uptime, the renderer\n  rebuilt its full terminal state on every frame. [#13585](https://github.com/ghostty-org/ghostty/issues/13585)\n- Fix the automatically created configuration file being empty instead of\n  containing the configuration template. [#13774](https://github.com/ghostty-org/ghostty/issues/13774)\n- `+edit-config` works when `$EDITOR` or `$VISUAL` contains arguments,\n  such as `zed --new`. [#11897](https://github.com/ghostty-org/ghostty/issues/11897)\n- `adjust-cursor-height` works again. [#13225](https://github.com/ghostty-org/ghostty/issues/13225)\n- Mouse selection improvements: dragging after a `ctrl`/`cmd` triple-click\n  output selection now extends the selection by command output, autoscroll\n  stops when the screen switches (e.g. to the alternate screen), a force\n  touch on macOS selects the word at the press location without starting a\n  drag, and releasing a drag no longer activates a link or prompt click.\n  [#12830](https://github.com/ghostty-org/ghostty/issues/12830)\n- Double-click word selection no longer continues across hard line breaks,\n  and double-clicking either half of a wide character (such as CJK) selects\n  the whole word. [#14354](https://github.com/ghostty-org/ghostty/issues/14354)  [#14391](https://github.com/ghostty-org/ghostty/issues/14391)\n- Wide characters at the edges of a selection are now consistently rendered\n  as selected and included when copying, including when the wide character\n  wraps onto a new internal page. [#14632](https://github.com/ghostty-org/ghostty/issues/14632)  [#14651](https://github.com/ghostty-org/ghostty/issues/14651)\n- Triple-click line selection no longer pulls in neighboring prompt text\n  when clicking blank cells between OSC 133 prompt boundaries. [#14553](https://github.com/ghostty-org/ghostty/issues/14553)\n- Link detection and double-click selection no longer merge prompt text\n  with the command text next to it when shell integration is active.\n  [#12435](https://github.com/ghostty-org/ghostty/issues/12435)\n- File paths opened with `cmd`/`ctrl`-click no longer include trailing\n  spaces, which broke opening paths printed by some TUIs. [#13505](https://github.com/ghostty-org/ghostty/issues/13505)\n- Mouse releases are now reported to the program that received the mouse\n  press when clicking at a shell prompt with click-to-move enabled. This\n  fixes double-click selection in programs like fzf's `ctrl+r` history\n  search. [#14710](https://github.com/ghostty-org/ghostty/issues/14710)\n- Shell redraws after a resize are no longer processed at the old terminal\n  size. This fixes one cause of duplicated or misplaced prompts after\n  resizing. [#14706](https://github.com/ghostty-org/ghostty/issues/14706)\n- Scrolling, such as clicking in the scrollbar, now works with very large\n  scrollback (millions of lines). [#13048](https://github.com/ghostty-org/ghostty/issues/13048)\n- Custom `command-palette-entry` actions with string parameters, such as\n  `set_tab_title`, no longer have their parameters escaped when run from\n  the command palette. [#13609](https://github.com/ghostty-org/ghostty/issues/13609)\n- HTML clipboard copies no longer include a superfluous trailing newline.\n  [#13543](https://github.com/ghostty-org/ghostty/issues/13543)\n- Copying as VT (`copy_to_clipboard:vt`) and VT screen files now preserve\n  OSC 8 hyperlinks, empty gaps between text, and cells that only have\n  a background color, such as colored status bars. VT screen files also\n  keep trailing blank rows. [#14711](https://github.com/ghostty-org/ghostty/issues/14711)  [#14725](https://github.com/ghostty-org/ghostty/issues/14725)  [#14766](https://github.com/ghostty-org/ghostty/issues/14766)\n- The mouse pointer now restores the shape set by the running program\n  (OSC 22) after releasing modifier keys instead of resetting to the\n  default. [#14128](https://github.com/ghostty-org/ghostty/issues/14128)\n- Custom shaders no longer receive swapped selection foreground and\n  background color uniforms. [#14460](https://github.com/ghostty-org/ghostty/issues/14460)\n- Ghostty no longer floods the logs with \"adjusting page capacity\"\n  messages during output with many styles, graphemes, or hyperlinks.\n  [#14631](https://github.com/ghostty-org/ghostty/issues/14631)\n- Fix stale wrap and prompt state on rows reused after scrolling or\n  erasing, which could cause incorrect copy, search, selection, and reflow\n  results. [#14010](https://github.com/ghostty-org/ghostty/issues/14010)\n- Fix stale rendering of the previous row after erasing or deleting a\n  wrapped wide character. [#14054](https://github.com/ghostty-org/ghostty/issues/14054)\n- Fix a freeze when reloading the configuration while a program is flooding\n  the terminal with queries, such as color queries. [#14833](https://github.com/ghostty-org/ghostty/issues/14833)\n- `+list-themes` no longer crashes on some keys when the search\n  matches no themes, and the keypad down key now moves one row instead of\n  21. [#14612](https://github.com/ghostty-org/ghostty/issues/14612)  [#14605](https://github.com/ghostty-org/ghostty/issues/14605)\n- Fix crashes in scrollback search after clearing the scrollback, resizing,\n  or erasing history. [#11957](https://github.com/ghostty-org/ghostty/issues/11957)  [#13274](https://github.com/ghostty-org/ghostty/issues/13274)  [#13282](https://github.com/ghostty-org/ghostty/issues/13282)\n- Fix crashes and viewport corruption when resizing with scrolled-back\n  history or with the cursor near the bottom of the screen. [#12300](https://github.com/ghostty-org/ghostty/issues/12300) \n  [#12907](https://github.com/ghostty-org/ghostty/issues/12907)  [#12935](https://github.com/ghostty-org/ghostty/issues/12935)\n- Fix a use-after-free crash when clicking or selecting text during heavy\n  output. [#12463](https://github.com/ghostty-org/ghostty/issues/12463)\n- Fix a possible crash when reflowing hyperlinks during a resize. [#13524](https://github.com/ghostty-org/ghostty/issues/13524)\n- Fix possible crashes or memory corruption when scrolling or erasing rows\n  across a page boundary that needed more capacity. [#13394](https://github.com/ghostty-org/ghostty/issues/13394)  [#13397](https://github.com/ghostty-org/ghostty/issues/13397)\n- Fix possible crashes and memory corruption found via fuzzing when\n  printing causes a page to grow, or after clearing the screen into\n  scrollback. [#11261](https://github.com/ghostty-org/ghostty/issues/11261)  [#13997](https://github.com/ghostty-org/ghostty/issues/13997)\n- Fix many latent crashes and undefined behavior in selection, pins,\n  search, title and working directory updates, and resize error handling.\n  [#12894](https://github.com/ghostty-org/ghostty/issues/12894)  [#13275](https://github.com/ghostty-org/ghostty/issues/13275)  [#13278](https://github.com/ghostty-org/ghostty/issues/13278)  [#13367](https://github.com/ghostty-org/ghostty/issues/13367)\n- Fix a possible crash or corrupted input when many pty writes are queued,\n  such as during large pastes. [#13659](https://github.com/ghostty-org/ghostty/issues/13659)\n- Fix an out-of-bounds access when IME preedit text with wide characters\n  is composed between existing wide characters, such as with Korean input.\n  [#12479](https://github.com/ghostty-org/ghostty/issues/12479)\n- Fix a crash when pressing or releasing mouse button 11. [#14759](https://github.com/ghostty-org/ghostty/issues/14759)\n- Fix the `write_screen_file`, `write_scrollback_file`, and\n  `write_selection_file` actions leaking two file descriptors on each use,\n  which could eventually prevent opening new terminals. [#13644](https://github.com/ghostty-org/ghostty/issues/13644)\n- Fix memory and file descriptor leaks in terminal I/O, including for writes\n  in read-only mode and files read via the `input` configuration.\n  [#13574](https://github.com/ghostty-org/ghostty/issues/13574)  [#13579](https://github.com/ghostty-org/ghostty/issues/13579)  [#13931](https://github.com/ghostty-org/ghostty/issues/13931)\n\n### Terminal Capabilities\n\n- vt: Kitty graphics animation is now fully supported: frame transmission,\n  composition, animation control, and rendering. [#5255](https://github.com/ghostty-org/ghostty/issues/5255)  [#13943](https://github.com/ghostty-org/ghostty/issues/13943)\n- vt: Kitty graphics relative placements (`P=`, `Q=`, `H=`, `V=`) are now\n  supported, allowing images to be positioned relative to other images.\n  [#13939](https://github.com/ghostty-org/ghostty/issues/13939)\n- vt: Support the Kitty graphics transient image usage hint. Transient\n  images are evicted first when image storage is full. [#13389](https://github.com/ghostty-org/ghostty/issues/13389)\n- vt: The Kitty clipboard protocol (OSC 5522) is now implemented on macOS\n  and GTK, including paste events (mode 5522). Reads and writes follow\n  `clipboard-read` and `clipboard-write`, and a new\n  `clipboard-write-limit-bytes` configuration limits the size of a single\n  write. [#10549](https://github.com/ghostty-org/ghostty/issues/10549)  [#13962](https://github.com/ghostty-org/ghostty/issues/13962)  [#13993](https://github.com/ghostty-org/ghostty/issues/13993)  [#13995](https://github.com/ghostty-org/ghostty/issues/13995)  [#13998](https://github.com/ghostty-org/ghostty/issues/13998)  [#14002](https://github.com/ghostty-org/ghostty/issues/14002)  [#14061](https://github.com/ghostty-org/ghostty/issues/14061)\n- vt: Support visibility reports (mode 2033 and `CSI ? 998 n`), which tell\n  programs when the terminal is not visible, such as in a background tab\n  or on another workspace, so they can stop rendering. [#13494](https://github.com/ghostty-org/ghostty/issues/13494)\n- vt: Programs can resize the window with the xterm `CSI 8 ; rows ; cols t`\n  sequence if the new `vt-window-resize-allowed` configuration is enabled\n  (default off). The request is ignored in splits, windows with multiple\n  tabs, the quick terminal, and fullscreen, maximized, or tiled windows.\n  [#1115](https://github.com/ghostty-org/ghostty/issues/1115)  [#14375](https://github.com/ghostty-org/ghostty/issues/14375)\n- vt: Support OSC 133 `click_events=2`, which reports prompt clicks with\n  row coordinates relative to the prompt. [#10865](https://github.com/ghostty-org/ghostty/issues/10865)  [#12953](https://github.com/ghostty-org/ghostty/issues/12953)\n- vt: Support soft terminal reset (DECSTR, `CSI ! p`), which resets\n  modes, margins, and text attributes without clearing the screen.\n  [#14538](https://github.com/ghostty-org/ghostty/issues/14538)\n- vt: Support backarrow key mode (DECBKM, mode 67), which lets programs\n  choose whether backspace sends `DEL` (`0x7f`, the default) or `BS`\n  (`0x08`). [#12226](https://github.com/ghostty-org/ghostty/issues/12226)\n- vt: Support the DECRQCRA and XTCHECKSUM screen checksum reports, which\n  are mostly used by terminal test suites. Because a program can use these\n  to read the screen contents, they are disabled unless the new\n  `vt-xt-checksum-report` configuration is enabled. The new\n  `vt-xt-checksum-extension` configuration controls how the checksum is\n  calculated. [#14483](https://github.com/ghostty-org/ghostty/issues/14483)\n- vt: Respond to `CSI 19 t` (report screen size in characters) and to\n  DECXCPR (`CSI ? 6 n`) extended cursor position requests. [#14633](https://github.com/ghostty-org/ghostty/issues/14633) \n  [#14673](https://github.com/ghostty-org/ghostty/issues/14673)\n- vt: DECRQM now answers ANSI mode queries (`CSI Ps $ p`), reports DECECM\n  and other unimplemented ANSI modes as permanently reset like xterm, and\n  no longer truncates mode numbers above 32767 in its reply. [#12505](https://github.com/ghostty-org/ghostty/issues/12505) \n  [#14236](https://github.com/ghostty-org/ghostty/issues/14236)  [#14237](https://github.com/ghostty-org/ghostty/issues/14237)  [#14672](https://github.com/ghostty-org/ghostty/issues/14672)\n- vt: Ghostty terminfo now advertises overline support (`Smol`/`Rmol`),\n  which lets tmux pass overlines through. DECRQSS SGR replies now include\n  overline and curly, double, dotted, and dashed underline styles.\n  [#13649](https://github.com/ghostty-org/ghostty/issues/13649)  [#13653](https://github.com/ghostty-org/ghostty/issues/13653)  [#13470](https://github.com/ghostty-org/ghostty/issues/13470)\n- vt: The terminfo `Se` capability now resets the cursor to the configured\n  `cursor-style` instead of a steady block. This fixes programs like Neovim\n  leaving a block cursor behind on exit. [#12482](https://github.com/ghostty-org/ghostty/issues/12482)\n- vt: OSC payloads are now limited to 8 MiB, Kitty graphics payloads to\n  65 MiB, and each cell to 64 combining codepoints, so terminal output\n  can't easily exhaust memory. This also fixes a memory leak on invalid\n  Kitty graphics data. [#12349](https://github.com/ghostty-org/ghostty/issues/12349)  [#13633](https://github.com/ghostty-org/ghostty/issues/13633)\n- vt: Experimental support for the\n  [Glyph Protocol](https://github.com/raphamorim/rio/pull/1542)\n  (APC `25a1`), which lets programs register custom glyphs. Ghostty parses\n  and answers requests but doesn't render registered glyphs yet.\n  [#12352](https://github.com/ghostty-org/ghostty/issues/12352)  [#12930](https://github.com/ghostty-org/ghostty/issues/12930)  [#12937](https://github.com/ghostty-org/ghostty/issues/12937)\n- vt: Parse the new program status protocol (OSC 7501), which lets programs\n  report whether they are idle, working, done, blocked, or failed. This is\n  the first terminal specification pioneered by the Ghostty project.\n  libghostty can parse it all, but the Ghostty GUI ignores it for now.\n  [#14560](https://github.com/ghostty-org/ghostty/issues/14560)\n- vt: Parse (but do not implement) the Kitty desktop notification protocol\n  (OSC 99). [#10467](https://github.com/ghostty-org/ghostty/issues/10467)\n- vt: Parse (but do not implement) the Kitty drag and drop protocol\n  (OSC 72). [#13029](https://github.com/ghostty-org/ghostty/issues/13029)\n- vt: More tmux control mode fixes, including crashes that running\n  `tmux -CC` could trigger. tmux control mode is still not hooked up to\n  the GUI. [#11395](https://github.com/ghostty-org/ghostty/issues/11395)  [#11935](https://github.com/ghostty-org/ghostty/issues/11935)  [#14262](https://github.com/ghostty-org/ghostty/issues/14262)  [#14680](https://github.com/ghostty-org/ghostty/issues/14680)\n- vt: Clearing the screen at a prompt (e.g. `ctrl+l` in bash or zsh) now\n  moves prior output into scrollback even when the prompt is not on the\n  last row. Previously, the output was erased. [#14660](https://github.com/ghostty-org/ghostty/issues/14660)  [#14668](https://github.com/ghostty-org/ghostty/issues/14668)\n- vt: Kitty graphics: transmitting an image with an existing ID now\n  replaces the image and removes its old placements, as the spec requires.\n  Interrupted or failed retransmissions no longer leave stale images on\n  screen. [#6711](https://github.com/ghostty-org/ghostty/issues/6711)  [#13723](https://github.com/ghostty-org/ghostty/issues/13723)  [#13893](https://github.com/ghostty-org/ghostty/issues/13893)\n- vt: Kitty graphics: images now move with the text when a program scrolls\n  with `CSI S`, `CSI T`, or scroll margins, and are clipped to the scroll\n  region. [#4323](https://github.com/ghostty-org/ghostty/issues/4323)  [#13935](https://github.com/ghostty-org/ghostty/issues/13935)\n- vt: Kitty graphics: automatically assigned image IDs no longer collide\n  with IDs chosen by the program. [#2197](https://github.com/ghostty-org/ghostty/issues/2197)  [#13934](https://github.com/ghostty-org/ghostty/issues/13934)\n- vt: Kitty graphics: delete commands now match the spec and Kitty. Point\n  deletes (`d=p`, `d=c`) only remove placements at that cell, `d=a` only\n  removes placements on the visible screen, range deletes accept empty\n  ranges, and deleting a missing placement no longer frees the image.\n  [#13652](https://github.com/ghostty-org/ghostty/issues/13652)  [#13895](https://github.com/ghostty-org/ghostty/issues/13895)  [#13898](https://github.com/ghostty-org/ghostty/issues/13898)  [#13932](https://github.com/ghostty-org/ghostty/issues/13932)\n- vt: Kitty graphics: command validation and responses now match Kitty.\n  This fixes missing responses for invalid image data that could hang\n  clients, false positive query replies, lost IDs in chunked transfer\n  replies, file transfers with an exact `S` size, and loads interrupted by\n  a non-chunk transmission. [#13889](https://github.com/ghostty-org/ghostty/issues/13889)  [#13892](https://github.com/ghostty-org/ghostty/issues/13892)  [#13896](https://github.com/ghostty-org/ghostty/issues/13896)  [#13897](https://github.com/ghostty-org/ghostty/issues/13897)  [#13933](https://github.com/ghostty-org/ghostty/issues/13933) \n  [#14811](https://github.com/ghostty-org/ghostty/issues/14811)\n- vt: Kitty graphics: cropped source rectangles are no longer stretched,\n  and `X`/`Y` offsets are kept within the first cell. [#13890](https://github.com/ghostty-org/ghostty/issues/13890)  [#13891](https://github.com/ghostty-org/ghostty/issues/13891)\n- vt: Kitty graphics: the cursor moves after tall images like Kitty does,\n  so consecutive images no longer overlap. [#13887](https://github.com/ghostty-org/ghostty/issues/13887)\n- vt: Full reset (RIS) no longer resets `image-storage-limit` to the\n  default. [#13951](https://github.com/ghostty-org/ghostty/issues/13951)\n- vt: OSC and APC sequences (such as Kitty graphics commands) canceled by\n  CAN or SUB, or aborted by another control character, are now discarded\n  instead of executed, matching xterm. [#14453](https://github.com/ghostty-org/ghostty/issues/14453)  [#14812](https://github.com/ghostty-org/ghostty/issues/14812)\n- vt: With modifyOtherKeys level 2, control keys, keypad keys, and\n  `alt+escape` now encode like xterm. F13 to F25, Help, and Menu now send\n  xterm's function key sequences in all legacy encoding modes. [#14144](https://github.com/ghostty-org/ghostty/issues/14144) \n  [#14145](https://github.com/ghostty-org/ghostty/issues/14145)\n- vt: Legacy alt-as-escape encoding now sends the full UTF-8 sequence for\n  non-ASCII keys. [#14146](https://github.com/ghostty-org/ghostty/issues/14146)\n- vt: Kitty keyboard protocol release events no longer repeat the typed\n  text for dead keys or level 5 keys on GTK, which caused duplicated\n  characters in programs like Neovim. [#13861](https://github.com/ghostty-org/ghostty/issues/13861)\n- vt: `ctrl+alt+shift+backspace` now sends `ESC BS` in legacy key encoding,\n  matching xterm. [#14508](https://github.com/ghostty-org/ghostty/issues/14508)\n- vt: UTF-8 mouse mode (1005) now encodes the button correctly, fixing\n  invalid reports for the back and forward mouse buttons. [#14532](https://github.com/ghostty-org/ghostty/issues/14532)\n- vt: Foreground, background, and cursor colors reset with OSC 110, 111,\n  or 112 now follow later configuration changes, such as a light/dark\n  theme switch. [#13650](https://github.com/ghostty-org/ghostty/issues/13650)\n- vt: Full reset (RIS) now restores palette colors changed with OSC 4.\n  [#14480](https://github.com/ghostty-org/ghostty/issues/14480)\n- vt: An empty OSC 22 now resets the mouse pointer shape to the default.\n  [#14495](https://github.com/ghostty-org/ghostty/issues/14495)\n- vt: Long desktop notifications (OSC 9 and OSC 777) with multibyte UTF-8\n  text are no longer dropped or shown as invalid UTF-8 when truncated.\n  [#13795](https://github.com/ghostty-org/ghostty/issues/13795)  [#13811](https://github.com/ghostty-org/ghostty/issues/13811)\n- vt: DCS strings now carry UTF-8 data. Previously, some UTF-8 bytes were\n  dropped, ended the string early, or started a new control sequence.\n  [#14016](https://github.com/ghostty-org/ghostty/issues/14016)\n- vt: C0 controls `0x10` to `0x1F` are now executed instead of printed\n  as text, and UTF-8 encoded C1 controls are ignored, matching xterm.\n  [#14022](https://github.com/ghostty-org/ghostty/issues/14022)  [#14023](https://github.com/ghostty-org/ghostty/issues/14023)\n- vt: Erasing a full line (`CSI 2 K`) now clears its soft-wrap state, so\n  erased rows no longer join together when the window is resized. [#13637](https://github.com/ghostty-org/ghostty/issues/13637)\n- vt: The cursor and saved cursor keep the correct position when a resize\n  reflows text, fixing an extra line wrap or overwritten text after\n  resizing. [#12598](https://github.com/ghostty-org/ghostty/issues/12598)  [#14458](https://github.com/ghostty-org/ghostty/issues/14458)  [#14478](https://github.com/ghostty-org/ghostty/issues/14478)\n- vt: Variation selectors (VS15/VS16) now apply to the preceding codepoint,\n  fixing the rendering of some ZWJ emoji such as the pirate flag. [#12596](https://github.com/ghostty-org/ghostty/issues/12596)\n- vt: Combining marks printed after a character in the last column now\n  attach to that character. [#12581](https://github.com/ghostty-org/ghostty/issues/12581)\n- vt: Characters above U+00FF, such as emoji, now print as-is instead of as\n  a blank while a non-UTF-8 character set such as DEC line drawing is\n  active. [#14554](https://github.com/ghostty-org/ghostty/issues/14554)\n- vt: Single shifts (SS2/SS3) now apply only to the next printed character.\n  [#14576](https://github.com/ghostty-org/ghostty/issues/14576)\n- vt: Tab clear (TBC) fixes: `CSI 0 g` no longer sets a tab stop where\n  there wasn't one, and `CSI g` with no parameter clears the tab stop at\n  the cursor. [#13900](https://github.com/ghostty-org/ghostty/issues/13900)  [#14644](https://github.com/ghostty-org/ghostty/issues/14644)\n- vt: Printing with autowrap (DECAWM) disabled clears the pending wrap, so\n  re-enabling autowrap doesn't cause a spurious line wrap. [#14652](https://github.com/ghostty-org/ghostty/issues/14652)\n- vt: With reverse wrap enabled, moving left after restoring a cursor with\n  a pending wrap no longer jumps the cursor. [#14390](https://github.com/ghostty-org/ghostty/issues/14390)\n- vt: Cursor movement respects margins and origin mode: CUB and backspace\n  stop at the left margin, and CHA, HPA, VPA, HPR, and VPR no longer apply\n  the margin offset twice in origin mode. [#14761](https://github.com/ghostty-org/ghostty/issues/14761)  [#14762](https://github.com/ghostty-org/ghostty/issues/14762)\n- vt: Fix a crash when VS15 narrows a wide character under the cursor.\n  [#13631](https://github.com/ghostty-org/ghostty/issues/13631)\n- vt: Fix a crash or memory corruption after narrowing the terminal cuts a\n  wide character in half on the alternate screen or with wraparound\n  disabled. [#14509](https://github.com/ghostty-org/ghostty/issues/14509)\n- vt: Fix a crash when a grapheme cluster widens in the last column and\n  wraps inside or below a scroll region with grapheme clustering (mode\n  2027) enabled. [#14552](https://github.com/ghostty-org/ghostty/issues/14552)\n- vt: Fix a slow memory and performance leak in graphics-heavy sessions\n  where evicted Kitty images left their placements' tracked positions\n  behind. [#13656](https://github.com/ghostty-org/ghostty/issues/13656)\n- vt: Fix a memory leak when an OSC color sequence contains more than two\n  requests. [#13239](https://github.com/ghostty-org/ghostty/issues/13239)\n\n### Shell Integration\n\n- A new `ghostty +ssh` CLI action wraps `ssh` and sets up Ghostty on remote\n  hosts: it forwards Ghostty's environment and installs Ghostty's terminfo\n  on the first connection to each host, caching successful installs. It can\n  be used directly (`ghostty +ssh user@example.com`) or as an alias\n  (`alias ssh='ghostty +ssh --'`) without shell integration. The `ssh-env`\n  and `ssh-terminfo` shell integration features now use it for every\n  shell. [#12582](https://github.com/ghostty-org/ghostty/issues/12582)\n- `ssh-terminfo` now always installs Ghostty's bundled terminfo on remote\n  hosts instead of keeping an existing, possibly outdated, `xterm-ghostty`\n  entry, and reinstalls it when a newer Ghostty changes its terminfo.\n  [#13844](https://github.com/ghostty-org/ghostty/issues/13844)\n- `ghostty +ssh-cache` has been reworked with positional destinations, a\n  new `--prune` option, consistent output and exit codes, and error\n  messages that name the cache file. See the\n  [breaking changes](#breaking-changes) above. [#12814](https://github.com/ghostty-org/ghostty/issues/12814)  [#13533](https://github.com/ghostty-org/ghostty/issues/13533)\n- `ssh-terminfo` now tells apart the same host on different ports, so\n  terminfo is installed on each of them. `ghostty +ssh-cache` accepts\n  `host:port` destinations. [#14472](https://github.com/ghostty-org/ghostty/issues/14472)\n- `ssh-env` no longer overrides `SetEnv` entries in your `~/.ssh/config`.\n  [#11518](https://github.com/ghostty-org/ghostty/issues/11518)  [#14854](https://github.com/ghostty-org/ghostty/issues/14854)\n- bash: Failed commands now report their real exit status on Bash 4.4+,\n  so command finished notifications no longer report every command as\n  successful. [#14247](https://github.com/ghostty-org/ghostty/issues/14247)  [#14250](https://github.com/ghostty-org/ghostty/issues/14250)\n- nu: Tab completion for `ssh` and `sudo` now works with external\n  completers such as carapace. [#13310](https://github.com/ghostty-org/ghostty/issues/13310)\n- bash: The bundled bash-preexec, used only for Bash versions older than\n  4.4 such as macOS's `/bin/bash`, has been updated to 0.7.0. [#14120](https://github.com/ghostty-org/ghostty/issues/14120)\n- zsh: Fix a stray `{` in the prompt and broken prompt marking when `PS1`\n  or `PS2` ends with a bare `%`. [#11832](https://github.com/ghostty-org/ghostty/issues/11832)\n- bash: Fix \"command not found\" errors in subshells that inherit\n  `PROMPT_COMMAND`. [#11690](https://github.com/ghostty-org/ghostty/issues/11690)\n- bash: Fix a syntax error when an existing `PROMPT_COMMAND` ends with a\n  newline. [#11621](https://github.com/ghostty-org/ghostty/issues/11621)\n- bash: Fix extra blank lines at the prompt when using ble.sh. [#11644](https://github.com/ghostty-org/ghostty/issues/11644)\n- bash: Fix the shell integration hook being added twice when it is\n  sourced again with an array `PROMPT_COMMAND`. [#14266](https://github.com/ghostty-org/ghostty/issues/14266)\n\n### macOS\n\n- macOS: Support macOS 27. This fixes the layout and background color of\n  titlebar tabs, a thin border around the app icon, hidden titlebars\n  covering the top lines of the terminal with Reduce Transparency enabled,\n  and the Shortcuts \"New Window\" action opening two windows. [#13001](https://github.com/ghostty-org/ghostty/issues/13001) \n  [#13390](https://github.com/ghostty-org/ghostty/issues/13390)  [#14107](https://github.com/ghostty-org/ghostty/issues/14107)  [#14411](https://github.com/ghostty-org/ghostty/issues/14411)  [#12999](https://github.com/ghostty-org/ghostty/issues/12999)  [#13069](https://github.com/ghostty-org/ghostty/issues/13069)\n- macOS: When a terminal's process exits, a native bar now appears at the\n  bottom of the terminal instead of text being written into the terminal.\n  Commands that fail or exit faster than `abnormal-command-exit-runtime`\n  are highlighted in red. [#7649](https://github.com/ghostty-org/ghostty/issues/7649)  [#12251](https://github.com/ghostty-org/ghostty/issues/12251)\n- macOS: Quitting, or closing a window, when multiple windows or tabs have\n  running processes now offers \"Review Windows...\", which steps through\n  each one so you can decide what to close. [#12742](https://github.com/ghostty-org/ghostty/issues/12742)  [#14062](https://github.com/ghostty-org/ghostty/issues/14062)\n- macOS: The command palette now highlights matching text, matches\n  initials, searches action descriptions, and ranks results by where they\n  matched. [#12264](https://github.com/ghostty-org/ghostty/issues/12264)  [#13610](https://github.com/ghostty-org/ghostty/issues/13610)  [#13624](https://github.com/ghostty-org/ghostty/issues/13624)\n- macOS: The search bar now remembers the last search and shares it with\n  other apps through the system find pasteboard, like Safari and\n  Terminal.app. [#12516](https://github.com/ghostty-org/ghostty/issues/12516)  [#12712](https://github.com/ghostty-org/ghostty/issues/12712)\n- macOS: Screen readers such as VoiceOver are now notified when the\n  selection changes instead of reading a stale selection. [#12902](https://github.com/ghostty-org/ghostty/issues/12902)\n- macOS: The AppleScript `terminal` class and the Shortcuts terminal entity\n  now expose `pid` (of the foreground process) and `tty`. [#11592](https://github.com/ghostty-org/ghostty/issues/11592) \n  [#10756](https://github.com/ghostty-org/ghostty/issues/10756)  [#11922](https://github.com/ghostty-org/ghostty/issues/11922)\n- macOS: AppleScript tabs and terminals have a new read-write\n  `name override` property to set or clear a custom title. [#12048](https://github.com/ghostty-org/ghostty/issues/12048) \n  [#14733](https://github.com/ghostty-org/ghostty/issues/14733)\n- macOS: Middle-clicking a tab closes it with\n  `macos-titlebar-style = tabs`. [#11962](https://github.com/ghostty-org/ghostty/issues/11962)  [#11963](https://github.com/ghostty-org/ghostty/issues/11963)\n- macOS: The version in the About window now links to the release notes\n  for that version. [#11964](https://github.com/ghostty-org/ghostty/issues/11964)\n- macOS: Updates that are downloaded and installed automatically no longer\n  prompt you to restart. Checking for updates manually still offers to\n  restart. [#13623](https://github.com/ghostty-org/ghostty/issues/13623)\n- macOS: `toggle_background_opacity` now applies to every tab in the\n  window, and new windows inherit the current state. [#11583](https://github.com/ghostty-org/ghostty/issues/11583)\n- macOS: `cmd+arrow_up` and `cmd+arrow_down` now run their configured\n  keybinds, which default to `jump_to_prompt`. Ghostty 1.3 always scrolled\n  to the top or bottom of the scrollback instead, ignoring the\n  configuration. To scroll to the top or bottom, use `cmd+home` and\n  `cmd+end`. [#12245](https://github.com/ghostty-org/ghostty/issues/12245)\n- macOS: In the configuration errors window, Return reloads the\n  configuration and Escape ignores the errors. [#12601](https://github.com/ghostty-org/ghostty/issues/12601)\n- macOS: Ghostty launches about 15% faster to a visible window and draws\n  its first frame about 27% sooner. [#13722](https://github.com/ghostty-org/ghostty/issues/13722)\n- macOS: Terminals that aren't visible, such as background tabs, now\n  release their GPU resources and rebuild them when shown again. With 20\n  background tabs, GPU memory drops from about 385 MiB to 18 MiB. Metal\n  buffers also no longer over-allocate when they grow. [#14017](https://github.com/ghostty-org/ghostty/issues/14017)  [#13490](https://github.com/ghostty-org/ghostty/issues/13490)\n- macOS: Lower idle CPU and energy use. The display link now pauses when\n  there is nothing to draw, and unfocused terminals that are animating\n  draw at most once per display refresh instead of once per write.\n  [#14035](https://github.com/ghostty-org/ghostty/issues/14035)  [#14068](https://github.com/ghostty-org/ghostty/issues/14068)\n- macOS: Update Sparkle to 2.9.6, which fixes several security advisories\n  in Sparkle, including CVE-2026-47121 and CVE-2026-47122. [#14072](https://github.com/ghostty-org/ghostty/issues/14072)  [#14082](https://github.com/ghostty-org/ghostty/issues/14082)\n- macOS: Global keybinds no longer stop working after macOS disables\n  Ghostty's event tap. [#12294](https://github.com/ghostty-org/ghostty/issues/12294)  [#12714](https://github.com/ghostty-org/ghostty/issues/12714)\n- macOS: Fix IME composition issues. Korean text being composed is now\n  committed instead of lost when pressing an arrow key, and control-key\n  IME shortcuts such as Japanese input's `ctrl+j` no longer send control\n  characters to the terminal. [#11461](https://github.com/ghostty-org/ghostty/issues/11461)  [#12447](https://github.com/ghostty-org/ghostty/issues/12447)  [#12518](https://github.com/ghostty-org/ghostty/issues/12518)  [#12547](https://github.com/ghostty-org/ghostty/issues/12547)\n- macOS: Text from input methods, dictation, and the emoji picker is now\n  sent as typed input instead of pasted text. Programs no longer treat\n  dictation as a paste, and switching input sources mid-composition sends\n  the pending text as keys, matching Terminal.app. [#13195](https://github.com/ghostty-org/ghostty/issues/13195)  [#13222](https://github.com/ghostty-org/ghostty/issues/13222) \n  [#13817](https://github.com/ghostty-org/ghostty/issues/13817)\n- macOS: Unicode Hex Input can now enter characters outside the Basic\n  Multilingual Plane, such as emoji, typed as surrogate pairs. [#13733](https://github.com/ghostty-org/ghostty/issues/13733) \n  [#13737](https://github.com/ghostty-org/ghostty/issues/13737)\n- macOS: `font-thicken` now also applies to IME preedit text. [#14230](https://github.com/ghostty-org/ghostty/issues/14230)\n- macOS: `option+backspace` and other modified Backspace keys now report\n  their modifiers with the Kitty keyboard protocol instead of sending a\n  bare DEL. [#13871](https://github.com/ghostty-org/ghostty/issues/13871)\n- macOS: Pasting and dropping text now prefer plain text over URLs, so a\n  path copied from apps like Transmit pastes as a path instead of an\n  `sftp://` URL. [#13152](https://github.com/ghostty-org/ghostty/issues/13152)  [#13170](https://github.com/ghostty-org/ghostty/issues/13170)  [#13212](https://github.com/ghostty-org/ghostty/issues/13212)\n- macOS: The search bar keeps focus when you click in it or on the\n  next/previous buttons, and the terminal's focus state is now correct\n  while search is open. [#11872](https://github.com/ghostty-org/ghostty/issues/11872)  [#11978](https://github.com/ghostty-org/ghostty/issues/11978)\n- macOS: The Find Next and Find Previous menu items and the\n  `navigate_search` and `end_search` keybinds now work correctly,\n  including while the search field is focused. [#12070](https://github.com/ghostty-org/ghostty/issues/12070)  [#12492](https://github.com/ghostty-org/ghostty/issues/12492)\n- macOS: Pressing Enter in the search bar no longer blocks confirming an\n  IME candidate. [#12781](https://github.com/ghostty-org/ghostty/issues/12781)\n- macOS: Clicking a command palette entry with the mouse now runs it\n  instead of closing the palette. [#11665](https://github.com/ghostty-org/ghostty/issues/11665)\n- macOS: The command palette now gets focus and paste when opened from the\n  inline tab title editor. [#12524](https://github.com/ghostty-org/ghostty/issues/12524)\n- macOS: Holding `cmd+t` to create many tabs now leaves the newest tab\n  focused. [#13725](https://github.com/ghostty-org/ghostty/issues/13725)  [#13985](https://github.com/ghostty-org/ghostty/issues/13985)\n- macOS: Fix an empty \"ghost\" tab or window that could appear when a tab\n  was closed right after it was opened. [#12119](https://github.com/ghostty-org/ghostty/issues/12119)\n- macOS: Titlebar tabs no longer disappear after creating a tab from\n  \"Show All Tabs\". [#12949](https://github.com/ghostty-org/ghostty/issues/12949)  [#13017](https://github.com/ghostty-org/ghostty/issues/13017)\n- macOS: Double-clicking the window title now zooms the window with\n  `macos-titlebar-style = tabs`. [#12219](https://github.com/ghostty-org/ghostty/issues/12219)\n- macOS: Moving a tab with `macos-titlebar-style = tabs` on macOS 26 no\n  longer briefly shows the neighboring tab. [#14847](https://github.com/ghostty-org/ghostty/issues/14847)\n- macOS: The inline tab title editor stays in place while the window is\n  resized. [#12220](https://github.com/ghostty-org/ghostty/issues/12220)\n- macOS: Fix tabs flashing when switching tabs after a program changed the\n  background color with OSC 11, and the window chrome keeping the old\n  color after a light/dark theme switch. [#12825](https://github.com/ghostty-org/ghostty/issues/12825)  [#12828](https://github.com/ghostty-org/ghostty/issues/12828)  [#12822](https://github.com/ghostty-org/ghostty/issues/12822)\n- macOS: The `macos-glass-regular` and `macos-glass-clear` options for\n  `background-blur` now layer the glass over the background color, and\n  focused windows are no longer less transparent than unfocused ones.\n  [#13914](https://github.com/ghostty-org/ghostty/issues/13914)  [#13928](https://github.com/ghostty-org/ghostty/issues/13928)\n- macOS: The native titlebar no longer cuts off the end of the title when\n  using a custom `window-title-font-family`. [#14135](https://github.com/ghostty-org/ghostty/issues/14135)  [#14217](https://github.com/ghostty-org/ghostty/issues/14217)\n- macOS: Fix terminals rendering at a stale size under heavy system load or\n  during rapid resizes from window managers. [#12143](https://github.com/ghostty-org/ghostty/issues/12143)\n- macOS: Splits dragged into another tab or window now render immediately,\n  and the source window keeps keyboard focus. [#12343](https://github.com/ghostty-org/ghostty/issues/12343)  [#12338](https://github.com/ghostty-org/ghostty/issues/12338)\n- macOS: The split zoom indicator no longer stays visible after the other\n  splits of a zoomed split are closed, such as with AppleScript. [#14703](https://github.com/ghostty-org/ghostty/issues/14703)\n- macOS: The split divider now uses the standard row and column resize\n  pointers. [#13433](https://github.com/ghostty-org/ghostty/issues/13433)\n- macOS: `window-save-state = never` now also stops macOS from taking\n  window restoration snapshots, which could stall focus changes between\n  windows. [#14506](https://github.com/ghostty-org/ghostty/issues/14506)\n- macOS: Window state saved by Ghostty 1.2 or later is now migrated, so\n  windows and tabs are restored after updating Ghostty. [#12461](https://github.com/ghostty-org/ghostty/issues/12461)\n- macOS: Tabs created while the screen is locked now initialize correctly.\n  [#13639](https://github.com/ghostty-org/ghostty/issues/13639)\n- macOS: Quitting now asks for confirmation when windows with running\n  processes are minimized or the quick terminal is hidden. [#13686](https://github.com/ghostty-org/ghostty/issues/13686)\n- macOS: OSC 52 clipboard read confirmations no longer steal focus. If the\n  terminal is unfocused, Ghostty rings the bell and shows the prompt when\n  you return to it. [#13744](https://github.com/ghostty-org/ghostty/issues/13744)\n- macOS: Splits in the quick terminal now also set\n  `GHOSTTY_QUICK_TERMINAL=1`. [#12895](https://github.com/ghostty-org/ghostty/issues/12895)  [#12896](https://github.com/ghostty-org/ghostty/issues/12896)\n- macOS: The quick terminal no longer reopens at a stale size after a\n  display is reconnected at a different resolution. [#13250](https://github.com/ghostty-org/ghostty/issues/13250)\n- macOS: The \"New Ghostty Tab Here\" and \"New Ghostty Window Here\" services\n  now open the correct directory when given a plain-text path. [#12727](https://github.com/ghostty-org/ghostty/issues/12727) \n  [#12731](https://github.com/ghostty-org/ghostty/issues/12731)\n- macOS: Working directories passed from Services, Shortcuts, and\n  AppleScript are now normalized, fixing Nushell and zsh `%1~` prompts.\n  [#12614](https://github.com/ghostty-org/ghostty/issues/12614)  [#14051](https://github.com/ghostty-org/ghostty/issues/14051)\n- macOS: `ghostty -e` no longer opens the command's file arguments as\n  extra terminals, e.g. `ghostty -e vim file.txt`. [#13748](https://github.com/ghostty-org/ghostty/issues/13748)\n- macOS: Opening a `.command` file from Finder no longer corrupts\n  non-ASCII characters in its path. [#13862](https://github.com/ghostty-org/ghostty/issues/13862)\n- macOS: The Shortcuts terminal entity now reports the correct kind,\n  title, working directory, and screenshot for new terminals. [#13007](https://github.com/ghostty-org/ghostty/issues/13007)\n- macOS: The Shortcuts \"New Terminal\" action now works with commands that\n  have arguments and with a command field that was cleared. [#12391](https://github.com/ghostty-org/ghostty/issues/12391) \n  [#12392](https://github.com/ghostty-org/ghostty/issues/12392)\n- macOS: AppleScript `send key` now works for character keys, not only\n  special keys like `enter`, and respects `macos-option-as-alt`. [#13205](https://github.com/ghostty-org/ghostty/issues/13205)\n- macOS: Update pill fixes: update errors are now shown, \"Install and\n  Relaunch\" no longer asks for confirmation, and the cancel option is\n  hidden once an update can no longer be canceled. [#13540](https://github.com/ghostty-org/ghostty/issues/13540)  [#13562](https://github.com/ghostty-org/ghostty/issues/13562) \n  [#13612](https://github.com/ghostty-org/ghostty/issues/13612)\n- macOS: The default app icon follows the system icon style again after\n  changing it in System Settings, and custom icons now apply to the app in\n  Finder. [#12180](https://github.com/ghostty-org/ghostty/issues/12180)  [#12344](https://github.com/ghostty-org/ghostty/issues/12344)\n- macOS: The dock icon bell badge now appears when notification permission\n  was granted earlier without badge permission. [#12133](https://github.com/ghostty-org/ghostty/issues/12133)\n- macOS: The Copy menu item is disabled when nothing is selected. [#12521](https://github.com/ghostty-org/ghostty/issues/12521)\n- macOS: Menu items now show the correct shortcut for keybinds on physical\n  keys (e.g. `super+backquote`), uppercase letters, forward delete, and\n  the `scroll_to_selection` and `search_selection` actions. [#13888](https://github.com/ghostty-org/ghostty/issues/13888) \n  [#12039](https://github.com/ghostty-org/ghostty/issues/12039)  [#12011](https://github.com/ghostty-org/ghostty/issues/12011)  [#12281](https://github.com/ghostty-org/ghostty/issues/12281)\n- macOS: The secure input indicator's popover arrow now points at the\n  icon. [#12249](https://github.com/ghostty-org/ghostty/issues/12249)\n- macOS: Fix a rare permanent freeze after waking from sleep or changing\n  displays. macOS did not mark the app as \"Not Responding\", so it could\n  only be killed. [#14691](https://github.com/ghostty-org/ghostty/issues/14691)\n- macOS: Fix a crash when closing a tab, most easily triggered with\n  `undo-timeout = 0`. [#13359](https://github.com/ghostty-org/ghostty/issues/13359)  [#13364](https://github.com/ghostty-org/ghostty/issues/13364)\n- macOS: Fix a crash when opening a new tab from a native fullscreen\n  window. [#13636](https://github.com/ghostty-org/ghostty/issues/13636)\n- macOS: Fix a crash caused by a data race when reading cached terminal\n  contents. [#13646](https://github.com/ghostty-org/ghostty/issues/13646)\n- macOS: Fix a crash when OSC 52 clipboard confirmation prompts overlap.\n  [#13648](https://github.com/ghostty-org/ghostty/issues/13648)\n- macOS: Fix crashes when CoreText returns null, such as for fonts without\n  a display name or under severe memory pressure. [#13642](https://github.com/ghostty-org/ghostty/issues/13642)  [#13679](https://github.com/ghostty-org/ghostty/issues/13679)\n- macOS: Fix closed windows leaking with transparent titlebars (the\n  default), which made Ghostty and WindowServer use more CPU and memory\n  over time. [#13601](https://github.com/ghostty-org/ghostty/issues/13601)\n- macOS: Fix a memory leak each time Ghostty reads terminal text, such as\n  for copy, Quick Look, or accessibility. [#12020](https://github.com/ghostty-org/ghostty/issues/12020)  [#12025](https://github.com/ghostty-org/ghostty/issues/12025)\n- macOS: Fix an IOSurface memory leak when scripts rapidly create and close\n  terminals. [#13640](https://github.com/ghostty-org/ghostty/issues/13640)\n- macOS: Fix a Mach port leak, and a gradual slowdown, while global\n  keybinds wait for Accessibility permission. [#13590](https://github.com/ghostty-org/ghostty/issues/13590)\n\n### GTK (Linux, FreeBSD)\n\n- GTK: Splits can now be rearranged with drag and drop, matching macOS.\n  Drag a split by its handle and drop it onto another split, including\n  splits in other tabs and windows. [#10224](https://github.com/ghostty-org/ghostty/issues/10224)  [#10423](https://github.com/ghostty-org/ghostty/issues/10423)\n- GTK: Ghostty now renders at the true fractional scale (e.g. 125% or\n  150%), so text and box-drawing characters are sharp instead of blurry\n  under fractional scaling. [#1938](https://github.com/ghostty-org/ghostty/issues/1938)  [#14269](https://github.com/ghostty-org/ghostty/issues/14269)\n- GTK: The renderer no longer uses `GtkGLArea`. Ghostty now renders with\n  EGL entirely on the render thread and hands finished frames to GTK as\n  DMABUFs, so the main thread no longer does any OpenGL work. [#14052](https://github.com/ghostty-org/ghostty/issues/14052) \n  [#14636](https://github.com/ghostty-org/ghostty/issues/14636)\n- GTK: Windows can now be renamed using the menu, command palette, or the\n  new `prompt_window_title` and `set_window_title` binding actions.\n  [#10469](https://github.com/ghostty-org/ghostty/issues/10469)  [#10999](https://github.com/ghostty-org/ghostty/issues/10999)\n- GTK: A new `+new-tab` CLI command opens a new tab in a running Ghostty\n  instance. When run from inside Ghostty, the tab opens in the same\n  window. It accepts the same `-e`, `--working-directory`, and `--title`\n  flags as `+new-window`. [#11762](https://github.com/ghostty-org/ghostty/issues/11762)\n- GTK: A new `+toggle-quick-terminal` CLI command toggles the quick\n  terminal of a running Ghostty instance, useful for binding in window\n  managers without global shortcut support. [#12661](https://github.com/ghostty-org/ghostty/issues/12661)\n- GTK: Global keybinds now use the `vicinae-hotkey-v1` Wayland protocol\n  when the compositor supports it (e.g. Hyprland 0.56+), falling back to\n  the XDG desktop portal otherwise. Ghostty shows a desktop notification if\n  a global keybind can't be registered. [#13464](https://github.com/ghostty-org/ghostty/issues/13464)\n- GTK: `quick-terminal-screen` is now supported on Wayland. The default,\n  `main`, places the quick terminal on the compositor's primary output\n  (or the first monitor if the compositor doesn't report one). Set it to\n  `mouse` to let the compositor choose, which was the previous behavior.\n  [#11117](https://github.com/ghostty-org/ghostty/issues/11117)\n- GTK: On Wayland, `background-blur` now uses the compositor-agnostic\n  `ext-background-effect-v1` protocol instead of KDE's blur protocol,\n  enabling blur on compositors such as Niri. The blur region also no longer\n  covers the window's client-side shadows. [#10721](https://github.com/ghostty-org/ghostty/issues/10721)  [#10720](https://github.com/ghostty-org/ghostty/issues/10720)  [#10727](https://github.com/ghostty-org/ghostty/issues/10727)\n- GTK: On GTK 4.23.3 and newer, `background-blur` uses GTK's built-in\n  background blur, which covers the window more accurately. [#13581](https://github.com/ghostty-org/ghostty/issues/13581) \n  [#13586](https://github.com/ghostty-org/ghostty/issues/13586)\n- GTK: The `open_config` binding action now accepts `new_window` to\n  edit the configuration in `$VISUAL` or `$EDITOR` in a new Ghostty\n  window. The default, `os_open`, keeps the previous behavior. [#11905](https://github.com/ghostty-org/ghostty/issues/11905)\n- GTK: A new configuration `gtk-horizontal-tab-scroll` (default `true`)\n  can be set to `false` to stop two-finger horizontal scrolling from\n  switching tabs, passing the scroll to the terminal application instead.\n  [#12659](https://github.com/ghostty-org/ghostty/issues/12659)\n- GTK: A new configuration `gtk-tabs-inverted` moves the close button to\n  the start of each tab, in both the tab bar and the tab overview.\n  [#14657](https://github.com/ghostty-org/ghostty/issues/14657)\n- GTK: The default command palette entries are now translatable. [#11641](https://github.com/ghostty-org/ghostty/issues/11641)\n- GTK: The embedded Noto emoji fonts were updated, so newer emoji and ZWJ\n  sequences such as the head-shaking faces render as one glyph instead of\n  overlapping neighboring cells. [#14047](https://github.com/ghostty-org/ghostty/issues/14047)\n- GTK: `ctrl+shift+page_up` and `ctrl+shift+page_down` now move the current\n  tab left and right (`move_tab`), matching Firefox, GNOME Terminal, and\n  VS Code. `jump_to_prompt` moved to `ctrl+shift+arrow_up` and\n  `ctrl+shift+arrow_down`. [#4998](https://github.com/ghostty-org/ghostty/issues/4998)  [#12458](https://github.com/ghostty-org/ghostty/issues/12458)\n- GTK: URLs now open through the XDG desktop portal, falling back to\n  `xdg-open` if the portal is unavailable. Ghostty passes an activation\n  token so the opened application, such as your browser, can come to the\n  front on compositors that require one. [#5991](https://github.com/ghostty-org/ghostty/issues/5991)  [#11754](https://github.com/ghostty-org/ghostty/issues/11754)  [#14785](https://github.com/ghostty-org/ghostty/issues/14785) \n  [#14787](https://github.com/ghostty-org/ghostty/issues/14787)\n- GTK: Desktop notifications are now withdrawn when their terminal is\n  focused or closed, and repeated notifications with the same text\n  replace each other, matching macOS. [#14108](https://github.com/ghostty-org/ghostty/issues/14108)\n- GTK: Tabs that aren't visible no longer render, saving CPU and GPU.\n  This matches macOS. [#12760](https://github.com/ghostty-org/ghostty/issues/12760)\n- GTK: The Dolphin \"Open Ghostty Here\" action now opens a new window in\n  the running Ghostty instance instead of launching a separate one.\n  [#11614](https://github.com/ghostty-org/ghostty/issues/11614)\n- GTK: Fix Ghostty sometimes failing to launch with systemd 262, which\n  refused to start the service because Ghostty reported readiness before\n  it could handle reload signals. [#14398](https://github.com/ghostty-org/ghostty/issues/14398)  [#14399](https://github.com/ghostty-org/ghostty/issues/14399)\n- GTK: Fix deeply nested splits sometimes becoming invisible or losing\n  focus. [#11193](https://github.com/ghostty-org/ghostty/issues/11193)  [#12698](https://github.com/ghostty-org/ghostty/issues/12698)\n- GTK: Resizing splits, especially with `resize_split` keybinds, no\n  longer flickers. [#13414](https://github.com/ghostty-org/ghostty/issues/13414)\n- GTK: `resize_split` on nested splits no longer causes large jumps in\n  size. [#12699](https://github.com/ghostty-org/ghostty/issues/12699)\n- GTK: Splits can no longer be resized smaller than one cell, by dragging\n  the divider or with `resize_split`. [#14476](https://github.com/ghostty-org/ghostty/issues/14476)\n- GTK: High-resolution scroll wheels no longer scroll much faster than\n  standard scroll wheels. [#12483](https://github.com/ghostty-org/ghostty/issues/12483)\n- GTK: Disable unwanted kinetic scrolling on trackpads with GTK versions\n  older than 4.20.1. [#11793](https://github.com/ghostty-org/ghostty/issues/11793)\n- GTK: Middle clicks are once again sent to terminal applications using\n  mouse reporting when `gtk-enable-primary-paste` is disabled in\n  GSettings. [#12940](https://github.com/ghostty-org/ghostty/issues/12940)  [#13108](https://github.com/ghostty-org/ghostty/issues/13108)\n- GTK: The quick terminal no longer breaks when toggled off manually\n  while `quick-terminal-autohide` is enabled. [#11679](https://github.com/ghostty-org/ghostty/issues/11679)  [#12471](https://github.com/ghostty-org/ghostty/issues/12471)\n- GTK: Opening the right-click context menu no longer hides the quick\n  terminal when `quick-terminal-autohide` is enabled. [#12843](https://github.com/ghostty-org/ghostty/issues/12843)\n- GTK: The resize overlay no longer keeps reappearing when the scrollbar\n  is visible and no longer blocks mouse input while shown. [#11970](https://github.com/ghostty-org/ghostty/issues/11970) \n  [#11972](https://github.com/ghostty-org/ghostty/issues/11972)\n- GTK: The maximum window size is now based on the monitor the window is\n  currently on, not the monitor it was opened on. [#13171](https://github.com/ghostty-org/ghostty/issues/13171)\n- GTK: `+new-window -e` now works when `shell-integration` is set to a\n  specific shell. `+new-window` and `+new-tab` also accept a new\n  `--shell-integration` flag. [#12378](https://github.com/ghostty-org/ghostty/issues/12378)  [#13741](https://github.com/ghostty-org/ghostty/issues/13741)\n- GTK: Keys remapped to modifiers with XKB (e.g. Delete remapped to\n  `ISO_Level3_Shift`) no longer also send the original key. [#13967](https://github.com/ghostty-org/ghostty/issues/13967)\n- GTK: On Wayland, the IME candidate window now follows the cursor while\n  composing and no longer covers the line being edited. [#14729](https://github.com/ghostty-org/ghostty/issues/14729)\n- GTK: Splits in a tab that was moved to another window now act on the\n  new window (e.g. `toggle_fullscreen`). [#14474](https://github.com/ghostty-org/ghostty/issues/14474)\n- GTK: The mouse cursor keeps its text shape while selecting text.\n  [#14558](https://github.com/ghostty-org/ghostty/issues/14558)\n- GTK: The command palette now uses the terminal colors when\n  `window-theme = ghostty`. [#14662](https://github.com/ghostty-org/ghostty/issues/14662)\n- GTK: Opening URLs no longer fails when the fallback opener (`xdg-open`)\n  produces large output. [#12797](https://github.com/ghostty-org/ghostty/issues/12797)\n- GTK: Clicking a desktop notification no longer focuses the wrong\n  terminal when the one that sent it has since been closed. [#12028](https://github.com/ghostty-org/ghostty/issues/12028)\n- GTK: A bell in the focused terminal no longer leaves the bell\n  indicator set. [#13597](https://github.com/ghostty-org/ghostty/issues/13597)\n- GTK: Fix the window continuously redrawing in the background after an\n  indeterminate progress bar (OSC 9;4) was removed. [#14704](https://github.com/ghostty-org/ghostty/issues/14704)  [#14738](https://github.com/ghostty-org/ghostty/issues/14738)\n- GTK: Log missing or invalid `gtk-xft-dpi` values once instead of\n  repeatedly. [#14410](https://github.com/ghostty-org/ghostty/issues/14410)  [#14085](https://github.com/ghostty-org/ghostty/issues/14085)  [#14434](https://github.com/ghostty-org/ghostty/issues/14434)\n- GTK: Fix a crash when closing tabs or splits on GTK 4.20 (GNOME 49).\n  [#12426](https://github.com/ghostty-org/ghostty/issues/12426)\n- GTK: Fix a crash with global keybinds or on configuration reload when\n  no D-Bus connection is available. [#13101](https://github.com/ghostty-org/ghostty/issues/13101)\n- GTK: Fix a possible crash when Fontconfig reports a font's language as a\n  plain string instead of a language set. [#14853](https://github.com/ghostty-org/ghostty/issues/14853)\n- GTK: Fix a leak where every audio bell started a new GStreamer pipeline\n  and threads that were never cleaned up, slowly raising CPU usage.\n  [#13647](https://github.com/ghostty-org/ghostty/issues/13647)  [#12815](https://github.com/ghostty-org/ghostty/issues/12815)  [#13657](https://github.com/ghostty-org/ghostty/issues/13657)\n- Snap: Link the system FreeType, Fontconfig, HarfBuzz, libpng, and zlib\n  instead of bundled copies, fixing frequent crashes caused by two copies\n  of the same library in one process. [#14392](https://github.com/ghostty-org/ghostty/issues/14392)  [#14682](https://github.com/ghostty-org/ghostty/issues/14682)\n- Snap: The snap's own GIO modules and XDG data directories now take\n  priority over the host's. [#12045](https://github.com/ghostty-org/ghostty/issues/12045)\n- Snap: Programs running inside Ghostty, such as `clear`, now find the\n  `xterm-ghostty` terminfo entry. [#12662](https://github.com/ghostty-org/ghostty/issues/12662)\n- Flatpak: Commands started by Ghostty on the host are now terminated if\n  Ghostty crashes. [#12427](https://github.com/ghostty-org/ghostty/issues/12427)\n\n### Localization\n\nGhostty 1.4 introduces full localization for the command palette and adds\nsupport for **4 new languages**:\n\n- Basque\n- Belarusian\n- Danish\n- Serbian (Cyrillic and Latin scripts)\n\nLocalization is maintained by volunteer contributors. If you want to\nhelp localize Ghostty in your language, please open a discussion on the\nGitHub repo. Thank you to all the volunteers who contributed to Ghostty's\nlocalization!\n\n### Changes for Package Maintainers\n\n- Ghostty now requires Zig 0.17 to build. [#14518](https://github.com/ghostty-org/ghostty/issues/14518)  [#14519](https://github.com/ghostty-org/ghostty/issues/14519)\n- GTK builds now require **GTK 4.18** and **libadwaita 1.7**, up from\n  GTK 4.14 and libadwaita 1.5. Builds against older headers fail at\n  compile time, and Ghostty exits at startup if older libraries are\n  loaded at runtime. [#14330](https://github.com/ghostty-org/ghostty/issues/14330)\n- GTK builds now link the system EGL library (pkg-config `egl`, usually\n  provided by libglvnd or Mesa) for the new renderer. At runtime, Ghostty\n  uses GTK's EGL display when it can, and otherwise needs an EGL driver\n  that supports the surfaceless platform. [#14052](https://github.com/ghostty-org/ghostty/issues/14052)  [#14636](https://github.com/ghostty-org/ghostty/issues/14636)\n- A new `-Dinstalled-exe-path` build option sets the absolute executable\n  path written into the desktop file, D-Bus services, and systemd user\n  service. Previously this path came from the install prefix. Without the\n  option, these files now name `ghostty` alone, which systemd only finds in\n  `/usr/bin` or `/usr/local/bin`, so set it for any other prefix.\n  [#14805](https://github.com/ghostty-org/ghostty/issues/14805)  [#14806](https://github.com/ghostty-org/ghostty/issues/14806)\n- When linking the system gtk4-layer-shell (`-fsys=gtk4-layer-shell`),\n  version 1.0.4 or newer is now required. Ghostty no longer disables the\n  quick terminal on older versions, which can crash on some compositors.\n  [#11559](https://github.com/ghostty-org/ghostty/issues/11559)\n\n## Libghostty\n\nAs with 1.3, libghostty isn't directly part of the Ghostty 1.4 release.\nBut a large part of the 1.4 development cycle went into libghostty, so\nhere's an update.\n\nOver the past 6 months, the C API for libghostty-vt has grown from a\nparser and a few encoders into a complete terminal emulator API, adopted\nby dozens of free and commercial terminal emulators used by millions of\npeople. It's hard to quantify exactly, but the number of people using a\nlibghostty-based terminal is confidently several times the number of\npeople using the Ghostty GUI.\n\nlibghostty-vt now builds for macOS, Linux, Windows (MSVC and GNU), FreeBSD,\nAndroid, iOS, and WebAssembly, and CI continuously verifies every one of\nthese targets. The goal is for libghostty-vt to be generally usable everywhere,\nwithin reason, so if you want more target support, let us know!\n\nIt's also easier to integrate libghostty-vt into existing build systems.\nThere's CMake support, Nix packaging, an xcframework, and a source\ntarball, in addition to the existing pkg-config file. **libghostty-vt no\nlonger needs libc++, and it can build freestanding.**\n\nThe API is still marked as a work in progress and broke compatibility\nseveral times during this cycle, so expect more breaking changes before\na tagged release. The [API documentation](https://libghostty.tip.ghostty.org/index.html)\nand the [Zig, C, C++, Swift, and WebAssembly examples](https://github.com/ghostty-org/ghostty/tree/main/example)\n(now over 30) are kept up to date with `main`.\n\nWe're going to do a final pass over the C API, break ABI one more time,\nand then likely tag a libghostty 1.0 release very soon.\n\n## Financial Update\n\nGhostty is a [non-profit project](https://ghostty.org/docs/sponsor), fiscally sponsored\nby [Hack Club](https://hackclub.com).\nAll of our finances are [public on HCB](https://hcb.hackclub.com/ghostty),\nso you can see exactly where every dollar goes.\n\nDuring the 1.4 cycle, we paid **$41,820** to contributors under contract and\nspent about **$1,260** on infrastructure such as website hosting.\n\nI'm happy to share that we've now signed our first two **12-month contracts**,\nwhich give contributors stable, long-term paid work on Ghostty and help\nensure the ongoing stability and sustainability of the project:\n\n- [@trag1c](https://github.com/trag1c) is Ghostty's head of operations.\n  He manages the community on GitHub and Discord, coordinates our\n  volunteer translators, and maintains various other important project\n  systems.\n- [@vancluever](https://github.com/vancluever) works on various Ghostty\n  subsystems. In this cycle, he led the upgrade to Zig 0.16, moved the\n  build off Zig's deprecated `@cImport`, updated the bundled Fontconfig,\n  and more. He's also the author of\n  [z2d](https://github.com/vancluever/z2d), the 2D graphics library Ghostty\n  uses to draw box-drawing characters and other sprite glyphs.\n\nIf you'd like to support Ghostty, please visit our [sponsorship page](https://ghostty.org/docs/sponsor).\n\n## Roadmap\n\nThe primary focus of the roadmap continues to be libghostty functionality,\nstability, and portability. During the last release cycle, I said I aimed to\ntag a libghostty release. We haven't done that yet, but I'm confident we will\ndo so before Ghostty 1.5.\n\nlibghostty is a project that continues to be the tide that lifts all boats.\nlibghostty improvements tie directly to Ghostty GUI improvements as well as\ndozens of other large projects in the ecosystem. As more large projects adopt\nlibghostty, libghostty tends to get more testing and attention, and this\ncreates a cycle that yields the most gain for terminal emulators everywhere.\n\nmacOS and GTK builds of Ghostty have talented, capable maintainer teams that\nare continuing to improve them, so they're not neglected by any means!\nAs a project, we've decided to drop any roadmap for Windows support in the\nGhostty GUI. libghostty fully supports Windows (and we test it in CI), and the\nofficial stance now is that downstream projects should use that.\n\nOur release cycle remains 6 months. This release was delayed by one month,\nbut Ghostty 1.5 is planned for March 2027. libghostty will have a separate\nrelease cycle.\n\n---\n\n*Originally published at [ghostty.org](https://ghostty.org/docs/install/release-notes/1-4-0).*\n","body_html":"<h1 id=\"ghostty-1-4-0\">Ghostty 1.4.0</h1>\n<p>Release notes for Ghostty 1.4.0, released on October 27, 2026.</p>\n<p>Ghostty 1.4.0 is a major release that includes large performance and\nmemory improvements, a 100% complete Kitty graphics implementation including\nanimation and relative placements (the first non-Kitty terminal to do so),\nSSH integration improvements, and hundreds more improvements and fixes\nacross all platforms.</p>\n<p>This release features <strong>7 months of work</strong> with changes from\n<strong>172 contributors</strong> over <strong>2,889 commits</strong>. Thank you to all the contributors,\nmaintainers, community moderators, translators, packagers, and users\nwho each helped make this release possible.</p>\n<p>These release notes are painstakingly and lovingly hand-crafted\nby human Ghostty maintainers, including the full changelog. They take\na combined 16+ hours to write, so please enjoy. 🥰</p>\n<p><em>Ghostty is non-profit. <a href=\"https://ghostty.org/docs/sponsor\" rel=\"nofollow ugc noopener\">Support development</a>.</em></p>\n<h2 id=\"security\">Security</h2>\n<ul><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-4hwh-wx3w-3fqg\" rel=\"nofollow ugc noopener\">GHSA-4hwh-wx3w-3fqg</a>.</p><p>Paste protection didn&#39;t treat carriage returns as line endings, so a\npaste could run a command without confirmation in programs that don&#39;t\nuse bracketed paste. This requires user interaction (copy-paste) to\ntrigger.</p></li><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mhff-mv4q-fp63\" rel=\"nofollow ugc noopener\">GHSA-mhff-mv4q-fp63</a>.</p><p>Malicious Kitty graphics commands could crash or hang Ghostty, force\nhuge allocations, or in limited cases read or delete files outside the\nallowed temporary directories. This only requires displaying malicious\noutput.</p></li><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-hcr9-7hcr-mjm8\" rel=\"nofollow ugc noopener\">GHSA-hcr9-7hcr-mjm8</a>.</p><p>Malicious terminal output could crash Ghostty, closing every window,\nvia tmux control mode. tmux doesn&#39;t need to be installed. This affects\nGhostty 1.3.0 and 1.3.1.</p></li><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-hp9c-qp4q-cpw3\" rel=\"nofollow ugc noopener\">GHSA-hp9c-qp4q-cpw3</a>.</p><p>The same impact as above, via a tmux control mode layout with a\nzero-sized or oversized pane. This affects Ghostty 1.3.0 and 1.3.1.</p></li><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-w9q4-5jvv-mcv4\" rel=\"nofollow ugc noopener\">GHSA-w9q4-5jvv-mcv4</a>.</p><p>Clearing the screen into scrollback could corrupt memory if it deleted\nthe scrollback page holding a styled or hyperlinked cursor. This only\nrequires displaying malicious output, but only with a small\n<code>scrollback-limit</code> such as <code>0</code>. The default isn&#39;t known to be affected.</p></li><li><p><a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-2r63-vmw6-3m3c\" rel=\"nofollow ugc noopener\">GHSA-2r63-vmw6-3m3c</a>.</p><p>A crafted directory name could make the zsh shell integration send\narbitrary escape sequences, such as silently replacing the clipboard via\nOSC 52. bash was affected in a more limited way. This only requires\n<code>cd</code>-ing into a directory from untrusted content, such as a cloned\nrepository.</p></li><li><p>macOS: <a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-cw69-wm67-5pv8\" rel=\"nofollow ugc noopener\">GHSA-cw69-wm67-5pv8</a>.</p><p>Cmd-clicking a crafted OSC 8 hyperlink could open unsafe local files or\ncustom URL schemes, leading to arbitrary command execution. Ghostty now\nblocks unsafe targets and confirms custom URL schemes. This requires\nuser interaction (cmd-click) to trigger.</p></li><li><p>macOS: <a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mfw9-xcr3-7gfp\" rel=\"nofollow ugc noopener\">GHSA-mfw9-xcr3-7gfp</a>.</p><p>The same issue as above for links detected by the <code>link</code> configuration,\nincluding the default URL matcher. This requires user interaction\n(cmd-click) to trigger.</p></li><li><p>macOS: <a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-v8cw-fg4j-jcc4\" rel=\"nofollow ugc noopener\">GHSA-v8cw-fg4j-jcc4</a>.</p><p>Drag-and-drop text skipped paste protection, with the same impact as\nabove. This requires user interaction (drag-and-drop) to trigger.</p></li><li><p>macOS: <a href=\"https://github.com/ghostty-org/ghostty/security/advisories/GHSA-mxqx-236q-wrv7\" rel=\"nofollow ugc noopener\">GHSA-mxqx-236q-wrv7</a>.</p><p>Opening a file whose name contains control characters could run a\ndifferent command than the one shown in the confirmation dialog. This\nrequires a crafted file on your system and confirming the dialog.</p></li></ul>\n<p>Note: I requested CVEs for the above advisories weeks ago, but GitHub\nhasn&#39;t assigned them yet. If/when they&#39;re assigned, I will update the\nabove with proper CVE numbers.</p>\n<h2 id=\"highlights\">Highlights</h2>\n<h3 id=\"macos-27-support\">macOS 27 Support</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/12999\" rel=\"nofollow ugc noopener\">#12999</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13069\" rel=\"nofollow ugc noopener\">#13069</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13393\" rel=\"nofollow ugc noopener\">#13393</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14413\" rel=\"nofollow ugc noopener\">#14413</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14414\" rel=\"nofollow ugc noopener\">#14414</a></p>\n<p>Ghostty 1.4 supports macOS 27 (Golden Gate). Most of the work was\ncompatibility fixes:</p>\n<ul><li><p>Tabs in the titlebar (<code>macos-titlebar-style = tabs</code>) lay out correctly</p><p>again.</p></li><li><p>The native tab bar no longer draws as a solid gray bar on top of your</p><p>theme. It now lets the new glass style blend with your terminal\nbackground.</p></li><li><p><code>macos-titlebar-style = hidden</code> no longer covers the top lines of the</p><p>terminal when Reduce Transparency is on.</p></li><li>The app icon no longer has a thin border.</li><li><p>The Shortcuts &quot;New Window&quot; action no longer opens two windows when</p><p>Ghostty is running without any windows.</p></li></ul>\n<p>Ghostty 1.4 remains fully compatible with prior macOS versions back to\nand including macOS 13 (Ventura). See the\n<a href=\"#system-requirements\">system requirements</a> for more details.</p>\n<blockquote><p>Note</p>\n<p>Ghostty 1.3.1 works on macOS 27, but it has some of the visual issues\nlisted above, such as the gray tab bar.</p></blockquote>\n<h3 id=\"kitty-graphics-animation-and-relative-placements\">Kitty Graphics Animation and Relative Placements</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/13943\" rel=\"nofollow ugc noopener\">#13943</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13939\" rel=\"nofollow ugc noopener\">#13939</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13935\" rel=\"nofollow ugc noopener\">#13935</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13934\" rel=\"nofollow ugc noopener\">#13934</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13893\" rel=\"nofollow ugc noopener\">#13893</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13933\" rel=\"nofollow ugc noopener\">#13933</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13389\" rel=\"nofollow ugc noopener\">#13389</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13270\" rel=\"nofollow ugc noopener\">#13270</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13281\" rel=\"nofollow ugc noopener\">#13281</a></p>\n<p>Ghostty now supports Kitty graphics\n<a href=\"https://sw.kovidgoyal.net/kitty/graphics-protocol/#animation\" rel=\"nofollow ugc noopener\">animation</a>\nand <a href=\"https://sw.kovidgoyal.net/kitty/graphics-protocol/#relative-placements\" rel=\"nofollow ugc noopener\">relative placements</a>.\nThese were the last major features of the Kitty graphics protocol that\nGhostty didn&#39;t support.</p>\n<p>Programs that display animated images with the Kitty protocol, such as an\nanimated GIF shown with <code>kitten icat</code>, now animate in Ghostty instead of\nshowing a single still frame. Frame transmission, composition, and playback\ncontrol are all supported, and animations pause while the terminal isn&#39;t\nvisible. Relative placements let a program position one image relative to\nanother image&#39;s placement, so the child image moves along with its parent.</p>\n<p>We also did a full conformance pass against the specification and Kitty\nitself, fixing dozens of behavioral differences. For example, images now\nscroll with text inside scroll regions (<a href=\"https://github.com/ghostty-org/ghostty/issues/4323\" rel=\"nofollow ugc noopener\">#4323</a> ), retransmitting an image\nID replaces the old image (<a href=\"https://github.com/ghostty-org/ghostty/issues/6711\" rel=\"nofollow ugc noopener\">#6711</a> ), and invalid image data now gets an\nerror response instead of silence, which could leave clients hanging. The\nfull list is in the <a href=\"#terminal-capabilities\">terminal capabilities</a> section.</p>\n<p>Kitty graphics are faster, too. Image payloads are now parsed in bulk\nwith SIMD instead of one byte at a time, making large image transfers\n<strong>about 16x faster</strong> to parse in our benchmarks (64 MiB of image data,\nx86_64 Linux), and drawing images costs much less per frame.</p>\n<p>Our Kitty graphics implementation now covers 100% of the published\nspecification, making Ghostty (and libghostty) the first terminal\nto do this outside of Kitty itself.</p>\n<h3 id=\"scrollback-compression-and-lower-memory-usage\">Scrollback Compression and Lower Memory Usage</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/13264\" rel=\"nofollow ugc noopener\">#13264</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13473\" rel=\"nofollow ugc noopener\">#13473</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13240\" rel=\"nofollow ugc noopener\">#13240</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13245\" rel=\"nofollow ugc noopener\">#13245</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14130\" rel=\"nofollow ugc noopener\">#14130</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14137\" rel=\"nofollow ugc noopener\">#14137</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14138\" rel=\"nofollow ugc noopener\">#14138</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14017\" rel=\"nofollow ugc noopener\">#14017</a></p>\n<p>Ghostty now transparently compresses scrollback that isn&#39;t visible,\nreducing the physical memory those pages use by <strong>70% to 90%</strong> for typical\ntext-heavy history. Compression only runs while the terminal is idle and\npages are decompressed on demand when you scroll back or search, so it\nhas no measurable impact on I/O throughput.</p>\n<p>Thanks to compression, <strong>the default scrollback limit has been raised from\n10 MB to 50 MB</strong> per terminal. On platforms that support compression, a\nfull scrollback still generally uses less physical memory than the old\n10 MB limit did.</p>\n<blockquote><p>Note</p>\n<p>Compression lowers <em>resident</em> (physical) memory, not <em>virtual</em> memory, so\nlook at resident memory when measuring it. It is currently available on\nmacOS and 64-bit Linux.</p></blockquote>\n<p>Beyond scrollback, memory usage is lower in many places:</p>\n<ul><li><p>A new, empty terminal now uses about <strong>16 KiB</strong> of terminal page memory</p><p>on macOS, down from 128 KiB in Ghostty 1.3.1.</p></li><li><p>On macOS and Linux, memory freed by clearing or trimming scrollback is</p><p>now returned to the OS instead of being held until the terminal closes.</p></li><li><p>Hidden tabs release their GPU resources. On macOS, with one visible tab</p><p>and 20 hidden tabs, GPU memory dropped from about 385 MiB to 18 MiB.\nRebuilding them when a tab becomes visible again takes under a\nmillisecond.</p></li></ul>\n<h3 id=\"performance-improvements\">Performance Improvements</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/13209\" rel=\"nofollow ugc noopener\">#13209</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13220\" rel=\"nofollow ugc noopener\">#13220</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13226\" rel=\"nofollow ugc noopener\">#13226</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13227\" rel=\"nofollow ugc noopener\">#13227</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13537\" rel=\"nofollow ugc noopener\">#13537</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13827\" rel=\"nofollow ugc noopener\">#13827</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13587\" rel=\"nofollow ugc noopener\">#13587</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14011\" rel=\"nofollow ugc noopener\">#14011</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13722\" rel=\"nofollow ugc noopener\">#13722</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14035\" rel=\"nofollow ugc noopener\">#14035</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12760\" rel=\"nofollow ugc noopener\">#12760</a></p>\n<p>There are performance improvements across the board in Ghostty 1.4\nthat yield significant gains compared to prior Ghostty versions.</p>\n<p>The biggest win came from a surprising discovery: on macOS, the kernel\ncaps every read from a pty at about 1 KiB no matter how large the read\nbuffer is. Previously, Ghostty processed each read as it arrived, so per-read\noverhead was paid every kilobyte, and the program writing output sat\nblocked while we parsed. Ghostty now drains the pty on one thread while\nparsing on another, raising end-to-end I/O throughput by <strong>25% to 55%</strong>\non macOS (M4 Max, plain and Unicode text) over Ghostty 1.3.x.</p>\n<p>VT processing itself is also much faster. In parser benchmarks, plain\nASCII text went from 128 MB/s to 725 MB/s (5.7x), CJK text got 3.4x\nfaster, and a 2.6 GB dataset of real-world terminal recordings\nfrom <a href=\"https://asciinema.org/\" rel=\"nofollow ugc noopener\">asciinema</a> is processed about 25% faster.\nTogether, these changes took <code>cat</code>-ing a 150 MB text file on macOS from\n1.5 seconds to 566 milliseconds.</p>\n<p>Other notable improvements:</p>\n<ul><li><p><strong>Resize:</strong> resizing a terminal with a large scrollback is about **6x</p><p>faster** (120x80 with 10,000 lines of scrollback), and 3x to 5x faster\nwith history full of CJK text or emoji.</p></li><li><p><strong>Rendering:</strong> the renderer holds the terminal lock <strong>2.7x to 11x</strong></p><p>less per frame, leaving more time for the I/O thread during heavy\noutput.</p></li><li><p><strong>Copy and search:</strong> formatting terminal contents as plain text, HTML,</p><p>or VT, which backs clipboard copy, <code>write_screen_file</code>, and scrollback\nsearch, is 1.5x to 8x faster.</p></li><li><p><strong>Launch (macOS):</strong> about 15% faster from launch to visible window, and</p><p>27% faster to the first rendered frame.</p></li><li><p><strong>Idle energy:</strong> on macOS, the renderer&#39;s display link now sleeps when</p><p>there&#39;s nothing to draw. On GTK, hidden tabs stop rendering, matching\nmacOS.</p></li><li><p><strong>Large OSC sequences:</strong> OSC 52 clipboard payloads parse about **30x</p><p>faster**, and even short sequences like title changes are about 6x\nfaster.</p></li></ul>\n<h3 id=\"new-opengl-renderer-linux-freebsd\">New OpenGL Renderer (Linux, FreeBSD)</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/14052\" rel=\"nofollow ugc noopener\">#14052</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14269\" rel=\"nofollow ugc noopener\">#14269</a></p>\n<p>The GTK app has a new rendering pipeline. It no longer uses <code>GtkGLArea</code>.\nInstead, the renderer draws with EGL on its own thread, exports each frame\nas a DMABUF, and hands it to GTK to display. Rendering is now\ntriple-buffered, which should greatly reduce tearing, and no OpenGL calls\nrun on the main thread anymore, which let us remove a number of\nworkarounds.</p>\n<p>The most visible result is crisp text under fractional scaling. Text and\nbox-drawing characters are no longer blurry with fractional display\nscaling such as 125% or 150% (<a href=\"https://github.com/ghostty-org/ghostty/issues/1938\" rel=\"nofollow ugc noopener\">#1938</a> ). We fixed this once before, but it\ncame back after upstream GTK changes. Ghostty now renders at the window&#39;s\ntrue fractional scale, so every rendered pixel maps to exactly one pixel\non screen.</p>\n<p>The new render surface needs a system EGL library (see\n<a href=\"#changes-for-package-maintainers\">Changes for Package Maintainers</a>).\nOn GPU drivers that can&#39;t export DMABUFs, Ghostty falls back to copying\nframes through the CPU, which is slower but works.</p>\n<h3 id=\"kitty-clipboard-protocol\">Kitty Clipboard Protocol</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/13962\" rel=\"nofollow ugc noopener\">#13962</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13993\" rel=\"nofollow ugc noopener\">#13993</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13995\" rel=\"nofollow ugc noopener\">#13995</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13998\" rel=\"nofollow ugc noopener\">#13998</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14002\" rel=\"nofollow ugc noopener\">#14002</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14061\" rel=\"nofollow ugc noopener\">#14061</a></p>\n<p>Ghostty now implements the\n<a href=\"https://sw.kovidgoyal.net/kitty/clipboard/\" rel=\"nofollow ugc noopener\">Kitty clipboard protocol</a>\n(OSC 5522) on both macOS and GTK. Ghostty 1.3 could parse the protocol\nbut didn&#39;t implement it.</p>\n<p>OSC 52 can only read and write plain text. The Kitty clipboard protocol\nlets programs running in the terminal read and write any kind of clipboard\ndata, such as images or HTML, and lets them pick among the formats on the\nclipboard. Programs can also enable paste events (mode 5522), which tell\nthe program what formats a paste contains so it can read the one it\nwants. This is how a terminal program can accept a pasted image, for\nexample.</p>\n<p>Clipboard access follows the existing <code>clipboard-read</code> and\n<code>clipboard-write</code> configurations. By default, reads prompt for permission\nand writes are allowed. The permission prompt shows a preview of the\nclipboard contents, including images. Programs that send a password can\nhave your answer remembered for the rest of that terminal session. A new\n<code>clipboard-write-limit-bytes</code> configuration limits the size of a single\nwrite (default 64 MiB). A write over the limit fails and leaves the\nclipboard untouched.</p>\n<h3 id=\"split-drag-and-drop-gtk\">Split Drag and Drop (GTK)</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/10423\" rel=\"nofollow ugc noopener\">#10423</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13706\" rel=\"nofollow ugc noopener\">#13706</a></p>\n<p>You can now rearrange splits on GTK by dragging them, matching the macOS\nfeature introduced in Ghostty 1.3. When a tab has two or more splits, each\nsplit shows a drag handle at the top. Grab the handle and drop the split\nonto any other split, including splits in other tabs and windows. An\noverlay shows which side of the target split it will land on. The terminal\ncontents, working directory, and running processes all move with it.</p>\n<p>A new <code>drag-handle</code> configuration controls when drag handles are shown on\nboth macOS and GTK: <code>auto</code> (default), <code>always</code>, or <code>never</code>. With <code>never</code>,\nsplits can&#39;t be rearranged with the mouse. Hiding the handles was a\ncommon request from users who found them in the way.</p>\n<p>On GTK, splits can only be dropped onto other splits. Dragging a split out\nto create a new tab or window is macOS-only.</p>\n<h3 id=\"terminal-emulation-accuracy\">Terminal Emulation Accuracy</h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/14454\" rel=\"nofollow ugc noopener\">#14454</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13494\" rel=\"nofollow ugc noopener\">#13494</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14483\" rel=\"nofollow ugc noopener\">#14483</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14538\" rel=\"nofollow ugc noopener\">#14538</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14673\" rel=\"nofollow ugc noopener\">#14673</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14375\" rel=\"nofollow ugc noopener\">#14375</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14144\" rel=\"nofollow ugc noopener\">#14144</a></p>\n<p>Ghostty 1.4 includes dozens of improvements to core terminal emulation. We\nnow run <a href=\"https://github.com/ThomasDickey/esctest2\" rel=\"nofollow ugc noopener\">esctest</a>, Thomas Dickey&#39;s\nterminal conformance suite, against Ghostty&#39;s terminal core in CI.\nAlongside that, we fixed many differences from xterm in cursor movement\nwithin margins, tab stops, character sets, mode reports, and more. You\ncan find the full list of related changes in the\n<a href=\"#terminal-capabilities\">terminal capabilities</a> section.</p>\n<p>Ghostty also supports several new sequences, including soft terminal reset\n(DECSTR), extended cursor position reports (DECXCPR), backarrow key mode\n(DECBKM), and screen size reports in characters (<code>CSI 19 t</code>). Programs can\nalso now ask whether the terminal is visible using\n<a href=\"https://rockorager.dev/misc/visibility-reports/\" rel=\"nofollow ugc noopener\">visibility reports</a>\n(mode 2033), so they can stop rendering while hidden.</p>\n<p>Keyboard encoding also matches xterm more closely, with fixes for\n<code>modifyOtherKeys</code> mode 2 and legacy Alt-as-Escape encoding of non-ASCII\nkeys.</p>\n<p>Two new sequences are disabled by default because they can be abused by\nuntrusted programs, including ones running on a remote machine:</p>\n<pre><code># Allow programs to resize the window (CSI 8 t)\nvt-window-resize-allowed = true\n\n# Allow programs to request screen checksums (DECRQCRA)\nvt-xt-checksum-report = true</code></pre>\n<h3 id=\"ssh-integration-with-ghostty-ssh\">SSH Integration with <code>ghostty +ssh</code></h3>\n<p>PRs: <a href=\"https://github.com/ghostty-org/ghostty/issues/12582\" rel=\"nofollow ugc noopener\">#12582</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12814\" rel=\"nofollow ugc noopener\">#12814</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13533\" rel=\"nofollow ugc noopener\">#13533</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13844\" rel=\"nofollow ugc noopener\">#13844</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14472\" rel=\"nofollow ugc noopener\">#14472</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14854\" rel=\"nofollow ugc noopener\">#14854</a></p>\n<p>Ghostty 1.2 introduced <a href=\"https://ghostty.org/docs/features/ssh\" rel=\"nofollow ugc noopener\">SSH shell integration features</a>\nas a work in progress. In Ghostty 1.4, they&#39;re backed by a new\n<code>ghostty +ssh</code> CLI action: a drop-in <code>ssh</code> wrapper that prepares the\nremote session for Ghostty and then runs the real <code>ssh</code> with your\narguments forwarded unchanged.</p>\n<pre><code>ghostty +ssh user@example.com\n\n# Or alias it so every ssh invocation goes through it\nalias ssh=&#39;ghostty +ssh --&#39;</code></pre>\n<p>Before connecting, <code>+ssh</code> installs Ghostty&#39;s terminfo on the remote host\nso the proper <code>xterm-ghostty</code> <code>TERM</code> value can be used, and forwards\n<code>COLORTERM</code>, <code>TERM_PROGRAM</code>, and <code>TERM_PROGRAM_VERSION</code>. If the terminfo\ninstall fails (for example, <code>tic</code> isn&#39;t available on the remote), it falls\nback to <code>TERM=xterm-256color</code>. Flags such as <code>--terminfo=false</code>,\n<code>--forward-env=false</code>, and <code>--verbose</code> control each step.</p>\n<p>The <code>ssh-env</code> and <code>ssh-terminfo</code> shell integration features (still opt-in)\nnow call <code>+ssh</code> too. Previously, each shell integration carried its own copy\nof this logic, which made up roughly a third of our shell integration\nscripts. Now bash, zsh, fish, elvish, and Nushell all behave identically,\nand you can get the same behavior from scripts or anywhere else by calling\n<code>ghostty +ssh</code> directly.</p>\n<p>The terminfo install itself is also more reliable. Ghostty now always\ninstalls its own bundled terminfo rather than accepting whatever\n<code>xterm-ghostty</code> entry the remote already has, and it reinstalls\nautomatically when a Ghostty update changes the terminfo. It also no longer\nneeds <code>infocmp</code> or Ghostty&#39;s terminfo on the local machine. Installs are\ncached per host <em>and</em> port, so two machines behind one address no longer\nshare a cache entry. And <code>ssh-env</code> no longer silently overrides <code>SetEnv</code>\nentries in your <code>~/.ssh/config</code> (<a href=\"https://github.com/ghostty-org/ghostty/issues/11518\" rel=\"nofollow ugc noopener\">#11518</a> ).</p>\n<p>The <code>+ssh-cache</code> command that manages this cache now takes positional\ndestinations (<code>ghostty +ssh-cache user@example.com</code>) and has a new\n<code>--prune=30d</code> flag. See the <a href=\"#breaking-changes\">breaking changes</a> if you\nscript against <code>+ssh-cache</code>.</p>\n<h2 id=\"system-requirements\">System Requirements</h2>\n<p><strong>macOS:</strong> The minimum required macOS version for Ghostty 1.4 remains\nunchanged (macOS 13 Ventura). Ghostty is now compatible with macOS 27.</p>\n<p><strong>GTK:</strong> Ghostty 1.4 requires <strong>GTK 4.18</strong> and <strong>libadwaita 1.7</strong>, up from\nGTK 4.14 and libadwaita 1.5 in Ghostty 1.3. This aligns with our\n<a href=\"https://ghostty.org/docs/linux/#supported-gtkadwaita-versions\" rel=\"nofollow ugc noopener\">GTK/Adwaita version policy</a>.\nNotably, Ubuntu 24.04 LTS doesn&#39;t meet this requirement. Systems with\nolder GTK or Adwaita versions can work around this requirement by using an\nolder version of Ghostty or the Flatpak package. <a href=\"https://github.com/ghostty-org/ghostty/issues/14330\" rel=\"nofollow ugc noopener\">#14330</a></p>\n<p><strong>OpenGL (GTK):</strong> The minimum required OpenGL version remains 4.3, but\nGhostty now renders through EGL instead of GTK&#39;s OpenGL widget. This\nshould be invisible for nearly everyone, but if Ghostty fails to start\nwith an EGL error, please make sure your GPU driver provides a working\nEGL implementation.</p>\n<blockquote><p>Important</p>\n<p>We previously announced that Ghostty 1.4 would require macOS 14.\nNothing forced our hand to do this in this release, so we kept macOS\n13 support. <strong>We still plan to drop macOS 13 in a future release.</strong> Apple\ndropped security support for macOS 13 in the fall of 2025, so we\nrecommend upgrading regardless.</p></blockquote>\n<h2 id=\"breaking-changes\">Breaking Changes</h2>\n<p>The following behaviors have changed in 1.4.0:</p>\n<ul><li><p><code>copy-on-select</code> has been reworked and now accepts <code>none</code>, <code>primary</code>,</p><p><code>clipboard</code>, or <code>both</code>. <strong>The meaning of <code>clipboard</code> has changed:</strong> it\npreviously copied to both the selection clipboard and the system\nclipboard, and now copies only to the system clipboard. If you set\n<code>copy-on-select = clipboard</code> and want the old behavior, change it to\n<code>both</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/12600\" rel=\"nofollow ugc noopener\">#12600</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12604\" rel=\"nofollow ugc noopener\">#12604</a></p></li><li><p>macOS: <code>copy-on-select</code> now defaults to <code>none</code> (previously <code>true</code>), so</p><p>selecting text no longer copies it anywhere and middle-click paste of the\nselection no longer works by default. To restore the 1.3 behavior, set\n<code>copy-on-select = primary</code>. Note that an explicit <code>copy-on-select = true</code>\non macOS now copies selections to the system clipboard, which is\ndifferent from 1.3. <a href=\"https://github.com/ghostty-org/ghostty/issues/12600\" rel=\"nofollow ugc noopener\">#12600</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12604\" rel=\"nofollow ugc noopener\">#12604</a></p></li><li><p>macOS: <code>cmd+arrow_up</code> and <code>cmd+arrow_down</code> now run <code>jump_to_prompt</code> again,</p><p>matching Terminal.app and Ghostty 1.2. In 1.3, these keys were hardcoded\nto scroll to the top and bottom and couldn&#39;t be rebound. To keep the 1.3\nbehavior, set <code>keybind = cmd+arrow_up=scroll_to_top</code> and\n<code>keybind = cmd+arrow_down=scroll_to_bottom</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/12245\" rel=\"nofollow ugc noopener\">#12245</a></p></li><li><p>GTK: The default <code>ctrl+shift+page_up</code> and <code>ctrl+shift+page_down</code> keybinds</p><p>now move the current tab left and right (<code>move_tab</code>), matching Firefox,\nGNOME Terminal, and VS Code. <code>jump_to_prompt</code> moved to\n<code>ctrl+shift+arrow_up</code> and <code>ctrl+shift+arrow_down</code>, so programs running in\nthe terminal no longer receive those keys. If a program you use needs\nthem, unbind them with <code>keybind = ctrl+shift+arrow_up=unbind</code> and\n<code>keybind = ctrl+shift+arrow_down=unbind</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/4998\" rel=\"nofollow ugc noopener\">#4998</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12458\" rel=\"nofollow ugc noopener\">#12458</a></p></li></ul>\n<h3 id=\"deprecations\">Deprecations</h3>\n<p>The list below contains deprecations that remain compatible today through\na compatibility layer, but may break in a future release if they are\nignored:</p>\n<ul><li><p><code>scrollback-limit</code> has been renamed to <code>scrollback-limit-bytes</code>, to make</p><p>room for the new <code>scrollback-limit-lines</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13473\" rel=\"nofollow ugc noopener\">#13473</a></p></li><li><p><code>copy-on-select = true</code> is replaced with <code>copy-on-select = primary</code> on</p><p>Linux and FreeBSD, or <code>copy-on-select = clipboard</code> on macOS.\n<code>copy-on-select = false</code> is replaced with <code>copy-on-select = none</code>.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12600\" rel=\"nofollow ugc noopener\">#12600</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12604\" rel=\"nofollow ugc noopener\">#12604</a></p></li></ul>\n<p>There is no set timeline to remove these deprecations, but we recommend\nadapting to the new configurations sooner rather than later to avoid\nany possible disruptions in the future.</p>\n<h2 id=\"full-changelog\">Full Changelog</h2>\n<ul><li><p>Scrollback history is now transparently compressed while the terminal</p><p>is idle, reducing the physical memory used by compressed scrollback by\n70% to 90% for typical text. Compression is available on macOS and 64-bit\nLinux and can be disabled with the new <code>scrollback-compression</code>\nconfiguration. Because of this, the default scrollback limit has been\nraised from 10 MB to 50 MB, which on average still uses less memory than\na full scrollback did previously. <a href=\"https://github.com/ghostty-org/ghostty/issues/13264\" rel=\"nofollow ugc noopener\">#13264</a></p></li><li><p>A new configuration <code>scrollback-limit-lines</code> limits scrollback by number</p><p>of lines instead of bytes. The existing <code>scrollback-limit</code> configuration\nhas been renamed to <code>scrollback-limit-bytes</code> (the old name continues to\nwork). If both are set, the first limit reached applies, and both accept\n<code>unlimited</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13473\" rel=\"nofollow ugc noopener\">#13473</a></p></li><li><p><code>copy-on-select</code> now accepts <code>none</code>, <code>primary</code>, <code>clipboard</code>, and <code>both</code></p><p>and no longer affects middle-click paste (see <code>middle-click-action</code>).\n<code>clipboard</code> now copies only to the system clipboard, so use <code>both</code> for the\nprevious behavior. The default on macOS is now <code>none</code>. See the\n<a href=\"#breaking-changes\">breaking changes</a> for migration details. <a href=\"https://github.com/ghostty-org/ghostty/issues/12600\" rel=\"nofollow ugc noopener\">#12600</a></p></li><li><p>A new configuration <code>middle-click-action</code> configures the behavior of</p><p>middle-clicking: <code>primary-paste</code> (default) pastes from the selection\nclipboard, <code>clipboard-paste</code> pastes from the system clipboard, and\n<code>ignore</code> does nothing. <a href=\"https://github.com/ghostty-org/ghostty/issues/12478\" rel=\"nofollow ugc noopener\">#12478</a></p></li><li><p>A new binding action <code>move_tab_to_new_window</code> moves the current tab into</p><p>a new window of its own. It is also available in the command palette.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/2630\" rel=\"nofollow ugc noopener\">#2630</a></p></li><li><p>A new CLI command <code>+explain-config</code> prints the documentation for a</p><p>configuration option or binding action, e.g.\n<code>ghostty +explain-config font-size</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11546\" rel=\"nofollow ugc noopener\">#11546</a></p></li><li><p>The <code>+explain-config</code> and <code>+show-config</code> CLI commands now page their</p><p>output through <code>$GHOSTTY_PAGER</code> or <code>$PAGER</code> (falling back to <code>less</code>) when\nrun interactively. Paging can be disabled with <code>--no-pager</code> or by setting\nthe pager to an empty value. <a href=\"https://github.com/ghostty-org/ghostty/issues/11940\" rel=\"nofollow ugc noopener\">#11940</a></p></li><li><p>A new configuration <code>drag-handle</code> controls when the split drag handles</p><p>are shown: <code>auto</code> (default), <code>always</code>, or <code>never</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13706\" rel=\"nofollow ugc noopener\">#13706</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13709\" rel=\"nofollow ugc noopener\">#13709</a></p></li><li><p>Scrollback search now wraps around when navigating past the first or</p><p>last match. <a href=\"https://github.com/ghostty-org/ghostty/issues/11449\" rel=\"nofollow ugc noopener\">#11449</a></p></li><li><p>A new configuration <code>link-osc8</code> (default <code>true</code>) can be set to <code>false</code> to</p><p>disable OSC 8 hyperlinks entirely. Disabled OSC 8 hyperlinks are not\nhighlighted, previewed, copied, or opened. <a href=\"https://github.com/ghostty-org/ghostty/issues/13634\" rel=\"nofollow ugc noopener\">#13634</a></p></li><li><p>Processes running in Ghostty now receive a <code>GHOSTTY_SURFACE_ID</code></p><p>environment variable that uniquely identifies the terminal they are\nrunning in. <a href=\"https://github.com/ghostty-org/ghostty/issues/12027\" rel=\"nofollow ugc noopener\">#12027</a></p></li><li><p>The right-click context menu now has a &quot;Close Split&quot; item. <a href=\"https://github.com/ghostty-org/ghostty/issues/11173\" rel=\"nofollow ugc noopener\">#11173</a> </p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/11174\" rel=\"nofollow ugc noopener\">#11174</a></p></li><li>Upgrade to Unicode 18. <a href=\"https://github.com/ghostty-org/ghostty/issues/14293\" rel=\"nofollow ugc noopener\">#14293</a></li><li><p>I/O throughput is 25% to 55% higher on macOS by reading from the pty</p><p>concurrently with parsing previously read output. <a href=\"https://github.com/ghostty-org/ghostty/issues/13209\" rel=\"nofollow ugc noopener\">#13209</a></p></li><li><p>VT processing is significantly faster across the board. Plain text is up</p><p>to ~6x faster, real-world output (measured against a large asciinema\ndataset) is ~24% faster, grapheme-heavy output is ~3x faster, and DEC\nspecial graphics (line drawing), repeated characters (<code>REP</code>),\nhyperlink-heavy output, and scroll regions are all faster. <a href=\"https://github.com/ghostty-org/ghostty/issues/13220\" rel=\"nofollow ugc noopener\">#13220</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13226\" rel=\"nofollow ugc noopener\">#13226</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13231\" rel=\"nofollow ugc noopener\">#13231</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13294\" rel=\"nofollow ugc noopener\">#13294</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13625\" rel=\"nofollow ugc noopener\">#13625</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13826\" rel=\"nofollow ugc noopener\">#13826</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14356\" rel=\"nofollow ugc noopener\">#14356</a></p></li><li><p>Large OSC sequences, such as OSC 52 clipboard writes, are parsed ~30x</p><p>faster and small OSC sequences, such as title changes, ~6x faster.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14011\" rel=\"nofollow ugc noopener\">#14011</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13565\" rel=\"nofollow ugc noopener\">#13565</a></p></li><li><p>Resizing with reflow is ~6x faster with large scrollback and 3x to 5x</p><p>faster with scrollback heavy in wide characters such as CJK or emoji.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13537\" rel=\"nofollow ugc noopener\">#13537</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13827\" rel=\"nofollow ugc noopener\">#13827</a></p></li><li><p>Terminals use significantly less memory. A new terminal now uses ~16 KiB</p><p>of physical memory for its screen instead of 128 KiB on macOS, every\nterminal page uses 30% less memory, and memory freed from scrollback\n(such as by clearing it) is now returned to the operating system.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13240\" rel=\"nofollow ugc noopener\">#13240</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13245\" rel=\"nofollow ugc noopener\">#13245</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14130\" rel=\"nofollow ugc noopener\">#14130</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14137\" rel=\"nofollow ugc noopener\">#14137</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14138\" rel=\"nofollow ugc noopener\">#14138</a></p></li><li><p>Kitty graphics are faster. Large image transfers are parsed in bulk using</p><p>SIMD, zlib-compressed images decompress ~17% faster, pixel format\nconversion avoids an extra copy, and the per-frame cost of drawing images\nis much lower, especially with Unicode placeholder images on screen or\nlong scrollback. <a href=\"https://github.com/ghostty-org/ghostty/issues/13270\" rel=\"nofollow ugc noopener\">#13270</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13281\" rel=\"nofollow ugc noopener\">#13281</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13987\" rel=\"nofollow ugc noopener\">#13987</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14422\" rel=\"nofollow ugc noopener\">#14422</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14780\" rel=\"nofollow ugc noopener\">#14780</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14789\" rel=\"nofollow ugc noopener\">#14789</a></p></li><li><p>Formatting terminal contents is 1.5x to 8x faster, which speeds up</p><p>clipboard copy (plain, HTML, and VT), <code>write_screen_file</code> and related\nactions, and scrollback search. <a href=\"https://github.com/ghostty-org/ghostty/issues/13587\" rel=\"nofollow ugc noopener\">#13587</a></p></li><li><p>The renderer holds the terminal lock 2.7x to 11x less time per frame,</p><p>and glyph and font lookups are faster. <a href=\"https://github.com/ghostty-org/ghostty/issues/13227\" rel=\"nofollow ugc noopener\">#13227</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14300\" rel=\"nofollow ugc noopener\">#14300</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14301\" rel=\"nofollow ugc noopener\">#14301</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14420\" rel=\"nofollow ugc noopener\">#14420</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14406\" rel=\"nofollow ugc noopener\">#14406</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13258\" rel=\"nofollow ugc noopener\">#13258</a></p></li><li><p><code>command-palette-entry = clear</code> removes all command palette entries,</p><p>including the default entries. <a href=\"https://github.com/ghostty-org/ghostty/issues/12682\" rel=\"nofollow ugc noopener\">#12682</a></p></li><li><p><code>window-padding-balance</code> has a new value <code>equal</code> that balances padding</p><p>equally on all four sides without capping the top padding. <a href=\"https://github.com/ghostty-org/ghostty/issues/11491\" rel=\"nofollow ugc noopener\">#11491</a></p></li><li><p><code>theme</code> now expands <code>~</code> to the home directory in theme file paths,</p><p>including in separate light and dark themes. <a href=\"https://github.com/ghostty-org/ghostty/issues/13840\" rel=\"nofollow ugc noopener\">#13840</a></p></li><li><p><code>+list-themes</code> now supports <code>g</code> and <code>G</code> to jump to the first and</p><p>last theme, and <code>ctrl+d</code> and <code>ctrl+u</code> to page down and up. <a href=\"https://github.com/ghostty-org/ghostty/issues/13681\" rel=\"nofollow ugc noopener\">#13681</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14607\" rel=\"nofollow ugc noopener\">#14607</a></p></li><li><p>The terminal inspector can now copy terminal I/O events or export them</p><p>to a file. <a href=\"https://github.com/ghostty-org/ghostty/issues/13519\" rel=\"nofollow ugc noopener\">#13519</a></p></li><li><p>Bundled themes updated to <a href=\"https://github.com/mbadolato/iTerm2-Color-Schemes/releases/tag/release-20261019-151001-86a776d\" rel=\"nofollow ugc noopener\">release-20261019-151001-86a776d</a>.</p><p>This adds 356 new themes and renames or removes none. The colors of 10\nexisting themes changed upstream: Adwaita, Adwaita Dark, Atom One Light,\nCatppuccin Frappe, Catppuccin Latte, Catppuccin Macchiato, Catppuccin\nMocha, Cursor Dark, Dark Modern, and Electron Highlighter.</p></li><li><p>Fix configuration parsing silently ignoring all settings after a comment</p><p>or blank line that happened to end at an internal buffer boundary. This\ntypically only affected long configuration files. <a href=\"https://github.com/ghostty-org/ghostty/issues/13638\" rel=\"nofollow ugc noopener\">#13638</a></p></li><li><p>Fix a performance degradation where, after a long uptime, the renderer</p><p>rebuilt its full terminal state on every frame. <a href=\"https://github.com/ghostty-org/ghostty/issues/13585\" rel=\"nofollow ugc noopener\">#13585</a></p></li><li><p>Fix the automatically created configuration file being empty instead of</p><p>containing the configuration template. <a href=\"https://github.com/ghostty-org/ghostty/issues/13774\" rel=\"nofollow ugc noopener\">#13774</a></p></li><li><p><code>+edit-config</code> works when <code>$EDITOR</code> or <code>$VISUAL</code> contains arguments,</p><p>such as <code>zed --new</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11897\" rel=\"nofollow ugc noopener\">#11897</a></p></li><li><code>adjust-cursor-height</code> works again. <a href=\"https://github.com/ghostty-org/ghostty/issues/13225\" rel=\"nofollow ugc noopener\">#13225</a></li><li><p>Mouse selection improvements: dragging after a <code>ctrl</code>/<code>cmd</code> triple-click</p><p>output selection now extends the selection by command output, autoscroll\nstops when the screen switches (e.g. to the alternate screen), a force\ntouch on macOS selects the word at the press location without starting a\ndrag, and releasing a drag no longer activates a link or prompt click.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12830\" rel=\"nofollow ugc noopener\">#12830</a></p></li><li><p>Double-click word selection no longer continues across hard line breaks,</p><p>and double-clicking either half of a wide character (such as CJK) selects\nthe whole word. <a href=\"https://github.com/ghostty-org/ghostty/issues/14354\" rel=\"nofollow ugc noopener\">#14354</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14391\" rel=\"nofollow ugc noopener\">#14391</a></p></li><li><p>Wide characters at the edges of a selection are now consistently rendered</p><p>as selected and included when copying, including when the wide character\nwraps onto a new internal page. <a href=\"https://github.com/ghostty-org/ghostty/issues/14632\" rel=\"nofollow ugc noopener\">#14632</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14651\" rel=\"nofollow ugc noopener\">#14651</a></p></li><li><p>Triple-click line selection no longer pulls in neighboring prompt text</p><p>when clicking blank cells between OSC 133 prompt boundaries. <a href=\"https://github.com/ghostty-org/ghostty/issues/14553\" rel=\"nofollow ugc noopener\">#14553</a></p></li><li><p>Link detection and double-click selection no longer merge prompt text</p><p>with the command text next to it when shell integration is active.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12435\" rel=\"nofollow ugc noopener\">#12435</a></p></li><li><p>File paths opened with <code>cmd</code>/<code>ctrl</code>-click no longer include trailing</p><p>spaces, which broke opening paths printed by some TUIs. <a href=\"https://github.com/ghostty-org/ghostty/issues/13505\" rel=\"nofollow ugc noopener\">#13505</a></p></li><li><p>Mouse releases are now reported to the program that received the mouse</p><p>press when clicking at a shell prompt with click-to-move enabled. This\nfixes double-click selection in programs like fzf&#39;s <code>ctrl+r</code> history\nsearch. <a href=\"https://github.com/ghostty-org/ghostty/issues/14710\" rel=\"nofollow ugc noopener\">#14710</a></p></li><li><p>Shell redraws after a resize are no longer processed at the old terminal</p><p>size. This fixes one cause of duplicated or misplaced prompts after\nresizing. <a href=\"https://github.com/ghostty-org/ghostty/issues/14706\" rel=\"nofollow ugc noopener\">#14706</a></p></li><li><p>Scrolling, such as clicking in the scrollbar, now works with very large</p><p>scrollback (millions of lines). <a href=\"https://github.com/ghostty-org/ghostty/issues/13048\" rel=\"nofollow ugc noopener\">#13048</a></p></li><li><p>Custom <code>command-palette-entry</code> actions with string parameters, such as</p><p><code>set_tab_title</code>, no longer have their parameters escaped when run from\nthe command palette. <a href=\"https://github.com/ghostty-org/ghostty/issues/13609\" rel=\"nofollow ugc noopener\">#13609</a></p></li><li><p>HTML clipboard copies no longer include a superfluous trailing newline.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/13543\" rel=\"nofollow ugc noopener\">#13543</a></p></li><li><p>Copying as VT (<code>copy_to_clipboard:vt</code>) and VT screen files now preserve</p><p>OSC 8 hyperlinks, empty gaps between text, and cells that only have\na background color, such as colored status bars. VT screen files also\nkeep trailing blank rows. <a href=\"https://github.com/ghostty-org/ghostty/issues/14711\" rel=\"nofollow ugc noopener\">#14711</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14725\" rel=\"nofollow ugc noopener\">#14725</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14766\" rel=\"nofollow ugc noopener\">#14766</a></p></li><li><p>The mouse pointer now restores the shape set by the running program</p><p>(OSC 22) after releasing modifier keys instead of resetting to the\ndefault. <a href=\"https://github.com/ghostty-org/ghostty/issues/14128\" rel=\"nofollow ugc noopener\">#14128</a></p></li><li><p>Custom shaders no longer receive swapped selection foreground and</p><p>background color uniforms. <a href=\"https://github.com/ghostty-org/ghostty/issues/14460\" rel=\"nofollow ugc noopener\">#14460</a></p></li><li><p>Ghostty no longer floods the logs with &quot;adjusting page capacity&quot;</p><p>messages during output with many styles, graphemes, or hyperlinks.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14631\" rel=\"nofollow ugc noopener\">#14631</a></p></li><li><p>Fix stale wrap and prompt state on rows reused after scrolling or</p><p>erasing, which could cause incorrect copy, search, selection, and reflow\nresults. <a href=\"https://github.com/ghostty-org/ghostty/issues/14010\" rel=\"nofollow ugc noopener\">#14010</a></p></li><li><p>Fix stale rendering of the previous row after erasing or deleting a</p><p>wrapped wide character. <a href=\"https://github.com/ghostty-org/ghostty/issues/14054\" rel=\"nofollow ugc noopener\">#14054</a></p></li><li><p>Fix a freeze when reloading the configuration while a program is flooding</p><p>the terminal with queries, such as color queries. <a href=\"https://github.com/ghostty-org/ghostty/issues/14833\" rel=\"nofollow ugc noopener\">#14833</a></p></li><li><p><code>+list-themes</code> no longer crashes on some keys when the search</p><p>matches no themes, and the keypad down key now moves one row instead of</p>\n<ol start=\"21\"><li><a href=\"https://github.com/ghostty-org/ghostty/issues/14612\" rel=\"nofollow ugc noopener\">#14612</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14605\" rel=\"nofollow ugc noopener\">#14605</a></li></ol></li><li><p>Fix crashes in scrollback search after clearing the scrollback, resizing,</p><p>or erasing history. <a href=\"https://github.com/ghostty-org/ghostty/issues/11957\" rel=\"nofollow ugc noopener\">#11957</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13274\" rel=\"nofollow ugc noopener\">#13274</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13282\" rel=\"nofollow ugc noopener\">#13282</a></p></li><li><p>Fix crashes and viewport corruption when resizing with scrolled-back</p><p>history or with the cursor near the bottom of the screen. <a href=\"https://github.com/ghostty-org/ghostty/issues/12300\" rel=\"nofollow ugc noopener\">#12300</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/12907\" rel=\"nofollow ugc noopener\">#12907</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12935\" rel=\"nofollow ugc noopener\">#12935</a></p></li><li><p>Fix a use-after-free crash when clicking or selecting text during heavy</p><p>output. <a href=\"https://github.com/ghostty-org/ghostty/issues/12463\" rel=\"nofollow ugc noopener\">#12463</a></p></li><li>Fix a possible crash when reflowing hyperlinks during a resize. <a href=\"https://github.com/ghostty-org/ghostty/issues/13524\" rel=\"nofollow ugc noopener\">#13524</a></li><li><p>Fix possible crashes or memory corruption when scrolling or erasing rows</p><p>across a page boundary that needed more capacity. <a href=\"https://github.com/ghostty-org/ghostty/issues/13394\" rel=\"nofollow ugc noopener\">#13394</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13397\" rel=\"nofollow ugc noopener\">#13397</a></p></li><li><p>Fix possible crashes and memory corruption found via fuzzing when</p><p>printing causes a page to grow, or after clearing the screen into\nscrollback. <a href=\"https://github.com/ghostty-org/ghostty/issues/11261\" rel=\"nofollow ugc noopener\">#11261</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13997\" rel=\"nofollow ugc noopener\">#13997</a></p></li><li><p>Fix many latent crashes and undefined behavior in selection, pins,</p><p>search, title and working directory updates, and resize error handling.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12894\" rel=\"nofollow ugc noopener\">#12894</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13275\" rel=\"nofollow ugc noopener\">#13275</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13278\" rel=\"nofollow ugc noopener\">#13278</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13367\" rel=\"nofollow ugc noopener\">#13367</a></p></li><li><p>Fix a possible crash or corrupted input when many pty writes are queued,</p><p>such as during large pastes. <a href=\"https://github.com/ghostty-org/ghostty/issues/13659\" rel=\"nofollow ugc noopener\">#13659</a></p></li><li><p>Fix an out-of-bounds access when IME preedit text with wide characters</p><p>is composed between existing wide characters, such as with Korean input.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12479\" rel=\"nofollow ugc noopener\">#12479</a></p></li><li>Fix a crash when pressing or releasing mouse button 11. <a href=\"https://github.com/ghostty-org/ghostty/issues/14759\" rel=\"nofollow ugc noopener\">#14759</a></li><li><p>Fix the <code>write_screen_file</code>, <code>write_scrollback_file</code>, and</p><p><code>write_selection_file</code> actions leaking two file descriptors on each use,\nwhich could eventually prevent opening new terminals. <a href=\"https://github.com/ghostty-org/ghostty/issues/13644\" rel=\"nofollow ugc noopener\">#13644</a></p></li><li><p>Fix memory and file descriptor leaks in terminal I/O, including for writes</p><p>in read-only mode and files read via the <code>input</code> configuration.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13574\" rel=\"nofollow ugc noopener\">#13574</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13579\" rel=\"nofollow ugc noopener\">#13579</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13931\" rel=\"nofollow ugc noopener\">#13931</a></p></li></ul>\n<h3 id=\"terminal-capabilities\">Terminal Capabilities</h3>\n<ul><li><p>vt: Kitty graphics animation is now fully supported: frame transmission,</p><p>composition, animation control, and rendering. <a href=\"https://github.com/ghostty-org/ghostty/issues/5255\" rel=\"nofollow ugc noopener\">#5255</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13943\" rel=\"nofollow ugc noopener\">#13943</a></p></li><li><p>vt: Kitty graphics relative placements (<code>P=</code>, <code>Q=</code>, <code>H=</code>, <code>V=</code>) are now</p><p>supported, allowing images to be positioned relative to other images.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13939\" rel=\"nofollow ugc noopener\">#13939</a></p></li><li><p>vt: Support the Kitty graphics transient image usage hint. Transient</p><p>images are evicted first when image storage is full. <a href=\"https://github.com/ghostty-org/ghostty/issues/13389\" rel=\"nofollow ugc noopener\">#13389</a></p></li><li><p>vt: The Kitty clipboard protocol (OSC 5522) is now implemented on macOS</p><p>and GTK, including paste events (mode 5522). Reads and writes follow\n<code>clipboard-read</code> and <code>clipboard-write</code>, and a new\n<code>clipboard-write-limit-bytes</code> configuration limits the size of a single\nwrite. <a href=\"https://github.com/ghostty-org/ghostty/issues/10549\" rel=\"nofollow ugc noopener\">#10549</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13962\" rel=\"nofollow ugc noopener\">#13962</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13993\" rel=\"nofollow ugc noopener\">#13993</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13995\" rel=\"nofollow ugc noopener\">#13995</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13998\" rel=\"nofollow ugc noopener\">#13998</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14002\" rel=\"nofollow ugc noopener\">#14002</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14061\" rel=\"nofollow ugc noopener\">#14061</a></p></li><li><p>vt: Support visibility reports (mode 2033 and <code>CSI ? 998 n</code>), which tell</p><p>programs when the terminal is not visible, such as in a background tab\nor on another workspace, so they can stop rendering. <a href=\"https://github.com/ghostty-org/ghostty/issues/13494\" rel=\"nofollow ugc noopener\">#13494</a></p></li><li><p>vt: Programs can resize the window with the xterm <code>CSI 8 ; rows ; cols t</code></p><p>sequence if the new <code>vt-window-resize-allowed</code> configuration is enabled\n(default off). The request is ignored in splits, windows with multiple\ntabs, the quick terminal, and fullscreen, maximized, or tiled windows.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/1115\" rel=\"nofollow ugc noopener\">#1115</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14375\" rel=\"nofollow ugc noopener\">#14375</a></p></li><li><p>vt: Support OSC 133 <code>click_events=2</code>, which reports prompt clicks with</p><p>row coordinates relative to the prompt. <a href=\"https://github.com/ghostty-org/ghostty/issues/10865\" rel=\"nofollow ugc noopener\">#10865</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12953\" rel=\"nofollow ugc noopener\">#12953</a></p></li><li><p>vt: Support soft terminal reset (DECSTR, <code>CSI ! p</code>), which resets</p><p>modes, margins, and text attributes without clearing the screen.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14538\" rel=\"nofollow ugc noopener\">#14538</a></p></li><li><p>vt: Support backarrow key mode (DECBKM, mode 67), which lets programs</p><p>choose whether backspace sends <code>DEL</code> (<code>0x7f</code>, the default) or <code>BS</code>\n(<code>0x08</code>). <a href=\"https://github.com/ghostty-org/ghostty/issues/12226\" rel=\"nofollow ugc noopener\">#12226</a></p></li><li><p>vt: Support the DECRQCRA and XTCHECKSUM screen checksum reports, which</p><p>are mostly used by terminal test suites. Because a program can use these\nto read the screen contents, they are disabled unless the new\n<code>vt-xt-checksum-report</code> configuration is enabled. The new\n<code>vt-xt-checksum-extension</code> configuration controls how the checksum is\ncalculated. <a href=\"https://github.com/ghostty-org/ghostty/issues/14483\" rel=\"nofollow ugc noopener\">#14483</a></p></li><li><p>vt: Respond to <code>CSI 19 t</code> (report screen size in characters) and to</p><p>DECXCPR (<code>CSI ? 6 n</code>) extended cursor position requests. <a href=\"https://github.com/ghostty-org/ghostty/issues/14633\" rel=\"nofollow ugc noopener\">#14633</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14673\" rel=\"nofollow ugc noopener\">#14673</a></p></li><li><p>vt: DECRQM now answers ANSI mode queries (<code>CSI Ps $ p</code>), reports DECECM</p><p>and other unimplemented ANSI modes as permanently reset like xterm, and\nno longer truncates mode numbers above 32767 in its reply. <a href=\"https://github.com/ghostty-org/ghostty/issues/12505\" rel=\"nofollow ugc noopener\">#12505</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14236\" rel=\"nofollow ugc noopener\">#14236</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14237\" rel=\"nofollow ugc noopener\">#14237</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14672\" rel=\"nofollow ugc noopener\">#14672</a></p></li><li><p>vt: Ghostty terminfo now advertises overline support (<code>Smol</code>/<code>Rmol</code>),</p><p>which lets tmux pass overlines through. DECRQSS SGR replies now include\noverline and curly, double, dotted, and dashed underline styles.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13649\" rel=\"nofollow ugc noopener\">#13649</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13653\" rel=\"nofollow ugc noopener\">#13653</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13470\" rel=\"nofollow ugc noopener\">#13470</a></p></li><li><p>vt: The terminfo <code>Se</code> capability now resets the cursor to the configured</p><p><code>cursor-style</code> instead of a steady block. This fixes programs like Neovim\nleaving a block cursor behind on exit. <a href=\"https://github.com/ghostty-org/ghostty/issues/12482\" rel=\"nofollow ugc noopener\">#12482</a></p></li><li><p>vt: OSC payloads are now limited to 8 MiB, Kitty graphics payloads to</p><p>65 MiB, and each cell to 64 combining codepoints, so terminal output\ncan&#39;t easily exhaust memory. This also fixes a memory leak on invalid\nKitty graphics data. <a href=\"https://github.com/ghostty-org/ghostty/issues/12349\" rel=\"nofollow ugc noopener\">#12349</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13633\" rel=\"nofollow ugc noopener\">#13633</a></p></li><li><p>vt: Experimental support for the</p><p><a href=\"https://github.com/raphamorim/rio/pull/1542\" rel=\"nofollow ugc noopener\">Glyph Protocol</a>\n(APC <code>25a1</code>), which lets programs register custom glyphs. Ghostty parses\nand answers requests but doesn&#39;t render registered glyphs yet.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12352\" rel=\"nofollow ugc noopener\">#12352</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12930\" rel=\"nofollow ugc noopener\">#12930</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12937\" rel=\"nofollow ugc noopener\">#12937</a></p></li><li><p>vt: Parse the new program status protocol (OSC 7501), which lets programs</p><p>report whether they are idle, working, done, blocked, or failed. This is\nthe first terminal specification pioneered by the Ghostty project.\nlibghostty can parse it all, but the Ghostty GUI ignores it for now.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14560\" rel=\"nofollow ugc noopener\">#14560</a></p></li><li><p>vt: Parse (but do not implement) the Kitty desktop notification protocol</p><p>(OSC 99). <a href=\"https://github.com/ghostty-org/ghostty/issues/10467\" rel=\"nofollow ugc noopener\">#10467</a></p></li><li><p>vt: Parse (but do not implement) the Kitty drag and drop protocol</p><p>(OSC 72). <a href=\"https://github.com/ghostty-org/ghostty/issues/13029\" rel=\"nofollow ugc noopener\">#13029</a></p></li><li><p>vt: More tmux control mode fixes, including crashes that running</p><p><code>tmux -CC</code> could trigger. tmux control mode is still not hooked up to\nthe GUI. <a href=\"https://github.com/ghostty-org/ghostty/issues/11395\" rel=\"nofollow ugc noopener\">#11395</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/11935\" rel=\"nofollow ugc noopener\">#11935</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14262\" rel=\"nofollow ugc noopener\">#14262</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14680\" rel=\"nofollow ugc noopener\">#14680</a></p></li><li><p>vt: Clearing the screen at a prompt (e.g. <code>ctrl+l</code> in bash or zsh) now</p><p>moves prior output into scrollback even when the prompt is not on the\nlast row. Previously, the output was erased. <a href=\"https://github.com/ghostty-org/ghostty/issues/14660\" rel=\"nofollow ugc noopener\">#14660</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14668\" rel=\"nofollow ugc noopener\">#14668</a></p></li><li><p>vt: Kitty graphics: transmitting an image with an existing ID now</p><p>replaces the image and removes its old placements, as the spec requires.\nInterrupted or failed retransmissions no longer leave stale images on\nscreen. <a href=\"https://github.com/ghostty-org/ghostty/issues/6711\" rel=\"nofollow ugc noopener\">#6711</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13723\" rel=\"nofollow ugc noopener\">#13723</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13893\" rel=\"nofollow ugc noopener\">#13893</a></p></li><li><p>vt: Kitty graphics: images now move with the text when a program scrolls</p><p>with <code>CSI S</code>, <code>CSI T</code>, or scroll margins, and are clipped to the scroll\nregion. <a href=\"https://github.com/ghostty-org/ghostty/issues/4323\" rel=\"nofollow ugc noopener\">#4323</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13935\" rel=\"nofollow ugc noopener\">#13935</a></p></li><li><p>vt: Kitty graphics: automatically assigned image IDs no longer collide</p><p>with IDs chosen by the program. <a href=\"https://github.com/ghostty-org/ghostty/issues/2197\" rel=\"nofollow ugc noopener\">#2197</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13934\" rel=\"nofollow ugc noopener\">#13934</a></p></li><li><p>vt: Kitty graphics: delete commands now match the spec and Kitty. Point</p><p>deletes (<code>d=p</code>, <code>d=c</code>) only remove placements at that cell, <code>d=a</code> only\nremoves placements on the visible screen, range deletes accept empty\nranges, and deleting a missing placement no longer frees the image.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13652\" rel=\"nofollow ugc noopener\">#13652</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13895\" rel=\"nofollow ugc noopener\">#13895</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13898\" rel=\"nofollow ugc noopener\">#13898</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13932\" rel=\"nofollow ugc noopener\">#13932</a></p></li><li><p>vt: Kitty graphics: command validation and responses now match Kitty.</p><p>This fixes missing responses for invalid image data that could hang\nclients, false positive query replies, lost IDs in chunked transfer\nreplies, file transfers with an exact <code>S</code> size, and loads interrupted by\na non-chunk transmission. <a href=\"https://github.com/ghostty-org/ghostty/issues/13889\" rel=\"nofollow ugc noopener\">#13889</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13892\" rel=\"nofollow ugc noopener\">#13892</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13896\" rel=\"nofollow ugc noopener\">#13896</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13897\" rel=\"nofollow ugc noopener\">#13897</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13933\" rel=\"nofollow ugc noopener\">#13933</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14811\" rel=\"nofollow ugc noopener\">#14811</a></p></li><li><p>vt: Kitty graphics: cropped source rectangles are no longer stretched,</p><p>and <code>X</code>/<code>Y</code> offsets are kept within the first cell. <a href=\"https://github.com/ghostty-org/ghostty/issues/13890\" rel=\"nofollow ugc noopener\">#13890</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13891\" rel=\"nofollow ugc noopener\">#13891</a></p></li><li><p>vt: Kitty graphics: the cursor moves after tall images like Kitty does,</p><p>so consecutive images no longer overlap. <a href=\"https://github.com/ghostty-org/ghostty/issues/13887\" rel=\"nofollow ugc noopener\">#13887</a></p></li><li><p>vt: Full reset (RIS) no longer resets <code>image-storage-limit</code> to the</p><p>default. <a href=\"https://github.com/ghostty-org/ghostty/issues/13951\" rel=\"nofollow ugc noopener\">#13951</a></p></li><li><p>vt: OSC and APC sequences (such as Kitty graphics commands) canceled by</p><p>CAN or SUB, or aborted by another control character, are now discarded\ninstead of executed, matching xterm. <a href=\"https://github.com/ghostty-org/ghostty/issues/14453\" rel=\"nofollow ugc noopener\">#14453</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14812\" rel=\"nofollow ugc noopener\">#14812</a></p></li><li><p>vt: With modifyOtherKeys level 2, control keys, keypad keys, and</p><p><code>alt+escape</code> now encode like xterm. F13 to F25, Help, and Menu now send\nxterm&#39;s function key sequences in all legacy encoding modes. <a href=\"https://github.com/ghostty-org/ghostty/issues/14144\" rel=\"nofollow ugc noopener\">#14144</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14145\" rel=\"nofollow ugc noopener\">#14145</a></p></li><li><p>vt: Legacy alt-as-escape encoding now sends the full UTF-8 sequence for</p><p>non-ASCII keys. <a href=\"https://github.com/ghostty-org/ghostty/issues/14146\" rel=\"nofollow ugc noopener\">#14146</a></p></li><li><p>vt: Kitty keyboard protocol release events no longer repeat the typed</p><p>text for dead keys or level 5 keys on GTK, which caused duplicated\ncharacters in programs like Neovim. <a href=\"https://github.com/ghostty-org/ghostty/issues/13861\" rel=\"nofollow ugc noopener\">#13861</a></p></li><li><p>vt: <code>ctrl+alt+shift+backspace</code> now sends <code>ESC BS</code> in legacy key encoding,</p><p>matching xterm. <a href=\"https://github.com/ghostty-org/ghostty/issues/14508\" rel=\"nofollow ugc noopener\">#14508</a></p></li><li><p>vt: UTF-8 mouse mode (1005) now encodes the button correctly, fixing</p><p>invalid reports for the back and forward mouse buttons. <a href=\"https://github.com/ghostty-org/ghostty/issues/14532\" rel=\"nofollow ugc noopener\">#14532</a></p></li><li><p>vt: Foreground, background, and cursor colors reset with OSC 110, 111,</p><p>or 112 now follow later configuration changes, such as a light/dark\ntheme switch. <a href=\"https://github.com/ghostty-org/ghostty/issues/13650\" rel=\"nofollow ugc noopener\">#13650</a></p></li><li><p>vt: Full reset (RIS) now restores palette colors changed with OSC 4.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/14480\" rel=\"nofollow ugc noopener\">#14480</a></p></li><li><p>vt: An empty OSC 22 now resets the mouse pointer shape to the default.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/14495\" rel=\"nofollow ugc noopener\">#14495</a></p></li><li><p>vt: Long desktop notifications (OSC 9 and OSC 777) with multibyte UTF-8</p><p>text are no longer dropped or shown as invalid UTF-8 when truncated.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13795\" rel=\"nofollow ugc noopener\">#13795</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13811\" rel=\"nofollow ugc noopener\">#13811</a></p></li><li><p>vt: DCS strings now carry UTF-8 data. Previously, some UTF-8 bytes were</p><p>dropped, ended the string early, or started a new control sequence.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14016\" rel=\"nofollow ugc noopener\">#14016</a></p></li><li><p>vt: C0 controls <code>0x10</code> to <code>0x1F</code> are now executed instead of printed</p><p>as text, and UTF-8 encoded C1 controls are ignored, matching xterm.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14022\" rel=\"nofollow ugc noopener\">#14022</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14023\" rel=\"nofollow ugc noopener\">#14023</a></p></li><li><p>vt: Erasing a full line (<code>CSI 2 K</code>) now clears its soft-wrap state, so</p><p>erased rows no longer join together when the window is resized. <a href=\"https://github.com/ghostty-org/ghostty/issues/13637\" rel=\"nofollow ugc noopener\">#13637</a></p></li><li><p>vt: The cursor and saved cursor keep the correct position when a resize</p><p>reflows text, fixing an extra line wrap or overwritten text after\nresizing. <a href=\"https://github.com/ghostty-org/ghostty/issues/12598\" rel=\"nofollow ugc noopener\">#12598</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14458\" rel=\"nofollow ugc noopener\">#14458</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14478\" rel=\"nofollow ugc noopener\">#14478</a></p></li><li><p>vt: Variation selectors (VS15/VS16) now apply to the preceding codepoint,</p><p>fixing the rendering of some ZWJ emoji such as the pirate flag. <a href=\"https://github.com/ghostty-org/ghostty/issues/12596\" rel=\"nofollow ugc noopener\">#12596</a></p></li><li><p>vt: Combining marks printed after a character in the last column now</p><p>attach to that character. <a href=\"https://github.com/ghostty-org/ghostty/issues/12581\" rel=\"nofollow ugc noopener\">#12581</a></p></li><li><p>vt: Characters above U+00FF, such as emoji, now print as-is instead of as</p><p>a blank while a non-UTF-8 character set such as DEC line drawing is\nactive. <a href=\"https://github.com/ghostty-org/ghostty/issues/14554\" rel=\"nofollow ugc noopener\">#14554</a></p></li><li><p>vt: Single shifts (SS2/SS3) now apply only to the next printed character.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/14576\" rel=\"nofollow ugc noopener\">#14576</a></p></li><li><p>vt: Tab clear (TBC) fixes: <code>CSI 0 g</code> no longer sets a tab stop where</p><p>there wasn&#39;t one, and <code>CSI g</code> with no parameter clears the tab stop at\nthe cursor. <a href=\"https://github.com/ghostty-org/ghostty/issues/13900\" rel=\"nofollow ugc noopener\">#13900</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14644\" rel=\"nofollow ugc noopener\">#14644</a></p></li><li><p>vt: Printing with autowrap (DECAWM) disabled clears the pending wrap, so</p><p>re-enabling autowrap doesn&#39;t cause a spurious line wrap. <a href=\"https://github.com/ghostty-org/ghostty/issues/14652\" rel=\"nofollow ugc noopener\">#14652</a></p></li><li><p>vt: With reverse wrap enabled, moving left after restoring a cursor with</p><p>a pending wrap no longer jumps the cursor. <a href=\"https://github.com/ghostty-org/ghostty/issues/14390\" rel=\"nofollow ugc noopener\">#14390</a></p></li><li><p>vt: Cursor movement respects margins and origin mode: CUB and backspace</p><p>stop at the left margin, and CHA, HPA, VPA, HPR, and VPR no longer apply\nthe margin offset twice in origin mode. <a href=\"https://github.com/ghostty-org/ghostty/issues/14761\" rel=\"nofollow ugc noopener\">#14761</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14762\" rel=\"nofollow ugc noopener\">#14762</a></p></li><li><p>vt: Fix a crash when VS15 narrows a wide character under the cursor.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/13631\" rel=\"nofollow ugc noopener\">#13631</a></p></li><li><p>vt: Fix a crash or memory corruption after narrowing the terminal cuts a</p><p>wide character in half on the alternate screen or with wraparound\ndisabled. <a href=\"https://github.com/ghostty-org/ghostty/issues/14509\" rel=\"nofollow ugc noopener\">#14509</a></p></li><li><p>vt: Fix a crash when a grapheme cluster widens in the last column and</p><p>wraps inside or below a scroll region with grapheme clustering (mode</p>\n<ol start=\"2027\"><li>enabled. <a href=\"https://github.com/ghostty-org/ghostty/issues/14552\" rel=\"nofollow ugc noopener\">#14552</a></li></ol></li><li><p>vt: Fix a slow memory and performance leak in graphics-heavy sessions</p><p>where evicted Kitty images left their placements&#39; tracked positions\nbehind. <a href=\"https://github.com/ghostty-org/ghostty/issues/13656\" rel=\"nofollow ugc noopener\">#13656</a></p></li><li><p>vt: Fix a memory leak when an OSC color sequence contains more than two</p><p>requests. <a href=\"https://github.com/ghostty-org/ghostty/issues/13239\" rel=\"nofollow ugc noopener\">#13239</a></p></li></ul>\n<h3 id=\"shell-integration\">Shell Integration</h3>\n<ul><li><p>A new <code>ghostty +ssh</code> CLI action wraps <code>ssh</code> and sets up Ghostty on remote</p><p>hosts: it forwards Ghostty&#39;s environment and installs Ghostty&#39;s terminfo\non the first connection to each host, caching successful installs. It can\nbe used directly (<code>ghostty +ssh user@example.com</code>) or as an alias\n(<code>alias ssh=&#39;ghostty +ssh --&#39;</code>) without shell integration. The <code>ssh-env</code>\nand <code>ssh-terminfo</code> shell integration features now use it for every\nshell. <a href=\"https://github.com/ghostty-org/ghostty/issues/12582\" rel=\"nofollow ugc noopener\">#12582</a></p></li><li><p><code>ssh-terminfo</code> now always installs Ghostty&#39;s bundled terminfo on remote</p><p>hosts instead of keeping an existing, possibly outdated, <code>xterm-ghostty</code>\nentry, and reinstalls it when a newer Ghostty changes its terminfo.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13844\" rel=\"nofollow ugc noopener\">#13844</a></p></li><li><p><code>ghostty +ssh-cache</code> has been reworked with positional destinations, a</p><p>new <code>--prune</code> option, consistent output and exit codes, and error\nmessages that name the cache file. See the\n<a href=\"#breaking-changes\">breaking changes</a> above. <a href=\"https://github.com/ghostty-org/ghostty/issues/12814\" rel=\"nofollow ugc noopener\">#12814</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13533\" rel=\"nofollow ugc noopener\">#13533</a></p></li><li><p><code>ssh-terminfo</code> now tells apart the same host on different ports, so</p><p>terminfo is installed on each of them. <code>ghostty +ssh-cache</code> accepts\n<code>host:port</code> destinations. <a href=\"https://github.com/ghostty-org/ghostty/issues/14472\" rel=\"nofollow ugc noopener\">#14472</a></p></li><li><p><code>ssh-env</code> no longer overrides <code>SetEnv</code> entries in your <code>~/.ssh/config</code>.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/11518\" rel=\"nofollow ugc noopener\">#11518</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14854\" rel=\"nofollow ugc noopener\">#14854</a></p></li><li><p>bash: Failed commands now report their real exit status on Bash 4.4+,</p><p>so command finished notifications no longer report every command as\nsuccessful. <a href=\"https://github.com/ghostty-org/ghostty/issues/14247\" rel=\"nofollow ugc noopener\">#14247</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14250\" rel=\"nofollow ugc noopener\">#14250</a></p></li><li><p>nu: Tab completion for <code>ssh</code> and <code>sudo</code> now works with external</p><p>completers such as carapace. <a href=\"https://github.com/ghostty-org/ghostty/issues/13310\" rel=\"nofollow ugc noopener\">#13310</a></p></li><li><p>bash: The bundled bash-preexec, used only for Bash versions older than</p><p>4.4 such as macOS&#39;s <code>/bin/bash</code>, has been updated to 0.7.0. <a href=\"https://github.com/ghostty-org/ghostty/issues/14120\" rel=\"nofollow ugc noopener\">#14120</a></p></li><li><p>zsh: Fix a stray <code>{</code> in the prompt and broken prompt marking when <code>PS1</code></p><p>or <code>PS2</code> ends with a bare <code>%</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11832\" rel=\"nofollow ugc noopener\">#11832</a></p></li><li><p>bash: Fix &quot;command not found&quot; errors in subshells that inherit</p><p><code>PROMPT_COMMAND</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11690\" rel=\"nofollow ugc noopener\">#11690</a></p></li><li><p>bash: Fix a syntax error when an existing <code>PROMPT_COMMAND</code> ends with a</p><p>newline. <a href=\"https://github.com/ghostty-org/ghostty/issues/11621\" rel=\"nofollow ugc noopener\">#11621</a></p></li><li>bash: Fix extra blank lines at the prompt when using ble.sh. <a href=\"https://github.com/ghostty-org/ghostty/issues/11644\" rel=\"nofollow ugc noopener\">#11644</a></li><li><p>bash: Fix the shell integration hook being added twice when it is</p><p>sourced again with an array <code>PROMPT_COMMAND</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/14266\" rel=\"nofollow ugc noopener\">#14266</a></p></li></ul>\n<h3 id=\"macos\">macOS</h3>\n<ul><li><p>macOS: Support macOS 27. This fixes the layout and background color of</p><p>titlebar tabs, a thin border around the app icon, hidden titlebars\ncovering the top lines of the terminal with Reduce Transparency enabled,\nand the Shortcuts &quot;New Window&quot; action opening two windows. <a href=\"https://github.com/ghostty-org/ghostty/issues/13001\" rel=\"nofollow ugc noopener\">#13001</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13390\" rel=\"nofollow ugc noopener\">#13390</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14107\" rel=\"nofollow ugc noopener\">#14107</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14411\" rel=\"nofollow ugc noopener\">#14411</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12999\" rel=\"nofollow ugc noopener\">#12999</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13069\" rel=\"nofollow ugc noopener\">#13069</a></p></li><li><p>macOS: When a terminal&#39;s process exits, a native bar now appears at the</p><p>bottom of the terminal instead of text being written into the terminal.\nCommands that fail or exit faster than <code>abnormal-command-exit-runtime</code>\nare highlighted in red. <a href=\"https://github.com/ghostty-org/ghostty/issues/7649\" rel=\"nofollow ugc noopener\">#7649</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12251\" rel=\"nofollow ugc noopener\">#12251</a></p></li><li><p>macOS: Quitting, or closing a window, when multiple windows or tabs have</p><p>running processes now offers &quot;Review Windows...&quot;, which steps through\neach one so you can decide what to close. <a href=\"https://github.com/ghostty-org/ghostty/issues/12742\" rel=\"nofollow ugc noopener\">#12742</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14062\" rel=\"nofollow ugc noopener\">#14062</a></p></li><li><p>macOS: The command palette now highlights matching text, matches</p><p>initials, searches action descriptions, and ranks results by where they\nmatched. <a href=\"https://github.com/ghostty-org/ghostty/issues/12264\" rel=\"nofollow ugc noopener\">#12264</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13610\" rel=\"nofollow ugc noopener\">#13610</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13624\" rel=\"nofollow ugc noopener\">#13624</a></p></li><li><p>macOS: The search bar now remembers the last search and shares it with</p><p>other apps through the system find pasteboard, like Safari and\nTerminal.app. <a href=\"https://github.com/ghostty-org/ghostty/issues/12516\" rel=\"nofollow ugc noopener\">#12516</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12712\" rel=\"nofollow ugc noopener\">#12712</a></p></li><li><p>macOS: Screen readers such as VoiceOver are now notified when the</p><p>selection changes instead of reading a stale selection. <a href=\"https://github.com/ghostty-org/ghostty/issues/12902\" rel=\"nofollow ugc noopener\">#12902</a></p></li><li><p>macOS: The AppleScript <code>terminal</code> class and the Shortcuts terminal entity</p><p>now expose <code>pid</code> (of the foreground process) and <code>tty</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11592\" rel=\"nofollow ugc noopener\">#11592</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/10756\" rel=\"nofollow ugc noopener\">#10756</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/11922\" rel=\"nofollow ugc noopener\">#11922</a></p></li><li><p>macOS: AppleScript tabs and terminals have a new read-write</p><p><code>name override</code> property to set or clear a custom title. <a href=\"https://github.com/ghostty-org/ghostty/issues/12048\" rel=\"nofollow ugc noopener\">#12048</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14733\" rel=\"nofollow ugc noopener\">#14733</a></p></li><li><p>macOS: Middle-clicking a tab closes it with</p><p><code>macos-titlebar-style = tabs</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11962\" rel=\"nofollow ugc noopener\">#11962</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/11963\" rel=\"nofollow ugc noopener\">#11963</a></p></li><li><p>macOS: The version in the About window now links to the release notes</p><p>for that version. <a href=\"https://github.com/ghostty-org/ghostty/issues/11964\" rel=\"nofollow ugc noopener\">#11964</a></p></li><li><p>macOS: Updates that are downloaded and installed automatically no longer</p><p>prompt you to restart. Checking for updates manually still offers to\nrestart. <a href=\"https://github.com/ghostty-org/ghostty/issues/13623\" rel=\"nofollow ugc noopener\">#13623</a></p></li><li><p>macOS: <code>toggle_background_opacity</code> now applies to every tab in the</p><p>window, and new windows inherit the current state. <a href=\"https://github.com/ghostty-org/ghostty/issues/11583\" rel=\"nofollow ugc noopener\">#11583</a></p></li><li><p>macOS: <code>cmd+arrow_up</code> and <code>cmd+arrow_down</code> now run their configured</p><p>keybinds, which default to <code>jump_to_prompt</code>. Ghostty 1.3 always scrolled\nto the top or bottom of the scrollback instead, ignoring the\nconfiguration. To scroll to the top or bottom, use <code>cmd+home</code> and\n<code>cmd+end</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/12245\" rel=\"nofollow ugc noopener\">#12245</a></p></li><li><p>macOS: In the configuration errors window, Return reloads the</p><p>configuration and Escape ignores the errors. <a href=\"https://github.com/ghostty-org/ghostty/issues/12601\" rel=\"nofollow ugc noopener\">#12601</a></p></li><li><p>macOS: Ghostty launches about 15% faster to a visible window and draws</p><p>its first frame about 27% sooner. <a href=\"https://github.com/ghostty-org/ghostty/issues/13722\" rel=\"nofollow ugc noopener\">#13722</a></p></li><li><p>macOS: Terminals that aren&#39;t visible, such as background tabs, now</p><p>release their GPU resources and rebuild them when shown again. With 20\nbackground tabs, GPU memory drops from about 385 MiB to 18 MiB. Metal\nbuffers also no longer over-allocate when they grow. <a href=\"https://github.com/ghostty-org/ghostty/issues/14017\" rel=\"nofollow ugc noopener\">#14017</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13490\" rel=\"nofollow ugc noopener\">#13490</a></p></li><li><p>macOS: Lower idle CPU and energy use. The display link now pauses when</p><p>there is nothing to draw, and unfocused terminals that are animating\ndraw at most once per display refresh instead of once per write.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14035\" rel=\"nofollow ugc noopener\">#14035</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14068\" rel=\"nofollow ugc noopener\">#14068</a></p></li><li><p>macOS: Update Sparkle to 2.9.6, which fixes several security advisories</p><p>in Sparkle, including CVE-2026-47121 and CVE-2026-47122. <a href=\"https://github.com/ghostty-org/ghostty/issues/14072\" rel=\"nofollow ugc noopener\">#14072</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14082\" rel=\"nofollow ugc noopener\">#14082</a></p></li><li><p>macOS: Global keybinds no longer stop working after macOS disables</p><p>Ghostty&#39;s event tap. <a href=\"https://github.com/ghostty-org/ghostty/issues/12294\" rel=\"nofollow ugc noopener\">#12294</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12714\" rel=\"nofollow ugc noopener\">#12714</a></p></li><li><p>macOS: Fix IME composition issues. Korean text being composed is now</p><p>committed instead of lost when pressing an arrow key, and control-key\nIME shortcuts such as Japanese input&#39;s <code>ctrl+j</code> no longer send control\ncharacters to the terminal. <a href=\"https://github.com/ghostty-org/ghostty/issues/11461\" rel=\"nofollow ugc noopener\">#11461</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12447\" rel=\"nofollow ugc noopener\">#12447</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12518\" rel=\"nofollow ugc noopener\">#12518</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12547\" rel=\"nofollow ugc noopener\">#12547</a></p></li><li><p>macOS: Text from input methods, dictation, and the emoji picker is now</p><p>sent as typed input instead of pasted text. Programs no longer treat\ndictation as a paste, and switching input sources mid-composition sends\nthe pending text as keys, matching Terminal.app. <a href=\"https://github.com/ghostty-org/ghostty/issues/13195\" rel=\"nofollow ugc noopener\">#13195</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13222\" rel=\"nofollow ugc noopener\">#13222</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13817\" rel=\"nofollow ugc noopener\">#13817</a></p></li><li><p>macOS: Unicode Hex Input can now enter characters outside the Basic</p><p>Multilingual Plane, such as emoji, typed as surrogate pairs. <a href=\"https://github.com/ghostty-org/ghostty/issues/13733\" rel=\"nofollow ugc noopener\">#13733</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13737\" rel=\"nofollow ugc noopener\">#13737</a></p></li><li>macOS: <code>font-thicken</code> now also applies to IME preedit text. <a href=\"https://github.com/ghostty-org/ghostty/issues/14230\" rel=\"nofollow ugc noopener\">#14230</a></li><li><p>macOS: <code>option+backspace</code> and other modified Backspace keys now report</p><p>their modifiers with the Kitty keyboard protocol instead of sending a\nbare DEL. <a href=\"https://github.com/ghostty-org/ghostty/issues/13871\" rel=\"nofollow ugc noopener\">#13871</a></p></li><li><p>macOS: Pasting and dropping text now prefer plain text over URLs, so a</p><p>path copied from apps like Transmit pastes as a path instead of an\n<code>sftp://</code> URL. <a href=\"https://github.com/ghostty-org/ghostty/issues/13152\" rel=\"nofollow ugc noopener\">#13152</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13170\" rel=\"nofollow ugc noopener\">#13170</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13212\" rel=\"nofollow ugc noopener\">#13212</a></p></li><li><p>macOS: The search bar keeps focus when you click in it or on the</p><p>next/previous buttons, and the terminal&#39;s focus state is now correct\nwhile search is open. <a href=\"https://github.com/ghostty-org/ghostty/issues/11872\" rel=\"nofollow ugc noopener\">#11872</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/11978\" rel=\"nofollow ugc noopener\">#11978</a></p></li><li><p>macOS: The Find Next and Find Previous menu items and the</p><p><code>navigate_search</code> and <code>end_search</code> keybinds now work correctly,\nincluding while the search field is focused. <a href=\"https://github.com/ghostty-org/ghostty/issues/12070\" rel=\"nofollow ugc noopener\">#12070</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12492\" rel=\"nofollow ugc noopener\">#12492</a></p></li><li><p>macOS: Pressing Enter in the search bar no longer blocks confirming an</p><p>IME candidate. <a href=\"https://github.com/ghostty-org/ghostty/issues/12781\" rel=\"nofollow ugc noopener\">#12781</a></p></li><li><p>macOS: Clicking a command palette entry with the mouse now runs it</p><p>instead of closing the palette. <a href=\"https://github.com/ghostty-org/ghostty/issues/11665\" rel=\"nofollow ugc noopener\">#11665</a></p></li><li><p>macOS: The command palette now gets focus and paste when opened from the</p><p>inline tab title editor. <a href=\"https://github.com/ghostty-org/ghostty/issues/12524\" rel=\"nofollow ugc noopener\">#12524</a></p></li><li><p>macOS: Holding <code>cmd+t</code> to create many tabs now leaves the newest tab</p><p>focused. <a href=\"https://github.com/ghostty-org/ghostty/issues/13725\" rel=\"nofollow ugc noopener\">#13725</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13985\" rel=\"nofollow ugc noopener\">#13985</a></p></li><li><p>macOS: Fix an empty &quot;ghost&quot; tab or window that could appear when a tab</p><p>was closed right after it was opened. <a href=\"https://github.com/ghostty-org/ghostty/issues/12119\" rel=\"nofollow ugc noopener\">#12119</a></p></li><li><p>macOS: Titlebar tabs no longer disappear after creating a tab from</p><p>&quot;Show All Tabs&quot;. <a href=\"https://github.com/ghostty-org/ghostty/issues/12949\" rel=\"nofollow ugc noopener\">#12949</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13017\" rel=\"nofollow ugc noopener\">#13017</a></p></li><li><p>macOS: Double-clicking the window title now zooms the window with</p><p><code>macos-titlebar-style = tabs</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/12219\" rel=\"nofollow ugc noopener\">#12219</a></p></li><li><p>macOS: Moving a tab with <code>macos-titlebar-style = tabs</code> on macOS 26 no</p><p>longer briefly shows the neighboring tab. <a href=\"https://github.com/ghostty-org/ghostty/issues/14847\" rel=\"nofollow ugc noopener\">#14847</a></p></li><li><p>macOS: The inline tab title editor stays in place while the window is</p><p>resized. <a href=\"https://github.com/ghostty-org/ghostty/issues/12220\" rel=\"nofollow ugc noopener\">#12220</a></p></li><li><p>macOS: Fix tabs flashing when switching tabs after a program changed the</p><p>background color with OSC 11, and the window chrome keeping the old\ncolor after a light/dark theme switch. <a href=\"https://github.com/ghostty-org/ghostty/issues/12825\" rel=\"nofollow ugc noopener\">#12825</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12828\" rel=\"nofollow ugc noopener\">#12828</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12822\" rel=\"nofollow ugc noopener\">#12822</a></p></li><li><p>macOS: The <code>macos-glass-regular</code> and <code>macos-glass-clear</code> options for</p><p><code>background-blur</code> now layer the glass over the background color, and\nfocused windows are no longer less transparent than unfocused ones.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13914\" rel=\"nofollow ugc noopener\">#13914</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13928\" rel=\"nofollow ugc noopener\">#13928</a></p></li><li><p>macOS: The native titlebar no longer cuts off the end of the title when</p><p>using a custom <code>window-title-font-family</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/14135\" rel=\"nofollow ugc noopener\">#14135</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14217\" rel=\"nofollow ugc noopener\">#14217</a></p></li><li><p>macOS: Fix terminals rendering at a stale size under heavy system load or</p><p>during rapid resizes from window managers. <a href=\"https://github.com/ghostty-org/ghostty/issues/12143\" rel=\"nofollow ugc noopener\">#12143</a></p></li><li><p>macOS: Splits dragged into another tab or window now render immediately,</p><p>and the source window keeps keyboard focus. <a href=\"https://github.com/ghostty-org/ghostty/issues/12343\" rel=\"nofollow ugc noopener\">#12343</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12338\" rel=\"nofollow ugc noopener\">#12338</a></p></li><li><p>macOS: The split zoom indicator no longer stays visible after the other</p><p>splits of a zoomed split are closed, such as with AppleScript. <a href=\"https://github.com/ghostty-org/ghostty/issues/14703\" rel=\"nofollow ugc noopener\">#14703</a></p></li><li><p>macOS: The split divider now uses the standard row and column resize</p><p>pointers. <a href=\"https://github.com/ghostty-org/ghostty/issues/13433\" rel=\"nofollow ugc noopener\">#13433</a></p></li><li><p>macOS: <code>window-save-state = never</code> now also stops macOS from taking</p><p>window restoration snapshots, which could stall focus changes between\nwindows. <a href=\"https://github.com/ghostty-org/ghostty/issues/14506\" rel=\"nofollow ugc noopener\">#14506</a></p></li><li><p>macOS: Window state saved by Ghostty 1.2 or later is now migrated, so</p><p>windows and tabs are restored after updating Ghostty. <a href=\"https://github.com/ghostty-org/ghostty/issues/12461\" rel=\"nofollow ugc noopener\">#12461</a></p></li><li><p>macOS: Tabs created while the screen is locked now initialize correctly.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/13639\" rel=\"nofollow ugc noopener\">#13639</a></p></li><li><p>macOS: Quitting now asks for confirmation when windows with running</p><p>processes are minimized or the quick terminal is hidden. <a href=\"https://github.com/ghostty-org/ghostty/issues/13686\" rel=\"nofollow ugc noopener\">#13686</a></p></li><li><p>macOS: OSC 52 clipboard read confirmations no longer steal focus. If the</p><p>terminal is unfocused, Ghostty rings the bell and shows the prompt when\nyou return to it. <a href=\"https://github.com/ghostty-org/ghostty/issues/13744\" rel=\"nofollow ugc noopener\">#13744</a></p></li><li><p>macOS: Splits in the quick terminal now also set</p><p><code>GHOSTTY_QUICK_TERMINAL=1</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/12895\" rel=\"nofollow ugc noopener\">#12895</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12896\" rel=\"nofollow ugc noopener\">#12896</a></p></li><li><p>macOS: The quick terminal no longer reopens at a stale size after a</p><p>display is reconnected at a different resolution. <a href=\"https://github.com/ghostty-org/ghostty/issues/13250\" rel=\"nofollow ugc noopener\">#13250</a></p></li><li><p>macOS: The &quot;New Ghostty Tab Here&quot; and &quot;New Ghostty Window Here&quot; services</p><p>now open the correct directory when given a plain-text path. <a href=\"https://github.com/ghostty-org/ghostty/issues/12727\" rel=\"nofollow ugc noopener\">#12727</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/12731\" rel=\"nofollow ugc noopener\">#12731</a></p></li><li><p>macOS: Working directories passed from Services, Shortcuts, and</p><p>AppleScript are now normalized, fixing Nushell and zsh <code>%1~</code> prompts.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12614\" rel=\"nofollow ugc noopener\">#12614</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14051\" rel=\"nofollow ugc noopener\">#14051</a></p></li><li><p>macOS: <code>ghostty -e</code> no longer opens the command&#39;s file arguments as</p><p>extra terminals, e.g. <code>ghostty -e vim file.txt</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13748\" rel=\"nofollow ugc noopener\">#13748</a></p></li><li><p>macOS: Opening a <code>.command</code> file from Finder no longer corrupts</p><p>non-ASCII characters in its path. <a href=\"https://github.com/ghostty-org/ghostty/issues/13862\" rel=\"nofollow ugc noopener\">#13862</a></p></li><li><p>macOS: The Shortcuts terminal entity now reports the correct kind,</p><p>title, working directory, and screenshot for new terminals. <a href=\"https://github.com/ghostty-org/ghostty/issues/13007\" rel=\"nofollow ugc noopener\">#13007</a></p></li><li><p>macOS: The Shortcuts &quot;New Terminal&quot; action now works with commands that</p><p>have arguments and with a command field that was cleared. <a href=\"https://github.com/ghostty-org/ghostty/issues/12391\" rel=\"nofollow ugc noopener\">#12391</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/12392\" rel=\"nofollow ugc noopener\">#12392</a></p></li><li><p>macOS: AppleScript <code>send key</code> now works for character keys, not only</p><p>special keys like <code>enter</code>, and respects <code>macos-option-as-alt</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13205\" rel=\"nofollow ugc noopener\">#13205</a></p></li><li><p>macOS: Update pill fixes: update errors are now shown, &quot;Install and</p><p>Relaunch&quot; no longer asks for confirmation, and the cancel option is\nhidden once an update can no longer be canceled. <a href=\"https://github.com/ghostty-org/ghostty/issues/13540\" rel=\"nofollow ugc noopener\">#13540</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13562\" rel=\"nofollow ugc noopener\">#13562</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13612\" rel=\"nofollow ugc noopener\">#13612</a></p></li><li><p>macOS: The default app icon follows the system icon style again after</p><p>changing it in System Settings, and custom icons now apply to the app in\nFinder. <a href=\"https://github.com/ghostty-org/ghostty/issues/12180\" rel=\"nofollow ugc noopener\">#12180</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12344\" rel=\"nofollow ugc noopener\">#12344</a></p></li><li><p>macOS: The dock icon bell badge now appears when notification permission</p><p>was granted earlier without badge permission. <a href=\"https://github.com/ghostty-org/ghostty/issues/12133\" rel=\"nofollow ugc noopener\">#12133</a></p></li><li>macOS: The Copy menu item is disabled when nothing is selected. <a href=\"https://github.com/ghostty-org/ghostty/issues/12521\" rel=\"nofollow ugc noopener\">#12521</a></li><li><p>macOS: Menu items now show the correct shortcut for keybinds on physical</p><p>keys (e.g. <code>super+backquote</code>), uppercase letters, forward delete, and\nthe <code>scroll_to_selection</code> and <code>search_selection</code> actions. <a href=\"https://github.com/ghostty-org/ghostty/issues/13888\" rel=\"nofollow ugc noopener\">#13888</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/12039\" rel=\"nofollow ugc noopener\">#12039</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12011\" rel=\"nofollow ugc noopener\">#12011</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12281\" rel=\"nofollow ugc noopener\">#12281</a></p></li><li><p>macOS: The secure input indicator&#39;s popover arrow now points at the</p><p>icon. <a href=\"https://github.com/ghostty-org/ghostty/issues/12249\" rel=\"nofollow ugc noopener\">#12249</a></p></li><li><p>macOS: Fix a rare permanent freeze after waking from sleep or changing</p><p>displays. macOS did not mark the app as &quot;Not Responding&quot;, so it could\nonly be killed. <a href=\"https://github.com/ghostty-org/ghostty/issues/14691\" rel=\"nofollow ugc noopener\">#14691</a></p></li><li><p>macOS: Fix a crash when closing a tab, most easily triggered with</p><p><code>undo-timeout = 0</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/13359\" rel=\"nofollow ugc noopener\">#13359</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13364\" rel=\"nofollow ugc noopener\">#13364</a></p></li><li><p>macOS: Fix a crash when opening a new tab from a native fullscreen</p><p>window. <a href=\"https://github.com/ghostty-org/ghostty/issues/13636\" rel=\"nofollow ugc noopener\">#13636</a></p></li><li><p>macOS: Fix a crash caused by a data race when reading cached terminal</p><p>contents. <a href=\"https://github.com/ghostty-org/ghostty/issues/13646\" rel=\"nofollow ugc noopener\">#13646</a></p></li><li><p>macOS: Fix a crash when OSC 52 clipboard confirmation prompts overlap.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/13648\" rel=\"nofollow ugc noopener\">#13648</a></p></li><li><p>macOS: Fix crashes when CoreText returns null, such as for fonts without</p><p>a display name or under severe memory pressure. <a href=\"https://github.com/ghostty-org/ghostty/issues/13642\" rel=\"nofollow ugc noopener\">#13642</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13679\" rel=\"nofollow ugc noopener\">#13679</a></p></li><li><p>macOS: Fix closed windows leaking with transparent titlebars (the</p><p>default), which made Ghostty and WindowServer use more CPU and memory\nover time. <a href=\"https://github.com/ghostty-org/ghostty/issues/13601\" rel=\"nofollow ugc noopener\">#13601</a></p></li><li><p>macOS: Fix a memory leak each time Ghostty reads terminal text, such as</p><p>for copy, Quick Look, or accessibility. <a href=\"https://github.com/ghostty-org/ghostty/issues/12020\" rel=\"nofollow ugc noopener\">#12020</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12025\" rel=\"nofollow ugc noopener\">#12025</a></p></li><li><p>macOS: Fix an IOSurface memory leak when scripts rapidly create and close</p><p>terminals. <a href=\"https://github.com/ghostty-org/ghostty/issues/13640\" rel=\"nofollow ugc noopener\">#13640</a></p></li><li><p>macOS: Fix a Mach port leak, and a gradual slowdown, while global</p><p>keybinds wait for Accessibility permission. <a href=\"https://github.com/ghostty-org/ghostty/issues/13590\" rel=\"nofollow ugc noopener\">#13590</a></p></li></ul>\n<h3 id=\"gtk-linux-freebsd\">GTK (Linux, FreeBSD)</h3>\n<ul><li><p>GTK: Splits can now be rearranged with drag and drop, matching macOS.</p><p>Drag a split by its handle and drop it onto another split, including\nsplits in other tabs and windows. <a href=\"https://github.com/ghostty-org/ghostty/issues/10224\" rel=\"nofollow ugc noopener\">#10224</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/10423\" rel=\"nofollow ugc noopener\">#10423</a></p></li><li><p>GTK: Ghostty now renders at the true fractional scale (e.g. 125% or</p><p>150%), so text and box-drawing characters are sharp instead of blurry\nunder fractional scaling. <a href=\"https://github.com/ghostty-org/ghostty/issues/1938\" rel=\"nofollow ugc noopener\">#1938</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14269\" rel=\"nofollow ugc noopener\">#14269</a></p></li><li><p>GTK: The renderer no longer uses <code>GtkGLArea</code>. Ghostty now renders with</p><p>EGL entirely on the render thread and hands finished frames to GTK as\nDMABUFs, so the main thread no longer does any OpenGL work. <a href=\"https://github.com/ghostty-org/ghostty/issues/14052\" rel=\"nofollow ugc noopener\">#14052</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14636\" rel=\"nofollow ugc noopener\">#14636</a></p></li><li><p>GTK: Windows can now be renamed using the menu, command palette, or the</p><p>new <code>prompt_window_title</code> and <code>set_window_title</code> binding actions.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/10469\" rel=\"nofollow ugc noopener\">#10469</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/10999\" rel=\"nofollow ugc noopener\">#10999</a></p></li><li><p>GTK: A new <code>+new-tab</code> CLI command opens a new tab in a running Ghostty</p><p>instance. When run from inside Ghostty, the tab opens in the same\nwindow. It accepts the same <code>-e</code>, <code>--working-directory</code>, and <code>--title</code>\nflags as <code>+new-window</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/11762\" rel=\"nofollow ugc noopener\">#11762</a></p></li><li><p>GTK: A new <code>+toggle-quick-terminal</code> CLI command toggles the quick</p><p>terminal of a running Ghostty instance, useful for binding in window\nmanagers without global shortcut support. <a href=\"https://github.com/ghostty-org/ghostty/issues/12661\" rel=\"nofollow ugc noopener\">#12661</a></p></li><li><p>GTK: Global keybinds now use the <code>vicinae-hotkey-v1</code> Wayland protocol</p><p>when the compositor supports it (e.g. Hyprland 0.56+), falling back to\nthe XDG desktop portal otherwise. Ghostty shows a desktop notification if\na global keybind can&#39;t be registered. <a href=\"https://github.com/ghostty-org/ghostty/issues/13464\" rel=\"nofollow ugc noopener\">#13464</a></p></li><li><p>GTK: <code>quick-terminal-screen</code> is now supported on Wayland. The default,</p><p><code>main</code>, places the quick terminal on the compositor&#39;s primary output\n(or the first monitor if the compositor doesn&#39;t report one). Set it to\n<code>mouse</code> to let the compositor choose, which was the previous behavior.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/11117\" rel=\"nofollow ugc noopener\">#11117</a></p></li><li><p>GTK: On Wayland, <code>background-blur</code> now uses the compositor-agnostic</p><p><code>ext-background-effect-v1</code> protocol instead of KDE&#39;s blur protocol,\nenabling blur on compositors such as Niri. The blur region also no longer\ncovers the window&#39;s client-side shadows. <a href=\"https://github.com/ghostty-org/ghostty/issues/10721\" rel=\"nofollow ugc noopener\">#10721</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/10720\" rel=\"nofollow ugc noopener\">#10720</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/10727\" rel=\"nofollow ugc noopener\">#10727</a></p></li><li><p>GTK: On GTK 4.23.3 and newer, <code>background-blur</code> uses GTK&#39;s built-in</p><p>background blur, which covers the window more accurately. <a href=\"https://github.com/ghostty-org/ghostty/issues/13581\" rel=\"nofollow ugc noopener\">#13581</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/13586\" rel=\"nofollow ugc noopener\">#13586</a></p></li><li><p>GTK: The <code>open_config</code> binding action now accepts <code>new_window</code> to</p><p>edit the configuration in <code>$VISUAL</code> or <code>$EDITOR</code> in a new Ghostty\nwindow. The default, <code>os_open</code>, keeps the previous behavior. <a href=\"https://github.com/ghostty-org/ghostty/issues/11905\" rel=\"nofollow ugc noopener\">#11905</a></p></li><li><p>GTK: A new configuration <code>gtk-horizontal-tab-scroll</code> (default <code>true</code>)</p><p>can be set to <code>false</code> to stop two-finger horizontal scrolling from\nswitching tabs, passing the scroll to the terminal application instead.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/12659\" rel=\"nofollow ugc noopener\">#12659</a></p></li><li><p>GTK: A new configuration <code>gtk-tabs-inverted</code> moves the close button to</p><p>the start of each tab, in both the tab bar and the tab overview.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14657\" rel=\"nofollow ugc noopener\">#14657</a></p></li><li>GTK: The default command palette entries are now translatable. <a href=\"https://github.com/ghostty-org/ghostty/issues/11641\" rel=\"nofollow ugc noopener\">#11641</a></li><li><p>GTK: The embedded Noto emoji fonts were updated, so newer emoji and ZWJ</p><p>sequences such as the head-shaking faces render as one glyph instead of\noverlapping neighboring cells. <a href=\"https://github.com/ghostty-org/ghostty/issues/14047\" rel=\"nofollow ugc noopener\">#14047</a></p></li><li><p>GTK: <code>ctrl+shift+page_up</code> and <code>ctrl+shift+page_down</code> now move the current</p><p>tab left and right (<code>move_tab</code>), matching Firefox, GNOME Terminal, and\nVS Code. <code>jump_to_prompt</code> moved to <code>ctrl+shift+arrow_up</code> and\n<code>ctrl+shift+arrow_down</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/4998\" rel=\"nofollow ugc noopener\">#4998</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12458\" rel=\"nofollow ugc noopener\">#12458</a></p></li><li><p>GTK: URLs now open through the XDG desktop portal, falling back to</p><p><code>xdg-open</code> if the portal is unavailable. Ghostty passes an activation\ntoken so the opened application, such as your browser, can come to the\nfront on compositors that require one. <a href=\"https://github.com/ghostty-org/ghostty/issues/5991\" rel=\"nofollow ugc noopener\">#5991</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/11754\" rel=\"nofollow ugc noopener\">#11754</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14785\" rel=\"nofollow ugc noopener\">#14785</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/14787\" rel=\"nofollow ugc noopener\">#14787</a></p></li><li><p>GTK: Desktop notifications are now withdrawn when their terminal is</p><p>focused or closed, and repeated notifications with the same text\nreplace each other, matching macOS. <a href=\"https://github.com/ghostty-org/ghostty/issues/14108\" rel=\"nofollow ugc noopener\">#14108</a></p></li><li><p>GTK: Tabs that aren&#39;t visible no longer render, saving CPU and GPU.</p><p>This matches macOS. <a href=\"https://github.com/ghostty-org/ghostty/issues/12760\" rel=\"nofollow ugc noopener\">#12760</a></p></li><li><p>GTK: The Dolphin &quot;Open Ghostty Here&quot; action now opens a new window in</p><p>the running Ghostty instance instead of launching a separate one.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/11614\" rel=\"nofollow ugc noopener\">#11614</a></p></li><li><p>GTK: Fix Ghostty sometimes failing to launch with systemd 262, which</p><p>refused to start the service because Ghostty reported readiness before\nit could handle reload signals. <a href=\"https://github.com/ghostty-org/ghostty/issues/14398\" rel=\"nofollow ugc noopener\">#14398</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14399\" rel=\"nofollow ugc noopener\">#14399</a></p></li><li><p>GTK: Fix deeply nested splits sometimes becoming invisible or losing</p><p>focus. <a href=\"https://github.com/ghostty-org/ghostty/issues/11193\" rel=\"nofollow ugc noopener\">#11193</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12698\" rel=\"nofollow ugc noopener\">#12698</a></p></li><li><p>GTK: Resizing splits, especially with <code>resize_split</code> keybinds, no</p><p>longer flickers. <a href=\"https://github.com/ghostty-org/ghostty/issues/13414\" rel=\"nofollow ugc noopener\">#13414</a></p></li><li><p>GTK: <code>resize_split</code> on nested splits no longer causes large jumps in</p><p>size. <a href=\"https://github.com/ghostty-org/ghostty/issues/12699\" rel=\"nofollow ugc noopener\">#12699</a></p></li><li><p>GTK: Splits can no longer be resized smaller than one cell, by dragging</p><p>the divider or with <code>resize_split</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/14476\" rel=\"nofollow ugc noopener\">#14476</a></p></li><li><p>GTK: High-resolution scroll wheels no longer scroll much faster than</p><p>standard scroll wheels. <a href=\"https://github.com/ghostty-org/ghostty/issues/12483\" rel=\"nofollow ugc noopener\">#12483</a></p></li><li><p>GTK: Disable unwanted kinetic scrolling on trackpads with GTK versions</p><p>older than 4.20.1. <a href=\"https://github.com/ghostty-org/ghostty/issues/11793\" rel=\"nofollow ugc noopener\">#11793</a></p></li><li><p>GTK: Middle clicks are once again sent to terminal applications using</p><p>mouse reporting when <code>gtk-enable-primary-paste</code> is disabled in\nGSettings. <a href=\"https://github.com/ghostty-org/ghostty/issues/12940\" rel=\"nofollow ugc noopener\">#12940</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13108\" rel=\"nofollow ugc noopener\">#13108</a></p></li><li><p>GTK: The quick terminal no longer breaks when toggled off manually</p><p>while <code>quick-terminal-autohide</code> is enabled. <a href=\"https://github.com/ghostty-org/ghostty/issues/11679\" rel=\"nofollow ugc noopener\">#11679</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12471\" rel=\"nofollow ugc noopener\">#12471</a></p></li><li><p>GTK: Opening the right-click context menu no longer hides the quick</p><p>terminal when <code>quick-terminal-autohide</code> is enabled. <a href=\"https://github.com/ghostty-org/ghostty/issues/12843\" rel=\"nofollow ugc noopener\">#12843</a></p></li><li><p>GTK: The resize overlay no longer keeps reappearing when the scrollbar</p><p>is visible and no longer blocks mouse input while shown. <a href=\"https://github.com/ghostty-org/ghostty/issues/11970\" rel=\"nofollow ugc noopener\">#11970</a> \n<a href=\"https://github.com/ghostty-org/ghostty/issues/11972\" rel=\"nofollow ugc noopener\">#11972</a></p></li><li><p>GTK: The maximum window size is now based on the monitor the window is</p><p>currently on, not the monitor it was opened on. <a href=\"https://github.com/ghostty-org/ghostty/issues/13171\" rel=\"nofollow ugc noopener\">#13171</a></p></li><li><p>GTK: <code>+new-window -e</code> now works when <code>shell-integration</code> is set to a</p><p>specific shell. <code>+new-window</code> and <code>+new-tab</code> also accept a new\n<code>--shell-integration</code> flag. <a href=\"https://github.com/ghostty-org/ghostty/issues/12378\" rel=\"nofollow ugc noopener\">#12378</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13741\" rel=\"nofollow ugc noopener\">#13741</a></p></li><li><p>GTK: Keys remapped to modifiers with XKB (e.g. Delete remapped to</p><p><code>ISO_Level3_Shift</code>) no longer also send the original key. <a href=\"https://github.com/ghostty-org/ghostty/issues/13967\" rel=\"nofollow ugc noopener\">#13967</a></p></li><li><p>GTK: On Wayland, the IME candidate window now follows the cursor while</p><p>composing and no longer covers the line being edited. <a href=\"https://github.com/ghostty-org/ghostty/issues/14729\" rel=\"nofollow ugc noopener\">#14729</a></p></li><li><p>GTK: Splits in a tab that was moved to another window now act on the</p><p>new window (e.g. <code>toggle_fullscreen</code>). <a href=\"https://github.com/ghostty-org/ghostty/issues/14474\" rel=\"nofollow ugc noopener\">#14474</a></p></li><li><p>GTK: The mouse cursor keeps its text shape while selecting text.</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/14558\" rel=\"nofollow ugc noopener\">#14558</a></p></li><li><p>GTK: The command palette now uses the terminal colors when</p><p><code>window-theme = ghostty</code>. <a href=\"https://github.com/ghostty-org/ghostty/issues/14662\" rel=\"nofollow ugc noopener\">#14662</a></p></li><li><p>GTK: Opening URLs no longer fails when the fallback opener (<code>xdg-open</code>)</p><p>produces large output. <a href=\"https://github.com/ghostty-org/ghostty/issues/12797\" rel=\"nofollow ugc noopener\">#12797</a></p></li><li><p>GTK: Clicking a desktop notification no longer focuses the wrong</p><p>terminal when the one that sent it has since been closed. <a href=\"https://github.com/ghostty-org/ghostty/issues/12028\" rel=\"nofollow ugc noopener\">#12028</a></p></li><li><p>GTK: A bell in the focused terminal no longer leaves the bell</p><p>indicator set. <a href=\"https://github.com/ghostty-org/ghostty/issues/13597\" rel=\"nofollow ugc noopener\">#13597</a></p></li><li><p>GTK: Fix the window continuously redrawing in the background after an</p><p>indeterminate progress bar (OSC 9;4) was removed. <a href=\"https://github.com/ghostty-org/ghostty/issues/14704\" rel=\"nofollow ugc noopener\">#14704</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14738\" rel=\"nofollow ugc noopener\">#14738</a></p></li><li><p>GTK: Log missing or invalid <code>gtk-xft-dpi</code> values once instead of</p><p>repeatedly. <a href=\"https://github.com/ghostty-org/ghostty/issues/14410\" rel=\"nofollow ugc noopener\">#14410</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14085\" rel=\"nofollow ugc noopener\">#14085</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14434\" rel=\"nofollow ugc noopener\">#14434</a></p></li><li><p>GTK: Fix a crash when closing tabs or splits on GTK 4.20 (GNOME 49).</p><p><a href=\"https://github.com/ghostty-org/ghostty/issues/12426\" rel=\"nofollow ugc noopener\">#12426</a></p></li><li><p>GTK: Fix a crash with global keybinds or on configuration reload when</p><p>no D-Bus connection is available. <a href=\"https://github.com/ghostty-org/ghostty/issues/13101\" rel=\"nofollow ugc noopener\">#13101</a></p></li><li><p>GTK: Fix a possible crash when Fontconfig reports a font&#39;s language as a</p><p>plain string instead of a language set. <a href=\"https://github.com/ghostty-org/ghostty/issues/14853\" rel=\"nofollow ugc noopener\">#14853</a></p></li><li><p>GTK: Fix a leak where every audio bell started a new GStreamer pipeline</p><p>and threads that were never cleaned up, slowly raising CPU usage.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/13647\" rel=\"nofollow ugc noopener\">#13647</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/12815\" rel=\"nofollow ugc noopener\">#12815</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/13657\" rel=\"nofollow ugc noopener\">#13657</a></p></li><li><p>Snap: Link the system FreeType, Fontconfig, HarfBuzz, libpng, and zlib</p><p>instead of bundled copies, fixing frequent crashes caused by two copies\nof the same library in one process. <a href=\"https://github.com/ghostty-org/ghostty/issues/14392\" rel=\"nofollow ugc noopener\">#14392</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14682\" rel=\"nofollow ugc noopener\">#14682</a></p></li><li><p>Snap: The snap&#39;s own GIO modules and XDG data directories now take</p><p>priority over the host&#39;s. <a href=\"https://github.com/ghostty-org/ghostty/issues/12045\" rel=\"nofollow ugc noopener\">#12045</a></p></li><li><p>Snap: Programs running inside Ghostty, such as <code>clear</code>, now find the</p><p><code>xterm-ghostty</code> terminfo entry. <a href=\"https://github.com/ghostty-org/ghostty/issues/12662\" rel=\"nofollow ugc noopener\">#12662</a></p></li><li><p>Flatpak: Commands started by Ghostty on the host are now terminated if</p><p>Ghostty crashes. <a href=\"https://github.com/ghostty-org/ghostty/issues/12427\" rel=\"nofollow ugc noopener\">#12427</a></p></li></ul>\n<h3 id=\"localization\">Localization</h3>\n<p>Ghostty 1.4 introduces full localization for the command palette and adds\nsupport for <strong>4 new languages</strong>:</p>\n<ul><li>Basque</li><li>Belarusian</li><li>Danish</li><li>Serbian (Cyrillic and Latin scripts)</li></ul>\n<p>Localization is maintained by volunteer contributors. If you want to\nhelp localize Ghostty in your language, please open a discussion on the\nGitHub repo. Thank you to all the volunteers who contributed to Ghostty&#39;s\nlocalization!</p>\n<h3 id=\"changes-for-package-maintainers\">Changes for Package Maintainers</h3>\n<ul><li>Ghostty now requires Zig 0.17 to build. <a href=\"https://github.com/ghostty-org/ghostty/issues/14518\" rel=\"nofollow ugc noopener\">#14518</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14519\" rel=\"nofollow ugc noopener\">#14519</a></li><li><p>GTK builds now require <strong>GTK 4.18</strong> and <strong>libadwaita 1.7</strong>, up from</p><p>GTK 4.14 and libadwaita 1.5. Builds against older headers fail at\ncompile time, and Ghostty exits at startup if older libraries are\nloaded at runtime. <a href=\"https://github.com/ghostty-org/ghostty/issues/14330\" rel=\"nofollow ugc noopener\">#14330</a></p></li><li><p>GTK builds now link the system EGL library (pkg-config <code>egl</code>, usually</p><p>provided by libglvnd or Mesa) for the new renderer. At runtime, Ghostty\nuses GTK&#39;s EGL display when it can, and otherwise needs an EGL driver\nthat supports the surfaceless platform. <a href=\"https://github.com/ghostty-org/ghostty/issues/14052\" rel=\"nofollow ugc noopener\">#14052</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14636\" rel=\"nofollow ugc noopener\">#14636</a></p></li><li><p>A new <code>-Dinstalled-exe-path</code> build option sets the absolute executable</p><p>path written into the desktop file, D-Bus services, and systemd user\nservice. Previously this path came from the install prefix. Without the\noption, these files now name <code>ghostty</code> alone, which systemd only finds in\n<code>/usr/bin</code> or <code>/usr/local/bin</code>, so set it for any other prefix.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/14805\" rel=\"nofollow ugc noopener\">#14805</a>  <a href=\"https://github.com/ghostty-org/ghostty/issues/14806\" rel=\"nofollow ugc noopener\">#14806</a></p></li><li><p>When linking the system gtk4-layer-shell (<code>-fsys=gtk4-layer-shell</code>),</p><p>version 1.0.4 or newer is now required. Ghostty no longer disables the\nquick terminal on older versions, which can crash on some compositors.\n<a href=\"https://github.com/ghostty-org/ghostty/issues/11559\" rel=\"nofollow ugc noopener\">#11559</a></p></li></ul>\n<h2 id=\"libghostty\">Libghostty</h2>\n<p>As with 1.3, libghostty isn&#39;t directly part of the Ghostty 1.4 release.\nBut a large part of the 1.4 development cycle went into libghostty, so\nhere&#39;s an update.</p>\n<p>Over the past 6 months, the C API for libghostty-vt has grown from a\nparser and a few encoders into a complete terminal emulator API, adopted\nby dozens of free and commercial terminal emulators used by millions of\npeople. It&#39;s hard to quantify exactly, but the number of people using a\nlibghostty-based terminal is confidently several times the number of\npeople using the Ghostty GUI.</p>\n<p>libghostty-vt now builds for macOS, Linux, Windows (MSVC and GNU), FreeBSD,\nAndroid, iOS, and WebAssembly, and CI continuously verifies every one of\nthese targets. The goal is for libghostty-vt to be generally usable everywhere,\nwithin reason, so if you want more target support, let us know!</p>\n<p>It&#39;s also easier to integrate libghostty-vt into existing build systems.\nThere&#39;s CMake support, Nix packaging, an xcframework, and a source\ntarball, in addition to the existing pkg-config file. <strong>libghostty-vt no\nlonger needs libc++, and it can build freestanding.</strong></p>\n<p>The API is still marked as a work in progress and broke compatibility\nseveral times during this cycle, so expect more breaking changes before\na tagged release. The <a href=\"https://libghostty.tip.ghostty.org/index.html\" rel=\"nofollow ugc noopener\">API documentation</a>\nand the <a href=\"https://github.com/ghostty-org/ghostty/tree/main/example\" rel=\"nofollow ugc noopener\">Zig, C, C++, Swift, and WebAssembly examples</a>\n(now over 30) are kept up to date with <code>main</code>.</p>\n<p>We&#39;re going to do a final pass over the C API, break ABI one more time,\nand then likely tag a libghostty 1.0 release very soon.</p>\n<h2 id=\"financial-update\">Financial Update</h2>\n<p>Ghostty is a <a href=\"https://ghostty.org/docs/sponsor\" rel=\"nofollow ugc noopener\">non-profit project</a>, fiscally sponsored\nby <a href=\"https://hackclub.com\" rel=\"nofollow ugc noopener\">Hack Club</a>.\nAll of our finances are <a href=\"https://hcb.hackclub.com/ghostty\" rel=\"nofollow ugc noopener\">public on HCB</a>,\nso you can see exactly where every dollar goes.</p>\n<p>During the 1.4 cycle, we paid <strong>$41,820</strong> to contributors under contract and\nspent about <strong>$1,260</strong> on infrastructure such as website hosting.</p>\n<p>I&#39;m happy to share that we&#39;ve now signed our first two <strong>12-month contracts</strong>,\nwhich give contributors stable, long-term paid work on Ghostty and help\nensure the ongoing stability and sustainability of the project:</p>\n<ul><li><p><a href=\"https://github.com/trag1c\" rel=\"nofollow ugc noopener\">@trag1c</a> is Ghostty&#39;s head of operations.</p><p>He manages the community on GitHub and Discord, coordinates our\nvolunteer translators, and maintains various other important project\nsystems.</p></li><li><p><a href=\"https://github.com/vancluever\" rel=\"nofollow ugc noopener\">@vancluever</a> works on various Ghostty</p><p>subsystems. In this cycle, he led the upgrade to Zig 0.16, moved the\nbuild off Zig&#39;s deprecated <code>@cImport</code>, updated the bundled Fontconfig,\nand more. He&#39;s also the author of\n<a href=\"https://github.com/vancluever/z2d\" rel=\"nofollow ugc noopener\">z2d</a>, the 2D graphics library Ghostty\nuses to draw box-drawing characters and other sprite glyphs.</p></li></ul>\n<p>If you&#39;d like to support Ghostty, please visit our <a href=\"https://ghostty.org/docs/sponsor\" rel=\"nofollow ugc noopener\">sponsorship page</a>.</p>\n<h2 id=\"roadmap\">Roadmap</h2>\n<p>The primary focus of the roadmap continues to be libghostty functionality,\nstability, and portability. During the last release cycle, I said I aimed to\ntag a libghostty release. We haven&#39;t done that yet, but I&#39;m confident we will\ndo so before Ghostty 1.5.</p>\n<p>libghostty is a project that continues to be the tide that lifts all boats.\nlibghostty improvements tie directly to Ghostty GUI improvements as well as\ndozens of other large projects in the ecosystem. As more large projects adopt\nlibghostty, libghostty tends to get more testing and attention, and this\ncreates a cycle that yields the most gain for terminal emulators everywhere.</p>\n<p>macOS and GTK builds of Ghostty have talented, capable maintainer teams that\nare continuing to improve them, so they&#39;re not neglected by any means!\nAs a project, we&#39;ve decided to drop any roadmap for Windows support in the\nGhostty GUI. libghostty fully supports Windows (and we test it in CI), and the\nofficial stance now is that downstream projects should use that.</p>\n<p>Our release cycle remains 6 months. This release was delayed by one month,\nbut Ghostty 1.5 is planned for March 2027. libghostty will have a separate\nrelease cycle.</p>\n<hr />\n<p><em>Originally published at <a href=\"https://ghostty.org/docs/install/release-notes/1-4-0\" rel=\"nofollow ugc noopener\">ghostty.org</a>.</em></p>","headings":[{"level":1,"text":"Ghostty 1.4.0","id":"ghostty-1-4-0"},{"level":2,"text":"Security","id":"security"},{"level":2,"text":"Highlights","id":"highlights"},{"level":3,"text":"macOS 27 Support","id":"macos-27-support"},{"level":3,"text":"Kitty Graphics Animation and Relative Placements","id":"kitty-graphics-animation-and-relative-placements"},{"level":3,"text":"Scrollback Compression and Lower Memory Usage","id":"scrollback-compression-and-lower-memory-usage"},{"level":3,"text":"Performance Improvements","id":"performance-improvements"},{"level":3,"text":"New OpenGL Renderer (Linux, FreeBSD)","id":"new-opengl-renderer-linux-freebsd"},{"level":3,"text":"Kitty Clipboard Protocol","id":"kitty-clipboard-protocol"},{"level":3,"text":"Split Drag and Drop (GTK)","id":"split-drag-and-drop-gtk"},{"level":3,"text":"Terminal Emulation Accuracy","id":"terminal-emulation-accuracy"},{"level":3,"text":"SSH Integration with ghostty +ssh","id":"ssh-integration-with-ghostty-ssh"},{"level":2,"text":"System Requirements","id":"system-requirements"},{"level":2,"text":"Breaking Changes","id":"breaking-changes"},{"level":3,"text":"Deprecations","id":"deprecations"},{"level":2,"text":"Full Changelog","id":"full-changelog"},{"level":3,"text":"Terminal Capabilities","id":"terminal-capabilities"},{"level":3,"text":"Shell Integration","id":"shell-integration"},{"level":3,"text":"macOS","id":"macos"},{"level":3,"text":"GTK (Linux, FreeBSD)","id":"gtk-linux-freebsd"},{"level":3,"text":"Localization","id":"localization"},{"level":3,"text":"Changes for Package Maintainers","id":"changes-for-package-maintainers"},{"level":2,"text":"Libghostty","id":"libghostty"},{"level":2,"text":"Financial Update","id":"financial-update"},{"level":2,"text":"Roadmap","id":"roadmap"}]}}