Tux
Barebones terminal IDE with split panes, session sidebar, and git-aware workflow — built because Warp and VSCode buried the features I needed.
Context & Overview
I live in the terminal. Warp and VSCode promised the workflow I wanted — split panes, a file explorer, a git tree, session monitoring — but every one of those features was either missing, behind a flag, or three menus deep. I wanted a tool that only had what I needed, in the order I needed it, with a native feel and a small footprint. So I built it.
The Challenge
Problem Statement
Modern IDEs and terminals overload on features I don't use, while burying the features I do. Every menu click is a context switch. Every buried feature is friction that compounds over a workday.
Why It Matters
The features that actually matter for my workflow are layout, git visibility, file state, and fast terminal access. If a tool can't surface those in under a second, it's slowing me down — even if it has the feature somewhere.
Constraints
- Must launch fast — sub-2s cold start target
- Only the features I actually use, nothing else
- Native feel, not a web wrapper in disguise
- Small package size, not a multi-hundred-megabyte bundle
Goals & Metrics
Objectives
- Split panes (vertical and horizontal)
- Right-side terminal
- Left sidebar: file explorer, git tree, terminal sessions
- Inline git diffs
- Read, write, and edit files with Prettier syntax highlighting
- Rust + Tauri for speed and smaller package size
Target KPIs
- Time from launch to first command
- Package / binary size
- Number of features kept (intentionally small)
Research & Discovery
Methodology
Key Insights
- Most IDE features are inert for me — extensions marketplace, debugger, plugin system, integrated package manager.
- The features that actually matter are layout, git state, and file state. Those three cover ~90% of my day.
- Tauri gives a native UX with webview flexibility, without the 200MB Electron tax.
Approach & Strategy
PRD-first, then a single-day scaffold followed by 5 fix commits. Rust backend handles PTY, git ops, and the editor engine. React frontend handles the layout because that's where webview pays off.
Frameworks
Tauri 2, ghostty-web (terminal rendering), CodeMirror (editor), @pierre/diffs (diff viewer), git2-rs (git operations)
Collaboration
Solo. Daily-driver dogfooding from commit 1 — every feature had to be used the same day it was built.
The Solution
A three-pane desktop app. Sessions and the file tree live on the left. The terminal plus editor/diff sit in the middle. Git state lives on the right. Ghostty powers the terminal, CodeMirror powers the editor with Prettier for JS/TS/JSON/HTML/CSS/MD, and @pierre/diffs renders the diff pane. Session state persists across launches.
App Visuals
Design Rationale
Rust + Tauri for sub-2s cold start and a small binary. React only where layout actually needs it (split panes, drag-resize, sidebar collapse). No LSP, no plugin marketplace, no debugger — explicitly out of scope per the PRD.
Execution
Roadmap
PRD
20-section PRD covering layout, terminal, git, editor, persistence, performance targets
Initial commit
Tauri 2 + React 19 scaffold with all 7 panes wired (App, Sidebar, FileTree, Terminal, GitViewer, Diff, Editor)
5 fix passes
File explorer → CWD reset → GitViewer → shortcuts + git.rs → backspace keystroke
Challenges Overcome
- ⚠ File explorer: PTY and sidebar state had to be rewired so the tree and the terminals stayed in sync (`7097843`).
- ⚠ CWD reset bug: shell working directory wasn't restoring on session switch, breaking per-session isolation (`de63eac`).
- ⚠ GitViewer stability: two passes to get diffs rendering reliably across staged / unstaged / untracked states (`d10a0a4`, `53678a0`).
- ⚠ Keyboard shortcut layer + dedicated `git.rs` module landed in the same commit to keep the surface area small (`53678a0`).
- ⚠ Backspace keystroke wasn't reaching the shell in the built binary, only in dev. Keymap registration was happening too late (`be3d4d1`).
Outcomes & Impact
Quantifiable Results
- 1.Terminal, editor, and git state visible at a glance: no menu diving
- 2.Single binary replaces 2-tool setup (Warp + VSCode) for daily sessions
- 3.Dogfooded from commit 1: every feature used the same day it was built
Qualitative Feedback
“Feels native, not browser-y”
“No feature I have to ignore or disable”
“Daily-driver capable for terminal-centric workflows”
Learnings & Future
Key Takeaways
- Build the tool that fits how you actually work — not how a feature list says it should.
- A PRD prevents scope creep better than any framework. It also makes the 'what we cut' conversation easy.
- Fix commits tell you where the real work was. The initial scaffold is the easy part.
Next Steps
- LSP for syntax-only lint hints (no autocomplete — out of scope by design)
- Hunk staging directly in the diff viewer
- Fuzzy file search (Cmd+P)
- Workspace JSON snapshots for cross-machine restore
- UI improvements tailored for terminal-based coding agents (Claude Code, Codex, Aider) — clearer diffs, in-place prompts, agent run state
- Better shortcut detection — context-aware keybindings that don't fight with the shell or the agent