emdash is a UI layer for running multiple coding agents in parallel — currently supporting OpenAI Codex CLI, Claude Code CLI, and Droid (Factory CLI). Each agent runs in its own Git worktree so you can fan out tasks, keep changes compartmentalized, and manage everything from a single UI.
- Download for macOS (Apple Silicon): https://github.com/generalaction/emdash/releases/download/v0.2.3/emdash-arm64.dmg
- Download for macOS (Intel x64): https://github.com/generalaction/emdash/releases/download/v0.2.3/emdash-x64.dmg
Either download the DMG from Releases (or click the link above), or run the app locally — see Requirements and Getting Started below.
- Node.js 22.12.0+ and Git
- One or more providers (install as needed):
- OpenAI Codex CLI (install + authenticate)
- Optional: Claude Code CLI (install + authenticate)
- Optional: GitHub CLI for PRs, badges, and repo info
Install the Codex CLI and authenticate it:
npm install -g @openai/codex
# or
brew install codex
# authenticate
codex
Install the Claude Code CLI and authenticate it:
npm install -g @anthropic-ai/claude-code
# start and login
claude
# then use /login inside the CLI
Install and authenticate GitHub CLI for GitHub features:
Install GitHub CLI:
- macOS:
brew install gh
- Linux:
sudo apt install gh
(Ubuntu/Debian) orsudo dnf install gh
(Fedora) - Windows:
winget install GitHub.cli
Authenticate:
gh auth login
- Ensure Node.js 18+ and Git are installed
- Install and authenticate at least one provider (Codex or Claude Code)
- (Optional) Install and authenticate GitHub CLI
- Clone this repository
- Install dependencies:
npm install
- Run the app:
npm run dev
In the chat input, use the provider selector to switch between Codex and Claude Code. Once a chat has started with Codex or Claude, the provider is locked for that chat.
emdash in action
- Creating a CONTRIBUTIONS.md file for an open source repository
Running multiple Codex agents in parallel
- Monitor and review the work of several agents within emdash
Open a Pull Request from the dashboard
- Review diffs, set title/description, choose target branch, and publish to GitHub — all from emdash
emdash uses SQLite for local data persistence, ensuring your projects and workspaces are maintained across application sessions. All data is stored locally on your machine, providing privacy and offline functionality.
The application maintains two primary data structures:
Stores information about opened Git repositories and their GitHub integration status:
CREATE TABLE projects (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
path TEXT NOT NULL UNIQUE,
git_remote TEXT,
git_branch TEXT,
github_repository TEXT,
github_connected BOOLEAN DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Key Features:
- Unique Path Constraint: Prevents duplicate project entries
- Git Integration: Tracks remote URLs and current branches
- GitHub Status: Monitors connection state with GitHub CLI
- Automatic Timestamps: Tracks creation and modification times
Manages isolated agent workspaces with their associated Git worktrees:
CREATE TABLE workspaces (
id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
name TEXT NOT NULL,
branch TEXT NOT NULL,
path TEXT NOT NULL,
status TEXT DEFAULT 'idle',
agent_id TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
);
Key Features:
- Cascade Deletion: Removing a project automatically cleans up associated workspaces
- Status Tracking: Monitors workspace state (idle, running, completed)
- Agent Assignment: Links workspaces to specific agent instances
- Branch Management: Tracks Git branch names for each workspace
The SQLite database is automatically created in your system's application data directory:
- macOS:
~/Library/Application Support/emdash/emdash.db
- Windows:
%APPDATA%/emdash/emdash.db
- Linux:
~/.config/emdash/emdash.db
The application provides a comprehensive set of database operations through the DatabaseService
:
- Project Management: Save, retrieve, and delete project entries
- Workspace Management: Create, update, and remove workspace records
- Automatic Initialization: Database and tables are created on first launch
- Error Handling: Robust error handling with detailed logging
The application stores conversation history locally, which may consume disk space over time:
If you want to reset or reclaim space, you can delete the app's local database. This removes saved conversations and resets projects/workspaces. The database is recreated automatically on next launch.
Important
- Quit the app before deleting the DB to avoid file‑in‑use errors.
- Paths with spaces need quotes (e.g.
"Application Support"
).
Default locations (packaged app)
- macOS:
~/Library/Application Support/emdash/emdash.db
- Windows:
%APPDATA%/emdash/emdash.db
- Linux:
~/.config/emdash/emdash.db
Development builds (Electron default)
- macOS:
~/Library/Application Support/Electron/emdash.db
Note: legacy filenames we migrate from (safe to remove if present): database.sqlite
, orcbench.db
.
Quick commands (macOS)
# Quit the app first
# Packaged path (if you ran a built app)
rm -f "$HOME/Library/Application Support/emdash/emdash.db" \
"$HOME/Library/Application Support/emdash/emdash.db-wal" \
"$HOME/Library/Application Support/emdash/emdash.db-shm"
# Dev path (vite/electron dev)
rm -f "$HOME/Library/Application Support/Electron/emdash.db" \
"$HOME/Library/Application Support/Electron/emdash.db-wal" \
"$HOME/Library/Application Support/Electron/emdash.db-shm"
# Optional: remove legacy DB filenames if they exist
rm -f "$HOME/Library/Application Support/emdash/database.sqlite" \
"$HOME/Library/Application Support/emdash/orcbench.db"
rm -f "$HOME/Library/Application Support/Electron/database.sqlite" \
"$HOME/Library/Application Support/Electron/orcbench.db"
# One-liner to locate any emdash.db under your home folder (preview only)
find "$HOME" -type f -name 'emdash.db*' -print
- Additional providers (e.g., Gemini CLI, aider, Warp)
- Workspace lifecycle hooks to run custom scripts on create, run, and archive (e.g., install deps, copy env files, clean up resources)
- Planning chat with controlled execution (draft actions in a separate chat, then run them one by one)
- Linear integration to track and close out issues
- Privacy
- All data is local. The app does not send your code or chats to us.
- Using Codex CLI or GitHub CLI transmits data to those providers per their policies.