Skip to main content

A cross-platform desktop terminal with workspaces and tabs

Project description

terminux

A fast, reliable, cross-platform terminal — organized the way you actually work.

Workspaces on the left. Tabbed terminals in the middle. Everything where you left it.

Python Platform Status License


terminux — workspaces sidebar and a tabbed terminal running a test suite

Why terminux?

You don't have one project. You have six. Each one is a different directory, a different mental context, a different set of running shells. terminux gives each of them a home — a workspace — and keeps them alive and arranged exactly how you left them, even across restarts.

It's the workspace UX of cmux on a clean, auditable two-process architecture inspired by terax — rebuilt in Python for reliability over features. No accounts. No telemetry. No AI. Just a terminal that respects your flow.

uv sync && make frontend
uv run terminux

That's it. You're in.

✨ What you get

  • Workspaces sidebar — a persistent list of named workspaces. Names track the first tab's working directory automatically (until you pin one).
  • Tabbed terminals — every workspace has its own tabs, each a real PTY shell. Switch freely; background tabs keep streaming, no jank.
  • Survives restarts — workspaces, tabs, window geometry, font size, each shell's working directory, and the visible scrollback of every tab all come back. Fresh shells, same layout, same view you left.
  • Keyboard-first — sidebar shows a keycap on each of the first nine workspaces; jump straight there with Ctrl+Shift+1..9 on Linux (Cmd+1..9 on macOS). Plus a fuzzy quick-switcher, find-in-terminal, font zoom, and more.
  • Platform-respecting shortcuts — Linux uses Ctrl+Shift+<key> for app shortcuts (matching GNOME Terminal, Konsole, Alacritty, Ghostty, kitty), so raw Ctrl+P / Ctrl+B / Ctrl+F flow straight to your shell. macOS uses Cmd for the same job; raw Ctrl is left alone.
  • Clickable URLs & iTerm2-style copy — modifier-click opens links; optional auto-copy on selection, persisted, off by default.
  • Working vs ready — two-color sidebar dot: amber while a foreground task is actively producing output (idle TUIs and parked prompts don't count); green once that task has finished — driven by BEL / OSC 9 / OSC 133;D (opt-in shell integration) or a kernel-level busy→idle transition. Plain output by itself never falsely promotes to green. Reads at a glance like a CI traffic light.
  • Drag & drop — reorder workspaces and tabs with live drop feedback (works even in WKWebView, where HTML5 DnD doesn't). Drop a file to paste its shell-quoted path.
  • Local-first & hardened — loopback-only by default, per-session auth token, CSP and security headers, atomic versioned persistence.
The fuzzy quick switcher (Ctrl+Shift+P / Cmd+P) jumping between workspaces and tabs

The fuzzy quick switcher (Ctrl+Shift+P on Linux, Cmd+P on macOS) — jump to any workspace or tab.

Run

uv sync
make frontend                # build the web UI (needs Node; first run only)
uv run terminux              # desktop window (pywebview)
uv run terminux --no-window  # server only — open the printed URL in a browser

--no-window is the dev/test path and a preview of the future web mode.

Install / package

terminux ships as a self-contained desktop app — no Python or Node required to run the bundle.

make linux        # Linux bundle (built in Docker) → dist/linux/terminux/terminux
make docker-run   # run headless web mode on :8000
make app          # macOS .app → dist/terminux.app

Full platform notes (signing, Gatekeeper, X11, architectures) live in the documentation.

Documentation

Docs are built with Zensical and live in docs/.

uv run zensical serve    # live preview at http://127.0.0.1:8000
uv run zensical build    # static site → site/

Start with docs/index.md. The original vision, functional spec, and technical spec are in notes/.

Develop

make frontend        # build TS/Vite UI → src/terminux/web/static
make frontend-test   # vitest unit tests (pure TS logic)
make test            # pytest: unit, integration, e2e (Playwright)
make lint            # ruff + ty + pyrefly + mypy
make format

The e2e tier drives the served UI with a real browser (no pywebview); install it once with uv run playwright install chromium.

Status — 0.5 preview

Works today: workspaces sidebar (create / rename / reorder / close, auto status dot), tabs with multiple live terminals, real PTY shells over a per-terminal WebSocket, background streaming, structure persisted to disk (fresh shells on restart), per-session loopback token, macOS & Linux bundles.

Not yet: split panes, client/server detach, Windows PTY.

Architecture in one breath

A Vite/TypeScript xterm.js web UI runs in a sandboxed pywebview window and talks to a loopback Starlette/uvicorn backend that owns the PTYs and streams raw bytes over per-terminal WebSockets. The frontend build output is committed to src/terminux/web/static/, so the Python package runs with no Node toolchain.

Built for people who keep too many terminals open. — abilian/terminux

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

terminux-0.6.2.tar.gz (120.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

terminux-0.6.2-py3-none-any.whl (126.1 kB view details)

Uploaded Python 3

File details

Details for the file terminux-0.6.2.tar.gz.

File metadata

  • Download URL: terminux-0.6.2.tar.gz
  • Upload date:
  • Size: 120.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for terminux-0.6.2.tar.gz
Algorithm Hash digest
SHA256 13f744d9a13003ae4cf3e68494aa1b5c69eefbf4cbdda72bdb162d925682dbef
MD5 ab6b8cd4e05e1f52ca4daff733114e76
BLAKE2b-256 def5823253b75dfc88c7281ef7ff5a45914bb66ddae49a1a632b82ca20d47abc

See more details on using hashes here.

File details

Details for the file terminux-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: terminux-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 126.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for terminux-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5775afe4dbc8046e3278994693a538cc4673c8885dec8be26124824c205248b0
MD5 cc89eda2b531c534b619d8618b575f1b
BLAKE2b-256 64ce8bcf5738c19dd99c2a44d4f551636b090401ae1d58a71106216e0111472d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page