🇬🇧 English · 🇩🇪 Deutsch
An agentic coding assistant as a desktop app — it doesn't just suggest code, it acts: reads, writes and refactors files across a whole project, runs commands and tests, automates work on a visual canvas, and can run autonomous, verify-gated missions. Built from scratch with Electron, React and TypeScript; runs against DeepSeek, local models (Ollama / LM Studio) and other OpenAI-compatible endpoints — fully local and privacy-friendly.
License: MIT Electron React TypeScript Tests CI
A quick tour: visual workflow builder · Mission Control · Swarm · Time Machine · run traces · cost dashboard · MCP marketplace.
A solo-built, end-to-end product that goes well beyond a chat wrapper — the hard parts are the agent runtime and the safety model:
- A real streaming tool-calling agent loop — multi-round quality passes, per-turn token/cost budgets, context compaction, and an approval gate with three modes (Interactive / Plan / Auto).
- Verify-gated autonomy — "Mission Control" runs a goal as a dependency DAG and marks a task done only when its verify command goes green, never on the model's say-so. Bounded re-planning instead of infinite loops.
- Parallelism that can't corrupt your repo — "Swarm" runs N agents at once, each in its own isolated git worktree + branch, with a hard cost cap and guaranteed teardown.
- A layered security model — working-directory confinement (symlink-resolved), an SSRF-hardened web fetch (DNS-pin + IPv6 bypass blocking), an "unattended" gate that blocks high-blast-radius tools when no human is present, OS-encrypted secret storage, and abort-/timeout-bounded MCP calls.
- Engineered, not hacked — 394 unit/integration tests (incl. real-git suites for the flagship orchestration), ESLint, and a CI pipeline that also builds the app and drives every view through a Playwright UI smoke test.
No secrets in this repo. API keys are entered in the app's Settings and stored OS-encrypted under
~/.deepcode— never in source, never in.env. This public copy ships no keys, databases or logs.
| Area | What it does |
|---|---|
| 🧠 Agent loop | read_file / write_file / edit_file / apply_patch, shell, git, web-fetch, sub-agents, a visible to-do list, streaming + live cost. |
| 🕸️ Visual workflow builder | n8n-style canvas, 20 node types (Agent, Tool, Shell, HTTP, Condition, Loop, Email...), cron + file-watch triggers, self-healing, "generate from a description", run-from-chat. |
| 🎯 Mission Control | Set a goal → autonomous, verify-gated execution of a plan tree, with an overnight/off-peak operator. |
| 🐝 Swarm | Parallel agents in isolated git worktrees + branches; cost-capped; review & merge the resulting branches. |
| ⏳ Time Machine | Scrub past turns on a timeline and branch a new line from any point (causal replay, not blind undo). |
| 🔬 Run traces | Every turn as a correlated cost/latency tree + waterfall; per-call tokens and ok/error. |
| 🛒 Marketplace | Curated 31-connector MCP catalog, searchable, one-click activate; plus install plugins/skills from a git repo. |
| 🧩 Extensible | File-based Skills, Sub-agents, Hooks, Plugins, Slash commands, semantic project-scoped Memory, scheduled Automations. |
| Visual workflow builder | Mission Control |
|---|---|
| Workflow builder | Mission Control |
| MCP marketplace | Run traces (observability) |
| Marketplace | Run traces |
src/
shared/ types + IPC channel names (used by all processes)
main/ Electron main process
agent/ model client, the agentic engine, prompt builder, tools/
systems/ skills, commands, subagents, hooks, memory, mcp, plugins, automations
missions/ mission overseer + planner timemachine/ timeline + fork + reconstruct
workflows/ node executor, triggers, self-heal
preload/ contextBridge API (window.deepcode)
renderer/ React UI (chat, streaming, tool approvals, all panels)
test/ vitest unit + real-git/store integration suites + renderer (jsdom) tests
Three-process Electron app: a typed IPC bridge connects a React renderer to a main-process engine that owns the model client, the tool runtime and all file/shell access. Every capability (skills, MCP, hooks, workflows...) is file-based and editable under ~/.deepcode.
Electron · React 18 · TypeScript · Vite (electron-vite) · React Flow · markdown-it + highlight.js · Model Context Protocol (MCP) · Vitest · ESLint · Playwright · GitHub Actions.
- 394 tests (vitest): pure logic, real-git/store integration (swarm worktrees, Time Machine, mission overseer), and renderer components under jsdom + Testing Library.
- CI runs lint → typecheck → test, and a second job builds the app and runs the Playwright UI smoke test so a build break, a console error, or a broken view fails CI — not just unit regressions.
npm run lint && npm run typecheck && npm test # what CI gates on npm run smoke # build + drive every view (Playwright)
npm install npm run dev # development with hot reload # or npm run build && npm run start # run the production build npm run package:win # build a Windows installer (NSIS) into ./release
On first launch, open Settings and paste your DeepSeek API key + model (or point it at a local Ollama / LM Studio model with the local: prefix — free and offline). Keys are stored OS-encrypted; they never touch this repo.
Windows users:
START_DEEPCODE.batis a one-click launcher (it builds, then starts).
Personal project, actively developed. The model id and base URL are configurable, so any OpenAI-compatible "v4 PRO" / local / DeepInfra endpoint plugs in without code changes. UI strings are currently German.
- v0.2.94 — Large files no longer fail in a loop. A big file used to be emitted as one
write_filewhose content was truncated at the model's output-token limit, producing an "Invalid JSON arguments" loop. The agent now (a) gets a clear "you were cut off — write in smaller chunks" message instead of a generic error with the payload echoed back, (b) can build a file incrementally viawrite_filemode:"append", and (c) is told upfront never to emit a huge file in one call. Also strips gpt-oss "harmony" control tokens that corrupted tool names/arguments, recovers tool calls that vision models dump into the text, and labels the Qwen3-VL entry "(Vision)" so it isn't picked as a coder. - v0.2.93 — Truncated answers auto-continue + DeepSeek thinking-mode tool loops. A reply cut off at the max-tokens limit now resumes itself (capped) instead of stopping mid-sentence. And the first-party DeepSeek route now replays its reasoning on tool-call turns (required by V3.2/V4 thinking-mode), tightly gated so every other provider is unchanged.
- v0.2.92 — No more hanging on the preview step. The agent is now told to use DeepCode's built-in live preview instead of driving an external browser to open a generated file (which could block indefinitely on a local
file://URL). - v0.2.91 — Robust chat-switching during a turn. Switching into a chat whose turn was already running no longer loses the streamed reply (it now appears live and on completion instead of only after a reload). Backend session isolation was already safe — no data was ever corrupted. Also removed the deprecated Grok 4.1 model.
- v0.2.90 — No more silent aborts. When a gateway (e.g. OpenRouter) reports a provider error mid-stream, the turn now shows a clear error instead of ending with a blank bubble and no reason. Also surfaces content-filter stops and empty completions.
- v0.2.89 — Off-peak banner only for DeepSeek. The off-peak discount indicator now shows only for the first-party DeepSeek route — it no longer appears for DeepInfra / OpenRouter / MiMo models, which don't get that discount. (Cost was already calculated correctly; this fixes the misleading banner.)
- v0.2.88 — Clear the current chat. A 🧹 button empties the open chat's messages and tasks while keeping the session (title / model / working dir), behind a confirm. Refused mid-turn so it can't race a running turn.
- v0.2.87 — Tidy model picker. The model dropdown now shows curated, ordered display names (e.g. "DI GLM 5.2", "OR Grok 4.3", "Lokal Qwen 2.5 uncensored") instead of raw slugs, disambiguating the same model across providers. Display-only — the stored model id is unchanged.
- v0.2.86 — Clearer transcript. The automatic self-review / verify / compaction messages the agent generates are now shown as muted, labelled automatic notes instead of looking like the user's own message (still sent to the model). Added a timestamp under every message, and fixed a false "model may be hung" warning while tool-heavy models stream their tool-call arguments.
- v0.2.85 — Flagship models via OpenRouter. Added Grok 4.3, MiniMax M3 and Kimi K2.7 Code as ready-picks — each verified against the live OpenRouter API (exact slug, context window, price, native tool-calling).
- v0.2.84 — OpenRouter cost accuracy + model lineup. Per-model fallback rates for every OpenRouter pick so a turn never shows a wrong 0ドル when the provider's live cost is absent, and
:freeroutes are honored as truly free. Added Gemini 2.5 Flash-Lite as a ready-pick; routed MiMo exclusively through the cheaper OpenRouter path. - v0.2.83 — OpenRouter provider. A new
openrouter:prefix routes to OpenRouter (one key, hundreds of models). Cost is taken from OpenRouter's own reported figure so it matches the real bill. Ships ready-to-pick value models — incl. the same MiMo far cheaper via OpenRouter, plus tool-calling picks like GLM-4.7-Flash, DeepSeek-V4-Flash, Qwen3-Coder-Flash, Grok-4.1-Fast, gpt-oss-20b and the free gpt-oss-120b. Keys stay in OS-encrypted settings, never in source. - v0.2.82 — Accurate cost tracking. Per-turn cost now trusts the provider's own reported cost (DeepInfra's
estimated_cost) so the figure matches the real invoice, with a researched per-model rate table (incl. cached-input) as fallback — replacing a single flat guess that billed every DeepInfra model the same. Also reads OpenAI-style cached-token counts, prices gateway routes by their underlying model, and stops billing unknown models at the wrong rates. - v0.2.81 — Hang-proof streaming + a live step view. The model stream now has connect + idle timeouts, so a provider that stalls (local model loading, a stuck reasoner, a gateway under load) aborts with a clear message instead of hanging forever. A new Claude-Code/Codex-style activity feed shows the current step, tool and elapsed time, plus a "time since last activity" heartbeat that flips to a stall warning — so working and hung finally look different.
- v0.2.80 — Rename chats from the sidebar. A visible pencil button (next to delete) makes the existing double-click / F2 inline rename discoverable; a manually set title is now protected from the first-message auto-titling.
- v0.2.79 — Steer the running turn. A message you send while the agent is working is now injected into the current turn at its next step — the agent course-corrects immediately instead of queuing your input until the turn ends.
- v0.2.78 — Two more DeepInfra ready-picks: Qwen3-Coder-480B (agentic coding) and Kimi K2.6 (agentic, native function-calling).
- v0.2.77 — Xiaomi MiMo now routes through DeepInfra by default (
deepinfra:XiaomiMiMo/MiMo-V2.5-Pro) — one key for it; Xiaomi's free token-plan route stays available. - v0.2.76 — The agent now narrates its work — a short preamble before each action and a takeaway after, like Claude Code / Codex.
- v0.2.72–0.2.75 — New model providers & ready-to-pick models: Xiaomi MiMo (
mimo:) and the Kilo Code gateway (kilo:), plus GLM-5.2 and Gemma 4 31B (DeepInfra) and JetBrains Mellum 2 (local). - v0.2.68 — Every MCP call is abort- + timeout-bounded — a hung connector can no longer freeze a turn (Stop interrupts instantly).
- v0.2.64–0.2.67 — CI hardened (build + Playwright UI-smoke + ESLint); the engine approval-gate and the DeepSeek client extracted and unit-tested.
- v0.2.60–0.2.63 — Multi-session tabs (horizontal scroll + drag-reorder), an expandable per-span diff in the Traces panel, a Time Machine state-reconstruction test, and a renderer test foundation (jsdom + Testing Library).
Newest first · updated on each release.
MIT © Maurice