Skip to content
redasgardPublic

About

tmux-native quake drop-down terminal for Linux — two-dimensional tab matrix, sessions that survive crashes, GTK4 + Rust

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Repository files navigation

hashterm

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.

hashterm — frameless quake console: group rows on the left, tabs along the top, colored rings around the terminal

Quick start

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 down

Ctrl+Shift+T opens a tab, Ctrl+, opens Settings. Prefer a package? See Install.

Features

  • 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/PgDn moves between groups, Ctrl+Home/End between 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 -S sessions included), and pre-type everything else at the prompt so a single Enter re-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.toml in 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+F searches the whole tmux scrollback (lowercase ignores case, the bar shows the match count). Ctrl+click opens http, https and mailto links, 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 · shop while a program runs) instead of the host name, follows cd, 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 --doctor checks tmux, the hotkey portal, the config and the log in one screen (--doctor --log adds the last log lines). A global hotkey the desktop refused or limited is shown in Settings and once on screen, with the always-working fallback hashterm --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.

In motion

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.

hashterm in use: the console slides down, scrolling through tabs, switching groups, sliding away

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.

The tab matrix

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.

The tab matrix — groups on the left with colored dots, the active group's tabs along the top, a colored ring around the terminal

The switch dial

Switching tabs shows a wheel: the current tab bright in the center, neighbors receding above and below.

Tab-switch dial OSD

Auto-hiding tab bar

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.

Left tab bar hidden Left tab bar revealed as a floating overlay

Settings

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.

Settings — Appearance

Organizing tabs and groups

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).

Tab context menu Group context menu

Install

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.deb

Every 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_*.deb

Runtime 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.

Building from source

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

Default keys

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].

Architecture

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.

License

MIT — see LICENSE.

About

tmux-native quake drop-down terminal for Linux — two-dimensional tab matrix, sessions that survive crashes, GTK4 + Rust

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages