--- url: https://among-terminal.github.io/overview.md --- # Among Terminal overview Among Terminal combines native VTE terminals, nested panes and live workspaces in a GNOME window. The short [demonstration](/#demo) introduces the interface; the full-length recordings here cover more workflows and controls. ## Complete workflow tour [![Watch the complete Among Terminal workflow tour](/media/among-terminal-overview.png)](/media/among-terminal-overview.mp4) **[Watch the overview · 1 min 53 s](/media/among-terminal-overview.mp4)** The original silent tour joins the reviewed feature recordings with direct cuts: themes, splitting and resizing, pane movement, focus, zoom, fullscreen, workspace naming and switching, sidebar controls, plugins, consented session restoration and pane closing. Recorded shortcuts remain visible; no soundtrack or explanatory subtitles are added. ## Extended presentation [![Watch the extended Among Terminal presentation](/media/among-terminal-promo.png)](/media/among-terminal-promo.mp4) **[Watch the extended presentation · 2 min 1 s](/media/among-terminal-promo.mp4)** The earlier long-form film presents the recorded workflows on a charcoal stage. It is retained here separately from the approved 23-second README film. ## Explore individual features * [Feature guide](/features/): demonstrations alongside controls and caveats. * [Panes](/panes/), [sessions](/sessions/), [preferences](/preferences/) and [plugins](/plugins/): detailed references. Use fullscreen to inspect terminal text. Previews link to MP4 files; GitHub inline playback is not assumed. The recordings use isolated synthetic projects, not personal shell startup files. --- --- url: https://among-terminal.github.io/build.md --- # Build prerequisites This page is for developers. For ready-made packages, see [installation](/install/). ## Build and install from source With Rust/Cargo 1.98.1 installed, clone the repository and run the source installer as your normal user: ```sh git clone https://github.com/Among-Terminal/among.git cd among sh scripts/install.sh --install-deps ``` The installer uses sudo only for Debian/Ubuntu build dependencies; compilation and application installation run as your user. It installs a desktop entry and `~/.local/bin/among`. It does not install Rust or change your toolchain. Rerun it from an updated checkout to update; `~/.local/bin/among-uninstall` removes only installer-owned files and preserves preferences and sessions. See the [source installer reference](https://github.com/Among-Terminal/among/blob/main/docs/install.md) for conflicts, XDG paths, rollback limitations and prebuilt-binary mode. For a binary-only Cargo installation with the native prerequisites below: ```sh cargo install --git https://github.com/Among-Terminal/among --locked among ``` This compiles the moving default branch, without desktop integration or plugins. Do not run Cargo as root. Repeat to update; `cargo uninstall among` removes the Cargo binary but preserves settings and sessions. Built on Debian 13 (trixie), Rust 1.98.1, against GTK 4.18.6, libadwaita 1.7.6, and VTE 0.80.1. Live acceptance runs use isolated Xephyr/native X11 with GNOME Shell. A Wayland host desktop is not evidence of native Wayland application behavior; Wayland, Snap and Flatpak runtime acceptance remains unexecuted. ## System packages ```sh sudo apt install libgtk-4-dev libvte-2.91-gtk4-dev libadwaita-1-dev ``` Verify: ```sh pkg-config --exists gtk4 libadwaita-1 vte-2.91-gtk4 && echo ok ``` The GTK4 VTE library must be **0.76 or newer**. Native context-menu dispatch requires this version; check with `pkg-config --modversion vte-2.91-gtk4`. ### Do not install `libvte-2.91-dev` That package provides the **GTK 3** build of VTE, whose pkg-config file is `vte-2.91.pc` and whose libraries are `-lgtk-3 -lgdk-3`. The bindings used here are generated against the **GTK 4** build, whose pkg-config file is `vte-2.91-gtk4` and whose libraries are `-lvte-2.91-gtk4 -lgtk-4`. Both can be installed side by side — they are different shared objects, not conflicting packages — but only the `-gtk4` one satisfies the build. ## Rust dependencies From `Cargo.toml`: ```toml [dependencies] gtk = { package = "gtk4", version = "0.11", features = ["v4_10", "v4_12"] } adw = { package = "libadwaita", version = "0.9", features = ["v1_5"] } vte = { package = "vte4", version = "0.10", features = ["v0_76"] } glib = "0.22" gio = "0.22" serde = { version = "1", features = ["derive"] } serde_json = "1" libc = "0.2" ``` Several of these constraints are not optional, and none of them are explained in the `vte4` README: ### `gtk4` needs the `v4_10` feature `vte4`'s generated code references `gtk::Accessible`. In `gtk4` 0.11 that type is behind the `v4_10` feature, so a plain `gtk4 = "0.11"` dependency fails: ``` error[E0425]: cannot find type `Accessible` in crate `gtk` ``` The `v4_12` feature is this project's own requirement, not `vte4`'s: it exposes `CssProvider::load_from_string`, which is how `data/among.css` is installed. ### `glib` and `gio` must be listed directly `vte4` does not re-export them. `Pty::new_sync` takes a `vte::PtyFlags`, and `spawn_async` takes a `glib::SpawnFlags` and an `Option<&gio::Cancellable>`, so both crates have to be reachable by name. ### `libadwaita` must track `gtk4` The gtk-rs crates are versioned as a set, and the `-sys` crates declare a `links` value. Two crates cannot both claim `links = "gtk-4"`, so cargo refuses the build outright: ``` package `gtk4-sys` links to the native library `gtk-4`, but it conflicts with a previous package which links to `gtk-4` as well: package `gtk4-sys v0.9.0` ``` `libadwaita 0.7` depends on `gtk4-sys 0.9`; `gtk4 0.11` needs `gtk4-sys 0.11`. `libadwaita 0.9` is the release that tracks `gtk4 0.11`. Whenever `gtk4` is bumped, `libadwaita` must move with it. ## Verifying a clean build ```sh cargo build --release --locked cargo test --locked ``` `cargo test` runs without a display. The VTE binding helpers that touch GTK — `ShortcutTrigger::parse_string`, `CallbackAction::new`, `GtkSnapshot` — assert that GTK is initialised, so they are kept out of the test paths and exercised through the running application instead. ## Runtime notes * VTE's search helpers need the PCRE2 multiline flag `0x400`, which is defined in neither the crate nor VTE's public headers. Without it VTE emits a warning on every search call. * `vte::Regex::for_search` and `vte::Regex::for_match` are different constructors with different purposes; using the wrong one triggers a GLib critical at runtime. * `text_range` and `text_selected_full` are commented out in the generated bindings and are unavailable. `text_selected` is behind the `v0_70` feature, and going through the clipboard to read text is not reliable enough to build on. --- --- url: https://among-terminal.github.io/index.md --- # Among Terminal Keep your shells, projects and tools together in one native GNOME window. Among Terminal combines VTE terminals with split panes, named workspaces and optional live status plugins. ## Install a release package Use a ready-made package from [GitHub Releases](https://github.com/Among-Terminal/among/releases). No Rust toolchain or compilation is needed. | Format | Best for | Availability | | --- | --- | --- | | AppImage | A portable bundle with the main runtime libraries included | In preparation; not downloadable yet | | DEB | Debian/Ubuntu; APT installs runtime dependencies | **RC2 preview available**, amd64 and arm64 | | RPM | Fedora; DNF installs runtime dependencies | In preparation; not downloadable yet | ### Install the available DEB Download a ready-made **0.1.0 RC2 preview** package for [Ubuntu 24.04 or Debian 13](/install/), on amd64 or arm64. For Ubuntu 24.04 on amd64, open a terminal in your download folder: ```sh sudo apt install ./among-terminal_0.1.0.rc.2-1.ubuntu24.04_amd64.deb ``` Launch **Among Terminal** from the applications menu. No Git, Rust or build scripts are required. This is a prerelease, not a stable release. [Downloads, updates and removal](/install/). [Watch or download the video](/media/among-terminal-action-v5.mp4). The feature guide describes every action without requiring video playback. ## Built for several things at once * **Split and resize.** Keep an editor, shell and monitor side by side; adjust dividers with the mouse or keyboard. * **Rearrange live panes.** Drag pane headers to change the layout without restarting their processes. * **Organize workspaces.** Name and colour-code projects, switch instantly, and collapse the sidebar without losing access to running terminals. * **Stay on the keyboard.** Move focus, zoom a pane, switch workspaces and customize shortcuts in Settings. * **Restore your layout.** Reopen splits and known directories in fresh shells. Running commands and scrollback are not resumed. * **Choose your status.** Enable a clock, resource meters or per-pane directory labels. Plugins are optional and disabled by default. [Explore features with screenshots and demonstrations →](/features/) ## Make your own plugin Plugins are separate executables exchanging JSON lines with the application. They can supply status text, icons and meters without depending on GTK. They run as your user, not in a security sandbox: install only trusted code. [Write your first plugin →](/plugin-development/#writing-one) · [Protocol reference](/plugin-development/#protocol) ## Learn the controls [Panes](/panes/) · [Workspaces and sessions](/sessions/) · [Keyboard shortcuts](/shortcuts/) · [Preferences](/preferences/) Ready to try it? See [installation](/install/). --- --- url: https://among-terminal.github.io/features.md --- # Features in practice Among Terminal keeps native VTE terminals in a single GNOME window. This guide connects each everyday control to a real demonstration and its detailed reference. The recordings use synthetic projects; zsh, Starship, `ll`, `mc` and `htop` are demo tools, not software installed or configured by Among Terminal. [Full-length overview videos](/overview/) · [Default shortcuts](/shortcuts/) ## Split and resize terminals Press **Ctrl+Shift+N** to split the focused pane. A wide pane splits side by side; a tall pane splits top to bottom. Repeat to build a nested layout with separate shells, for example a project listing, file manager and process monitor. Drag a divider to allocate more space, or use **Ctrl+Shift+Right** to grow the focused pane and **Ctrl+Shift+Left** to shrink it. Resizing keeps the terminals running rather than starting replacement shells. [![Separate live terminals running ll, mc and htop](/media/features/02-split-resize.png)](/media/features/02-split-resize.mp4) **Demonstrations:** [split panes](/media/features/02-split-resize.mp4) · [keyboard resize](/media/features/02b-keyboard-resize.mp4) · [mouse resize](/media/features/02c-mouse-resize.mp4). ## Rearrange panes without restarting tools Drag a **pane header**, not terminal text, onto another pane's edge. Left/right edges place panes side by side; top/bottom edges stack them. The drop indicator previews the destination. The moved terminal retains its process and focus; dragging inside terminal text still selects text. [![Moving a live pane by its header](/media/features/03-pane-drag.png)](/media/features/03-pane-drag.mp4) [Pane movement and drop rules](/panes/#dragging-a-pane-to-a-new-position). ## Focus, zoom and fullscreen * Click a terminal or its header to focus it; **Alt+Arrow** moves between panes. * **Ctrl+Shift+X** expands the focused pane to fill its workspace. Press again to recover the same nested layout; hidden panes keep running. * **F11** enters or leaves fullscreen. Normal startup is maximized, not fullscreen. [![Zooming a pane while preserving the workspace layout](/media/features/04b-zoom.png)](/media/features/04b-zoom.mp4) **Demonstrations:** [focus](/media/features/04-focus.mp4) · [zoom and restore](/media/features/04b-zoom.mp4) · [fullscreen](/media/features/04c-fullscreen.mp4). ## Organize projects into workspaces Use the header's **New workspace** button or **Ctrl+Shift+T**. Double-click its sidebar name to rename it: **Enter** accepts, **Escape** cancels, and empty names are rejected. Each workspace has a colour marker and a live terminal count. Click a sidebar entry, use **Alt+1…9**, or cycle with **Ctrl+PageUp/PageDown**. Inactive workspaces keep their terminals and processes running. The sidebar collapse button reduces the list to a strip: colours and counts remain visible, and every workspace remains reachable. [![Renaming and switching between Atlas and Orbit](/media/features/05-workspaces.png)](/media/features/05-workspaces.mp4) **Demonstrations:** [create, rename and switch](/media/features/05-workspaces.mp4) · [collapse and expand the sidebar](/media/features/05b-sidebar.mp4). ## Clipboard, links and pane actions Right-click a terminal, or press **Shift+F10** in the focused terminal, to open its native menu. In mouse-reporting programs, use **Shift+right-click**; an ordinary right-click still goes to the program. Menu actions belong to the pane that requested them, including when another pane was previously focused. **Copy** copies that pane's selected text; without selection it is disabled. **Paste** uses VTE's normal text-paste handling, including bracketed paste when requested by the terminal program; without a clipboard text format it is disabled. **Select All** selects available terminal text and scrollback, not other panes. Copy/Paste availability follows selection and clipboard changes even while the menu is open. Pasting sends text to the program: it is not session command replay, but a shell can interpret pasted newlines, so only paste text you trust. Pointer-opened menus can offer **Copy Link** and **Open Link** for explicit hyperlinks and plain absolute **http**, **https** and **mailto** URLs. An explicit hyperlink takes precedence over its displayed text. Other valid explicit schemes are copy-only; malformed, control-containing or oversized targets are not offered. Keyboard-opened menus omit link entries rather than reuse an old pointer target. Open Link requests the desktop handler asynchronously, never a shell command; handler failure shows an error while the terminal remains usable. **Split Pane**, **Expand/Restore Pane** and **Close Terminal** reuse the existing pane controls. Their shortcut hints follow Settings, and removing a shortcut does not disable its menu action. Arrow keys navigate, Enter activates, and Escape returns to terminal input. No context-menu recording is included in the videos. [Detailed menu and pane rules](/panes/#terminal-context-menu). ## Optional live status plugins After [installing the examples](/plugins/#installing), open **Settings** with **Ctrl+,** and select **Plugins**. All three examples are disabled by default; enable only the ones you want. Switches apply immediately and persist on restart. | Plugin | Where it appears | What it reports | | --- | --- | --- | | `clock` | Right application footer | Local time, including seconds | | `system-status` | Application header | CPU, memory and root-filesystem usage, with percentages and meters | | `pane-pwd` | Each pane footer | That pane's known directory; the tooltip contains the full path | Directory changes need your shell to publish **OSC 7**; installing Starship alone does not supply it. Unknown directories are not replaced with another pane's path. Resource readings describe the plugin's process/mount namespace, which may differ from the whole host in a sandbox. Plugins run as separate processes, but that is fault isolation, not a security sandbox: install only trusted code. [![Toggling clock, resource meters and pane directories in Settings](/media/features/06-plugins.png)](/media/features/06-plugins.mp4) [Live status and directory integration](/plugins/#live-status-examples) · [Third-party plugin protocol](/plugin-development/#protocol). ## Restore a layout, not yesterday's commands On a new launch with a saved session, choose **Restore** or **Start new**. Restoration recovers workspace names, colours, nested splits, focus and known directories, including inactive workspaces. Every terminal starts a **fresh shell**: commands, running tools and scrollback are not replayed. The demonstration restores four shells in different project directories, then manually runs `ll`. Changed directories require shell OSC 7 reporting even if the directory plugin is disabled. Missing directories fall back to an accessible home/startup directory and are reported in Settings. Storage failures are visible and retryable; recent changes can be lost after a crash. [![Choosing Restore and reopening separate project directories](/media/features/07-session-restore.png)](/media/features/07-session-restore.mp4) [Session consent, storage and recovery limits](/sessions/). ## Close a pane and keep working **Ctrl+Shift+W** closes the focused pane and its process. The sibling that fills the space receives focus, so the next keystrokes reach a surviving terminal. Closing a workspace's last pane closes that workspace; the final workspace asks for confirmation before the application exits. Closing a pane can end a running job: this is not a detach operation. [![Closing one pane and typing ll in its surviving sibling](/media/features/08-close-pane.png)](/media/features/08-close-pane.mp4) [Closing, process exit and focus rules](/panes/#closing-and-exiting). ## Appearance and preferences The native interface supports light and dark styling. Shell prompts and terminal colours are configured separately; Among Terminal does not import GNOME Terminal profiles. [![The terminal listing in light and dark appearance](/media/features/01-themes.png)](/media/features/01-themes.mp4) In **Settings → Keyboard**, select an action and press a new shortcut, or use **Escape** to remove its binding. Changes take effect without restarting and are saved together with explicit unbinding. Save failures leave the current edit active for this session and show a warning; a later edit retries saving. Shortcut editing and storage recovery are documented but are not demonstrated in these clips. See [shortcut controls](/shortcuts/) and [preference persistence](/preferences/). The written instructions explain each action without requiring video playback. Demonstrations show native X11 behaviour; they do not establish support for untested platforms or assistive technologies. --- --- url: https://among-terminal.github.io/install.md --- # Installing Among Terminal Install a ready-made release package. No Git, Rust, Cargo or build scripts are needed. | Format | How dependencies are handled | Availability | | --- | --- | --- | | AppImage | The main runtime libraries are intended to be bundled | In preparation; not downloadable yet | | DEB | APT installs the required distribution libraries automatically | **RC2 preview available** for Ubuntu 24.04 and Debian 13 | | RPM | DNF installs the required distribution libraries automatically | In preparation; not downloadable yet | Only the DEB packages below are currently published. AppImage and RPM download links will be added after their build and runtime checks pass. ## Download These are **0.1.0 RC2 preview packages**, not a stable release. Choose the file matching both your distribution version and CPU architecture: | Distribution | amd64 (Intel/AMD 64-bit) | arm64 (64-bit ARM) | | --- | --- | --- | | Ubuntu 24.04 | [Download `.deb`](https://github.com/Among-Terminal/among/releases/download/v0.1.0-rc.2/among-terminal_0.1.0.rc.2-1.ubuntu24.04_amd64.deb) | [Download `.deb`](https://github.com/Among-Terminal/among/releases/download/v0.1.0-rc.2/among-terminal_0.1.0.rc.2-1.ubuntu24.04_arm64.deb) | | Debian 13 | [Download `.deb`](https://github.com/Among-Terminal/among/releases/download/v0.1.0-rc.2/among-terminal_0.1.0.rc.2-1.debian13_amd64.deb) | [Download `.deb`](https://github.com/Among-Terminal/among/releases/download/v0.1.0-rc.2/among-terminal_0.1.0.rc.2-1.debian13_arm64.deb) | Not sure which architecture you have? Run `dpkg --print-architecture`. Check your distribution version in **Settings → About**, or `/etc/os-release`. Do not use a Debian package on Ubuntu or vice versa. Other distribution versions have not been accepted for these packages. ## Install and launch Open a terminal in the folder containing the downloaded file. On Ubuntu 24.04 with amd64, run: ```sh sudo apt install ./among-terminal_0.1.0.rc.2-1.ubuntu24.04_amd64.deb ``` For another supported target, use the exact filename you downloaded. Keep the `./` prefix: it tells APT to install a local package. APT downloads the required runtime libraries from your configured distribution repositories. Launch **Among Terminal** from the applications menu, or run `among`. If an older Cargo, Snap or source-built copy is also installed, `/usr/bin/among` explicitly launches the DEB installation. ## Update and remove Download the newer package for the same distribution and architecture, then run `sudo apt install ./filename.deb` with its exact filename. Close and relaunch Among Terminal after the update. There is no Among APT repository yet: `apt upgrade` does not download newer Among releases automatically. An RC of the same base version sorts below the stable version; do not downgrade an existing stable installation to that RC. ```sh sudo apt remove among-terminal ``` Your preferences, sessions and separately installed plugins are kept in your home directory. Removing the DEB does not remove another Snap, Cargo or source-built copy. ## Package contents and integrity The DEB installs the application, desktop entry, icon and licence notices. Example plugins are provided but disabled by default. See [using plugins](/plugins/). The [release page](https://github.com/Among-Terminal/among/releases/tag/v0.1.0-rc.2) provides checksums, matching source materials and build/check provenance. Checksums detect changed files; they are not a separate publisher signature. Installed CI checks cover X11/Xvfb, not full stable acceptance or GNOME/Wayland certification. See the release notes for the exact scope and known limitations. ## For developers To compile or modify the application, see [building from source](/build/). Source compilation is not required to install these packages. --- --- url: https://among-terminal.github.io/shortcuts.md --- # Keyboard shortcuts The header's left controls are Settings, sidebar toggle, then New workspace. `Ctrl+Shift+T` (or your configured replacement) also creates a workspace. Edits in Preferences are saved immediately and restored on the next launch, including removed bindings and actions displaced by a shortcut reassignment. Storage is `$XDG_CONFIG_HOME/among/shortcuts.json` (or `~/.config/among/shortcuts.json`); see [Preferences storage](/preferences/). If saving fails, the edit remains session-only and Preferences shows a warning. Bindings live in a single registry (`src/shortcuts.rs`), which is what makes them inspectable and changeable without touching the code that uses them. ## Defaults | Action | Binding | Notes | | --- | --- | --- | | Focus up | `Alt+Up` | no neighbour in that direction: no change | | Focus down | `Alt+Down` | no neighbour in that direction: no change | | Focus left | `Alt+Left` | no neighbour in that direction: no change | | Focus right | `Alt+Right` | no neighbour in that direction: no change | | Activate workspace 1 | `Alt+1` | beyond the last workspace: no change | | Activate workspace 2 | `Alt+2` | | | Activate workspace 3 | `Alt+3` | | | Activate workspace 4 | `Alt+4` | | | Activate workspace 5 | `Alt+5` | | | Activate workspace 6 | `Alt+6` | | | Activate workspace 7 | `Alt+7` | | | Activate workspace 8 | `Alt+8` | | | Activate workspace 9 | `Alt+9` | | | New workspace | `Ctrl+Shift+t` | becomes the active workspace | | Split pane | `Ctrl+Shift+n` | orientation chosen from the pane's shape | | Grow pane | `Ctrl+Shift+Right` | one step; only that split moves | | Shrink pane | `Ctrl+Shift+Left` | one step; only that split moves | | Close pane | `Ctrl+Shift+w` | cascades to the workspace, then to exit | | Open preferences | `Ctrl+,` | shortcuts and plugins | | Toggle fullscreen | `F11` | returns to the previous size | | Toggle pane zoom | `Ctrl+Shift+x` | fills the workspace; again restores | | Next workspace | `Ctrl+PageDown` | wraps around | | Previous workspace | `Ctrl+PageUp` | wraps around | This list is generated from the running registry, so it cannot drift from what the application installs: ```sh AMONG_LIST_BINDINGS=1 among ``` Several of these are additions beyond the five originally requested. They exist because the specification requires a keyboard path to each behaviour, and a required behaviour with no way to reach it is not implemented: divider resizing, workspace cycling, preferences, fullscreen, and pane expansion. `Ctrl+Shift+Arrow` is used for resizing so it sits a modifier level away from `Alt+Arrow` focus movement — adjusting a divider and choosing a direction need to be distinguishable by touch. ### Why these and not others The obvious alternative for pane focus is `Ctrl+Shift+Arrow`, as used by several terminal emulators. `Alt+Arrow` was chosen because it does not collide with anything on a stock GNOME desktop. Verified against the live settings schema on the target machine: * GNOME claims `Ctrl+Alt+Arrow` for switching **its own** workspaces, `Ctrl+Alt+Tab` for panels, `Alt+Tab` for applications, and every `Super` sequence for the overview. * None of the defaults above touches those. * `Ctrl+Shift+T/N/W` are unclaimed by the desktop, and unclaimed by readline and zsh. * `Alt+Arrow` is not bound by the desktop or by GNOME Terminal's own profile. Binding a sequence the desktop also handles would make the action silently never fire, which looks like a broken application rather than a conflict. The registry reports such bindings instead of accepting them (`is_reserved_by_desktop`). ## Splitting There is one split binding, not separate horizontal and vertical ones. The orientation comes from the shape of the pane being split: * width ≥ height → a **vertical** divider, so the two panes sit side by side * height > width → a **horizontal** divider, so the two panes are stacked Comparing the two extents directly, rather than their ratio, matches the intuition that a wide area divides better across. This is the same behaviour as Terminator's `split_auto`. The new pane receives focus, so typing continues where the user last was looking. ## Running an action without a key ```sh AMONG_ACTION=split_pane among ``` Accepted names: `new-workspace`, `split-pane`/`split`, `close-pane`/`close`, `focus-up`, `focus-down`, `focus-left`, `focus-right`, `next-workspace`, `previous-workspace`, `workspace-N`. The environment is used rather than a command-line flag because GApplication parses and rejects any option it does not recognise, which makes a custom flag unusable. Invoking an action that has no binding reports it instead of doing nothing silently: ```sh AMONG_ACTION=fly-away among # among: unknown action name in AMONG_ACTION ``` ## Rebinding Overrides are read at startup and applied to the running process: ```sh AMONG_REBIND="split-pane=d" among ``` Several entries are separated by commas. An unusable accelerator or an unknown action name is reported and ignored rather than accepted: ```sh AMONG_REBIND="split-pane=<