A tmux-native quake terminal for Linux with a two-dimensional tab matrix and browser-style session resurrection.
Every tab is a session on a dedicated private tmux server — the GUI only
attaches. Kill the window, crash it, kill -9 it: your shells, scrollback and
running programs keep going, and the next launch re-adopts them exactly where
they were.
sudo apt install libgtk-4-dev libvte-2.91-gtk4-dev libgtk4-layer-shell-dev tmux
cargo build --release
./target/release/hashterm # then press F12 to drop the console downCtrl+Shift+T opens a tab, Ctrl+, opens Settings. Prefer a package? See
Install.
- Quake-style drop-down — a global hotkey (default
F12) slides the frameless console from the screen edge and keeps it above all other windows. X11 (EWMH), wlroots/KDE (layer-shell) and GNOME Wayland (via XWayland, like tilda/guake) are all handled; hotkeys go through the desktop portal with XGrabKey fallback. - Tab matrix — tabs are organized in two dimensions: groups (rows) on
one window edge, the active group's terminals (columns) on the
perpendicular edge.
Ctrl+PgUp/PgDnmoves between groups,Ctrl+Home/Endbetween terminals. Groups get colors, drawn as nested accent rings around the terminal (outer = group, inner = per-tab accent). Drag a tab onto another to reorder, onto a group row to move it there, onto the group bar's+for a brand-new group. Drag a group row onto another (or right-click > Move Left/Right) to reorder groups; the order is remembered. - Remembers its window — size and position are saved when you move or
resize the window and restored next time (
[window]in the config; position needs X11/XWayland, native Wayland remembers size only). - Session resurrection, browser-style — full dumps capture layout,
working directories, scrollback and the foreground program of every pane.
Restores relaunch safe-listed programs (
vim -Ssessions included), and pre-type everything else at the prompt so a singleEnterre-runs it. Autosaves rotate on a timer and on exit; named saves never expire.sudo/ssh-add-class commands are never replayed. - Settings window and a plain config file —
Ctrl+,opens a Settings window with live preview; it edits~/.config/hashterm/config.tomlin place (your comments survive), and the file stays fully commented and live-reloaded on save, so you can still hand-edit or keep it in your dotfiles. Hotkey conflicts are detected and surfaced on-screen instead of silently picking a winner. - Splits — a tab can hold several panes. tmux draws them, so they survive a crash and come back on restore. The tab's ✕ closes the whole tab and asks first when it holds more than one pane.
- Search and links —
Ctrl+Shift+Fsearches the whole tmux scrollback (lowercase ignores case, the bar shows the match count).Ctrl+clickopenshttp,httpsandmailtolinks, including hyperlinks programs print; hover with Ctrl held to see where a link really goes. Other schemes are refused. - Colour schemes — twelve bundled (
scheme = "dracula"…), your own in~/.config/hashterm/schemes/, optional switching with the desktop's light/dark setting; tmux's copy-mode colours follow the scheme. - Tabs named for what they are — a tab shows its folder (or
vim · shopwhile a program runs) instead of the host name, followscd, and yields to any title a program sets itself or you give it ([tabbar] auto_titles). Tab and group chrome is derived from your terminal colours, so it stays readable on any GTK theme. - Tells you when something is off —
hashterm --doctorchecks tmux, the hotkey portal, the config and the log in one screen (--doctor --logadds the last log lines). A global hotkey the desktop refused or limited is shown in Settings and once on screen, with the always-working fallbackhashterm --toggle. A log file is kept in~/.local/state/hashterm/([general] log_to_file). - Small touches — per-tab names and accent colors, switch OSD toasts,
auto-hiding tab bar on any edge, separate terminal/tab-bar/window opacity,
Ctrl+Alt+Shift+scroll live window transparency (remembered across restarts), clipboard bridged into tmux copy-mode.
The console drops from the top edge, the mouse wheel over the tab bar scrolls
through tabs (the dial shows where you are), and Ctrl+PgDn/PgUp hops between
groups — each with its own color, tab strip and terminals.
The slide-in and slide-out frames in this clip are re-created from real captured frames (same ease-out motion, wallpaper behind); the headless capture server has no compositor to record the app's own transparent slide.
Groups run along one edge, the active group's terminals along the perpendicular
one. Each group has a color, drawn as a ring around the terminal; drop a tab on
a group to move it, or on + for a new one.
Switching tabs shows a wheel: the current tab bright in the center, neighbors receding above and below.
With tabbar.auto_hide = true the bar stays out of the way: it is concealed
until the pointer touches its edge, then slides in over the terminal, so
revealing it never reflows the panes. Below, tabbar.edge = "left" — first
hidden, then revealed (the terminal text does not move). Ctrl+Shift+B toggles
it from the keyboard.
Ctrl+, opens a Settings window. It applies changes live and edits
config.toml in place, keeping your comments, so the file remains the single
source of truth. Details: docs/settings.md.
Closing is predictable: when you close the tab you are on (Ctrl+Shift+W, its
x, or the shell exiting) you land on the previous tab in the group — or the
next one if it was the first. Closing a group's last tab asks whether to close
the group; "Keep group" opens a fresh tab in your home directory instead.
Hover a group row and click its x to close the whole group (after a
confirmation — it ends the programs in all its tabs and cannot be undone).
Right-click a tab to rename it, change its accent color, move it to another group or close it. Right-click a group to rename it, color it, or move it up and down (you can also just drag it).
On Debian 13 (or anything with GTK ≥ 4.18 and VTE ≥ 0.80), download
hashterm_*_amd64.deb from the latest release
and install it:
sudo apt install ./hashterm_*_amd64.debEvery release .deb is built by CI with signed SLSA provenance; see
docs/RELEASING.md to verify one. To build the package
yourself instead:
cargo build --release
./packaging/build-deb.sh
sudo apt install ./dist/hashterm_*.debRuntime dependencies: GTK 4 (≥ 4.18), VTE4 (≥ 0.80), gtk4-layer-shell, tmux.
Styling hint: ~/.config/hashterm/user.css is loaded on top of the built-in
style at user priority.
sudo apt install libgtk-4-dev libvte-2.91-gtk4-dev libgtk4-layer-shell-dev
cargo build --release # needs Rust 1.90+
./target/release/hashterm| Key | Action |
|---|---|
F12 |
toggle the drop-down (global) |
Ctrl+Shift+T |
new tab |
Ctrl+Home / Ctrl+End |
previous / next terminal in the group |
Ctrl+PgUp / Ctrl+PgDn |
previous / next group |
Ctrl+Shift+N |
new group (a second row of tabs) |
Ctrl+Shift+E / Ctrl+Shift+O |
split the tab right / down (tmux panes, same folder) |
Alt+Shift+arrows |
move between panes |
Ctrl+Shift+X |
zoom the active pane |
Ctrl+Shift+W |
close the active pane, then the tab |
Ctrl+Shift+F |
find in the scrollback (Enter / Shift+Enter move, Esc closes) |
Ctrl+Shift+plus / Ctrl+minus / Ctrl+0 |
text bigger / smaller / reset (this window only) |
Ctrl+click |
open the link under the pointer |
Alt+1..0 |
jump to tab 1–10 |
Ctrl+Shift+B |
show/hide the tab bar |
Ctrl+Shift+S |
session picker (save / restore) |
Ctrl+, |
Settings window |
Ctrl+Shift+, |
open config.toml in your editor |
Ctrl+Shift+C / Ctrl+Shift+V |
copy / paste |
Ctrl+Alt+Shift + scroll |
window opacity |
| mouse wheel over the tab bar | previous / next tab in the group |
| mouse wheel over a group's title | previous / next tab of that group |
| right-click tab / group row | rename, properties, colors, move to group |
Everything is rebindable in [hotkeys].
crates/
hashterm-core config, persisted UI state, IPC types
hashterm-tmux dedicated-server controller, bundled tmux conf, hooks
hashterm-session dump/restore engine (zstd scrollback, /proc discovery)
hashterm-platform overlay backends (EWMH / layer-shell / plain), hotkeys
hashterm-ui GTK4 shell: window, tab bar, group bar, VTE pages
hashterm the binary (+ headless dump/restore subcommands)
hashterm-ctl tiny helper the tmux hooks call to notify the GUI
The tmux server runs on its own socket — tmux -L hashterm ls shows your
tabs from any terminal, and everything hashterm knows about a tab (title,
group, colors) lives in tmux session options, so it survives detach, restart
and dump/restore.
MIT — see LICENSE.








