Active · May 25, 2026
DalkkakAI
Native macOS multi-pane terminal multiplexer + Claude Code workspace for solo founders running multiple startups in parallel.
- Role
- Solo (AI-pair-programmed with Claude Code)
- Stack
- Tauri 2 · Rust · React 19 · TypeScript · xterm.js · portable-pty · tmux
A native macOS app that gives you multiple terminal panes across multiple "startup" workspaces, each backed by a persistent tmux session so claude, dev servers, and log tails survive an app restart. Built to scratch my own itch — I was running ~12 macOS desktops in parallel and burning hours on Mission Control switching.
What it does
- Multi-pane terminal grid (react-mosaic + xterm.js) over per-pane PTYs.
- Each pane is a tmux session keyed
dalkkak-<id>, so sessions outlive the app. - Multi-startup sidebar with per-startup layout;
⌘1..9/⌘⇧[/⌘⇧]navigation. - Layout JSON persistence in localStorage, automatic reattach on launch.
- Two-layer observability: Claude Code hooks →
logs/*.jsonl, Rusttracing→ daily-rolling runtime log.
Why
The product's core verb is "drive the user's local claude binary". A browser tab can't do that — web-only is technically incapable of solving the actual pain. Tauri (Rust backend + system WebKit) gives a ~10 MB bundle that still owns the file system and process tree. Multi-startup as a first-class citizen separates it from Warp / iTerm / BridgeMind, which all assume one project per window.
What's shipped (v0.1.0)
Phase 1: multi-pane + tmux persistence + multi-startup sidebar. Bundle: 309 lines of Rust, 14 TypeScript files. Unsigned beta, macOS Apple Silicon only.
What's not
Phase 2 (Claude Code output augmentation), Phase 3 (cross-startup operator layer), Phase 4 (signed release + marketplace) are roadmap only. Production users: zero. The dogfood test — replace 12 macOS desktops for one full week — hasn't been run yet.
Engineering bits worth pointing at
- Lifecycle decouple. xterm and the PTY live in a module-level registry, outside React. Mosaic split/stack remounts don't touch them. VS Code Server's terminal-hosting pattern. (log)
- Subprocess env hygiene. Tauri's GUI app inherits a minimal PATH and a near-empty environment. Without explicit
TERM,LANG, and PATH augmentation,claude --resumefroze for 15 seconds and tmux silently failed to spawn. (log 1, log 2) - Bug-as-asset. Every shipped bug got a six-section post-mortem (symptom / root cause / fix / instruction-blame / avoidability / lessons), enforced by
CLAUDE.mdRULE #6.
Project log
Chronological record of troubleshooting, retros, and updates while building this.
Pivoting v1 (Python/FastAPI) to v2 (Tauri + Rust + React)
Tech retroMay 25, 2026 · 1 min
Started DalkkakAI as a web app over a FastAPI backend, then realised the core feature — driving the user's local Claude Code binary — is technically impossible in a browser sandbox. Pivoted to Tauri the same day and froze v1 under old_repo/.
Focus-based split + keyboard shortcuts — iTerm's 50-year pattern, not a new one
UX retroMay 26, 2026 · 1 min
First split UX put a button in the toolbar that always split the root. Replaced with focused-pane split + ⌘D / ⌘⇧D / ⌘W, matching what every terminal user has had muscle memory for since the 1970s.
react-mosaic remounts killed running Claude sessions — moved xterm + PTY out of React
Tech retroMay 26, 2026 · 2 min
Splitting a pane changed its path in the mosaic tree, which React treated as an unmount, which fired the cleanup effect, which killed the PTY — and the running `claude` session with it. Fixed by hoisting xterm and the PTY out of React entirely.
Multi-startup sidebar — N startups in one workspace, each with its own layout
Tech retroMay 26, 2026 · 1 min
Phase 1.4 Step 1: introduced the Startup as a first-class concept. Sidebar lists startups, each owns its own pane layout. Right-click for rename / change emoji / delete.
Tauri GUI bundle's minimal PATH made tmux silently exit
TroubleshootMay 26, 2026 · 2 min
Panes printed `[exited]` and seemed to share sessions because `CommandBuilder::new("tmux")` couldn't resolve the binary — the GUI app's inherited PATH didn't include /opt/homebrew/bin.
Phase 1.0 — Tauri 2.x scaffold under apps/desktop
Tech retroMay 26, 2026 · 1 min
Bootstrapped the actual Tauri app under apps/desktop, then deleted the placeholder apps/web and apps/api from the v1 bootstrap. First `pnpm tauri dev` opened a native window.
claude --resume took 15s inside the DalkkakAI PTY
TroubleshootMay 26, 2026 · 1 min
The same `claude --resume` finished instantly in iTerm but hung for ~15 seconds in a freshly spawned DalkkakAI pane. Cause was a near-empty environment in the PTY child.
Phase 1.2 — first PTY pane streaming output to xterm.js
Tech retroMay 26, 2026 · 1 min
Wired portable-pty in Rust to xterm.js in the renderer through Tauri commands + events. Typing `ls` in a freshly opened pane echoed back. First moment the app felt real.
useEffect race ate the layout of every freshly-created startup
TroubleshootMay 26, 2026 · 1 min
New startups appeared in the sidebar fine, but their pane layout disappeared on the next launch. Two effects (Load and Save) were racing on the initial render, and the Load effect's stale closure was overwriting the Save.
Set up cross-repo blog log aggregation, then deduped CLAUDE.md against myself
UpdateMay 27, 2026 · 1 min
I had written 6 timeline entries directly into the blog repo, missing that this repo is actually a cross-repo log satellite. Migrated them here, locked the slug in CLAUDE.md RULE #9, then audited and deduped #9 against an existing Project-log section I'd also missed.
DalkkakAI v0.1.0 — Phase 1 shipped as an unsigned beta
Tech retroMay 27, 2026 · 2 min
Multi-pane terminal with tmux persistence and a multi-startup sidebar, in 309 lines of Rust and 14 TypeScript files. Tagged v0.1.0; unsigned, macOS Apple Silicon only, zero users yet.
Rewriting the portfolio docs after a brutal-honesty round on AI vs me
BusinessMay 27, 2026 · 1 min
Asked for a portfolio rating, got a flattered answer back, pushed back hard. Re-rated honestly (AI did most of the typing, I did the architecture / debugging direction / product calls). Rewrote README, added RESUME.md, refreshed CONTEXT.md to match.
StreamParser shipped with hardcoded regexes — they don't match real Claude Code output
Tech retroMay 27, 2026 · 1 min
Phase 2.1 Stage 1 landed a StreamParser that pattern-matches Claude Code output into tool calls / prompts / activity / completion events. It uses fragile hardcoded regexes and captures zero events in real usage. Should pivot to Claude Code hooks.
Should DalkkakAI eventually move to Swift? Walked the blueprint to decide
Tech retroMay 27, 2026 · 1 min
Caught myself flirting with a Swift rewrite for 'Apple-grade UX.' Walked every layer of the BLUEPRINT and concluded the current product as designed has no part that *requires* Swift. Tauri stays unless the blueprint itself pivots.
Two-layer observability — Claude Code hooks for dev-time, Rust tracing for runtime
Tech retroMay 27, 2026 · 1 min
Split observability into two layers with different purposes: Claude Code hooks capture every Bash/Edit/Prompt/Stop during dev, Rust `tracing` captures PTY lifecycle on the user's machine. Codified as CLAUDE.md RULE #8.