pt

personal terminal · also written pterm

Your terminal, with the whole project around it.

A Linux terminal workspace — projects, splits, tabs and git in one window, built on GTK4 and libghostty-vt.
Free, no telemetry, no subscription.

Download GitHub
$ curl -fsSL https://github.com/hdprajwal/pt/releases/latest/download/install.sh | sh
Linux x86_64 & aarch64 GTK4 + libadwaita free & open-source
The project sidebar, shell tabs, and the keyboard hint bar.

What it is

A terminal is usually one window per thing you are doing. pt turns that around: each project is an entry in the sidebar, and it keeps its own tabs, splits and working directories. Switch to a project and everything is where you left it — nothing to reopen, nothing to cd back into.

The VT layer is libghostty-vt, so escape-sequence handling is someone else's solved problem. The rest is GTK4 and libadwaita.

Features

projects Ctrl 1–9 Each project keeps its own tabs, splits and directories. The layout is written to disk and restored on next launch.
palette Ctrl K Projects, shells and commands, fuzzy-matched. Keyboard only.
splits Divide a tab as far as you need. New panes inherit the directory you were already in.
selection Ctrl ⇧ C Click and drag to select, with no modifier, even inside full-screen apps. Double-click a word, triple-click a line.
git Branch, dirty count and last exit code in the statusline; the detail in the info panel.
themes Config and the active theme are watched on disk and applied live — no restart, no reload command.

Install

Prebuilt tarballs for Linux x86_64 and aarch64 are published on GitHub Releases. The installer puts pt in ~/.local/bin, adds the prompt snippets, and registers a desktop entry and icon so it shows up in your launcher.

curl -fsSL https://github.com/hdprajwal/pt/releases/latest/download/install.sh | sh

Set PT_PREFIX to change the prefix, or pass a tag as an argument to pin a version. The runtime libraries still come from your package manager — GTK4 4.16 or newer, libadwaita and json-glib:

# Arch-based
sudo pacman -S --needed base-devel cmake pkgconf gtk4 libadwaita json-glib

Fonts are not bundled. The defaults are JetBrains Mono for the terminal and IBM Plex Sans for the UI — install them, or point the config at fonts you already have.

Build from source

You also need Zig 0.15.x, CMake 3.19 or newer, and network access on the first configure — ghostty's lib-vt is fetched at a pinned commit and built, so the first build takes a while. Later builds are incremental.

cmake -B build
cmake --build build
./build/pt

ctest --test-dir build   # tests

Selecting and copying text

Left-click and drag selects. Double-click selects a word, triple-click selects a line, and Ctrl+Shift+C copies (Ctrl+Shift+V pastes). Typing clears the selection and snaps the view back to the prompt.

That holds inside full-screen apps too — Claude Code, vim, htop, lazygit, fzf. Those apps normally ask the terminal for the mouse, and pt does not hand it over: mouse-reporting ships off, which is the one place pt deliberately differs from ghostty's defaults. The cost is that mouse-driven features inside those apps do nothing.

Set mouse-reporting = true for the usual behaviour. A plain drag then goes to the app, and holding Shift takes the pointer back for one gesture. Either way, "Toggle mouse reporting" in the palette flips the focused pane for the rest of the session without touching the config.

Configuration

pt reads ~/.config/pt/config, a key = value file where # starts a comment. Those six keys, plus app-* colour-token overrides such as app-background = #101010, are the entire config surface.

theme = pt-dark
font-size = 9
font-family = JetBrains Mono
ui-font-size = 12.5
ui-font-family = IBM Plex Sans
mouse-reporting = false

Booleans accept true/false, yes/no, on/off or 1/0. Custom themes go in ~/.config/pt/themes/; both the config and the active theme are watched and applied live.

Shell prompt integration

Source the snippet for your shell from its rc file. Bash and fish variants live next to the zsh one in share/prompt/.

# ~/.zshrc
source ~/.local/share/pt/prompt/pt-prompt.zsh

The snippet is a no-op outside pt, so sourcing it unconditionally is safe. Inside pt it reports each command's exit code back to the app and prints an identity line — path, branch, dirty count — in the project's accent colour. If a repository with a huge untracked tree makes the prompt slow, set PT_PROMPT_GIT_UNTRACKED=no to count only tracked changes.