tmux-ide

Web Dashboard

The web-based IDE that ships with tmux-ide 2.5+ — open localhost:6060 to use it

Web Dashboard

The dashboard is a browser-based IDE served by the tmux-ide daemon. It runs locally on localhost:6060 and gives you a file editor, multi-thread chat, diff viewer, terminal, plans editor, search, and LSP — all wired to the same project state your CLI commands operate on.

Open the dashboard

# In any project directory:
tmux-ide              # launches the tmux session + daemon; prints the URL
tmux-ide dashboard    # opens the browser at the daemon's URL

Flags for tmux-ide dashboard:

  • --no-open — print the URL without opening a browser
  • --json — emit {"url", "port", "pid"} for scripts

The dashboard is also reachable at http://localhost:6060 directly if you prefer.

Layout

The route is /project/:name. Five regions:

┌──┬───┬──────────┬───────────────────┬─────┐
│PR│ AB│ Sidebar  │ Editor / View     │ Insp│
│  │   │ (240px)  │                   │(260)│
├──┴───┴──────────┴───────────────────┴─────┤
│ Bottom Panel — terminal / problems / output│
├───────────────────────────────────────────┤
│ Status Bar                                │
└───────────────────────────────────────────┘
  • Project Rail (PR) — leftmost. One row per registered project; click to switch.
  • Activity Bar (AB) — view picker: files / search / diffs / plans / tasks / skills / notes / mission / chat / terminal / widgets.
  • Sidebar — context for the active view (file tree, plan list, etc.).
  • Editor — the active view's main surface.
  • Inspector — collapsible right rail with the event timeline (Cmd+I to toggle).
  • Bottom Panel — tabs for terminal, problems, output.

Keyboard shortcuts

  • Cmd+K — command palette: jump to any project, thread, terminal, or command.
  • Cmd+/ — keyboard shortcut cheat sheet (every registered keybind in the app).
  • Cmd+B / Cmd+Alt+B / Cmd+J — toggle left sidebar / right inspector / bottom panel.
  • Cmd+P — quick switcher: project picker.
  • Cmd+Shift+F — workspace search.
  • Cmd+Shift+C/T/E — focus chat / terminal / files view.
  • Cmd+E (in plans view) — enter plan edit mode.
  • Cmd+S (in plan edit) — save plan body.
  • Esc (in plan edit) — cancel without saving.

Views

Files

VS Code-style file tree + multi-tab editor with Shiki syntax highlighting. Right-click for context menu (open in folder, copy path, search in folder). LSP-powered hover, go-to-definition, rename across TypeScript / Python / Rust / Go. Autosave with crash recovery.

Chat

Multi-thread chat surface with first-class Claude Code and Codex providers, isolated per project.

  • Multichat — every project owns its own thread list; opening /project/A shows A's threads only. Click + New chat to start a thread; the rail switches between them with no daemon round-trip.
  • Provider switcher — the header picker swaps between Claude Code, Codex, and any custom command-based provider. The switch is local-first (no daemon round-trip), with the persisted thread.provider updated as a reload fallback. Switching does not lose thread context.
  • Per-turn model picker — discovered live from each provider (no hardcoded model lists). The picked model rides on the next chat.session.send; favorites are persisted per workspace.
  • Codex capabilities — when the active model declares them, an adjacent selector exposes reasoningEffort (low / medium / high) and fastMode. Both are persisted per thread × kind × model so different threads can run with different effort levels against the same model.
  • Composer — inline image preview with click-to-expand, plan follow-up cards (ProposedPlanCard), permission dialogs, terminal-context chips, pending-approval banner, and a mention/command menu.
  • Tool calls — every tool invocation renders as a ToolCallCard you can expand for input/output, with diff stats and changed-file trees rolled up inline.
  • Edit from message — text-only user turns get a pencil affordance. Edit-and-save calls chat.session.editFromTurn, regenerating the rest of the thread from the new content.
  • Rename in place — click the thread title in the header to rename without a modal.

Shortcuts: Cmd+Shift+C focuses the chat view. The header Stop button cancels an in-flight turn (chat.session.cancel).

Diffs

Three diff sources plus full commit history, all sharing one Monaco-powered StickyDiffEditor.

  • Modeschanges (working tree, polled every 5s), history (browse commits, ?base=main tags ahead-of-base commits for PR context), and branch (full base...HEAD range a PR would contain).
  • Sources within changesworking (HEAD vs disk), staged (HEAD vs index), and pr (base branch vs HEAD). The toggle is in the header; the file rail and editor rebind to the new git refs in place.
  • Split / unified — the view-style toggle lives in the same toolbar as the source toggle.
  • Per-hunk Accept / Reject — when the host registers the callbacks, each hunk gets inline affordances; the daemon write-through is staged behind the toolbar buttons.
  • Large-diff guard — files past the line threshold render a placeholder with a Load anyway escape hatch so the editor doesn't choke on auto-generated lockfiles.
  • Commit rail — in history mode, the left rail shows up to 200 commits with subject, short SHA, author, and relative date. An AHEAD badge marks commits not yet in main.

Shortcuts: open the Diffs view from the activity bar; the file rail accepts arrow-key navigation.

┌─ Diffs ──────────────────────────────────────────────┐
│ 12 files changed  +340 / −58       [changes][history][branch vs main]  [working][staged][pr]  [split][unified] │
├──────────┬───────────────────────────────────────────┤
│ src/     │  dashboard/lib/api.ts                     │
│ ▸ api.ts │  ─────────────────────────────────────── │
│   useK.. │   42  - return r.json();                 │
│   ...    │   42  + return await r.json();           │
│          │       [Accept hunk]  [Reject hunk]        │
└──────────┴───────────────────────────────────────────┘

Ripgrep-backed workspace search served by the daemon, virtualized for large result sets.

  • Query input — debounced 250ms; Enter is implicit. Smart-case by default; toggle to case-sensitive or regex from the icon row.
  • Glob include / exclude — VS Code-style globs (src/**, packages/*/src/**, **/*.test.ts, node_modules/**). Empty fields fall back to the daemon's default ignore list.
  • Current-file scope — the FileText toggle pins include to the active editor buffer; toggling off restores the prior glob.
  • Recent searches — focus the empty query input to drop down the last 10 queries for the current project (persisted per workspace).
  • Match navigationF3 / Shift+F3 step across matches panel-wide, wrapping at both ends. Clicking a match opens the file at the line with the submatch highlighted; the row stays highlighted as the active match so further F3 presses continue from there.
  • Replace — open the replace input from the toolbar; replace per-file from the file-header Replace button, or Replace N in M files to commit across the whole result set (gated by a confirm dialog). Files modified since the search snapshot are skipped automatically.
  • Open match — clicking a row navigates to ?view=files&path=<path>&line=<line>, which the Files surface consumes to focus the buffer at the cursor.

Shortcuts: Cmd+Shift+F opens the search view; F3 / Shift+F3 step to next / previous match; Esc closes the replace-confirm dialog.

┌─ Search ─ Cmd+Shift+F ───────────────────────────────┐
│ [openFileAt                                       ]  │
│ [refocusBuffer                                    ]  │
│ [Aa] [.*] [✎] [▣]                       searching…  │
│ files to include:  packages/*/src/**                 │
│ files to exclude:  **/*.test.ts, node_modules/**     │
│ 14 results in 6 files · 32ms                         │
│ ▾ packages/chat-solid/src/lib/editorOpen.ts (3)      │
│    12  // openFileAt is the broker entry point       │
│    14  export function openFileAt(req: OpenRequest)  │
│ ▾ dashboard/src/components/search/SearchView.tsx (5) │
│   362  openFileAt({                                  │
└──────────────────────────────────────────────────────┘

Terminal

Vertical-rail tab strip. Each new terminal opens with the project's cwd. Tabs are kept-alive on switch (no remount latency). Cmd+T opens a new terminal; Cmd+W closes the active one; Cmd+1..9 jumps to a tab.

Tasks / Plans / Skills / Mission / Notes

Mission-orchestration surfaces: view tasks, milestones, validation status, plans, skill definitions. Same data the CLI's tmux-ide task / mission / plan / skill commands operate on.

Bottom Panel

  • terminal — quick terminal scoped to the project cwd
  • problems — LSP diagnostics across the workspace
  • output — daemon event log (project.launch, chat.thread.created, task completion, etc.)

Project switching

The project rail on the left lists every registered project. Click to switch — the route changes to /project/:name. If the project's tmux session isn't running, the route auto-launches it on mount (the IDE shell shows a centered "Launching…" spinner during the boot, then renders once the session is up).

To add a project: open the dashboard at localhost:6060/setup or click "Add project" in the activity bar. The wizard auto-detects the package manager, frameworks, and recommended dev/test commands.

Settings

localhost:6060/settings — terminal font, theme, keybind customization, provider configuration.

See also

On this page