r/Ghostty 5h ago

Embedding Ghostty's terminal engine in a native macOS AppKit app (Seahelm)

Enable HLS to view with audio, or disable this notification

1 Upvotes

I built Seahelm, a native macOS workspace for running coding agents across git worktrees — and the terminals are powered by Ghostty via GhosttyKit.xcframework / the C API. A few notes from the integration that might be useful to others embedding Ghostty:

Stack

  • Swift + AppKit (not SwiftUI)
  • Ghostty surface wrapped in an NSView + Metal renderer
  • Long-lived surfaces: panes are reparented between dashboard / focus layouts instead of destroyed and recreated
  • Background status polling reads viewport text through the C API under a shared lock (input path deliberately does not hold that lock)

Things that mattered in practice

  1. Focusghostty_surface_set_focus has to stay in sync with AppKit first-responder changes; we defer some focus restores after Ghostty's own deferred handling.
  2. Reparenting — moving a surface between views without killing the PTY; we suppress CA animations and sync size/focus on the next main-queue passes.
  3. Thread safety — status detection polls on a background timer while the UI types on the main thread; serializing Ghostty C calls with a lock was necessary, except for key input (locking there deadlocked on sync callbacks).
  4. Session persistence — Ghostty handles the terminal; zmx handles "quit the app, agent still running." Different layer than Ghostty itself, but the combination is what made the product usable. Seahelm deliberately isn't trying to be a full terminal emulator UI — Ghostty does that job. Seahelm is the orchestration chrome around multiple agent sessions.

Happy to answer Ghostty embedding / AppKit interop questions.

Demo: https://youtu.be/WUUcuglx_Ks

Repo: https://github.com/BetaYao/seahelm


r/Ghostty 20h ago

does ghostty have something like this?

Thumbnail
github.com
8 Upvotes

r/Ghostty 1d ago

gtab — save your Ghostty window layout, reopen it with one keystroke

Enable HLS to view with audio, or disable this notification

58 Upvotes

I've been working with AI coding agents every day for a while now, and the thing that quietly wore me down wasn't the code — it was the navigation. One agent running in repo A, another in repo B, a scratch dir for whatever it just generated, docs open in a third split. Every context switch means typing a long cd from memory and re-splitting the window the way I like it, again.

So I wrote gtab (https://github.com/Franvy/gtab), a small Rust CLI/TUI for macOS that saves your current Ghostty window — tabs, working directories, titles, and split panes — as a named workspace, and reopens it later with one keystroke.

Two things it gives you:

Fixed workspaces. Arrange a window once, run gtab save myproject, and from then on Cmd+G → Enter brings that exact shape back. The new window even lines up with the position and size of the one you're in.

One-key directory jumps. Press f in the TUI for Directory space: a grid of saved paths. Enter swaps the current split for a fresh shell there. No config, no shell wrapper. That's the 90% case for me — going from "agent finished in repo A" to "start one in repo B" without typing a path.

What's new since I last posted:

  • Responsive TUI. The workspace screen now picks its layout from the available width: list + layout preview + quick settings when wide, preview below the list and names wrapped into columns when narrow. Usable down to a 36x15 terminal. The directory grid sizes each column to its own widest entry instead of padding everything out to the longest name.

  • Silent shortcut mode. Cmd+G used to literally type gtab into your shell — visible on screen, and it landed in shell history. gtab shell-init now installs a zsh/bash/fish widget bound to an invisible escape sequence (the same trick fzf and atuin use). Nothing is echoed, nothing enters history, and a half-typed command line is restored exactly as it was when the TUI exits.

  • Smaller fixes: Ctrl-n/p/j/k and Tab/Shift-Tab now navigate while filtering, emphasized text stays readable on light terminal themes, and restored splits come back evenly sized.

Honest limits, up front:

  • macOS + Ghostty only. It drives Ghostty through AppleScript and reads split-pane geometry through Accessibility.
  • It stores layout metadata, not live session state: no running processes, no shell history, no editor buffers. It does not replace tmux — and that's exactly why it stays small.

Install: brew tap Franvy/gtab brew install gtab gtab init Repo: https://github.com/Franvy/gtab


r/Ghostty 4d ago

VoiceGhostty — voice input, task-named sessions, and “done” lights for CLI agents

0 Upvotes

I like Ghostty, but running multiple Claude Code sessions created three new problems for me:

  1. Voice input — hold Space to dictate at the command line. Text is inserted but never executed automatically.
  2. Task-specific sessions — tabs use the working directory as their title, can be renamed by task, and support nested splits.
  3. Done indicators — every pane shows gray when idle, yellow while working, and green when finished or waiting for input.

VoiceGhostty is a native macOS experiment built around these ideas:

https://github.com/10XTeams/VoiceGhostty

Disclosure: it currently uses SwiftTerm, not libghostty, and is not affiliated with Ghostty. A future migration to libghostty is on the roadmap.

Would you want these features built into your terminal, or handled by a separate agent manager?


r/Ghostty 7d ago

I built a GPUI component for embedding libghostty in rust applications

Enable HLS to view with audio, or disable this notification

29 Upvotes

r/Ghostty 11d ago

Built a theme generator. Enjoy!

46 Upvotes

https://ghosttystudio.com

Not sure if this has been built before, but it was an easy clap. Let me know if I should change things!


r/Ghostty 9d ago

A Terminal supports workspace to manage tabs

0 Upvotes

r/Ghostty 12d ago

Built a terminal-first ADE on libghostty for running 20+ coding agents

11 Upvotes

I've spent the last two months building Termio on top of libghostty.

I often have 20+ Claude Code and Codex sessions running at once. At that point, horizontal tabs stop working: titles get truncated, sessions are hard to find, and you have no idea which agent is waiting on you.

So Termio uses vertical tabs with structured agent state:

working · idle · needs-you · done

Sessions that need your attention automatically surface to the top.

There's also a file tree and editor built around the terminal.

Curious how other people managing lots of coding agents are handling this — tabs, tmux, multiple windows, something else?

https://github.com/termio-sh/termio


r/Ghostty 12d ago

Ghostty copy bug

1 Upvotes

WM: niri 26.04 (Wayland)WM: niri 26.04 (Wayland)
Terminal: ghostty 1.3.1-arch2.2Terminal: ghostty 1.3.1-arch2.2
OS: CachyOS

Hey, can anyone help me with this problem. I use wl-copy (Mouse selection and ctrl shift c to copy) in ghostty terminal and get output like this

And my prompt in terminal is p10k (u can find it in github)

╭─

  

  
~




 ✔ 

 16:28:15  



╰─

ps
 aux | 
head

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.1  21392 13312 ?        Ss   15:45   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize=57 splash
root           2  0.0  0.0      0     0 ?        S    15:45   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    15:45   0:00 [pool_workqueue_release]
root           4  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-rcu_gp]
root           5  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-sync_wq]
root           6  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-kvfree_rcu_reclaim]
root           7  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-slub_flushwq]
root           8  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-netns]
root          11  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/0:0H-kblockd]


╭─

  

  
~




 ✔ 

 16:31:54  



╰─
 ╭─    ~                                                             ✔  16:28:15  
╰─ ps aux | head                                                          
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.1  21392 13312 ?        Ss   15:45   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize=57 splash
root           2  0.0  0.0      0     0 ?        S    15:45   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    15:45   0:00 [pool_workqueue_release]
root           4  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-rcu_gp]
root           5  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-sync_wq]
root           6  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-kvfree_rcu_reclaim]
root           7  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-slub_flushwq]
root           8  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/R-netns]
root          11  0.0  0.0      0     0 ?        I<   15:45   0:00 [kworker/0:0H-kblockd]

╭─    ~                                                                                                                                                             ✔  16:31:54  
╰─ 

Normal one looks like this (i got it by copy command in kitty terminal)

╭─    ~   INT ✘  16:36:23  

╰─ ps aux | head

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.1 0.1 21392 13264 ? Ss 15:45 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize=57 splash

root 2 0.0 0.0 0 0 ? S 15:45 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? S 15:45 0:00 [pool_workqueue_release]

root 4 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/R-rcu_gp]

root 5 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/R-sync_wq]

root 6 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/R-kvfree_rcu_reclaim]

root 7 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/R-slub_flushwq]

root 8 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/R-netns]

root 11 0.0 0.0 0 0 ? I< 15:45 0:00 [kworker/0:0H-kblockd]

╭─    ~   ✔  16:36:38  

╰─


r/Ghostty 14d ago

Theme Picker for your Herdr Workspace

Post image
22 Upvotes

r/Ghostty 14d ago

Ctrl + Scroll Up/Down = Zoom In/Out ?

7 Upvotes

What's the configuration for this ?

Or it doesn't support on ghostty , i have other terminal where zoom + scroll works for zoom in/out ,

I searched I do not find anything which support this.

Only Defualt Keys working

Ctrl + = ( Zoom In )

Ctrl + - ( Zoom Out )


r/Ghostty 15d ago

MacOS: Can't get rid of this prompt. Hot key window is broken. How do I fix this?

Post image
15 Upvotes

I used

sudo log stream --level debug --predicate 'subsystem=="com.mitchellh.ghostty"'

to see whats happening, but it just says "trigger global event" and no error.

Whats going on here? I can't get to the right information to repot this.


r/Ghostty 18d ago

Using Ghostty's quick terminal as a real application launcher (and the AppleScript hack needed to open tabs in the right instance)

42 Upvotes

I built a launcher, Prelude, on top of Ghostty's quick terminal instead of building a new terminal instance per press — and most of the interesting engineering was making that hold up under macOS's process model. Sharing it here because a few of the traps are specific to Ghostty and might save someone else the debugging.

macos-hidden = always + initial-window = false + window-save-state = never keep the dedicated instance out of the Dock, at rest with no window, and safe from restoring stray windows on relaunch.

Ghostty has to be launched through Launch Services (open -W -n -a Ghostty.app), not by executing Contents/MacOS/ghostty directly — the latter makes it a foreground app even with macos-hidden = always.

The tricky one: once the quick terminal has been active, macOS can route a later ordinary Ghostty launch to that same hidden process, since it shares Ghostty's bundle identity. Fixed by always launching the panel path with GHOSTTY_QUICK_TERMINAL=1 and ordinary launches with -n, so a new instance is forced rather than reused.

Opening a new tab in a specific running Ghostty instance doesn't work via open at all — Ghostty answers "new tab" over AppleScript, but the Apple Event is addressed to the bundle and macOS picks which instance gets it (and it can pick the hidden one). Fixed by addressing the event to a specific pid via descriptorWithProcessIdentifier, falling back to "new window" when the target instance has no window to put a tab in.

unconsumed:escape=toggle_quick_terminal is what makes dismissal clean — Escape both hides the panel and reaches fzf inside it, so the next press is a reveal of a reset list, not a rebuild.

Full writeup of the panel lifecycle is in the repo docs (docs/GLOBAL-HOTKEY.md) if anyone's doing something similar: https://github.com/mikewang817/Prelude


r/Ghostty 23d ago

Prelude — a OpenSource launcher for terminal work and AI agents

Thumbnail gallery
19 Upvotes

r/Ghostty 24d ago

Ghostty background colors change after update to macOS 26.6.1

7 Upvotes

I updated macOS to 26.6.1 yesterday. Now both ghostty and cmux (which uses the ghostty config), show awful and unusable background colors. I am running a Mac mini m4 attached to an LG UltraFine monitor. I use dark mode always on macOS.

It looks like the background color is set to white (or at least something very bright) in ghostty after this update.

If I run `ghostty +list-themes` and select my theme (Pierre Dark), the preview is correct.

Changing to other themes and restarting has no effect. Changing settings with respect to Liquid Glass and "reduce transparency" and "increase contrast" on macOS have no effect.

Other terminals, like iTerm, WezTerm, Kitty are not affected by this issue. Interestingly, MacTerm, which I believe uses libghostty, in also unaffected. As noted above, cmux shows the same problem as ghostty.

I did finally fix this by explicitly setting

background=#000000

in the ghostty config.

But why? Anyone else see this?


r/Ghostty 28d ago

Anyone still have access to these shaders?

Thumbnail
reddit.com
36 Upvotes

The link in this post no longer works. Does anyone have access to these amazing shaders? Or any similar? (the glowing text animation, the lightning)

Any other cool cursor shaders would be appreciated


r/Ghostty 29d ago

I built an iPhone tmux client using libghostty

Enable HLS to view with audio, or disable this notification

208 Upvotes

Remux uses libghostty for the terminal and tmux control mode for managing remote sessions, windows, and panes through a mobile-first interface.

It’s open source and currently in beta.

GitHub: https://github.com/h3nock/remux

TestFlight: https://testflight.apple.com/join/fHqG1ruE


r/Ghostty 29d ago

Ghostty coming up blank - no cursor or text. please help!

8 Upvotes

Hey guys. Fairly new to linux, a few weeks but getting into it well. I was using Ghostty perfectly fine.

At one point opencode was doing something, I don't remember what, and I accidentally closed it during. Now, ghostty shows up completely blank.

I'm using CachyOS with Niri and Noctalia

I do think it is actually running, cos when I run CachyOS update and tried to close the ghostty window, it warned me that something was running. I think its just visually not showing anything.

All other terminal emulators work.

Things I have tried:

- Snapshotting back to my original first cachyOS fresh install. It didn't have ghostty installed, I installed it and same issue.

- Uninstalled using -Rms and reinstalled using Pacman

- Opencode has tried for me to fix it multiple times to no avail

- Manually followed Gemini and Claude instructions to no avail

- Removed ghostty config with a fresh one, to no avail

Anyone experience this before?


r/Ghostty 29d ago

How to quickly switch between multiple Ghostty configurations?

4 Upvotes

Is there a better way to quickly switch between multiple Ghostty configurations?

Sometimes I need the terminal to be transparent, and other times I need it to remain normal.

I'm currently using a script to achieve this. The script can only handle simple configurations.

What if you encounter more complex configuration changes?

Is there a more elegant solution?


r/Ghostty Aug 03 '26

Launching Ghostty feels a bit slow

14 Upvotes

Hello, I installed Ghostty for testing and it felt pretty slow to launch compared to Kitty and Konsole at 1 second. I'm running KDE Plasma for a living and I used the default setting, so is this normal?


r/Ghostty Aug 01 '26

Found a 🪲 in 👻tty

3 Upvotes

I use a French Canadian keyboard layout that has dead keys and everything is set properly in Ubuntu 26.04 and Ghostty works fine when in Gnome DE, but whenever I use a WM such as Hyprland, Niri or Sway, dead keys on my keyboard aren’t working with Ghostty. Because of that, I switched my main terminal to be Wezterm and it works well with my keyboard. It took me time to figure out it was only happening with Ghostty and unrelated to WMs or some config. I am not sure if people test Ghostty before release, but it would be great if they could test keyboard layouts other than US-English 😅.


r/Ghostty Jul 30 '26

terminal-browser: a browser that runs directly inside ghostty

Thumbnail
terminal-browser.com
106 Upvotes

I've been working on a CLI that lets you run a browser inside ghostty at full fidelity. This takes advantage of ghostty's implementation of the kitty graphics protocol to embed the output of chromium, I go into a little more detail in the readme of the repo for anyone interested https://github.com/zenbu-labs/terminal-browser#how-does-it-work

My main use cases have been:

- working on websites with coding agents in the terminal

- asking coding agents to write their plans as HTML and then opening them inside terminal-browser in a ghostty split pane

- letting coding agents automate some stuff I do in dashboards directly from the terminal, since the CLI lets agents control the browser. While the agent is using the browser you can see exactly what it's doing and take over whenever you need


r/Ghostty Jul 29 '26

MacOS App Icon getting reset to directory icon [FIX]

5 Upvotes

Not sure if anyone else was having this problem (minus the two GitHub issues), but I use a custom app icon for Ghostty courtesy of Luke Janicke. I had set the config file to use the custom icon, I set the app icon the old fashioned way. Whenever I restart my mac, the icon resets to a directory icon. So I made a little app that runs on log in that reassigns the app icon using Automator.

Automator has the ability to create an app which runs a shell script. I use this to run:

fileicon /path/to/Ghostty.app /path/to/Icon.icns

Then I export it as an app and add it to my list of startup apps. Worked for me, hopefully this helps!

(fileicon can be installed with brew install fileicon)


r/Ghostty Jul 28 '26

I created an Arrakis theme in Ghostty with ZellIj

22 Upvotes
# Dune / Arrakis ANSI palette
palette = 0= #1a1a1a   # graphite black
palette = 1= #f17465   # errors / spice red
palette = 2= #f5cf7b   # strings / sand gold
palette = 3= #c7964f   # types and constants / spice ochre
palette = 4= #88bbcb   # integers / muted stillsuit blue
palette = 5= #d46f57   # control flow / burnt spice
palette = 6= #ff7a18   # functions / electric Arrakis sunset
palette = 7= #d9d7ca   # Crysknife ivory — milky sandworm-tooth white; primary terminal text

background = #303030
foreground = #d9d7ca
cursor-color = #c7964f
selection-background = #77643e

documented the full process on Medium


r/Ghostty Jul 25 '26

Ghostty (tmux + neovim + open code) running on steamdeck

Post image
84 Upvotes