Skip to content

syv-ai/dash

Repository files navigation

Dash

Desktop app for running Claude Code across multiple projects and tasks, each in its own git worktree.

The main idea: you open a project, create tasks, and each task gets an isolated git worktree with its own branch. Claude Code runs in a real terminal (xterm.js + node-pty) inside each worktree, so you can have multiple tasks going in parallel without branch conflicts.

Dash screenshot

What it does

  • Project management — Open any git repo as a project, or clone from a URL. Tasks are nested under projects in the sidebar. Drag-and-drop to reorder projects. Project overview dashboard shows all tasks, activity status, and quick actions.
  • Git worktrees — Each task gets its own worktree and branch. A reserve pool pre-creates worktrees so new tasks start instantly (<100ms). Per-project setup scripts run automatically after worktree creation (e.g. pnpm install, copying .env).
  • Terminal — Full PTY terminal per task. Sessions persist when switching between tasks (state is snapshotted and restored). Shift+Enter sends multiline input. File drag-drop pastes paths. Clickable file paths open in your IDE. 16 terminal themes.
  • Shell drawer — Separate shell terminal alongside the task terminal. Configurable position (left, right, or replacing main content).
  • File changes panel — Real-time git status with staged/unstaged sections. Stage, unstage, discard per-file. Click to view diffs.
  • Diff viewer — Full file or configurable context lines. Unified diff with syntax highlighting. Select lines to add inline comments and send them to the terminal.
  • Commit graph — Visualize branch history with a DAG-style commit graph per project.
  • GitHub issues — Search and link issues to tasks. Auto-posts branch comments on linked issues. PR link badge in task header.
  • Azure DevOps — Search and link ADO work items to tasks. PR detection and branch comments. Per-project ADO configuration with PAT token storage.
  • Remote control — Generate a QR code / URL to control a task's terminal from another device.
  • Activity indicators — Busy (amber) and idle (green) status per task, with desktop notifications and sound alerts (chime, cash, ping, droplet, marimba).
  • Editor integration — Open changed files in your editor (Cursor, VS Code, Zed, Vim) with line navigation. Clickable file paths in terminal output.
  • Commit attribution — Configurable co-author line on commits (default, none, or custom text).
  • Task archiving — Archive inactive tasks to keep the sidebar clean; restore when needed.
  • Auto-update — Background update checking with manual download and install.
  • Customizable keybindings — Remap any shortcut from Settings.
  • Dark/light theme

Install

Download the latest build from Releases. Open the .dmg and drag Dash.app to /Applications.

Prerequisites

Development setup

pnpm install
npx electron-rebuild -f -w node-pty,better-sqlite3  # rebuild native modules for Electron

Development

pnpm dev

This starts Vite on port 3000 and launches Electron pointing at it. Renderer changes hot-reload; main process changes need a restart (pnpm dev:main or just kill and re-run pnpm dev).

To just rebuild and launch the main process:

pnpm build:main
npx electron dist/main/main/entry.js --dev

Build

pnpm build              # compile both main + renderer
pnpm package:mac        # build + package as macOS .dmg

Output goes to release/.

Project structure

src/
├── main/                   # Electron main process
│   ├── entry.ts            # App name, path aliases, loads main.ts
│   ├── main.ts             # Boot: PATH fix, DB init, IPC, window
│   ├── preload.ts          # contextBridge API
│   ├── window.ts           # BrowserWindow creation
│   ├── db/                 # SQLite + Drizzle ORM
│   │   ├── schema.ts       # projects, tasks, conversations tables
│   │   ├── client.ts       # better-sqlite3 singleton
│   │   ├── migrate.ts      # SQL migration runner
│   │   └── path.ts         # DB file location
│   ├── ipc/                # IPC handlers
│   │   ├── appIpc.ts       # Dialogs, CLI/IDE detection
│   │   ├── dbIpc.ts        # CRUD for projects/tasks/conversations
│   │   ├── gitIpc.ts       # Git status, diff, stage/unstage, commit graph
│   │   ├── ptyIpc.ts       # Terminal spawn/kill/resize
│   │   ├── worktreeIpc.ts  # Worktree create/remove/claim
│   │   ├── githubIpc.ts    # GitHub issues, PRs, branch comments
│   │   ├── azureDevOpsIpc.ts # ADO work items, PRs, config
│   │   └── autoUpdateIpc.ts  # Check/download/install updates
│   └── services/
│       ├── DatabaseService.ts
│       ├── GitService.ts
│       ├── GithubService.ts
│       ├── AzureDevOpsService.ts
│       ├── ConnectionConfigService.ts
│       ├── AutoUpdateService.ts
│       ├── FileWatcherService.ts
│       ├── WorktreeService.ts
│       ├── WorktreePoolService.ts
│       ├── ptyManager.ts
│       ├── TerminalSnapshotService.ts
│       ├── HookServer.ts
│       ├── ActivityMonitor.ts
│       └── remoteControlService.ts
├── renderer/               # React UI
│   ├── App.tsx             # Root: state, keyboard shortcuts, layout
│   ├── keybindings.ts      # Keybinding system (defaults, load/save, matching)
│   ├── components/
│   │   ├── LeftSidebar.tsx  # Projects + nested tasks
│   │   ├── MainContent.tsx  # Terminal area + project overview
│   │   ├── ProjectOverview.tsx  # Project dashboard
│   │   ├── FileChangesPanel.tsx
│   │   ├── DiffViewer.tsx
│   │   ├── TaskModal.tsx
│   │   ├── SettingsModal.tsx
│   │   ├── ProjectSettingsModal.tsx
│   │   ├── DeleteProjectModal.tsx
│   │   ├── RemoteControlModal.tsx
│   │   ├── AdoSetupModal.tsx
│   │   ├── CommitGraph/    # DAG-style commit graph visualization
│   │   ├── TerminalPane.tsx
│   │   ├── TerminalDrawer.tsx
│   │   └── ShellDrawerWrapper.tsx
│   └── terminal/
│       ├── TerminalSessionManager.ts  # xterm.js lifecycle
│       ├── SessionRegistry.ts         # Session pool (preserves state on task switch)
│       └── FilePathLinkProvider.ts    # Clickable file paths → IDE
├── shared/
│   └── types.ts            # Shared types (Project, Task, GitStatus, etc.)
└── types/
    └── electron-api.d.ts   # window.electronAPI type declarations

Default keybindings

Shortcut Action
Cmd+N New task
Cmd+Shift+K Next task
Cmd+Shift+J Previous task
Cmd+Shift+A Stage all
Cmd+Shift+U Unstage all
Cmd+, Settings
Cmd+O Open folder
Cmd+`` `` Focus terminal
Esc Close overlay

All keybindings are customizable in Settings > Keybindings.

Tech stack

Shell Electron 30, electron-updater
UI React 18, TypeScript, Tailwind CSS 3
Build Vite 5, pnpm
Terminal xterm.js + node-pty
Database SQLite (better-sqlite3) + Drizzle ORM
Package electron-builder

Data storage

  • Database: ~/Library/Application Support/Dash/app.db (macOS)
  • Terminal snapshots: ~/Library/Application Support/Dash/terminal-snapshots/
  • Worktrees: {project}/../worktrees/{task-slug}/

Acknowledgements

Inspired by emdash.

License

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors