- Shared event-id dedupe
- 429 retry halt
- Doubled first-retry delay
Agentic coding. Your machine. Your model. Your review.
Undisclosed is an AI coding editor for developers who want the agent to do real work without handing over the machine or the last word. Run a local model and nothing leaves it. Bring any provider's key and switch per task. Every edit lands as a diff you approve, with the test run attached.
Apache-2.0 · macOS · Windows · Linux · no account · no Undisclosed server in the loop
The agent is everywhere now. The difference is what you own.
A year ago this was a shape question: an extension, a terminal tool, or a closed editor. Cline now ships a CLI and a desktop app, and OpenCode has a desktop beta. The split that still matters is whether the editor is open, whether the model can run on your machine, and whether a change reaches you as a diff you approve.
Checked 20 October 2026 against each project's own README. This category moves fast: if a row is out of date, open an issue and we will correct it.
Thirty seconds: the ask, the plan, the fix, thirteen passing tests.
Three bugs are open in a webhook delivery worker. The agent reads the tests and the three modules, names each bug, fixes them in place, then runs pytest. All thirteen pass. This is the dispatchkit work sample: three files, thirteen tests, three interacting bugs. This run uses DeepSeek through a BYOK key, so the prompt and the files the agent read went to DeepSeek; the editor and the brain stayed on the machine.
It shows its work while it works.
The diff card and the test receipt from that run, plus the three bugs the agent named before it touched code. The cards are read from the run's tool activity, not from the model's write-up of it.
- Mdispatch/backoff.py+1 -1
- Mdispatch/store.py+2 -2
- Mdispatch/worker.py+2 -3
- return min(MAX_DELAY_SECONDS, base * (2**attempt))
+ return min(MAX_DELAY_SECONDS, base * (2 ** (attempt - 1)))
- except RateLimited:
- raise
- except Transient:
+ except (RateLimited, Transient):
The names come from the workspace's test collection; the verdict comes from the run itself.
The same checks run on every change: typecheck and lint, a deterministic diff review, then tests with the coverage gaps named. The scorecard is tests passed, diff match, interventions and corrections, not tool count. How a change is verified.
Developers who want the agent, not the lock-in.
If an agent is going to touch real files, you should be able to say where it runs, which model does the thinking, and what it changed. Undisclosed is organized around those three answers.
Local control
The editor, the brain, the history and the model can all stay on your machine. No account, no Undisclosed server in the loop, and nothing to sign into before the first edit.
Reviewable changes
Ask is the default. Edits arrive as diffs you approve, risky calls are named before they run, and every test run comes back as a receipt instead of a claim.
Model choice
Run Ollama, LM Studio, vLLM or llama.cpp locally. Add OpenAI, Anthropic, Gemini, DeepSeek, Mistral or OpenRouter by key. Switch per task, not per reinstall.
A coding editor first. The agent is part of it.
Undisclosed is Eclipse Theia with an agent docked into the editor, not a chat window parked next to one. Same terminal, same git, same keys.
How the two processes fit together →The editor
Theia 1.76 with Monaco, terminal, git, debugging and search. Import your VS Code settings, themes and Open VSX extensions, with a list of what could not come over.
The agent
A dock widget, not a separate app. Toggle it with Cmd/Ctrl+Shift+A. It plans first, asks when a step needs your call, and leaves the diff and the test receipt in the panel.
The models
Ollama, LM Studio or Hugging Face on your hardware. Local coding is still behind cloud on long, multi-file work: use the largest coding model your machine holds (14B and up if it fits) and expect to review more. Or your own key for DeepSeek, Anthropic, Gemini, Mistral and anything OpenAI-compatible. Pick per task.
The hands
Terminal, file read and write, git, search, debugging, browser, screenshots and web search, exposed only when a turn needs them. GitHub issues and pull requests when you add a token.
The skills
Twenty example skills ship with the app and six start enabled: frontend and design work, skill authoring, a security review. Each is a folder you can read. Any other skill installs from a URL you paste into the chat, landing in ~/.undisclosed/skills.
The memory
Facts carry between conversations and live on disk in ~/.undisclosed/memory. It is on by default; the Memory panel has a switch that stops new facts and a Clear button that removes what is stored.
Privacy you can check, not just a tagline.
Two processes, both yours: the editor and the brain on localhost. No Undisclosed server sits in between. Three questions cover most of it: what leaves the machine, what stays on disk, and what can run without asking. The full host-by-host ledger is linked below.
01 / NetworkDoes my code go to a cloud provider?
Only if you choose a cloud model. A local model keeps the loop offline. With your own key, the prompt and the context the agent assembled go to that provider, and nowhere else. GitHub, search, browser and other hands only call out when you connect them.
02 / DiskWhat is stored?
Conversations in ~/.undisclosed/turns, memory in ~/.undisclosed/memory, brain logs in ~/.undisclosed/logs. Full debug dumps exist only when you set UNDISCLOSED_DEBUG=1. The Memory panel has an on/off switch and Clear.
03 / ShellCan it run a destructive command?
No. Commands that can wipe data or take over the host (rm, sudo, dd, mkfs, shutdown) are refused before they run, in every mode, and approval cannot override the block. This is static analysis of the command line, not a sandbox: a deletion whose target cannot be resolved waits for approval. Git pushes and GitHub writes prompt in every mode.
The whole thing is in one repo.
Apache-2.0: the editor shell, the agent panel, the brain, the packaging. You can read the code that reads your code. Issues are how the roadmap gets set, so file one even if it is just a rough edge.
Straight answers
Do I need an API key?
No. Run a model locally through Ollama, LM Studio or Hugging Face and the agent works without a key. Cloud models are optional: add a key in Models and pick the model per task.
Is my code sent anywhere?
With a local model, no. With a cloud model, the prompt and the context the agent sends go to that provider. There is no Undisclosed server in between, and no account to attach it to.
Am I locked into one model vendor?
No. Run a model locally through Ollama, LM Studio or Hugging Face, or add a key for OpenAI, Anthropic, Gemini, DeepSeek, Mistral, OpenRouter or any OpenAI-compatible endpoint. The model is picked per task in the composer; changing it does not reinstall anything. There is no Undisclosed account or plan tying you to a provider.
How do I audit what leaves the machine?
The privacy section lists every outbound connection and the trigger that opens it. The same table, with the model-provider hosts, is in docs/NETWORK.md. To watch a run, use lsof or ss as shown there. The strongest check is a local model with the app blocked at the firewall: the editor, the brain and the agent loop keep working.
Do you test the dangerous-call blocking?
Yes. The command classifier has a parametrized matrix plus an adversarial suite in brain/tests/app/agent/toolkit/test_dangerous_tool_calls.py: path-qualified binaries, env/command/xargs/nohup wrappers, bundled shell flags like bash -lc, and writes whose target resolves outside the workspace. Run cd brain && .venv/bin/python -m pytest tests/app/agent/toolkit/test_dangerous_tool_calls.py.
Can the agent run commands without asking?
Not by default. Ask is the default mode: terminal commands that change files, file edits and deletions, and git add/commit wait for an approval in the panel that names the call and its arguments. A denial, or no answer within five minutes, returns a refusal to the agent instead of running it. git push, git reset, git clean and GitHub writes prompt in both modes. Auto is opt-in and lets ordinary workspace edits run without asking.
Can it delete files in my project?
Yes, when the task needs it, such as replacing a component or removing a file you named. Deletions use an explicit path list and stay inside the workspace: the tool refuses the workspace root, .git, .. escapes and symlinks that point outside. rm, find -delete and xargs rm are blocked in every mode. A script that deletes a variable or glob target waits for approval in every mode because the path cannot be checked in advance. The same rule applies to writes: mv, cp, chmod, chown, truncate, install and tee prompt in every mode when the target resolves outside the workspace.
What is stored on disk?
Conversations in ~/.undisclosed/turns, memory in ~/.undisclosed/memory, and brain logs in ~/.undisclosed/logs. Debug dumps are opt-in with UNDISCLOSED_DEBUG=1. The Memory panel can switch memory off or clear what is stored.
Does it work offline?
The editor and the brain run offline. The agent needs a model, so a local model is what makes the full loop work with the network off.
Can I keep my VS Code setup?
Settings, themes and extensions import from VS Code and Open VSX. Extensions that only exist in the Microsoft marketplace are not on Open VSX, and the import summary tells you which ones were skipped.
What does it cost?
The app is Apache-2.0 and free to build and run. If you use a cloud model, you pay that provider directly for the tokens you use.
Is the download signed?
Not yet. The macOS build is unsigned, which is real friction for a tool that asks you to trust it. That is a known gap, not a design choice, and the work is tracked in docs/PACKAGING.md. For now: right-click the app and choose Open the first time, or run xattr -cr /Applications/Undisclosed.app. Windows and Linux builds are on the releases page.
The agent, without giving up your code.
Download Undisclosed for macOS, Windows or Linux. Bring a local model or your own key, and keep the editor, the brain and every conversation on your machine.
Apache-2.0 · unsigned local builds for now · no account