The canvas-native terminal. Run Claude, Codex, and Gemini side-by-side, wire them together, and ship 10× faster.
Feature docs · Wiring tutorial · Pipeline guide · Features · Design · Install · Quick start
Most dev tools give you one thing at a time: one terminal, one editor, one browser tab.
TerminalX gives you a canvas. Tiles arrange spatially, connect with wires, and automate the copy-paste out of your day.
Spawn Claude, Codex, and Gemini as first-class tiles.
Auto-complete detection means you don't wait for process exit — chains fire on logical completion.
Six wire types. Drag from one tile's output port to another's input port — the type auto-infers.
Terminal → Agent context-pipe
Agent → Agent agent-chain
Runner → Agent auto-fix loop
Todo → Agent task dispatch
FileTree → Editor file-open routing
Agent → Browser refresh trigger
MCP connectors for Slack, GitHub, Linear, Jira, Notion, Calendar, Gmail.
Tasks land in a Todo tile — optionally auto-dispatched to a wired agent.
Tauri 2 + Rust. 47 MB idle.
Native PTY with bounded-channel backpressure. WebGL-rendered terminals. Connection-pooled HTTP proxy. Per-tile lazy chunks.
SSRF-guarded HTTP with pinned DNS. Shell allowlist. 64-PTY cap. Path validation. Atomic writes.
Workspace schema validation on import. CSP without unsafe-inline in script-src.
Three-layer auto-save: localStorage → disk → beforeunload.
Auto-snapshots every 5 min for time-travel. Export workspaces as portable JSON.
Developers who would rather see everything at once than alt-tab through tabs and windows. Multi-agent practitioners who need a spatial model of who's doing what. Teams who live in Slack + Linear and want that context inside the dev loop, not on a different monitor.
If you prefer IDE-driven single-file editing, you'll find this foreign. If you've ever wished your terminal sprawled into something bigger — you're home.
Every feature has its own page in docs/features/. Quick links:
| Category | Highlights |
|---|---|
| Tiles | Terminal · Agent · Editor · Diff · Git · Runner · SSH · Docker · +7 more |
| Wiring | Overview · context-pipe · agent-chain · task-assign · file-open · +2 more |
| Canvas | Infinite canvas · Workspace tabs · Bookmarks · Minimap · Tile dock · Layouts |
| Agents | Spawn · Memory · Auto-complete · Auto-pipe · Pipe button |
| Workflows | Prompt library · Starter layouts · Wire blueprints |
| Integrations | Slack · GitHub · Linear · Jira · Notion · Calendar · Gmail · HTTP proxy · OpenUsage |
| Persistence | Workspace · Snapshots · Recording · Time travel · Import/export |
| UX | Palette · Templates · History · Timeline · Themes · Detach + clone |
| Platform | PTY management · FS access · Bundle · Window chrome · Security |
Each page has a Power moves section with non-obvious workflows.
| Platform | Status | Notes |
|---|---|---|
| Windows 10 / 11 | ✅ Fully supported | Primary target. Needs VS Build Tools for dev. |
| macOS (Intel / Apple Silicon) | ✅ Fully supported | Native traffic lights, ⌘ modifier in UI. |
| Linux (Ubuntu / Fedora / Arch) | ✅ Fully supported | Uses $SHELL. Needs webkit2gtk. |
| iOS / Android | ❌ Not feasible | Mobile sandboxes forbid PTY spawning. |
Pick your OS. First build compiles ~500 Rust crates (2–3 min); subsequent builds are incremental.
Step-by-step (Intel or Apple Silicon)
# 1. Xcode CLT (provides the Rust linker)
xcode-select --install
# 2. Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
# 3. Node 22+ and pnpm
brew install node # or from nodejs.org
npm install -g pnpm
# 4. Clone and run
git clone https://github.com/txc0ld/tmx.git
cd tmx
pnpm install
pnpm tauri dev
# 5. (Optional) Distributable
pnpm tauri build
# → src-tauri/target/release/bundle/Troubleshooting
cargo: command not found→source "$HOME/.cargo/env"or open a new terminal."Cannot verify developer"on a bundled.dmg→ right-click app → Open → Open.
Step-by-step (PowerShell)
# 1. Install Visual Studio Build Tools 2022 from
# https://visualstudio.microsoft.com/downloads/
# Workload: "Desktop development with C++" + Windows SDK
# 2. Rust — run rustup-init.exe from https://rustup.rs
# 3. Node 22+ from https://nodejs.org, then:
npm install -g pnpm
# 4. WebView2 — preinstalled on Win10 (May 2022+) and Win11.
# Otherwise: https://developer.microsoft.com/microsoft-edge/webview2/
# 5. Clone and run (PowerShell — NOT git-bash)
git clone https://github.com/txc0ld/tmx.git
cd tmx
pnpm install
pnpm tauri dev
# 6. (Optional) MSI installer
pnpm tauri build
# → src-tauri\target\release\bundle\msi\TerminalX_0.1.0_x64_en-US.msiTroubleshooting
link.exe not found→ you're in git-bash. Use PowerShell orcmd.exe.MSB8066: custom build exited with code 1→ reopen shell after installing Build Tools.- "Agent Spawn Failed: not a valid Win32 application" → rebuild:
cd src-tauri && cargo build.
Ubuntu / Debian
# 1. Build deps
sudo apt update
sudo apt install -y libwebkit2gtk-4.1-dev build-essential curl wget file \
libssl-dev libayatana-appindicator3-dev librsvg2-dev
# 2. Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
# 3. Node 22+ and pnpm
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
npm install -g pnpm
# 4. Clone and run
git clone https://github.com/txc0ld/tmx.git
cd tmx && pnpm install && pnpm tauri dev
# 5. (Optional) AppImage / .deb
pnpm tauri buildTroubleshooting
no package 'webkit2gtk-4.1' found→ trylibwebkit2gtk-4.0-dev.- Blank window on NVIDIA + Wayland →
WEBKIT_DISABLE_COMPOSITING_MODE=1 pnpm tauri dev.
Fedora / Arch
# Fedora
sudo dnf install webkit2gtk4.1-devel openssl-devel curl wget file \
libappindicator-gtk3-devel librsvg2-devel gcc gcc-c++ make
# Arch
sudo pacman -S --needed webkit2gtk-4.1 base-devel curl wget file openssl \
appmenu-gtk-module libappindicator-gtk3 librsvgThen continue from Step 2 (Rust) in the Ubuntu guide.
Paste any of these into Claude Code, Codex CLI, or Gemini CLI — it'll handle OS detection, prereq checks, and the walkthrough.
Prompt for Claude / Codex / Gemini
I want to install TerminalX from https://github.com/txc0ld/tmx on this machine.
Please:
1. Detect my OS, shell, and architecture.
2. Check which prerequisites I have: git, rustc/cargo, node (v22+), pnpm,
and OS build tools (Xcode CLT on macOS, MSVC Build Tools on Windows,
webkit2gtk + build-essential on Linux).
3. For anything missing, tell me the exact install command — don't run
sudo or system-level installs without confirming with me first.
4. Clone to ~/tmx (or C:\src\tmx on Windows), run `pnpm install`, then
`pnpm tauri dev` in the background.
5. Report back when the app window opens, or surface the error if the
build fails. Use the README as source of truth; ask before deviating.
pnpm tauri dev- Add a project —
+in the sidebar, pick your repo folder. - Apply default layout — top-bar Layout button spawns Terminal + Agent + File Tree + Tasks + Git.
- Open the palette —
Ctrl/⌘+K, fuzzy-search 25+ commands. - Connect an integration — palette → "Add MCP Connection" → Slack / GitHub / Linear etc. See MCP overview.
- Wire something up — drag a Terminal's right port to an Agent's left port. See wiring tutorial.
| Shortcut | Action |
|---|---|
Ctrl/⌘+K |
Command palette |
Ctrl/⌘+F |
Search across all tile content |
Ctrl/⌘+Enter |
Toggle focus mode |
Ctrl/⌘+Tab / +Shift+Tab |
Cycle through tiles |
Ctrl/⌘+W |
Close focused/selected tiles |
Ctrl/⌘+G |
Group selected tiles |
Ctrl/⌘+Shift+B |
Save canvas bookmark |
Ctrl/⌘+1–9 |
Jump to bookmark |
Ctrl/⌘+Shift+D |
Split terminal pane |
Ctrl+Arrow |
Navigate split panes |
Shift+Drag |
Rubber-band select |
Alt+Drag / middle-click |
Pan canvas |
Scroll |
Zoom canvas |
Escape |
Close overlays / exit focus mode |
pnpm tauri dev # Full stack (Rust + Vite HMR)
pnpm dev # Frontend-only (no Tauri)
pnpm tauri build # Production binary for your OS
pnpm test # Frontend unit tests (Vitest)
npx tsc --noEmit # TypeScript type-check
cd src-tauri && cargo check # Rust type-check
cd src-tauri && cargo test # Rust testsCI runs on every push/PR across Ubuntu, Windows, and macOS — see .github/workflows/ci.yml.
React 19 frontend (src/) Rust backend (src-tauri/)
┌────────────────────────────┐ ┌──────────────────────────┐
│ InfiniteCanvas │ │ 30+ IPC commands │
│ TileShell (memo'd) │ IPC / │ • PTY (portable-pty, │
│ 15 tile components │ ←────→ │ bounded channel, │
│ WiringLayer + engine │ events │ 64 cap) │
│ │ │ • Agents (.cmd wrap) │
│ 14 Zustand stores │ │ • 11 git commands │
│ Hooks (usePty, useCanvas, │ │ • Docker, filesystem, │
│ useWiringEngine) │ │ workspace, timeline │
│ │ │ • HTTP proxy (SSRF + │
│ Lazy chunks per tile │ │ DNS pinned + pooled) │
└────────────────────────────┘ └──────────────────────────┘
Stack: Tauri 2 · React 19 · TypeScript 5.6 · Vite 6 · Zustand 5 · xterm.js 5 · Monaco · portable-pty 0.8 · reqwest 0.12
Deep architecture: CLAUDE.md · Design system: DESIGN.md · Security posture: CONTRIBUTING.md.
src/ React frontend
├── components/
│ ├── canvas/ InfiniteCanvas, Minimap, TileDock, WorkspaceTabs
│ ├── tiles/ 15 tile components + TileShell
│ ├── topbar/ Layout menu, Clear Canvas, theme picker
│ ├── palette/ Command palette
│ ├── wiring/ Wire rendering + drag-to-connect
│ └── timeline/ Session timeline
├── stores/ 14 Zustand stores
├── hooks/ usePty, useCanvas, useWiringEngine
├── utils/ ipc, layout, workspaceImport, detachTile
├── design/ Token-based design system (tokens.ts)
└── types/ Discriminated unions for all tile types
src-tauri/ Rust backend
├── src/
│ ├── commands/ 30+ IPC handlers
│ └── state/ AppState, PtyManager
├── capabilities/ Tauri permission manifests
└── icons/ App icons
docs/features/ Per-feature documentation (~55 files)
CLAUDE.md Architecture + critical patterns for AI agents
DESIGN.md Design-system source of truth
FEATURES.md Product feature tour
WIRING.md Drag-to-connect wiring tutorial
CONTRIBUTING.md PR workflow + security posture
Contributions welcome. See CONTRIBUTING.md for the full workflow, security posture, and PR checklist.
Quick guidelines:
- Fork and branch (
feat/your-feature). - Type-check (
npx tsc --noEmit) before committing. - Follow patterns in CLAUDE.md — especially Zustand selectors (the #1 crash cause) and the memoization rules.
- Cross-platform: if you touched Rust or IPC, test on your OS + confirm CI passes on all three.
- Conventional commits (
feat:,fix:,refactor:,perf:,docs:).
- ❌
useXxxStore(s => s.thing || [])— creates new arrays every render, infinite loop. Use a module-level constant with??. - ❌
invoke()directly from components — always wrap inutils/ipc.ts. - ❌ Hardcoded colors — use
colors.*fromdesign/tokens.ts. - ❌
@tauri-apps/plugin-fsfor user project files — scope is too narrow. UsereadFileText/writeFileTextfromutils/ipc.ts.
MIT © Fantom Labs
Built by Tay at Fantom Labs
Website · GitHub · Issues · Feature docs