Run Claude Code, Codex, Gemini CLI, Hermes Agent, and OpenCode in your browser β zero setup, wired to your Databricks workspace.
π Claude Code β Anthropic's coding agent with 39 Databricks skills + 2 MCP servers
π£ Codex β OpenAI's coding agent, pre-configured for Databricks
π΅ Gemini CLI β Google's coding agent with shared skills
π‘ Hermes Agent β NousResearch's multi-provider AI CLI with tool-calling and skills
π’ OpenCode β Open-source agent with multi-provider support
Every agent installs at boot and connects to your Databricks AI Gateway β on first terminal session, paste a short-lived PAT and all CLIs are configured automatically. Token auto-rotates every 10 minutes.
This isn't just a terminal in the cloud. Running coding agents on Databricks gives you enterprise-grade infrastructure out of the box:
| Benefit | What you get | |
|---|---|---|
| π | Unity Catalog Integration | All data access governed by UC permissions β agents can only touch what your identity allows |
| π€ | AI Gateway | Route all LLM calls through a single control plane β swap models, set rate limits, and manage API keys centrally |
| π | Multi-AI & Multi-Agent | Switch between Claude, GPT, Gemini, and open-source models on the fly β change the model or agent without redeploying |
| π | Consumption Monitoring | Track token usage, cost, and latency per user and per model via the AI Gateway control center dashboard |
| π | MLflow Tracing | Every Claude Code session is automatically traced β review prompts, tool calls, and outputs in your MLflow experiment |
| 𧬠| Assess Traces with Genie | Point Genie at your MLflow traces to ask natural-language questions about agent behavior, cost patterns, and session quality |
| π | App Logs to Delta | Optionally route application logs to Delta tables for long-term retention, querying, and dashboarding |
| π¨ 8 Themes | Dracula, Nord, Solarized, Monokai, GitHub Dark, and more |
| βοΈ Split Panes | Run two sessions side by side with a draggable divider |
| π WebSocket I/O | Real-time terminal output over WebSocket β zero-latency, eliminates polling delay |
| π HTTP Polling Fallback | Automatic fallback via Web Worker when WebSocket is unavailable |
| π Parallel Setup | 7 agent setups run in parallel (~5x faster startup) |
| π Search | Find anything in your terminal history (Ctrl+Shift+F) |
| π€ Voice Input | Dictate commands with your mic (Option+V) |
| π Image Paste | Paste or drag-and-drop images into the terminal β saved to ~/uploads/, path inserted automatically |
| β¨οΈ Customizable | Fonts, font sizes, themes β all persisted across sessions |
| π Workspace Sync | Every git commit auto-syncs to /Workspace/Users/{you}/projects/ |
| βοΈ Micro Editor | Modern terminal editor, pre-installed |
| βοΈ Databricks CLI | Installed at boot, configured interactively on first session |
| π MLflow Tracing | Every Claude Code session is automatically traced to your Databricks MLflow experiment |
Every Claude Code session is automatically traced to a Databricks MLflow experiment β zero configuration required.
Claude Code session starts
β
βΌ
Environment vars set automatically:
MLFLOW_TRACKING_URI=databricks
MLFLOW_EXPERIMENT_NAME=/Users/{you}/{app-name}
β
βΌ
You work normally β code, debug, deploy
β
βΌ
Session ends β Stop hook fires
β
βΌ
Full session transcript logged as an MLflow trace
at /Users/{you}/{app-name} in your workspace
When a Claude Code session ends, the Stop hook automatically calls mlflow.claude_code.hooks.stop_hook_handler(), which captures the full session transcript β your prompts, agent actions, tool calls, and outputs β and logs it as an MLflow trace.
Traces are stored in a Databricks MLflow experiment at:
/Users/{your-email}/{app-name}
For example, if you're jane@company.com and your app is named coding-agents:
/Users/jane@company.com/coding-agents
View them in the Databricks UI: Workspace > Machine Learning > Experiments.
Tracing is configured during app startup by setup_mlflow.py, which merges the following into ~/.claude/settings.json:
| Setting | Value | Purpose |
|---|---|---|
MLFLOW_CLAUDE_TRACING_ENABLED |
true |
Enables Claude Code tracing |
MLFLOW_TRACKING_URI |
databricks |
Routes traces to Databricks backend |
MLFLOW_EXPERIMENT_NAME |
/Users/{owner}/{app} |
Target experiment path |
OTEL_EXPORTER_OTLP_ENDPOINT |
"" |
Overrides container OTEL to prevent trace loss |
| Stop hook | uv run python -c "from mlflow.claude_code.hooks import stop_hook_handler; stop_hook_handler()" |
Fires on session end |
Tracing is skipped gracefully if APP_OWNER is not set (e.g., local dev without Databricks).
- Click Use this template to create your own repo
- Go to Databricks β Apps β Create App
- Choose Custom App and connect your new repo
- Deploy
- Open the app β paste a short-lived PAT when prompted on first terminal session
That's it. No secrets to configure, no pre-deployment setup.
β Full deployment guide β environment variables, gateway config, and advanced options.
- Click Use this template to create your own repo
- Clone your new repo and run:
git clone https://github.com/<you>/<your-repo>.git
cd <your-repo>
uv run python app.pyOpen http://localhost:8000 β type claude, codex, gemini, or opencode to start coding.
On Jan 26, 2026, Andrej Karpathy made this viral tweet about the future of coding. Boris Cherny, the creator of Claude Code, responded:
This template repo opens that vision up for every Databricks user β no IDE setup, no local installs. Click "Use this template", deploy to Databricks Apps, and start coding with AI in your browser.
π§ All 39 Skills
Databricks Skills (25) β ai-dev-kit
| Category | Skills |
|---|---|
| AI & Agents | agent-bricks, genie, mlflow-eval, model-serving |
| Analytics | aibi-dashboards, unity-catalog, metric-views |
| Data Engineering | declarative-pipelines, jobs, structured-streaming, synthetic-data, zerobus-ingest |
| Development | asset-bundles, app-apx, app-python, python-sdk, config, spark-python-data-source |
| Storage | lakebase-autoscale, lakebase-provisioned, vector-search |
| Reference | docs, dbsql, pdf-generation |
| Meta | refresh-databricks-skills |
Superpowers Skills (14) β obra/superpowers
| Category | Skills |
|---|---|
| Build | brainstorming, writing-plans, executing-plans |
| Code | test-driven-dev, subagent-driven-dev |
| Debug | systematic-debugging, verification |
| Review | requesting-review, receiving-review |
| Ship | finishing-branch, git-worktrees |
| Meta | dispatching-agents, writing-skills, using-superpowers |
π 2 MCP Servers
| Server | What it does |
|---|---|
| DeepWiki | Ask questions about any GitHub repo β gets AI-powered answers from the codebase |
| Exa | Web search and code context retrieval for up-to-date information |
ποΈ Architecture
βββββββββββββββββββββββ WebSocket βββββββββββββββββββββββ
β Browser Client ββββββββββββββΊβ Gunicorn + Flask β
β (xterm.js) β (primary) β + Flask-SocketIO β
β βββββββββββββΊβ (PTY Manager) β
β β HTTP Poll β β
β β (fallback) β β
βββββββββββββββββββββββ βββββββββββββββββββββββ
β β
β on first load β on startup
βΌ βΌ
βββββββββββββββββββββββ βββββββββββββββββββββββ
β Setup Progress β β Background Setup β
β (inline UI) β β (11 steps, 5β6 β) β
βββββββββββββββββββββββ βββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Shell Process β
β (/bin/bash) β
βββββββββββββββββββββββ
How external MCP clients delegate coding tasks to CoDA's agent fleet:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Clients (upstream) β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β
β β Claude Code β β VS Code β β Genie Code β β Hermes β β
β β (CLI) β β (Copilot) β β (Databricks) β β (CLI) β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ βββββββ¬βββββββ β
β β β β β β
β β MCP JSON-RPC β MCP JSON-RPC β MCP JSON-RPC β β
β β over stdio β over stdio β over HTTP β β
βββββββββββΌβββββββββββββββββββΌββββββββββββββββββββΌβββββββββββββββββΌββββββββββ
β β β β
βΌ βΌ β β
βββββββββββββββββββββββββββββββββββ β β
β coda-bridge.py β β β
β (stdio β HTTP MCP proxy) β β β
β β β β
β β’ Reads JSON-RPC from stdin β β β
β β’ Injects OAuth token via β β β
β `databricks auth token` β β β
β β’ Forwards as HTTP POST β β β
β β’ Returns response to stdout β β β
ββββββββββββββββββ¬βββββββββββββββββ β β
β β β
β HTTP POST + Bearer token β β
β Mcp-Session-Id header β β
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CoDA MCP Server (Databricks App) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β MCP Tool Interface β β
β β β β
β β coda_run(prompt, ...) β Submit task, returns task_id β β
β β coda_inbox() β List tasks from last 24h β β
β β coda_get_result(task_id) β Get full output of completed task β β
β ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Hermes Agent (orchestrator) β β
β β β β
β β β’ Receives task from coda_run β β
β β β’ Runs autonomously in background β β
β β β’ Can delegate to sub-agents for complex work β β
β β β’ Has access to MCP servers (DeepWiki, Exa) β β
β β β’ Auth: short-lived PAT β Model Serving / AI Gateway β β
β ββββββββ¬βββββββββββββββββββββββ¬βββββββββββββββββββββββ¬βββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β Claude Code β β Codex / Gemini β β OpenCode / other β β
β β (sub-agent) β β (sub-agents) β β (sub-agents) β β
β ββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β β β β
β ββββββββββββββββββββββββΌβββββββββββββββββββββββ β
β βΌ β
β ββββββββββββββββββββββββββββ β
β β Databricks Workspace β β
β β β β
β β β’ Unity Catalog β β
β β β’ Model Serving β β
β β β’ Workspace files β β
β β β’ Jobs / Clusters β β
β ββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Flow: Client calls coda_run β coda-bridge.py injects OAuth and proxies over HTTP β CoDA MCP Server returns task_id immediately (fire-and-forget) β Hermes Agent runs the task autonomously, spawning sub-agents as needed β Client checks results later via coda_inbox / coda_get_result.
- Gunicorn starts, calls
initialize_app()viapost_worker_inithook - App serves the terminal UI with inline setup progress
- Background thread runs setup: 5 sequential steps (git config, micro editor, GitHub CLI, Databricks CLI upgrade, content-filter proxy), then 6 agent setups (Claude, Codex, OpenCode, Gemini, Databricks CLI config, MLflow) run in parallel via
ThreadPoolExecutor /api/setup-statusendpoint reports progress to the UI- Once complete, the terminal becomes interactive
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Terminal UI with inline setup progress |
/health |
GET | Health check with session count and setup status |
/api/setup-status |
GET | Setup progress for the UI |
/api/version |
GET | App version |
/api/session |
POST | Create new terminal session |
/api/input |
POST | Send input to terminal |
/api/output |
POST | Poll for terminal output (single session) |
/api/output-batch |
POST | Batch poll output for multiple sessions |
/api/heartbeat |
POST | Lightweight keepalive (no buffer drain) |
/api/resize |
POST | Resize terminal dimensions |
/api/upload |
POST | Upload file (clipboard image paste) |
/api/session/close |
POST | Close terminal session |
| Event | Direction | Description |
|---|---|---|
join_session |
Client β Server | Join session room for output delivery |
leave_session |
Client β Server | Leave session room |
terminal_input |
Client β Server | Send keystrokes to PTY |
terminal_resize |
Client β Server | Resize terminal |
heartbeat |
Client β Server | Keepalive for idle sessions |
terminal_output |
Server β Client | Push PTY output in real time |
session_exited |
Server β Client | Shell process exited |
session_closed |
Server β Client | Session terminated by server |
shutting_down |
Server β Client | Server restarting (SIGTERM) |
βοΈ Configuration
| Variable | Required | Description |
|---|---|---|
DATABRICKS_TOKEN |
No | Optional. If not set, the app prompts for a token on first session. Auto-rotated every 10 minutes |
HOME |
Yes | Set to /app/python/source_code in app.yaml |
ANTHROPIC_MODEL |
No | Claude model name (default: databricks-claude-opus-4-7) |
CODEX_MODEL |
No | Codex model name (default: databricks-gpt-5-5) |
GEMINI_MODEL |
No | Gemini model name (default: databricks-gemini-2-5-pro) |
DATABRICKS_GATEWAY_HOST |
No | AI Gateway URL override. Auto-discovered from DATABRICKS_WORKSPACE_ID if unset |
Single-user app β the owner is resolved via the app's service principal and Apps API (app.creator), with no PAT required at deploy time. Authorization checks X-Forwarded-Email against app.creator. On first terminal session, the user pastes a short-lived PAT interactively. Tokens auto-rotate every 10 minutes (15-minute lifetime), with old tokens proactively revoked. On restart, the user re-pastes (no persistence by design).
Production uses workers=1 (PTY state is process-local), threads=16 (concurrent polling + WebSocket), gthread worker class, timeout=60 (long-lived WebSocket connections).
π Project Structure
coding-agents-databricks-apps/
βββ app.py # Flask backend + PTY management + setup orchestration
βββ app_state.py # Shared app state (setup progress, session registry)
βββ app.yaml.template # Databricks Apps deployment config template
βββ cli_auth.py # Interactive PAT setup + CLI credential writer
βββ content_filter_proxy.py # Proxy that sanitises empty-content blocks for OpenCode
βββ gunicorn.conf.py # Gunicorn production server config
βββ pat_rotator.py # Background PAT auto-rotation (10-min cycle)
βββ pyproject.toml # Package metadata + uv config (supply-chain guardrails)
βββ requirements.txt # Compiled from pyproject.toml (Dependabot compatibility)
βββ requirements.lock # Hash-pinned lockfile (auto-regenerated by CI)
βββ Makefile # Deploy, redeploy, status, and cleanup targets
βββ setup_claude.py # Claude Code CLI + MCP configuration
βββ setup_codex.py # Codex CLI configuration
βββ setup_gemini.py # Gemini CLI configuration
βββ setup_opencode.py # OpenCode configuration
βββ setup_databricks.py # Databricks CLI configuration
βββ setup_mlflow.py # MLflow tracing auto-configuration
βββ setup_proxy.py # Content-filter proxy startup
βββ sync_to_workspace.py # Post-commit hook: sync to Workspace
βββ install_micro.sh # Micro editor installer
βββ install_gh.sh # GitHub CLI installer (OS/arch-aware)
βββ install_databricks_cli.sh # Databricks CLI upgrade script
βββ utils.py # Utility functions (ensure_https)
βββ static/
β βββ index.html # Terminal UI (xterm.js + split panes + WebSocket)
β βββ favicon.svg # App favicon
β βββ poll-worker.js # Web Worker for HTTP polling fallback
β βββ lib/
β βββ xterm.js # xterm.js terminal emulator
β βββ socket.io.min.js # Vendored Socket.IO client
βββ .claude/
β βββ skills/ # 39 pre-installed skills
βββ .github/
β βββ workflows/
β βββ dependency-audit.yml # Weekly CVE audit + lockfile drift check
β βββ update-lockfile.yml # Auto-regenerate requirements.lock on push
βββ docs/
βββ deployment.md # Full Databricks Apps deployment guide
βββ prd/ # Product requirement documents
βββ plans/ # Design documentation
Flask Β· Flask-SocketIO Β· Socket.IO Β· Gunicorn Β· xterm.js Β· Python PTY Β· uv Β· Databricks SDK Β· Databricks AI Gateway Β· MLflow

