A Rust-based TUI (Terminal User Interface) multiplexer designed for AI-assisted development workflows. Provides an integrated development environment with file browser, syntax-highlighted preview pane, and multiple embedded PTY terminals.
I love efficient coding, but I grew tired of bloated IDEs. Visual Studio Code felt too heavy, and other tools often came with baggage I simply didn't need for my daily workflow. What I truly wanted was an environment as fast as my thought process — built on the stability of Rust and bringing the power of Claude directly into the shell.
Over the 2025/2026 New Year, I turned that vision into reality: Claude Workbench.
It's not a traditional IDE; it's a high-performance TUI (Terminal User Interface). Built on the Fish shell and Rust, it seamlessly integrates tools like lazy-git and provides everything you need for a frictionless workflow — from an intelligent file browser and live Markdown rendering to direct Claude integration.
No overhead. Maximum performance. Built by a developer, for developers.
- The Problem: Modern IDEs have become bloated, filled with features that distract rather than help.
- The Search: After testing alternatives like Zed or Google IDX, they lacked the "Shell-First" philosophy I crave.
- The Goal: Create a portable, lightning-fast solution that feels like a natural extension of the terminal.
- Rust: Chosen for uncompromising performance, safety, and stability.
- Fish Shell (4.x): The core for a modern, user-friendly command-line experience.
- Claude Integration: Deep integration of Claude (e.g., via Claude Code) for AI-assisted development without leaving the terminal.
- Automation: Hosted on GitHub with automated release workflows (compiling) and integrated self-update logic.
| Pane | Key | Description |
|---|---|---|
| File Browser | F1 | Navigate directories, git status integration, file operations (F9), toggle visibility |
| Preview | F2 | Syntax highlighting (500+ languages), Markdown rendering, built-in editor |
| Claude Code | F4 | Embedded Claude CLI terminal with startup prefixes |
| LazyGit | F5 | Integrated Git TUI (restarts in current directory) |
| Terminal | F6 | General-purpose shell (syncs to current directory) |
Highlights:
- Full PTY emulation with 256-color support and 1000-line scrollback
- Search & Replace (MC Edit style) with regex support
- Character-level mouse selection - click and drag to select text, auto-copies to clipboard
- Keyboard selection mode (Ctrl+S) with intelligent filtering
- Drag & Drop files into terminals
- Git remote change detection with pull prompts
- Claude fullscreen mode when all panes hidden (F1/F2/F5/F6 toggles)
- Interactive pane resizing - drag pane borders with mouse
- Horizontal scrolling - in Preview and Edit mode for long lines
- F9 Copy Output - in the Terminal pane copies the whole last command block from the full scrollback; in Claude/LazyGit copies the last N visible lines (configurable, default 50)
- Self-update - automatic update check from GitHub Releases
- App Dropdown - auto-detect installed browsers/editors in Settings (macOS + Linux)
- Ctrl+X Markdown Export - export as Markdown copy or PDF (native Typst engine, no external tools needed)
- Ctrl+V Paste - clipboard paste in all input dialogs
- Mouse and keyboard navigation throughout
# Install via Homebrew (macOS / Linux)
brew install eqms/claude-workbench/claude-workbench
# Or use the installer script
curl -fsSL https://raw.githubusercontent.com/eqms/claude-workbench/main/scripts/install.sh | bash
# Or build from source
git clone https://github.com/eqms/claude-workbench.git
cd claude-workbench && cargo build --release
./target/release/claude-workbenchSee INSTALL.md for detailed platform-specific installation instructions.
| Key | Action |
|---|---|
| F1-F6 | Switch between panes |
| F9 | File menu in File Browser / Copy last command block (Terminal) or last N lines (Claude, LazyGit) to clipboard |
| F12 | Help (full shortcut reference) |
| Ctrl+P | Fuzzy file finder |
| Ctrl+Q | Quit |
| E | Edit file (in Preview) |
| Ctrl+X | Export Markdown/PDF (format chooser) |
| Shift+F2 | Open in External Editor (context-aware) |
| Ctrl+S | Selection mode (in Terminal/Preview) |
| Ctrl+C | Copy selection to System Clipboard |
| F11 | Universal Paste — inject system clipboard into active pane (XRDP / broken bracketed-paste workaround) |
| Right-click | Paste from system clipboard into pane under cursor (mirrors Kitty's mouse_map right press paste) |
See USAGE.md for complete keyboard shortcuts and detailed usage guide.
- Remote export/preview no longer corrupts the terminal over SSH. When claude-workbench runs on a remote Linux host, pressing
o(browser preview) or exporting viaCtrl+X(Markdown/PDF) used to runxdg-openon the server — with no display that falls back to a console browser which hijacks the TUI and fills the screen with garbage. On an SSH session the file is now streamed to your local Mac terminal via iTerm2's OSC 1337 "File Download" escape (also supported by WezTerm), landing in~/Downloadsover the existing SSH connection — no daemon, no port forwarding. Large PDFs use the multipart protocol. Terminals without transfer support (Terminus/Tabby, plain xterm, Kitty) leave the file on the server and show its path in the footer — the TUI is never corrupted. Newui.remote_transferconfig (auto/off/iterm2/wezterm) and--open-diagCLI for diagnostics. All file-open subprocesses now detach their standard streams as a second line of defense.
- External editor shortcut rebound to Shift+F2 (was Ctrl+Alt+E). The v1.1.1 rebind to Ctrl+Alt+E turned out to be a silent no-op on macOS terminals under default keyboard settings (Terminal.app, iTerm2, Kitty) — Option is consumed by the OS's dead-key/composition input method and never reaches the terminal as an Alt modifier when Ctrl is also held. An interim Ctrl+F2 rebind also failed: macOS reserves Ctrl+F2 through Ctrl+F8 system-wide for Full Keyboard Access focus navigation, so the key never reached the terminal at all. Shift+F2 is not claimed by any macOS system shortcut and uses the same reliable F-key + modifier encoding already proven by the working Shift+F9 shortcut, while still avoiding the original collision with Claude Code's own Ctrl+E binding.
- Security hardening release. The Markdown browser preview no longer renders raw HTML/
<script>embedded in.mdfiles — it is shown as escaped text instead (Markdown-syntax images and links are unaffected). The system file opener now canonicalizes paths so filenames starting with-cannot be misread as CLI flags. The CI/release pipeline runs with least-privilege permissions and all GitHub Actions are pinned to exact commit SHAs. See SECURITY-NOTES.md for the full audit trail.
- External editor shortcut moved to Ctrl+Alt+E. Claude Code now reserves plain
Ctrl+Efor its own use, so the "Open in External Editor" shortcut has been rebound toCtrl+Alt+E(Ctrl+Option+Eon macOS) to avoid the collision. Behavior is unchanged otherwise — still context-aware (Preview file when Preview is active, otherwise the FileBrowser selection).
- Terminal pane passthrough for nano / mc / vim (Ctrl+B prefix). In the User Terminal pane (F6) all keys — including F1–F12 and Ctrl+X/S/O/P/E — are now sent straight to the running program, so full-screen TUIs work correctly (e.g.
Ctrl+Xexits nano,F4/F10drive the Midnight Commander menu). Workbench commands are reached through a tmux-style prefix:Ctrl+Bthen1-6(panes),?(help),s(select),c(copy), orCtrl+Bagain for a literal byte.Ctrl+Qstays reserved as a guaranteed quit. Only the User Terminal is affected — Claude and LazyGit panes keep the regular shortcuts. Configurable / disablable viapty.terminal_prefixinconfig.yaml(default"ctrl+b"). F1–F12 are now encoded as xterm escape sequences so they reach the inner app. - Paste sanitizing in the editor. Text pasted into the Preview editor (Ctrl+V, bracketed paste, F11 universal paste) is now stripped of invisible/zero-width and control characters (U+200B, BOM, soft hyphen, bidi marks, …) and CRLF is normalized to LF. This fixes the "ghost cursor" where the visible cursor drifted away from the real insertion point. Text forwarded to a PTY is left byte-for-byte intact.
- Standard copy/cut/paste/undo in Edit mode. Replaced the MC-Edit Ctrl+F3/F5/F6/F8 block shortcuts (broken due to global F-key collision) with standard Ctrl+C / Ctrl+X / Ctrl+Z / Ctrl+Shift+Z.
Ctrl+CandCtrl+Xwithout a selection act on the current line.Ctrl+Xno longer opens the export dialog when the Preview pane is in Edit mode — that shortcut is reserved for ReadOnly Preview and FileBrowser. Hardware cursor viaf.set_cursor_position()fixes the invisible cursor in Terminus and certain iTerm2 configurations.
- Mouse-wheel scrolling works again in the Claude pane (tmux-like wheel forwarding). Claude Code ≥2.1.89 renders in the alternate screen with mouse tracking enabled by default; the local scrollback buffer is empty there, so wheel events used to vanish. Workbench now inspects the inner application's terminal state per wheel tick: if the app has mouse tracking enabled (Claude Code fullscreen renderer, LazyGit), the wheel event is forwarded to the application as an SGR/X10 mouse sequence so it scrolls its own view; on the alternate screen without mouse tracking (
less,vim) arrow keys are sent instead; otherwise (plain shell) the wheel scrolls the local scrollback exactly as before.Shift+PgUp/PgDnstill always scrolls the local buffer. As a side effect, wheel scrolling in the LazyGit pane now drives LazyGit's own list scrolling natively.
- F9 in the shell pane now copies the whole last command block. In the Terminal pane, F9 reads the full scrollback buffer (no longer capped at the visible pane height) and copies everything from the last shell prompt to the bottom — so older error messages that scrolled off-screen are included. It uses prompt-line heuristics to find the boundary; if none is found it falls back to the last N lines of the full buffer (still more than what was visible before). The Claude and LazyGit panes keep the previous last-N-visible-lines behaviour, and
Shift+F9/Ctrl+F9(interactive line count) is unchanged.
- PDF export renders source code correctly. Inline code (e.g.
module_name) is no longer rendered in tiny default monospace — it now uses the configured code font at a readable size inside a light-grey rounded chip, set as an atomic box so paragraph justification can no longer stretch the spaces within a code span. Longsnake_caseidentifiers and comma-joined lists in table cells now wrap inside their column (zero-width-space break opportunities) instead of overflowing into the neighbouring column. - Fixed a hard PDF export failure. Markdown containing braces or other Typst-significant characters in table cells (e.g.
search_partners_by_{name,email,vat}) previously aborted Typst compilation because{enters code mode.typst_escape()now escapes `{ } _ * [ ] ~ $ `` in literal text, so such documents export cleanly.
- Phase 1 Security Hardening — Wave 1 of 3 shipped. Eight audit findings closed in this release: predictable temp-path symlink-redirect vector (
tempfile::BuilderwithO_EXCLinsrc/browser/pdf_export.rs);--update-to <version>flag debug-only via#[cfg(debug_assertions)]plusfilter_restart_args()so the restart loop can't be wedged into an infinite downgrade; allow-list validation of the browser/editor config (validate_program()insrc/browser/opener.rs); removal of the$SHELL -i -cfallback insrc/setup/dependency_checker.rs; executable-bit check inclipboard::which();shlex::try_quoteerror propagation fromsync_terminals*;semver::Version::max_byrelease selection instead of GitHub creation-orderreleases[0]. Self-update signature verification (SEC-01) remains the only Phase 1 item still open — Wave 2 needs an operator-generatedzipsigned25519 keypair, Wave 3 needs at least two signed releases shipped before it can be enabled. Tests: 111 → 130. .planning/directory introduced — GSD project planning artifacts (PROJECT.md, ROADMAP.md, REQUIREMENTS.md, per-phase plans/research/reviews under.planning/phases/, refreshed codebase maps under.planning/codebase/) are now committed. Source of truth for upcoming phases.
- Async clipboard worker thread —
copy_to_clipboard()now dispatches to a dedicatedclipboard-workerthread and returns immediately withClipboardOutcome::Submitted. The event loop pollstake_pending_outcome()once per frame and only flashes the footer on realFailed. The UI stays responsive even when the X-server clipboard hangs for the full 500 ms timeout from v0.86.4. Paste remains synchronous (callers need the result immediately to inject into PTY/editor).
- Clipboard subprocess timeout (500 ms) — Real root cause of the "app frozen, no key/mouse response" symptom on XRDP:
xclip -iandxsel -iblock indefinitely under XRDP when the X11 selection-owner negotiation never completes. Because copy/paste run synchronously in the main thread, the entire event loop froze.run_with_stdin()andrun_capture()now wait at most 500 ms and kill the child on timeout, falling back to the next helper or OSC 52 instead of hanging. CLAUDE_WORKBENCH_CLIPBOARD=osc52kill-switch — Forces the newOsc52Onlystrategy: skips arboard, xclip, xsel, wl-copy/-paste entirely and emits OSC 52 only. Use in sessions where the X-server clipboard is completely broken. Other accepted values:arboard,subprocess.--clipboard-diagshows the active override.
- XRDP/Kitty selection-freeze fix (left-click drag) — Under XRDP, the RDP transport reliably swallows the
ButtonReleaseevent whenEnableMouseCaptureis active, whileButtonPressand motion events come through. Result:mouse_selection.selectingstaystrue, the highlight visually freezes, and further clicks are interpreted as drag extensions. Two defensive fixes: Esc now cancels an active mouse selection (global handler, runs after modal dismissals), and a newDown(Left)event clears any stale selection before starting a fresh one — clicks on footer/scrollbar/modal areas no longer leave a frozen highlight behind. Complements v0.86.2 which only addressed right-click.
- Right-click = Paste in PTY/Preview panes —
EnableMouseCapturewas swallowing right-clicks, so Kitty'smouse_map right press ungrabbed paste_from_clipboardcould never fire under XRDP. Right-click now uses the same fallback chain as F11 (arboard → xclip → xsel → wl-paste) and pastes into the pane under the cursor. If an Alt+drag mouse selection is active, right-click clears it instead — fixes the XRDP-only "screen blocked, selection won't go away" bug.
- macOS boot hang hotfix — v0.86.0 invoked
check_command()for the four new clipboard helpers at startup, falling back to$SHELL -i -c "..."when direct exec failed. On macOS the helpers are typically absent → 4×fish -i -cwith job-control init → terminal state corrupted on next launch. Helper detection now uses pure-Rust PATH lookup (crate::clipboard::which()), no subprocess.
- Clipboard fallback chain —
arboard→xclip→xsel→wl-copy→ OSC 52 for copy;arboard→xclip -o→xsel -b -o→wl-pastefor paste. Restores clipboard sync under XRDP / Kitty / Xfce where Kitty's bracketed-paste forwarding fails. - F11 Universal Paste — Reads the system clipboard via the fallback chain and injects it directly into the active pane (Claude / LazyGit / Terminal / Preview-Edit). Bypasses Kitty's bracketed-paste bridge entirely — the workaround when Kitty cannot read the system clipboard under XRDP.
- Startup dependency check — Detects
xclip,xsel,wl-copy,wl-pasteat launch. On Linux without any helper, a yellow footer banner appears for 10 seconds. F12 (Help) shows the current strategy and detected helpers. --clipboard-diagCLI —claude-workbench --clipboard-diagprints the active strategy, helper paths, relevant environment variables (DISPLAY,WAYLAND_DISPLAY,XRDP_SESSION,XDG_SESSION_TYPE,SSH_TTY) and runs a copy/paste roundtrip test.- Footer error flash — Failed clipboard operations now show
❌ Clipboard error: ...for 3 seconds, no more silent failure.
sudo apt install xclip xsel xfce4-clipman-plugin
pgrep -af xrdp-chansrv # must be running (default with xrdp)
# ~/.config/kitty/kitty.conf:
clipboard_control write-clipboard write-primary read-clipboard read-primary no-appendWith xclip installed, the app picks SubprocessFirst strategy automatically and writes directly into the X11 selection — exactly the path xrdp-chansrv syncs to the RDP channel.
- Claude Code 2.1.117 Startup Dialog — The permission mode dialog is replaced by a unified multi-section startup dialog covering Permission Mode, Model, Effort, Session Name, Worktree, and Remote Control. Navigation:
Tab/Shift+Tabbetween sections,↑↓in lists,←→for radios. All values persist toconfig.yamland are pre-selected on next launch. - Auto Mode — New
autopermission mode (--permission-mode auto) as the 6th variant, sorted afteracceptEditsmatching the Shift+Tab cycle order of Claude Code. Lets Claude check each tool call for risky actions and prompt injection — ideal for long-running tasks. - Model, Effort, Session Name, Worktree Flags —
--model sonnet|opus,--effort low|medium|high|xhigh|max,--name <session>,--worktree <name>now configurable from the startup dialog. - Remote Control via CLI flag — The 4-second
/remote-controlslash-command hack is replaced by the official--remote-controlflag. Starts reliably without timing-dependent race conditions. - 18 new unit tests — Test count now 99 (96 unit + 3 integration), up from 81.
- Internal Refactor Release —
handle_key_event(1,375 lines) split into 15 focused methods per overlay/pane;src/update/mod.rs(986 lines) split into six submodules (log,state,version,release_notes,check,install). Behavior preserved 1:1. - Optional
pdf-exportFeature — Typst PDF toolchain is now behind a default-enabled Cargo feature.cargo build --no-default-featuresproduces a smaller binary without PDF support. - Multi-OS CI — Test job now runs on Linux, macOS, and Windows (previously Linux only).
- Explicit Style Contract —
rustfmt.tomlandclippy.tomlcodify formatting and lint thresholds. - Integration Tests — New
tests/cli.rsexercises--help,--version, and unknown-flag handling (81 total tests, up from 78).
- Cross-File Link Resolution — HTML export now auto-converts referenced
.mdfiles and rewrites links. When README.md links to USAGE.md or INSTALL.md, all files are converted to HTML with working links.
- HTML Anchor Links Fixed — Internal anchor links (
[text](#heading)) now work in browser preview and HTML export. Headings get auto-generatedidattributes via sharedslugify()function.
- Unified Export System — All export paths (PDF, Markdown preview, Syntax preview) now share the same configurable values. 14 hardcoded values replaced by config fields.
- 7 New Document Settings — Table Font Size, Header Font Size, Line Height, Code Block BG, Heading Separator, Table Cell Padding, Blockquote Border now editable in F8.
- Consistent Preview Filenames — Browser previews use
{project}-{file}-{date}.htmlnaming instead of random temp names. - Bug Fix —
pre codeCSS incorrectly used table font size instead of code font size.
- Configurable Font Sizes — Body Font Size and Code Font Size are now editable in Document Settings (F8 → Document). Code blocks use their own size independently from tables.
- PDF Code Font from Config — The
Code Fontsetting (F8 → Document) is now applied to code blocks and tables in PDF export. Previously hardcoded to Consolas/Courier New.
- Async PDF Export — PDF generation runs in background with yellow progress indicator. UI stays responsive.
- PDF Internal Links — Markdown anchor links (
[text](#heading)) now work as clickable navigation in PDF. - PDF Font Fix — Header/footer now use configured Carlito/Calibri font instead of Typst default.
- Linux Clipboard — Wayland support via
wayland-data-control, OSC 52 dual-terminator (BEL + ST) for broader terminal compatibility. - Linux Rendering Fix — Fixed severe pane overlap/ghosting when scrolling on Linux terminals. Added
Clearbefore pane rendering, zero-area guards, and proper None-cell clearing.
- PDF Export Fix — Fixed "file not found" error when exporting Markdown with local images. Remote image URLs are now rendered as links in PDF.
- Export Flash Message — Footer shows "PDF exported" / "Markdown exported" after successful export.
- Templates Tab Removed — Removed non-functional Templates tab from Settings (no persistence, no effect).
- Native Typst PDF Engine — PDF export now uses pure Rust Typst rendering. No external tools (Chrome, wkhtmltopdf) required. Bundled Carlito font (Calibri-compatible) for consistent cross-platform rendering.
- Page Numbers — Every PDF page shows "Seite X von Y" with three-column footer (Company | Date | Page) and header with document title.
- Central DocumentConfig — New
document:section inconfig.yamlfor unified branding: company name, fonts (Calibri default), colors (#D5E8F0 table headers), font sizes (Word-standard hierarchy), PDF page settings (A4, 2.5cm margins). - CSS Template Module — Shared styling across all HTML preview and PDF templates via configurable
TemplateContext.
- F9 Menu Export — File Menu (F9 in File Browser) now has an "Export Markdown/PDF" entry (
xkey) as a direct alternative to Ctrl+X. - Ctrl+E Context-Aware — Opens the file currently shown in the Preview pane when Preview is active.
Remote Control Fix — The remote-control subcommand was removed (not a valid Claude CLI command). When Remote Control is enabled, the workbench now automatically sends a Space key 2 seconds after Claude starts, triggering the QR code display for remote access.
Remote Control Toggle — The Permission Mode dialog now includes a Remote Control checkbox below the 5 permission modes. When enabled, the QR code for remote access is automatically displayed after Claude starts. Toggle with Space, the setting is persisted in config.yaml.
claude:
remote_control: true # Enable remote control mode (default: false)F9 „Copy Last N Lines" — Press F9 in any terminal pane (Claude, LazyGit, Terminal) to copy the last N lines of output to the system clipboard. Configurable via pty.copy_lines_count (default: 50). Footer shows a green „✓ N lines" flash for 2 seconds. F9 in the File Browser still opens the file menu as before.
pty:
copy_lines_count: 50 # Increase for longer outputs, e.g. 100 or 200Configuration files are loaded in priority order:
./config.yaml(project-local, highest priority)~/.config/claude-workbench/config.yaml(user config)
terminal:
shell_path: "/opt/homebrew/bin/fish"
shell_args: ["-l"]
ui:
theme: "default"
layout:
claude_height_percent: 40
file_browser_width_percent: 20
preview_width_percent: 50
right_panel_width_percent: 30
file_browser:
show_hidden: false
show_file_info: true
date_format: "%d.%m.%Y %H:%M:%S"
auto_refresh_ms: 2000
# Optional: Claude startup prefixes and remote control
claude:
remote_control: false # Auto-show QR code for remote access after start
startup_prefixes:
- name: "Code Review"
prefix: "/review"
description: "Review code changes"
# Document export settings (PDF uses native Typst, no external tools needed)
document:
company:
name: "My Company" # Shown in PDF footer and author
footer_text: "Generated by {company_name}"
fonts:
body: "Calibri, -apple-system, sans-serif"
colors:
table_header_bg: "#D5E8F0"
pdf:
page_size: "A4"
margin: "2.5cm" # uniform fallback for all sides
# Optional per-side overrides (empty → use `margin`):
margin_top: ""
margin_right: ""
margin_bottom: ""
margin_left: ""Page margins are editable in the TUI under F8 → Document.
Page Margin (all sides)sets a uniform margin; the fourMargin Top/Right/Bottom/Leftfields override individual sides (leave empty to inherit the uniform value). Narrower left/right margins give wide tables more room.
- Ratatui - TUI framework
- Crossterm - Terminal handling
- portable-pty - PTY management
- vt100 - Terminal emulation
- syntect - Syntax highlighting
- Typst - Native PDF generation (pure Rust, no external binaries)
- tui-textarea - Text editor widget
- tui-markdown - Markdown rendering
MIT License - Copyright (c) 2025 Martin Schmid
See LICENSE for details.
Ein Rust-basierter TUI (Terminal User Interface) Multiplexer für KI-unterstützte Entwicklungsworkflows. Bietet eine integrierte Entwicklungsumgebung mit Dateibrowser, Syntax-hervorgehobener Vorschau und mehreren eingebetteten PTY-Terminals.
Ich liebe effizientes Programmieren, aber ich hatte genug von aufgeblähten IDEs. Visual Studio Code fühlte sich zu schwer an, und andere Tools brachten oft Ballast mit, den ich für meinen täglichen Workflow schlicht nicht brauchte. Was ich wirklich wollte, war eine Umgebung, die so schnell ist wie mein Denkprozess — aufgebaut auf der Stabilität von Rust und mit der Kraft von Claude direkt in der Shell.
Über Silvester 2025/2026 habe ich diese Vision Wirklichkeit werden lassen: Claude Workbench.
Es ist keine traditionelle IDE; es ist ein hochperformantes TUI (Terminal User Interface). Aufgebaut auf der Fish Shell und Rust, integriert es nahtlos Werkzeuge wie lazy-git und bietet alles, was man für einen reibungslosen Workflow braucht — von einem intelligenten Dateibrowser und Live-Markdown-Rendering bis hin zur direkten Claude-Integration.
Kein Overhead. Maximale Performance. Von einem Entwickler, für Entwickler.
- Das Problem: Moderne IDEs sind aufgebläht, vollgestopft mit Features die ablenken statt zu helfen.
- Die Suche: Nach dem Testen von Alternativen wie Zed oder Google IDX fehlte ihnen die "Shell-First"-Philosophie, die ich brauche.
- Das Ziel: Eine portable, blitzschnelle Lösung schaffen, die sich wie eine natürliche Erweiterung des Terminals anfühlt.
- Rust: Gewählt für kompromisslose Performance, Sicherheit und Stabilität.
- Fish Shell (4.x): Der Kern für ein modernes, benutzerfreundliches Kommandozeilen-Erlebnis.
- Claude-Integration: Tiefe Integration von Claude (z.B. via Claude Code) für KI-unterstützte Entwicklung ohne das Terminal zu verlassen.
- Automatisierung: Gehostet auf GitHub mit automatisierten Release-Workflows (Kompilierung) und integrierter Selbst-Update-Logik.
| Bereich | Taste | Beschreibung |
|---|---|---|
| Dateibrowser | F1 | Verzeichnisnavigation, Git-Status-Integration, Dateioperationen (F9), ein-/ausblenden |
| Vorschau | F2 | Syntax-Hervorhebung (500+ Sprachen), Markdown-Rendering, Editor |
| Claude Code | F4 | Eingebettetes Claude CLI Terminal mit Startup-Präfixen |
| LazyGit | F5 | Integrierte Git-TUI (startet im aktuellen Verzeichnis neu) |
| Terminal | F6 | Allgemeines Shell-Terminal (wechselt ins aktuelle Verzeichnis) |
Highlights:
- Volle PTY-Emulation mit 256-Farben und 1000 Zeilen Scrollback
- Suchen & Ersetzen (MC Edit Stil) mit Regex-Unterstützung
- Zeichenweise Mausauswahl - Klicken und Ziehen zum Markieren, kopiert automatisch ins Clipboard
- Tastatur-Auswahlmodus (Ctrl+S) mit intelligentem Filtering
- Drag & Drop von Dateien in Terminals
- Git Remote-Änderungserkennung mit Pull-Aufforderung
- Claude Vollbildmodus wenn alle Bereiche ausgeblendet (F1/F2/F5/F6 Umschaltung)
- Interaktives Pane-Resizing - Bereichsgrenzen per Maus ziehen
- Horizontales Scrollen - in Vorschau und Editor für lange Zeilen
- F9 Ausgabe kopieren - im Terminal-Bereich kopiert den ganzen letzten Kommando-Block aus dem vollen Scrollback; in Claude/LazyGit die letzten N sichtbaren Zeilen (konfigurierbar, Standard 50)
- Selbst-Update - automatische Update-Prüfung von GitHub Releases
- App-Dropdown - automatische Erkennung installierter Browser/Editoren in Settings (macOS + Linux)
- Ctrl+X Markdown-Export - Export als Markdown-Kopie oder PDF (native Typst-Engine, keine externen Tools nötig)
- Ctrl+V Einfügen - Clipboard-Paste in allen Eingabedialogen
- Maus- und Tastaturnavigation durchgehend
# Installation via Homebrew (macOS / Linux)
brew install eqms/claude-workbench/claude-workbench
# Oder Installer-Skript verwenden
curl -fsSL https://raw.githubusercontent.com/eqms/claude-workbench/main/scripts/install.sh | bash
# Oder aus Quellcode bauen
git clone https://github.com/eqms/claude-workbench.git
cd claude-workbench && cargo build --release
./target/release/claude-workbenchSiehe INSTALL.md für detaillierte plattformspezifische Installationsanleitungen.
| Taste | Aktion |
|---|---|
| F1-F6 | Zwischen Bereichen wechseln |
| F9 | Datei-Menü im Dateibrowser / Letzten Kommando-Block kopieren (Terminal) bzw. letzte N Zeilen (Claude, LazyGit) ins Clipboard |
| F12 | Hilfe (vollständige Shortcut-Referenz) |
| Ctrl+P | Fuzzy-Dateisuche |
| Ctrl+Q | Beenden |
| E | Datei bearbeiten (in Vorschau) |
| Ctrl+X | Markdown/PDF exportieren (Format-Auswahl) |
| Shift+F2 | In externem Editor öffnen (kontextabhängig) |
| Ctrl+S | Auswahlmodus (in Terminal/Vorschau) |
| Ctrl+C | Auswahl in System-Clipboard kopieren |
| F11 | Universal Paste — System-Clipboard in aktive Pane einfügen (Workaround für XRDP / defektes Bracketed-Paste-Forwarding) |
| Rechtsklick | Paste aus System-Clipboard in Pane unter dem Cursor (entspricht Kittys mouse_map right press paste) |
Siehe USAGE.md für alle Tastenkürzel und detaillierte Bedienungsanleitung.
- Shortcut für externen Editor auf Shift+F2 verschoben (vorher Ctrl+Alt+E). Die v1.1.1-Umstellung auf Ctrl+Alt+E erwies sich unter Standard-Tastatureinstellungen auf macOS-Terminals (Terminal.app, iTerm2, Kitty) als stiller Fehlschlag — die Option-Taste wird von der Zusammensetzungs-/Tottasten-Eingabemethode des Betriebssystems abgefangen und erreicht das Terminal nie als Alt-Modifikator, wenn gleichzeitig Ctrl gedrückt wird. Auch die Zwischenlösung Ctrl+F2 scheiterte: macOS reserviert Ctrl+F2 bis Ctrl+F8 systemweit für die Fokus-Navigation der Vollständigen Tastatursteuerung, sodass die Taste das Terminal nie erreichte. Shift+F2 ist von keinem macOS-Systemshortcut belegt und nutzt dieselbe zuverlässige F-Tasten-plus-Modifikator-Kodierung, die bereits beim funktionierenden Shift+F9-Shortcut bewährt ist, und vermeidet weiterhin die ursprüngliche Kollision mit Claude Codes eigener Ctrl+E-Belegung.
- Security-Hardening-Release. Die Markdown-Browser-Vorschau rendert kein rohes HTML/
<script>mehr, das direkt in.md-Dateien eingebettet ist — es wird stattdessen als escapter Text angezeigt (Markdown-Syntax für Bilder und Links ist nicht betroffen). Der System-Dateiöffner kanonisiert Pfade, sodass Dateinamen mit führendem-nicht mehr als CLI-Flags fehlinterpretiert werden können. Die CI/Release-Pipeline läuft mit Least-Privilege-Berechtigungen und alle GitHub Actions sind auf exakte Commit-SHAs gepinnt. Details im vollständigen Audit-Trail: SECURITY-NOTES.md.
- Shortcut für externen Editor auf Ctrl+Alt+E verschoben. Claude Code reserviert inzwischen das einfache
Ctrl+Efür die eigene Nutzung, daher wurde der Shortcut „In externem Editor öffnen“ aufCtrl+Alt+E(Ctrl+Option+Eunter macOS) umgestellt, um die Kollision zu vermeiden. Das Verhalten bleibt ansonsten unverändert — weiterhin kontextabhängig (Vorschau-Datei wenn Vorschau aktiv, sonst Dateibrowser-Auswahl).
- Mausrad-Scrollen im Claude-Bereich funktioniert wieder (tmux-artiges Wheel-Forwarding). Claude Code ≥2.1.89 rendert standardmäßig im Alternate Screen mit aktiviertem Mouse-Tracking; der lokale Scrollback-Puffer ist dort leer, Wheel-Events verpufften bisher. Workbench prüft jetzt pro Mausrad-Tick den Terminal-Zustand der inneren Anwendung: Hat die App Mouse-Tracking aktiviert (Claude Code Fullscreen-Renderer, LazyGit), wird das Wheel-Event als SGR/X10-Mouse-Sequenz an die Anwendung weitergeleitet, die dann selbst scrollt; im Alternate Screen ohne Mouse-Tracking (
less,vim) werden stattdessen Pfeiltasten gesendet; andernfalls (normale Shell) scrollt das Mausrad wie bisher den lokalen Scrollback.Shift+PgUp/PgDnscrollt weiterhin immer den lokalen Puffer. Nebeneffekt: Im LazyGit-Bereich scrollt das Mausrad jetzt nativ LazyGits eigene Listen.
- F9 im Shell-Bereich kopiert jetzt den ganzen letzten Kommando-Block. Im Terminal-Bereich liest F9 den kompletten Scrollback-Puffer (nicht mehr auf die sichtbare Bereichshöhe begrenzt) und kopiert alles vom letzten Shell-Prompt bis zum Ende — auch ältere Fehlermeldungen, die nach oben weggescrollt sind. Die Prompt-Grenze wird per Heuristik bestimmt; wird keine erkannt, greift ein Fallback auf die letzten N Zeilen des vollen Puffers (immer noch mehr als vorher sichtbar). Claude- und LazyGit-Bereich behalten das bisherige Verhalten (letzte N sichtbare Zeilen),
Shift+F9/Ctrl+F9(interaktive Zeilenzahl) bleibt unverändert.
- Async-Clipboard im Worker-Thread —
copy_to_clipboard()dispatcht jetzt an einen dediziertenclipboard-worker-Thread und returnt sofort mitClipboardOutcome::Submitted. Der Event-Loop pollt einmal pro Frametake_pending_outcome()und zeigt nur bei realemFailedden Footer-Flash. Die UI bleibt responsiv, selbst wenn der X-Server-Clipboard die volle 500 ms-Timeout-Spanne aus v0.86.4 ausschöpft. Paste bleibt synchron (Caller brauchen das Ergebnis sofort für PTY/Editor-Inject).
- Clipboard-Subprocess-Timeout (500 ms) — Wahre Ursache des "App reagiert auf nichts mehr"-Symptoms unter XRDP:
xclip -iundxsel -iblockieren indefinit, wenn die X11-Selection-Owner-Negotiation keinen Empfänger findet. Da Copy/Paste synchron im Main-Thread laufen, fror der gesamte Event-Loop ein.run_with_stdin()undrun_capture()warten jetzt maximal 500 ms und killen den Child bei Timeout — Fallback auf nächsten Helper bzw. OSC 52 statt Hänger. CLAUDE_WORKBENCH_CLIPBOARD=osc52Kill-Switch — Erzwingt die neueOsc52Only-Strategy: arboard/xclip/xsel/wl-copy/-paste werden komplett übersprungen, ausschließlich OSC 52 ans Terminal. Für Sessions, in denen der X-Server-Clipboard komplett kaputt ist. Weitere Werte:arboard,subprocess.--clipboard-diagzeigt den aktiven Override.
- XRDP/Kitty Selection-Freeze Fix (Linksklick-Drag) — Unter XRDP verschluckt das RDP-Backend bei aktivem
EnableMouseCapturezuverlässig denButtonRelease-Event, währendButtonPressund Bewegung durchkommen. Folge:mouse_selection.selectingbleibttrue, der Highlight friert ein, weitere Klicks werden als Drag-Erweiterung interpretiert. Zwei defensive Fixes: Esc cancelt jetzt eine aktive Mausselektion (globaler Handler, greift nach Modal-Dismissals), und ein neuesDown(Left)clearet stale Selection vorab — Klicks auf Footer/Scrollbar/Modal lassen keinen eingefrorenen Highlight mehr zurück. Ergänzt v0.86.2, das nur Rechtsklick adressierte.
- Rechtsklick = Paste in PTY/Preview-Panes —
EnableMouseCaptureschluckte Rechtsklicks, sodass Kittysmouse_map right press ungrabbed paste_from_clipboardunter XRDP nie greifen konnte. Rechtsklick nutzt jetzt dieselbe Fallback-Kette wie F11 (arboard → xclip → xsel → wl-paste) und pastet in die Pane unter dem Cursor. Bei aktiver Alt+Drag-Mausselektion clearet Rechtsklick stattdessen die Selektion — behebt den XRDP-only Bug "Bildschirm blockiert, Markierung lässt sich nicht entfernen".
- macOS Boot-Hänger Hotfix — v0.86.0 rief beim Start
check_command()für die vier neuen Clipboard-Helper auf, mit Fallback auf$SHELL -i -c "..."wenn direct exec scheiterte. Auf macOS sind die Helper typischerweise nicht installiert → 4×fish -i -cmit Job-Control-Init → Terminal-State korrumpiert nach Beenden. Helper-Detection nutzt jetzt pure-Rust PATH-Lookup (crate::clipboard::which()), kein Subprocess.
- Clipboard-Fallback-Kette —
arboard→xclip→xsel→wl-copy→ OSC 52 für Copy;arboard→xclip -o→xsel -b -o→wl-pastefür Paste. Stellt Clipboard-Sync unter XRDP / Kitty / Xfce wieder her, wenn Kittys Bracketed-Paste-Forwarding nicht funktioniert. - F11 Universal Paste — Liest das System-Clipboard über die Fallback-Kette und schreibt direkt in die aktive Pane (Claude / LazyGit / Terminal / Preview-Edit). Umgeht Kittys Bracketed-Paste-Bridge komplett — der Workaround, wenn Kitty unter XRDP das System-Clipboard nicht lesen kann.
- Startup-Dependency-Check — Erkennt
xclip,xsel,wl-copy,wl-pastebeim Start. Auf Linux ohne Helper erscheint 10 Sekunden lang ein gelbes Banner im Footer. F12 (Hilfe) zeigt die aktive Strategie und gefundene Helper. --clipboard-diagCLI —claude-workbench --clipboard-diagdruckt die aktive Strategie, Helper-Pfade, relevante Umgebungsvariablen (DISPLAY,WAYLAND_DISPLAY,XRDP_SESSION,XDG_SESSION_TYPE,SSH_TTY) und führt einen Copy/Paste-Roundtrip aus.- Footer-Error-Flash — Fehlgeschlagene Clipboard-Operationen zeigen jetzt
❌ Clipboard error: ...für 3 Sekunden, kein stilles Versagen mehr.
sudo apt install xclip xsel xfce4-clipman-plugin
pgrep -af xrdp-chansrv # muss laufen (Standard bei xrdp)
# ~/.config/kitty/kitty.conf:
clipboard_control write-clipboard write-primary read-clipboard read-primary no-appendMit xclip installiert wählt die App automatisch die SubprocessFirst-Strategie und schreibt direkt in die X11-Selection — exakt der Pfad, den xrdp-chansrv zum RDP-Kanal synct.
- Claude Code 2.1.117 Startup-Dialog — Der Permission-Mode-Dialog wird durch einen vereinheitlichten Multi-Sektion-Startup-Dialog ersetzt: Permission Mode, Model, Effort, Session-Name, Worktree und Remote Control. Navigation:
Tab/Shift+Tabzwischen Sektionen,↑↓in Listen,←→für Radio-Buttons. Alle Werte werden inconfig.yamlpersistiert und beim nächsten Start vorselektiert. - Auto Mode — Neuer
autoPermission Mode (--permission-mode auto) als 6. Variante, nachacceptEditseinsortiert entsprechend der Shift+Tab-Reihenfolge von Claude Code. Claude prüft jeden Tool-Call auf riskante Aktionen und Prompt-Injection — ideal für Long-Running Tasks. - Model, Effort, Session-Name, Worktree Flags —
--model sonnet|opus,--effort low|medium|high|xhigh|max,--name <session>,--worktree <name>jetzt im Startup-Dialog konfigurierbar. - Remote Control als CLI-Flag — Der 4-Sekunden
/remote-controlSlash-Command-Hack ist durch das offizielle--remote-controlFlag ersetzt. Startet zuverlaessig ohne Timing-abhaengige Race Condition. - 18 neue Unit-Tests — Test-Anzahl jetzt 99 (96 unit + 3 integration), vorher 81.
- Internes Refactor-Release —
handle_key_event(1.375 Zeilen) in 15 fokussierte Methoden pro Overlay/Pane aufgeteilt;src/update/mod.rs(986 Zeilen) in sechs Submodule (log,state,version,release_notes,check,install) zerlegt. Verhalten bleibt 1:1. - Optionales
pdf-exportFeature — Die Typst-PDF-Toolchain steht jetzt hinter einem default-aktivierten Cargo-Feature.cargo build --no-default-featureserzeugt ein kleineres Binary ohne PDF-Support. - Multi-OS CI — Der Test-Job laeuft jetzt auf Linux, macOS und Windows (vorher nur Linux).
- Expliziter Style-Contract —
rustfmt.tomlundclippy.tomldokumentieren Formatierungs- und Lint-Schwellenwerte. - Integrationstests — Neue
tests/cli.rsprueft--help,--versionund unbekannte Flags (81 Tests gesamt, vorher 78).
- Cross-File Link-Aufloesung — Der HTML-Export konvertiert jetzt automatisch referenzierte
.md-Dateien mit und schreibt die Links um. Wenn README.md auf USAGE.md oder INSTALL.md verlinkt, werden alle Dateien zu HTML konvertiert und die Links funktionieren.
- HTML Anker-Links repariert — Interne Anker-Links (
[text](#heading)) funktionieren jetzt in der Browser-Vorschau und im HTML-Export. Ueberschriften erhalten automatischid-Attribute ueber eine gemeinsameslugify()-Funktion.
- Einheitliches Export-System — Alle Export-Pfade (PDF, Markdown-Vorschau, Syntax-Vorschau) nutzen jetzt die gleichen konfigurierbaren Werte. 14 hardcoded Werte durch Config-Felder ersetzt.
- 7 neue Document Settings — Tabellen-Schriftgroesse, Header-Schriftgroesse, Zeilenhoehe, Code-Block-Hintergrund, Ueberschrift-Trennlinie, Tabellen-Zellenabstand, Blockquote-Rahmen jetzt in F8 editierbar.
- Konsistente Vorschau-Dateinamen — Browser-Vorschauen verwenden
{Projekt}-{Datei}-{Datum}.htmlstatt zufaelliger Temp-Namen. - Bug-Fix —
pre codeCSS nutzte faelschlicherweise Tabellen- statt Code-Schriftgroesse.
- Konfigurierbare Schriftgroessen — Body Font Size und Code Font Size sind jetzt in den Document Settings (F8 → Document) editierbar. Code-Bloecke verwenden eine eigene Groesse unabhaengig von Tabellen.
- PDF Code-Font aus Config — Die
Code Font-Einstellung (F8 → Document) wird jetzt auf Code-Blöcke und Tabellen im PDF-Export angewendet. Zuvor fest auf Consolas/Courier New verdrahtet.
- Async PDF-Export — PDF-Generierung im Hintergrund mit gelbem Fortschrittsindikator. UI bleibt reaktiv.
- PDF Interne Links — Markdown-Anker-Links (
[text](#heading)) funktionieren als klickbare Navigation im PDF. - PDF Schriftart-Fix — Header/Footer verwenden jetzt konfigurierte Carlito/Calibri-Schrift statt Typst-Default.
- Linux Clipboard — Wayland-Support via
wayland-data-control, OSC 52 Dual-Terminator (BEL + ST) fuer breitere Terminal-Kompatibilitaet. - Linux Rendering-Fix — Schweres Pane-Overlap/Ghosting beim Scrollen unter Linux behoben. Clear vor Pane-Rendering, Zero-Area-Guards, und korrektes None-Cell-Clearing.
- PDF-Export Fix — Fehler „file not found" bei Markdown-Dateien mit lokalen Bildern behoben. Remote-Bild-URLs werden als Links im PDF dargestellt.
- Export Flash-Nachricht — Footer zeigt nach erfolgreichem Export „PDF exported" / „Markdown exported".
- Templates-Tab entfernt — Nicht-funktionaler Templates-Tab aus Settings entfernt (keine Persistierung, keine Wirkung).
- F9-Menü Export — Das Datei-Menü (F9 im Dateibrowser) hat jetzt einen „Export Markdown/PDF"-Eintrag (
x-Taste) als direkte Alternative zu Ctrl+X. - Ctrl+E kontextabhängig — Öffnet die aktuell in der Vorschau angezeigte Datei, wenn der Vorschau-Bereich aktiv ist (bisher nur die im Dateibrowser markierte Datei).
- Behoben: Settings Auto-Save bei Esc — Der Settings-Dialog speichert Änderungen jetzt korrekt beim Schließen mit Esc.
- Behoben: Tab-Vervollständigung in allen Pfad-Dialogen — Tab vervollständigt Pfade in allen Dialogen (Ctrl+O, Export-Verzeichnis, Browser/Editor-Pfade).
- Behoben: Browser-Auswahl für Exporte — Der konfigurierte Browser wird jetzt korrekt für die Markdown-zu-HTML-Export-Vorschau verwendet.
- App-Dropdown für Browser/Editor — Settings → Paths erkennt jetzt automatisch installierte Browser und Editoren. Auswahl per Dropdown statt manuelle Pfadeingabe. macOS (App-Bundle-Erkennung) und Linux (which-basiert). "Custom path..." Fallback für manuelle Eingabe.
- Ctrl+X: Markdown-Export — Aktuelle Markdown-Datei als Markdown-Kopie oder PDF exportieren. Format-Auswahl-Dialog, konfigurierbares Export-Verzeichnis (Settings → Paths → Export Directory, Standard: ~/Downloads). PDF via Chrome headless oder wkhtmltopdf.
- Ctrl+V Einfügen in Dialogen — Clipboard-Paste funktioniert jetzt in allen Eingabedialogen (Ctrl+O, Dateioperationen, Settings-Felder).
- Command-Splitting Bugfix — Browser/Editor-Befehle wie
open -a "Brave Browser"funktionieren jetzt korrekt.
Remote Control Fix — Der remote-control Subcommand wurde entfernt (kein gültiger Claude CLI-Befehl). Bei aktiviertem Remote Control wird nun automatisch 2 Sekunden nach Claude-Start die Leertaste gesendet, um den QR-Code für den Remote-Zugriff anzuzeigen.
Remote Control Toggle — Der Berechtigungsmodus-Dialog enthält nun eine Remote Control Checkbox unterhalb der 5 Modi. Wenn aktiviert, wird der QR-Code für den Remote-Zugriff automatisch nach dem Claude-Start angezeigt. Umschalten mit Leertaste, die Einstellung wird in config.yaml gespeichert.
claude:
remote_control: true # Remote Control Modus aktivieren (Standard: false)F9 „Letzte N Zeilen kopieren" — F9 in einem Terminal-Bereich (Claude, LazyGit, Terminal) kopiert die letzten N Ausgabe-Zeilen in die Zwischenablage. Konfigurierbar über pty.copy_lines_count (Standard: 50). Der Footer zeigt 2 Sekunden lang einen grünen „✓ N Zeilen"-Flash. F9 im Dateibrowser öffnet weiterhin das Datei-Menü.
pty:
copy_lines_count: 50 # Für längere Ausgaben erhöhen, z.B. 100 oder 200Konfigurationsdateien werden in Prioritätsreihenfolge geladen:
./config.yaml(projektlokal, höchste Priorität)~/.config/claude-workbench/config.yaml(Benutzerkonfiguration)
terminal:
shell_path: "/opt/homebrew/bin/fish"
shell_args: ["-l"]
ui:
theme: "default"
layout:
claude_height_percent: 40
file_browser_width_percent: 20
preview_width_percent: 50
right_panel_width_percent: 30
file_browser:
show_hidden: false
show_file_info: true
date_format: "%d.%m.%Y %H:%M:%S"
auto_refresh_ms: 2000
# Optional: Claude Startup-Präfixe und Remote Control
claude:
remote_control: false # QR-Code für Remote-Zugriff automatisch anzeigen
startup_prefixes:
- name: "Code Review"
prefix: "/review"
description: "Code-Änderungen überprüfen"- Ratatui - TUI-Framework
- Crossterm - Terminal-Handhabung
- portable-pty - PTY-Verwaltung
- vt100 - Terminal-Emulation
- syntect - Syntax-Hervorhebung
- tui-textarea - Texteditor-Widget
- tui-markdown - Markdown-Rendering
MIT-Lizenz - Copyright (c) 2025 Martin Schmid
Siehe LICENSE für Details.


