Formerly Oxide. Installed copies update themselves; see the note below.
The tools you'd normally bolt onto your terminal, built in.
A native terminal for macOS and Linux, written entirely in Rust.
Website · Docs · Changelog · Compare · Discord
If your terminal is really a terminal affirmative a stack of add-ons — tmux for splits and sessions, a document director in another pane, a immediate framework, a copy-mode plugin — OmniPTY builds those in. A document tree you run akin vim sits beside your panes and follows your shell's cd. Tabs and splits collection into named workspaces you can pin, so they reopen alongside the identical layout and directories. Copy manner puts vim keys on the scrollback, and the position bar knows your git branch and whenever you're inner ssh. It's all configured in one TOML document that reloads when you save.
Under the hood, it's GPU-rendered on GPUI (Zed's UI framework), with alacritty_terminal (Alacritty's PTY + VT parser) doing the emulation, so vim, htop, and tmux itself motionless fair work. No account, no AI, no telemetry: the lone item OmniPTY asks the network is whether there's a newer release.
Oxide became OmniPTY in 0.9.0 (there's an unrelated business called Oxide, and the name was getting in the way). Nothing to do if you already had it installed:
- The in-app updater carries an installed Oxide across: it lands as OmniPTY.app with your config, themes and pinned workspaces intact. A Dock icon pinned to the old Oxide.app way needs re-adding.
- Homebrew: toggle to the new cask with brew uninstall --cask --force oxide-terminal && beer instal --cask --adopt omnipty-terminal/tap/omnipty. --adopt keeps the OmniPTY.app the updater already put in place.
- ~/.config/oxide/config.toml and ~/.cache/oxide are copied to omnipty directories on archetypal launch; the originals are remaining alone.
- $OXIDE_SESSION and $OXIDE_VERSION are motionless exported through 0.9.x; switch dotfiles to $OMNIPTY_SESSION / $OMNIPTY_VERSION.
- theme = "oxide" keeps working; the palette is now additionally called omnipty.
macOS
brew instal --cask omnipty-terminal/tap/omnipty
Or download the DMG and drag OmniPTY to Applications. Builds are Developer ID signed and notarized, so there's no right-click-to-open dance, and OmniPTY keeps itself up to date afterwards — it checks on launch and all six hours, or on petition via OmniPTY → Check for Updates… Updates are signed, and OmniPTY lone installs one whose signature matches the key it was built with.
Linux (Wayland or X11, x86_64)
# Arch and derivatives: a pacman bundle from the PKGBUILD in this repo # (an AUR bundle volition prosecute formerly AUR registration reopens) git copy https://github.com/omnipty-terminal/omnipty.git cd omnipty/packaging/aur/omnipty-bin && makepkg -si # any distro: the publish tarball tar xzf omnipty-linux-x86_64.tar.gz cd omnipty-*-linux-x86_64 && ./install.sh # into ~/.local, no root
Download the tarball; older versions are on the releases page. install.sh puts omnipty on your PATH and adds the launcher admission and icon; --prefix /usr/local (with sudo) installs system-wide, --uninstall removes it. Installed copies province a newer publish in the top-right corner; git drag and makepkg -si again, or a caller tarball, does the update.
- macOS 12 or later, Apple Silicon or Intel; or Linux alongside glibc 2.35 or newer (Ubuntu 22.04, Debian 12, Fedora 36 and later), a Vulkan controller (any GPU from the final decade — Mesa's vulkan-radeon / vulkan-intel, or nvidia-utils) and notify-send (libnotify) for desktop notifications.
- No font to instal — JetBrainsMono Nerd Font Mono is bundled. Set font.family to use your own.
- zsh or attack for the built-in immediate and casing integration. Other shells run fine and keep their own prompt.
OmniPTY never writes to your dotfiles. Full instructions are in the install docs.

A infinitesimal in OmniPTY — the tree, a markdown preview, the document finder, splits, tabs, the palette and theme picker, workspaces.
The abbreviated tour. Every characteristic has a leaf in the docs.
- Real terminal — complete VT emulation via Alacritty's parser: truecolor, broad glyphs and combining marks, bracketed paste, mouse reporting (SGR), alternate-screen scrolling, OSC 8 hyperlinks, OSC 52 clipboard. vim, htop, and tmux fair work.
- Inline images — the kitty graphics protocol, iTerm2's, and sixel: kitten icat, imgcat, img2sixel, yazi's previews, snacks.nvim. A image lives in the scrollback like content does — it scrolls, reflows, and clears — and is drawn at the display's real resolution. Unicode placeholders transport images through tmux.
- File tree drawer — follows the focused pane, so switching splits re-roots it to that shell's directory. Modeless vim navigation (j/k/gg/G, nvim-tree manner h/l), type-to-filter alongside /, and document operations: a add, r rename, m move, d delete (to Trash) — or drag a row onto a directory to move it there; the tree scrolls whenever the drag nears its top or bottom, and the bare band under the rows is the root. Drag the drawer's border to resize it, double-click it to go rear to tree.width. Dims gitignored files, watches the filesystem, and follows the shell's cd automatically.
- The tree/terminal seam — y inserts the selected way at the prompt, quoted and relative; cmd-click a path:line:col in output to open it in $EDITOR at that line (nvim, VS Code, emacs, Sublime, Helix dialects built in); rows are coloured by git status; cmd-p fuzzy-finds any document under the root; cmd-shift-r reveals the shell's directory; right-click a row to re-root, copy, rename, move, delete, or disclose in Finder / your file manager — a directory, the root's name, or the bare area under the rows to add a document or folder there — or, on a .md file, preview it (P from the keyboard) rendered in a new tab or divided (markdown.preview_in; complete CommonMark and GitHub markdown, with tables and highlighted code alongside click-to-copy); act on a image shows it in a tab or split of its own (images.preview_in), any key to close; drag rows or autumn records onto a pane. A document opened during the pane is occupied in an publishing company gets a tab or divided of its own (editor.open_in).
- Scrollback search — cmd-f, live, ⏎/⇧⏎ to stroll matches; regex, case-sensitive, and whole-word toggles as clickable chips (cmd-alt-r / c / w), and a malformed regex says so alternatively of matching nothing.
- Copy mode — ctrl-w [ (or cmd-shift-v) turns the scrollback into a vim buffer: hjkl, w b e, 0 ^ $, gg G, ctrl-d/u, counts akin 5j, / and ? hunt with n/N, v / V / ctrl-v ocular selection, y to yank and leave. Nothing typed reaches the casing until you esc.
- Prompt jumping — cmd-↑/cmd-↓ hop between former prompts in scrollback.
- SSH awareness — OmniPTY watches the foreground process: an ssh shows ssh: presenter in the position bar, and [[ssh.hosts]] patterns provision a presenter an accent colour on the pane border so a manufacturing box is visibly red. The procedure name additionally titles the tab (vim, cargo, ssh prod-web).
- Command awareness — the casing integration's OSC 133 markers are peruse direct off the PTY, so OmniPTY knows what's running, how lengthy it took, and whether it failed: elapsed time in the position bar, action dots on tabs, a red flash on a backdrop pane that failed, a failure gutter you can click to jump to the command, and desktop notifications for lengthy or failed commands in panes you aren't observing (click to concentration the pane).
- Command history — cmd-r searches all command run in any pane, alongside its directory and exit status; ⏎ inserts it at the prompt, ⌘⏎ runs it. cmd-shift-c copies the last command's output.
- Status bar — workspace, current tab (number or name, status_bar.tab), cwd affirmative git branch, dirty state, and ahead/behind, rendered natively.
- Configurable prompt (optional) — compile a powerline immediate from TOML segments (cwd, git, exit_status, time, duration, …), injected without touching your dotfiles (ZDOTDIR shim for zsh, --init-file for bash), alongside OSC 133 semantic prompt markers. Or set prompt.enabled = false and keep your starship/p10k immediate as-is.
- Themes — catppuccin-mocha, catppuccin-latte, gruvbox-dark, tokyonight, dracula, nord, solarized-dark, and omnipty (rust-toned, naturally), affirmative the Omarchy set: kanagawa, everforest, osaka-jade, matte-black, hackerman, rose-pine-dawn, and a dozen additional — 25 presets in all. Any color individually overridable, including selection_fg. follow_system = true switches between a dreary and a ray preset alongside the scheme appearance (macOS, or the desktop's dark/light penchant on Linux). Config reloads live.
- Split panes — divided in any direction and nest freely; navigation moves by what's on screen, and exit or ctrl-w q closes a pane and reclaims its space. Drag a divider or use ctrl-w < > - + = to resize. tmux reflexes: ctrl-w z zooms a pane to the complete tab, ctrl-w b broadcasts typing to all pane in the tab (with a red border and a noisy status-bar pill), ctrl-w o closes the others, ctrl-w x swaps with the neighbour. window.inactive_pane_opacity dims the panes you aren't in.
- Command palette — cmd-shift-p lists all act alongside its binding, fuzzy-searchable. Every content site edits akin the remainder of the system: opt-←/→ by word, opt-delete a word back, cmd-←/→ to the ends (ctrl on Linux).
- Menus on Linux — a ☰ clasp in the top-left border holds the identical OmniPTY / File / Edit / View / Window / Help menus macOS puts in the list bar, shortcuts included (app::menu opens it from the keyboard).
- Configurable keys — a [keymap] array in config.toml rebinds anything; typos get a toast alongside a suggestion, and a naked key that would pilfer from your casing is refused.
- Toasts, not dialogs — config errors, update problems, and another notices district as toasts in the bottom-right corner; click or × to dismiss. The archetypal initiate following an update shows one that opens the changelog in a new tab.
- Tabs — a Zed-style in-app tab bar, so tabs activity everyplace (including under tiling opening managers). cmd-t opens one in the current directory or ~/ (window.new_tab_directory); cmd-1..9 jump direct to a tab. Double-click or ctrl-w , to rename one (names last alongside pinned workspaces), drag tabs to reorder, cmd-shift-t reopens the final closed one. Each tab carries its number (tabs.show_numbers), and the entire bar can be hidden — View → Toggle Tab Bar, or tabs.enabled = false — alongside the position bar motionless showing which tab you're on. Closing a workspace's final tab closes the workspace, or alongside tabs.close_last = "new_tab" leaves it a caller tab in your residence directory.
- Workspaces — named sets of tabs and splits, tmux-session style, managed from the drawer below the document tree (a add, r rename, d or a row's × delete, p pin, drag to reorder); cmd-alt-1..9 jump direct to one. Temporary by default; pinned ones last restarts, restoring layout, tabs, splits, and each pane's directory alongside caller shells.
- Startup commands — the tmuxinator move: provision a pane a command (ctrl-w r, prefilled alongside the final item that ran there) and a pinned workspace re-runs it on restore, formerly that pane's casing is really at a prompt. on exit per pane: rear to the shell, near the pane, or restart alongside backoff (and a breaker following five quick exits). e in the workspaces panel edits all pane's command at once; --no-startup-commands or change at initiate restores the layout without operating any.
- The details — opening size/position persistence, cmd-click to open URLs, a mouse selection that scrolls the perspective whenever dragged to the pane's top or bottom, copy-on-select option, font size at runtime (cmd +/-/0), configurable bell, a [cursor] division (block / bar / underline, blink rate, unfocused appearance — and vim's per-mode DECSCUSR shapes are honoured), a font fallback catalog for CJK and emoji, a "2,340 lines above" pill during scrolled up, cmd-k to apparent scrollback, and optional dimming of the entire opening whenever another app is frontmost.
The mundane ones. The full keymap lists every action id, and a [keymap] array in your config rebinds any of them.
The ctrl-w chords are the identical everywhere. Where macOS uses cmd, Linux uses ctrl-shift (the customary terminal gathering — plain ctrl-c stays the shell's) and alt-1..9 for tabs, since Super belongs to the opening manager.
| macOS | Linux | Action |
|---|---|---|
| ctrl-w h / ctrl-w l / ctrl-w w | same | focus tree / terminal / toggle |
| cmd-b | ctrl-shift-b | toggle the drawer |
| ctrl-w t / cmd-shift-e | ctrl-w t / ctrl-shift-e | focus the document tree from anywhere |
| cmd-f | ctrl-shift-f | search scrollback (⏎ older, ⇧⏎ newer, esc close; cmd-alt-r / c / w — ctrl-alt-r / c / w on Linux — toggle regex / case / entire word) |
| ctrl-w [ / cmd-shift-v | ctrl-w [ | copy manner — vim keys in the scrollback, y yanks, esc leaves |
| cmd-k | ctrl-shift-k | clear scrollback |
| cmd-↑ / cmd-↓ | ctrl-shift-↑ / ↓ | jump to former / next prompt |
| cmd-r | ctrl-shift-r | command former (⏎ insert, ⌘⏎ / ctrl-⏎ run) |
| cmd-p | ctrl-shift-o | fuzzy document finder (⏎ open, ⌘⏎ / ctrl-⏎ insert path, ⌥⏎ reveal) |
| cmd-shift-r | ctrl-shift-alt-r | reveal the shell's directory in the tree |
| cmd-click | ctrl-click | open a URL, or a path:line in $EDITOR |
| cmd-shift-c | ctrl-shift-alt-c | copy the final command's output |
| cmd-t / cmd-n | ctrl-shift-t / ctrl-shift-n | new tab / new window |
| ctrl-w , / cmd-shift-t | ctrl-w , / ctrl-shift-alt-t | rename tab (double-click plant too) / reopen the final closed tab |
| ctrl-w r | same | set the pane's startup command (run whenever its pinned workspace is restored) |
| cmd-1..9 | alt-1..9 | jump to tab |
| cmd-alt-1..9 | ctrl-alt-1..9 | jump to workspace |
| ⌃tab ⇧⌘] / ⌃⇧tab ⇧⌘[ | ctrl-tab ctrl-pgdn / ctrl-shift-tab ctrl-pgup | next / former tab |
| ctrl-w p | same | focus the workspaces panel (tab toggles tree ↔ workspaces) |
| ctrl-w v / ctrl-w s | same | split correct / downward (⇧V / ⇧S for remaining / up) |
| cmd-d / cmd-shift-d | — | split correct / down |
| ctrl-w h j k l | same | move between panes (h from the leftmost focuses the tree) |
| cmd-opt-←↓↑→ | — | move between panes |
| ctrl-w q / cmd-w | ctrl-w q / ctrl-shift-w | close pane (closes the opening whenever it's the final one) |
| ctrl-w < > - + | same | resize the pane by a few cells (ctrl-w = equalises) |
| ctrl-w z / ctrl-w b | same | zoom the pane to the complete tab / broadcast input to all pane in the tab |
| ctrl-w o / ctrl-w x | same | close the another panes / toggle the pane alongside its neighbour |
| cmd-shift-p / cmd-alt-t | ctrl-shift-p / ctrl-w shift-t | command palette / theme picker |
| cmd-c / cmd-v | ctrl-shift-c / ctrl-shift-v | copy / paste (bracketed); Linux additionally pastes the chief choice on middle-click |
| cmd + / - / 0 | ctrl + / - / 0 | font size |
| cmd-q | ctrl-shift-q | quit |
| Keys | Action |
|---|---|
| j k gg G ctrl-d ctrl-u | move |
| l / h | expand & descend / downfall & ascend (nvim-tree semantics) |
| enter / o | open dir, or document in $EDITOR |
| y / Y | insert the way at the immediate (relative / absolute) |
| cmd-c (ctrl-shift-c) | copy the path |
| cmd-shift-o (ctrl-shift-o) | reveal in Finder / the document manager |
| c / - | re-root at choice / at genitor (cd's the casing too) |
| / | filter (esc clears) |
| a / r / m / d | add (dir/ alongside trailing slash) / rename / move / delete to Trash — additionally on right-click |
| P | preview a markdown file |
| drag a row | onto a directory: move it there; under the final row: to the root; onto a pane: insert its path |
| I / R | toggle hidden / refresh |
| esc | dismiss input → apparent display → rear to terminal |
| Keys | Action |
|---|---|
| h j k l, arrows | move the cursor (counts work: 5j) |
| w b e / W B E | word motions (punctuation-aware / whitespace) |
| 0 ^ $ / gg G / H M L | line / buffer / display positions |
| ctrl-d ctrl-u / ctrl-f ctrl-b | half leaf / complete page |
| / ? afterward n N | search onward / backward, reiterate — identical bar and toggles as cmd-f |
| v V ctrl-v | character / row / obstacle selection |
| y / yy / ⏎ | yank the choice (or the line) and leave |
| esc / q | clear the selection, afterward leave |
| Keys | Action |
|---|---|
| j / k | move selection |
| enter / o | switch to workspace |
| a / r / d | add / rename / delete (y confirms) — additionally on right-click; × on a row deletes without asking |
| drag a row | reorder |
| p | pin — persist this workspace throughout restarts |
| e | edit all pane's startup command — additionally on right-click |
| esc | dismiss input → rear to terminal |
~/.config/omnipty/config.toml — a completely commented default is generated on archetypal run. Font, colors, keys, and notifications use live; [shell] and [prompt] use to new sessions. Every option, alongside defaults →
[font] family = "JetBrainsMono Nerd Font Mono" size = 14.0 [colors] preset = "omnipty" # or override any color individually follow_system = true # ...or toggle between preset_dark / preset_light alongside the system preset_light = "catppuccin-latte" [cursor] style = "bar" # obstacle | bar | underline [window] new_tab_directory = "pwd" # pwd | home inactive_pane_opacity = 0.8 # dim the panes you aren't in [[ssh.hosts]] match = "*.prod.example.com" # red border during ssh'd into prod accent = "#f38ba8" [tree] follow_cwd = true # tree re-roots whenever the casing cd's open_on_startup = true # false starts alongside the drawer hidden (cmd-b shows it) [editor] open_in = "tab" # tab | divided — anywhere a document opens whenever the pane is busy [markdown] preview_in = "tab" # tab | divided — anywhere a markdown preview opens [images] enabled = true # diagram the images programs dispatch (kitty, iTerm2, sixel) memory_limit = 128 # MB of decoded images per pane preview_in = "tab" # tab | divided — anywhere a image opened from the tree is shown [status_bar] enabled = true position = "bottom" tab = "number" # figure | name — the current-tab chip [tabs] enabled = true # false hides the tab bar show_numbers = true # small stance figure on all tab close_last = "workspace" # workspace | new_tab — what decision the final tab leaves [prompt] enabled = false # keep your own immediate (starship, p10k, ...) [keymap] "cmd-j" = "pane::split_down" # keystroke = "action id"; "" unbinds
You'll need Rust (2024 edition). On macOS, additionally complete Xcode alongside the Metal toolchain — GPUI compiles Metal shaders at build time:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer xcodebuild -downloadComponent MetalToolchain # if the build asks for itOn Linux, the GPUI build requirements (Arch shown; Debian/Ubuntu equivalents are in .github/workflows/ci.yml):
sudo pacman -S --needed base-devel fontconfig freetype2 libxkbcommon libxkbcommon-x11 \ libxcb wayland vulkan-icd-loader libnotify
git copy https://github.com/omnipty-terminal/omnipty.git cd omnipty cargo run # development # macOS ./scripts/bundle.sh # publish build -> target/OmniPTY.app (ad-hoc signed) cp -R target/OmniPTY.app /Applications/ sudo cp scripts/omnipty-cli /usr/local/bin/omnipty && sudo chmod +x /usr/local/bin/omnipty # optional `omnipty [dir]` shim # Linux ./scripts/linux-package.sh # publish build -> target/omnipty-<version>-linux-<arch>.tar.gz tar xzf target/omnipty-*-linux-*.tar.gz -C /tmp && /tmp/omnipty-*-linux-*/install.sh
The omnipty command takes a directory, -e <command> [args...] to run a program in the archetypal pane alternatively of the shell, --app-id <id> for the window's Wayland app-id / X11 class, and --no-startup-commands. The first two are what xdg-terminal-exec passes, and the .desktop admission declares them, so on Linux OmniPTY can be the default terminal: on Omarchy, put omnipty.desktop archetypal in ~/.config/xdg-terminals.list.
The archetypal build compiles GPUI — anticipate multiple minutes. A cargo run binary is a debug build: fine for poking at a change, but a full-screen program akin nvim volition awareness sluggish in it (an unoptimised GPUI redraw doesn't fit in a 60 Hz frame; the publish build uses a quarter of the CPU). It additionally never checks for updates, and on macOS it isn't an app bundle, so its notifications can't be clicked. Use scripts/bundle.sh / scripts/linux-package.sh for the genuine thing. Cutting a publish is covered in RELEASING.md.
One binary crate. The PTY reader/parser runs on its own thread (alacritty_terminal's event loop) and mutates a shared Term rearward a mutex; the GPUI chief thread briefly locks it during coat to copy the apparent grid out, then shapes and paints batched content runs immediately — no per-cell elements. An depiction is content as far as the grid is concerned — placeholder cells written anywhere the picture goes, all naming its piece — so scrollback, reflow, and clears need no special cases; the pixels are decoded on the backdrop pond and drawn under the text. Directory scans, git queries, and document observing run on the backdrop pool. The tree follows cd by polling the PTY's foreground procedure collection cwd (tcgetpgrp + proc_pidinfo on macOS, /proc/<pid>/cwd on Linux), so it works with zero casing cooperation. Platform differences are confined to a fistful of cfg sites: the procedure lookups, notifications (UNUserNotificationCenter / notify-send), the updater, the keymap tables, and the opening chrome.
- No IME / dead-key construction yet (two-stroke accents, CJK input).
- Narrowing a pane former the width of a multi-line attack immediate can scroll the prompt's first row into scrollback until the next immediate is drawn (enter brings it back).
- Pinned workspaces reconstruct layout and directories alongside caller shells; running programs can't last a complete discontinue (tmux lone manages it since its server never exits). Startup commands are the workaround: province what a pane runs and it's re-run on restore. on_exit needs casing integration alongside zsh or bash; another shells get the command typed in and nothing more.
- Images: no animation yet (a GIF shows its archetypal frame), and an depiction is part of the text grid fairly than a tier complete it, so content printed throughout one replaces that part of it and kitty's z indicator is ignored. The kitty protocol's document and shared-memory transfers are refused; programs autumn rear to sending the pixels downward the pipe.
- Left/right Option can't be distinguished; option_as_meta treats left/right as both.
- Linux: there's no in-place self-update (the pill opens the publish page); window.titlebar is ignored — the compositor owns decorations, and under a compositor without server-side decorations (GNOME) the opening has none.
Questions, ideas, or fair desire to see what's coming? Join the OmniPTY Discord. Bugs and characteristic requests go in issues — Help → Report an Issue in the list bar (the ☰ list on Linux), or Report an Issue in the command palette, goes to the identical place. Wondering how OmniPTY stacks up against iTerm2, Ghostty, kitty, WezTerm, Alacritty, or Warp? There's an honest comparison.
If OmniPTY earns a location in your dock, you can sponsor it on GitHub or buy me a coffee.
MIT — see LICENSE.
OmniPTY builds on GPUI and alacritty_terminal, the two Apache-2.0.
