lavs9811 downloadsTrue Ghostty embedded terminal (libghostty-vt WASM) – with your real Ghostty config, multi-split support, and file-explorer context menu.
A true Ghostty-powered terminal pane embedded inside Obsidian — same VT parser as the native Ghostty app, no Electron quirks, no xterm.js compromises.
Ghostty Terminal embeds a fully functional, real terminal inside your Obsidian vault pane. Under the hood it uses:
libghostty-vt engine that powers the native Ghostty terminal app on macOS and Linux.pty_helper.py) — spawns your actual shell in a real pseudo-terminal (PTY) and proxies I/O between it and the WASM terminal renderer. Uses Python's stdlib pty module — no native Node addons required.ghostty-web's CanvasRenderer draws the terminal to a <canvas> element pixel-perfectly using exact font metrics.This is not a wrapper around xterm.js. You get real Ghostty VT semantics: proper Unicode (grapheme clusters, wide chars), 256-color + truecolor, OSC 8 hyperlinks, Kitty graphics protocol, and more.

| Feature | Details |
|---|---|
| 🖥️ Real Ghostty VT parser | ghostty-web WASM — identical behavior to native Ghostty |
| 🎨 Your Ghostty config | Auto-reads ~/.config/ghostty/config — font, font size, full 16-color palette |
| 📐 Pixel-perfect resize | Canvas measures exact character cell dimensions; columns never misalign |
| 🪟 Multiple terminals / splits | Each pane is fully independent; open as many as you need |
| 📁 File Explorer context menu | Right-click any file or folder → Open Ghostty Terminal here |
| 🔁 Shell restart button | If the shell exits, a ⟳ button appears inline — no plugin reload needed |
| ⚙️ Settings override | Override shell, font, font size, and scrollback from Obsidian Settings |
| 🚫 No native addons | Uses Python pty stdlib instead of node-pty — no electron-rebuild needed |
| Requirement | Minimum version |
|---|---|
| Obsidian | 1.6.0 (desktop only) |
| macOS / Linux | Any modern version |
| Python | 3.8+ (ships with macOS and most Linux distros) |
| Node.js | 18+ (only needed to build from source) |
Windows: The PTY proxy does not currently support Windows. macOS and Linux are fully supported.
BRAT lets you install plugins directly from GitHub without waiting for community approval.
https://github.com/lavs9/obsidian-ghostty-terminal
Go to the Releases page and download the latest release assets:
main.jsmanifest.jsonstyles.csspty_helper.pyCreate the plugin folder in your vault:
mkdir -p /path/to/your-vault/.obsidian/plugins/ghostty-terminal
Copy the downloaded files into that folder
In Obsidian: Settings → Community plugins → Toggle "Restricted mode" OFF → Enable "Ghostty Terminal"
# 1. Clone the repo
git clone https://github.com/lavs9/obsidian-ghostty-terminal
cd obsidian-ghostty-terminal
# 2. Install dependencies
npm install
# 3. Build
npm run build
# 4. Copy plugin files to your vault
VAULT=~/path/to/your-vault
mkdir -p "$VAULT/.obsidian/plugins/ghostty-terminal"
cp main.js manifest.json styles.css pty_helper.py "$VAULT/.obsidian/plugins/ghostty-terminal/"
# 5. Enable in Obsidian
# Settings → Community plugins → Enable "Ghostty Terminal"
# Symlink the repo directly into your vault's plugins folder for development
ln -s "$(pwd)" ~/path/to/your-vault/.obsidian/plugins/ghostty-terminal
# Start the watcher — rebuilds on every save
npm run dev
Install the Hot-Reload plugin in Obsidian to auto-reload the plugin on file change.
| Action | How |
|---|---|
| Open terminal | Click the terminal icon in the left ribbon, or run command "Open Ghostty Terminal" |
| Open in new split | Command palette: "Open Ghostty Terminal in new split" |
| Open at a specific path | Right-click any file or folder in the File Explorer → "Open Ghostty Terminal here" |
| Restart shell | Click the ⟳ Restart shell button that appears when the shell exits |
You can assign custom hotkeys to "Open Ghostty Terminal" via Settings → Hotkeys.
The plugin automatically reads your Ghostty config from:
~/Library/Application Support/com.mitchellh.ghostty/config~/.config/ghostty/configThe following config keys are recognized:
| Ghostty key | Effect |
|---|---|
font-family |
Terminal font family |
font-size |
Terminal font size (pt) |
background |
Background color |
foreground |
Foreground/text color |
cursor-color |
Cursor color |
palette = N=RRGGBB |
All 16 ANSI color entries |
cursor-style |
block / underline / bar |
cursor-style-blink |
true / false |
scrollback-limit |
Lines of scrollback buffer |
command |
Default shell command |
Override any Ghostty config value from Obsidian → Settings → Ghostty Terminal:
| Setting | Default | Description |
|---|---|---|
| Config file path | (auto-detect) | Explicit path to your Ghostty config file |
| Default shell | $SHELL env var |
Shell binary to spawn (e.g. /bin/fish) |
| Font family override | (from Ghostty config) | Override font, e.g. "Fira Code" |
| Font size override | (from Ghostty config) | Point size, e.g. 14 |
| Scrollback lines | 10000 |
Number of lines in the scrollback buffer |
obsidian-ghostty-terminal/
├── main.ts Plugin entry + GhosttyTerminalView
│ - Registers view, ribbon, commands, context menu
│ - Boots ghostty-web WASM on startup
│ - Manages Terminal lifecycle (init, resize, dispose)
│ - Spawns pty_helper.py and proxies I/O
├── src/
│ ├── ghostty-config.ts Ghostty config file parser
│ │ - Auto-detects config location on macOS + Linux
│ │ - Parses font, colors, cursor, scrollback, shell
│ └── settings.ts Plugin settings schema + Obsidian SettingTab UI
├── pty_helper.py Python PTY proxy (Unix only)
│ - Forks a real PTY via Python stdlib `pty.fork()`
│ - Proxies stdin/stdout between JS and shell
│ - Reads 4-byte resize frames on fd 3 (rows, cols)
│ - Calls TIOCSWINSZ to resize the PTY kernel window
├── styles.css Plugin CSS — scoped .ghostty-* classes
├── manifest.json Obsidian plugin manifest
└── esbuild.config.mjs Build config — bundles main.ts + ghostty-web WASM
Obsidian (Electron/Node.js)
│
▼
child_process.spawn("python3 pty_helper.py /bin/zsh")
│ stdin ──────────────────────────────► PTY master fd
│ stdout ◄────────────────────────────── PTY master fd
│ stdio[3] (resize pipe, write-only) ──► ioctl TIOCSWINSZ
│
▼
ghostty-web Terminal (WASM + Canvas)
- terminal.write(data) ← stdout bytes from PTY
- terminal.onData(cb) → stdin bytes to PTY
- terminal.resize(c, r) → 4-byte frame to resize pipe
node-pty is a native Node.js addon that requires recompilation against Electron's version of V8 (electron-rebuild). This is fragile and breaks on Obsidian updates. Python's pty module is part of the standard library and works out of the box on any macOS or Linux machine — no compilation needed.
Make sure pty_helper.py is in the same folder as main.js inside .obsidian/plugins/ghostty-terminal/. If you installed from source, re-run the copy step.
which python3Set an explicit font in Settings → Ghostty Terminal → Font family override. Use a monospace font installed on your system, e.g. "Menlo", "Monaco", "Fira Code", or "JetBrains Mono".
The plugin reads your Ghostty config automatically. If colors look wrong:
[GhosttyTerminal] config: log line to see what was parsedPull requests are welcome! Please:
npm run build to verify there are no TypeScript errorsMIT © Mayank Lavania