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.
curl -fsSL
https://github.com/hdprajwal/pt/releases/latest/download/install.sh |
sh
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.