
Mitchell Hashimoto
@mitchellh • 214,750 subscribers
Creator of Ghostty. 👻 Prev founded @HashiCorp, created Vagrant, Terraform, Vault, and others.
Shorts
Videos

Ghostty is getting automatic scrollback compression, resulting in 70 to 90% less physical memory usage. It happens incrementally when idle, so it had no measurable effect on IO throughput. I'm not aware of any other mainstream terminal that does this. Demo video below! The gains let us increase the default scrollback limit from 10MB to 50MB, because on average a full scrollback will still compress smaller than the prior limit. More history, for free. ("Unlimited", disk-paged history is on the roadmap too) Let's talk about cool implementation details, cause this was fun. First, the data structure and memory layout ("PageList") I wrote two years ago finally pays off! One of its traits is that screen memory is backed by a linked list of page-aligned, page-sized (or page-multiple-sized) blocks. Because each block is page-aligned and page-sized, we can use madvise to discard its physical backing while keeping the virtual address space reserved. Compressed pages therefore disappear from resident memory, but decompression is still guaranteed because the address space remains valid and we simply fault new pages back in as needed. We use the same trick for our memory pools, too. Unallocated pool pages don't count as resident memory, saving another couple of MB per terminal. This functionality is also available to libghostty-vt consumers via new `ghostty_terminal_compress` APIs. The consumer decides when the appropriate time to compress is and the APIs advise on compressability.
Mitchell Hashimoto162,141 views • 10 days ago

Work-in-progress: a new split layout framework for nearly all Apple platforms (macOS, iOS, etc.). A mix of SwiftUI and raw CoreAnimation. The goal is "every frame perfect" animation. Still very wip, but getting there! Goal is to bring it back to Ghostty eventually.
Mitchell Hashimoto337,556 views • 23 days ago

This is why PR diff speed matters. This isn't a dunk on GitHub specifically, because GitLab, Forgejo, etc. are all equal or worse. But this is the kind of thing that drives me nuts, because this is a core workflow and its slow enough I literally take my hands off the keyboard. Btw, when my mouse jiggles on the left, its because the page is literally skipping frames and I'm instinctively shaking my mouse to see if it'll respond. And on the keyboard input you can literally here me finish typing before a letter even shows up. For someone like me who is an expert at these tools, my brain navigates the tool dramatically faster than it can keep up, and that is not good. The tool should not get in the way.
Mitchell Hashimoto365,753 views • 1 month ago

Split layout framework update. Since the last video: focus views animate, corner drags can move both axes, cross-window drag and drop with animation, all animations backed by CoreAnimation, and full accessibility framework integration (e.g. compat with VoiceOver). The focus view work was the hardest and most complicated. We allow caller-provided SwiftUI views for the focus style, but have to drop that back to a native AppKit/UIKit hosted view for smooth CoreAnimation integration with our other animations so they move in lock-step with our other stuff. Lot of work to get that to work, but I think it turned out great. The caller lives in easy SwiftUI land we handle that complexity. The animation timings and curves need to be tweaked. I think some animations are too long or don't feel right. But thats just parameterization at this point...
Mitchell Hashimoto102,018 views • 20 days ago

Ghostty nightly now supports the `click_events` extension introduced by Kitty and supported by Fish. If you're using Fish 4.1+, you can click (no modifiers!) anywhere at a prompt to move the mouse. I believe Ghostty is the first to support this extension outside of Kitty. As far as as I can find, the only shell to support this is Fish (4.1+) and the only terminal to support this previously is Kitty. It'd be great for more of both ecosystems to support this. Other terminals do support moving the cursor with the mouse to some extent (Ghostty included since 1.0), but do so by another, more fragile mechanism: when you click, it just best-effort calculates a number of synthetic left arrow key inputs to pretend to move your cursor. This is super fragile because it can't take into account shell behaviors particularly around indention, multi-line, and if you're not at a prompt at all... The `click_events` extension allows Ghostty to know when you're at a prompt line, and works by encoding a mouse click event while at a prompt line to the shell. The shell then takes over and handles all the logic of moving the cursor, which makes the most sense! PR:
Mitchell Hashimoto347,151 views • 5 months ago

Ghostty 1.3 is going to have a preview of AppleScript support. All windows, tabs, splits, terminals are exposed via AppleScript. For macOS users, this satisfies some of the most common requests: broadcast commands, automatic layouts, jump to working directory, etc. PR here: I also think this is an incredibly important feature to ship early/now so agentic tools like Claude and Codex can take advantage of a scriptable Ghostty on macOS. I still plan on a generic cross-platform scripting/plugin API (two separate things), but integrating with native features like AppleScript is entirely in scope of the Ghostty mission and like our Shortcuts integration it importantly lets you connect multiple sources since AppleScript can control multiple applications from one script. Note I normally don't ship features so down to the wire with a release, but this one is very isolated in its impact and I'm going to explicit document it in the release notes and website as a preview since I fully expect we're going to iterate a lot on the objects and commands exposed. From a security perspective, Apple already prompts for permission to control different applications so we're covered, but there is a master kill switch you can put in the config, too.
Mitchell Hashimoto181,699 views • 4 months ago

Ghostty will now auto-generate a full, cohesive 256-color theme from just the base 16-color palette. This makes it significantly easier to make custom themes that are beautiful (just define 16 colors). See the demo below showing multiple themes fully generated. Thanks to Jake Stewart who contributed this to Ghostty and made a nice write-up explaining the background and approach:
Mitchell Hashimoto174,563 views • 5 months ago

Well, it has happened. Ghostty on macOS now has search. This is now in tip releases, I'm certain there's a bunch of polish and bugs to work through over the next months, but more than enough time for it to be rock solid for 1.3 next year. GTK to follow soon. Gobble, gobble. 🦃🦃
Mitchell Hashimoto221,587 views • 7 months ago

From empty repo to a functional minimal standalone terminal based on libghostty in 2 hours, presenting Ghostling! ~600 lines of C and you get extremely accurate, performant, and proven terminal emulation. Feature list: - Resize with text reflow - Full 24-bit color and 256-color palette support - Bold, italic, and inverse text styles - Unicode and multi-codepoint grapheme handling (no shaping or layout) - Keyboard input with modifier support (Shift, Ctrl, Alt, Super) - Kitty keyboard protocol support - Mouse tracking (X10, normal, button, and any-event modes) - Mouse reporting formats (SGR, URxvt, UTF8, X10) - Scroll wheel support (viewport scrollback or forwarded to applications) - Scrollbar with mouse drag-to-scroll - Focus reporting (CSI I / CSI O) - And more. Effectively all the terminal emulation features supported by Ghostty! The libghostty C API is not formally released, but I built this project to prove its ready to go. 😎
Mitchell Hashimoto111,878 views • 4 months ago

Libghostty can now be used to fuzz TUIs, thanks to Oskar Wickström + Antithesis. They already found bugs in multiple including btop. I always imagined libghostty would be useful for testing TUIs, super happy to see this is both practical and valuable. This is another example of where speed matters! "Why does Ghostty need to be so fast?" Well, if you're running hundreds or thousands of unit tests that each use a clean in-memory terminal, you want that to be fast. If you're fuzz testing and trying to push an unlimited amount of data through a terminal, you want that terminal to be fast. So many people got hung up on "why does my terminal _GUI_ need to be fast" without connecting one more dot and realizing the GUI is only fast if the core is fast, and the core being fast unlocks a hell of a lot more. Like this.
Mitchell Hashimoto71,584 views • 2 months ago

The lack of "feature design" is why so many products over time feel hollow or messy. This isn't visual design. This isn't architectural design. I thought that a short video lecture of what feature design is and a real case study of applying it in Ghostty would be helpful. Feature design is the planning step behind how you're going to solve one or more user problems with a product feature: what that feature looks like, how it feels, and not just how its going to tactically solve these specific problems, but how that solution is going to interface with the edges of other features that currently exist or are planned to exist in the future.
Mitchell Hashimoto155,878 views • 7 months ago

First I optimized CPU, then memory, now I'm onto the renderers (Metal first). Scrolling Neovim now sustains ~175fps easily (vsync off of course). More room for improvement, but this is already best-in-class (I can't find a terminal at the moment that does better on macOS). The road to get here was long. To quote Thorsten Ball I've been "moving the chess pieces into place over the past few months." I'll write about it in a devlog, eventually. And, people will inevitably say "high fps doesn't matter for a terminal." And yeah, maybe, but what's the fun in that. My answer to "why" is "because I can!" (Disclaimer: I use the Japanese bible as a sort of stress test for certain IO tests. I'm not religious and there isn't meant to be any sort of hidden message in this.)
Mitchell Hashimoto374,114 views • 2 years ago

Ghostty's icon is now Tahoe compatible: supports Liquid Glass, light/dark mode, and tinting. We had to lose a tiny amount of detail but very hard to notice, and the new effects make it look super clean. Videos of the various styles and effects attached. Icon by Michael Flarup.
Mitchell Hashimoto184,561 views • 1 year ago

Here's a short video (4m) that goes into more detail on how "vim mode" works in Ghostty and the multitude of features that are composed together to make it all work. This showcases how powerful Ghostty's keybinding system is getting! And don't worry, I plan on shipping a built-in "vim mode" table (unbound by default) so you can bind an opinionated "vim mode" with a single line in your config. But, if you want to modify it in any way, that's completely possible because this all works via standard config.
Mitchell Hashimoto87,810 views • 6 months ago

Ghostty on both macOS and Linux now support marking a terminal as read-only. In this mode, you can still search, scroll, and select text, but no input is sent to the running program. If you have something scary you really don't want to mess up, this is perfect! You can toggle this with the command palette, a keybinding (bind "toggle_readonly"), the context menu, or the main menu.
Mitchell Hashimoto89,086 views • 7 months ago

The non-native mind can't comprehend this level of platform integration. Ghostty is the only terminal on macOS other than the built-in one that provides any Shortcuts. Also, reminder that Ghostty is actually cross-platform with Linux too. (Sound on for explanation)
Mitchell Hashimoto116,208 views • 1 year ago

Have you ever wanted your terminal to look like an authentic CRT? Of course you have. Well, LOOK NO FURTHER because the future (or is it the past?) is now. And people ask why you'd ever need a GPU-rendered terminal.... HAH! My yak has no more hair to shave. This demo is crazier than it seems: you can actually specify any custom shader, and the shader API is compatible with ShaderToy, so you can take any off-the-shelf shader from ShaderToy and this works. The tech behind this is super over the top. Ghostty is cross-platform and uses Metal directly on macOS and OpenGL on Linux. Metal and OpenGL use different shading languages. No problem! You specify the custom shader in GLSL (OpenGL language) and it’s automatically translated to SPIR-V (binary IR) then automatically translated to MSL (Metal language). That all happens at runtime because why not. Yeah but this has to kill your battery right? Nope! <1% CPU and <1% GPU because computers are fast (especially when you're working at a relatively low level).
Mitchell Hashimoto200,104 views • 2 years ago

This is legitimately very good. This is how voice assistants should be! Fairly responsive, very natural, can interrupt freely. I am extremely skeptical about anything AI tells me but boy I really wish Siri or Alexa was like this. (Location isn’t secret, I’m not usually here)
Mitchell Hashimoto70,234 views • 11 months ago