Manage coding agents inside cloud development environments connected to your repositories
Fully open source under the MIT License.
Instead of editing code locally or inside restricted LLM sandboxes, Eva provisions full development environments where agents can:
• run shell commands • install dependencies • execute tests • build and preview apps • open pull requests
GitHub Repository
↓
Eva
↓
Cloud Sandbox (Daytona)
↓
AI Agent (Claude)
↓
Code Changes → Diff → Pull Request → Preview
- Connect your GitHub repository
- Build a sandbox snapshot with your dependencies
- Run a task (e.g. “fix failing tests”)
- Review the diff and open a pull request
Describe a bug or change and Eva spins up an isolated sandbox to execute it. Tasks run independently so you can launch multiple in parallel.
Persistent cloud development environments with live previews where you and the agent collaborate in real time.
Structured workflows for larger changes. Agents can plan, implement, and verify features across your codebase.
Store PRDs, specs, and context that the agent references during tasks. Keep your requirements close to the work.
Run your test suite in sandboxes automatically. Validate changes before they land without tying up local resources.
Access your connected databases (Convex, Supabase) directly from Claude. Query, inspect, and debug your data without leaving your AI workflow.
- Frontend: Vite, TanStack Router, React, Tailwind CSS
- Backend: Convex
- Sandboxes: Daytona SDK
- Auth: Clerk
| App | Description |
|---|---|
apps/web |
Main dashboard for managing repos, tasks, and sessions |
apps/desktop |
Electron desktop client with local session persistence |
apps/mcp |
MCP server for Claude to query connected Convex databases |
apps/chrome-extension |
Browser extension for quick task execution |
apps/teams-bot |
Microsoft Teams integration |
apps/mobile |
React Native mobile client |
Eva is self-hosted - there is no managed cloud version. You create your own Convex deployment, set up your own Clerk project, and run the app yourself. This gives you full control over your data and infrastructure.
- Node.js 20+
- pnpm
- Convex account
- Clerk account
- Daytona account
- GitHub account (for GitHub App)
git clone https://github.com/your-org/conductor.git
cd conductor
pnpm installnpx convex devFollow the prompts to create or link a Convex project. Note your deployment URL (e.g. https://your-deployment.convex.cloud).
- Create a Clerk application at clerk.com
- Note your Publishable Key (starts with
pk_) - Note your JWT Issuer Domain from Clerk Dashboard → JWT Templates (e.g.
https://your-app.clerk.accounts.dev)
-
Go to GitHub Settings → Developer settings → GitHub Apps → New GitHub App
-
Configure:
- Name:
Eva (your-org) - Homepage URL: your Eva instance URL
- Webhook URL:
https://your-deployment.convex.site/api/github/webhook - Webhook secret: generate a random string (save for
GITHUB_WEBHOOK_SECRET)
- Name:
-
Repository permissions:
- Contents: Read & write
- Pull requests: Read & write
- Issues: Read & write
- Metadata: Read-only
-
Subscribe to events: Push, Pull request, Installation
-
Click Create GitHub App
-
After creation, note:
- App ID →
GITHUB_APP_ID - Client ID →
GITHUB_CLIENT_ID - App slug (from the public URL
github.com/apps/<slug>) →GITHUB_APP_SLUG
- App ID →
-
Generate:
- Client secret →
GITHUB_CLIENT_SECRET - Private key (.pem file) →
GITHUB_PRIVATE_KEY
- Client secret →
-
Install the app on your account/org
-
Look up the App's bot user ID — this is used as the git commit author email so commits are attributed to the bot on GitHub (App IDs and bot user IDs live in different namespaces):
curl -s https://api.github.com/users/<slug>\[bot\] | jq .id # → Use for GITHUB_BOT_USER_ID
# Generate 32-byte encryption key (hex)
openssl rand -hex 32
# → Use for ENCRYPTION_KEY
# Generate deploy key
openssl rand -hex 32
# → Use for EVA_DEPLOY_KEY
# Generate ES256 key pair for sandbox JWT
openssl ecparam -genkey -name prime256v1 -noout -out private.pem
openssl ec -in private.pem -pubout -out public.pem
# Convert to JWK format (use online tool or jose CLI)
# → SANDBOX_JWT_PRIVATE_KEY (full JWK with "d" parameter)
# → SANDBOX_JWT_JWKS (JWKS with public key only)VITE_CONVEX_URL=https://your-deployment.convex.cloud
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...Required:
| Variable | Value |
|---|---|
CLERK_JWT_ISSUER_DOMAIN |
https://your-app.clerk.accounts.dev |
ENCRYPTION_KEY |
64-char hex string from Step 5 |
EVA_DEPLOY_KEY |
64-char hex string from Step 5 |
GITHUB_APP_ID |
App ID from GitHub App |
GITHUB_APP_SLUG |
App slug from github.com/apps/<slug> |
GITHUB_BOT_USER_ID |
Numeric bot user ID (from Step 4 lookup) |
GITHUB_CLIENT_ID |
Client ID from GitHub App |
GITHUB_CLIENT_SECRET |
Client secret from GitHub App |
GITHUB_PRIVATE_KEY |
Full contents of .pem file |
GITHUB_WEBHOOK_SECRET |
Random string from Step 4 |
Optional:
| Variable | Purpose |
|---|---|
SANDBOX_JWT_PRIVATE_KEY |
ES256 JWK for sandbox auth (JSON) |
SANDBOX_JWT_JWKS |
Public JWKS for sandbox auth (JSON) |
MCP_BOOTSTRAP_SECRET |
Secret for MCP bootstrap API |
MCP_JWT_SECRET |
Secret for MCP JWT signing |
CLERK_SECRET_KEY |
Clerk secret key (for MCP server) |
CLERK_PUBLISHABLE_KEY |
Clerk publishable key (for MCP server) |
The Daytona API key is stored as a team or repo env var in the dashboard (not as a Convex deployment env var).
- Get your API key from Daytona
- In Eva dashboard, go to Team Settings → Environment Variables
- Add
DAYTONA_API_KEYwith your key
# Terminal 1: Convex dev server
npx convex dev
# Terminal 2: Web app
pnpm devOpen http://localhost:5173
Eva supports Convex and Supabase MCP connections. To add these, add your Convex URL and Supabase URL to the repo or team environment variables in the dashboard.
Eva runs agents inside Daytona sandboxes that boot from pre-built snapshots. Snapshots include the OS, dependencies, tooling, and your repo code so sandboxes start fast.
The repo includes a GitHub Actions workflow (.github/workflows/rebuild-snapshot.yml) that:
- Generates a Dockerfile with all required system dependencies (Node.js, Chrome, ripgrep, Claude Code, agent-browser, etc.)
- Copies your repo into the image and runs
pnpm install - Pushes the built image to Daytona as a named snapshot
- Go to your repo's Actions tab on GitHub
- Select Rebuild Daytona Snapshot from the workflow list
- Click Run workflow
- Enter a snapshot name (this is the name you'll reference in Eva when configuring a repo)
- The workflow requires
DAYTONA_API_KEYto be set as a GitHub Actions secret
Edit .github/workflows/rebuild-snapshot.yml to customize what gets installed. The default snapshot includes:
- Node.js 20, pnpm, git, curl, jq, ripgrep, fd, gh CLI
- Chrome + Xvfb + VNC (for browser automation and previews)
- Claude Code, agent-browser, Convex CLI
- code-server (VS Code in the browser)
If your project needs additional system packages, language runtimes, or global tools, add them to the Dockerfile generation step in the workflow.
Rebuild your snapshot when:
- Dependencies change significantly (new major packages)
- You update the base tooling (Node.js version, system packages)
- You want sandboxes to start with a fresher copy of the codebase
Your codebase needs the agent-browser skill installed for screenshots or video walkthroughs to be captured.
You may face authentication issues in the preview URL if your auth provider blocks frame ancestors (e.g. AuthKit does this for security). Options:
- Open in a new tab — simplest fix.
- Add the Daytona domain to your auth provider's allowlist and callback URLs, then use the preview URL directly.
- Implement backend auth — if you want the iframe to work, implement a separate login page that doesn't make network requests to your auth provider (e.g. AuthKit), so it renders inside the iframe. Add instructions to your
CLAUDE.mdso the agent knows how to use this flow withagent-browser.
This restriction is not unique to Eva — it's a standard iframe security limitation.
- Codex agent support
- Testing arena for running and comparing agent strategies
- Improved project interview UI/UX