{"slug": "opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it", "title": "opendot: A terminal AI agent that snapshots every action so you can undo it", "summary": "Opendot, a new terminal AI agent that snapshots every action before execution, allows users to undo file edits and shell commands, flagging irreversible operations like network calls or sudo commands. The model-agnostic tool works with any LLM via LiteLLM or local Ollama, supports MCP servers, and is installable via pip or uvx.", "body_md": "[\n](https://pypi.org/project/opendot/)\n\nAn interactive terminal AI agent you can fully undo.\n\nopendot works directly on your real files and shell — but unlike other terminal\nagents, **every action it takes is snapshotted first**, so you can see exactly\nwhat it did and cleanly walk it back. Files *and* shell commands, not just\nin-repo edits. Commands whose effects escape your workspace (network, sudo,\n`git push`\n\n, deleting outside the working dir) are flagged and confirmed before\nthey run, with an honest note about what can't be undone.\n\nThat's the point of opendot: an agent you can let loose because nothing it does is a surprise, and (almost) nothing is irreversible.\n\nopendot is model-agnostic — it works with any model through LiteLLM (OpenAI, Anthropic, Google, DeepSeek, …) and runs fully local via Ollama. Ollama is just the zero-setup local option; use whatever backend you prefer.\n\n```\n# try it instantly, no install\nuvx opendot\n\n# recommended (isolated global CLI)\nuv tool install opendot        # or: pipx install opendot\n\n# also works\npip install opendot\nopendot                              # open an interactive chat\nopendot -p \"summarize this project\"  # one-shot, for scripts / CI\nopendot --model claude-opus-4-5      # launch with a specific model (see below)\n\nopendot log                          # audit: what has the agent done here?\nopendot undo                         # revert the last action\nopendot undo 000004                  # restore the workspace to before action #4\n```\n\nInside the chat, slash-commands: `/model`\n\n(searchable model picker),\n`/provider`\n\n(connect a provider + paste an API key), `/log`\n\n, `/undo`\n\n, `/clear`\n\n,\n`/compact`\n\n, `/help`\n\n.\n\nAny model works — cloud, local, or Hugging Face. You need an API key for the\nprovider you want to use (opendot is BYO-key; it doesn't host models). Pick a\nmodel and paste a key right inside the chat with `/model`\n\nand `/provider`\n\n, or\nset the key in your environment and pass `--model`\n\n:\n\nProvider names link to where you get a key.\n\n| Provider | Env var | Example `--model` |\n|---|---|---|\n|\n\n`OPENAI_API_KEY`\n\n`gpt-5.1`\n\n[Anthropic](https://console.anthropic.com/settings/keys)`ANTHROPIC_API_KEY`\n\n`claude-opus-4-5`\n\n`GEMINI_API_KEY`\n\n`gemini/gemini-3-pro`\n\n[DeepSeek](https://platform.deepseek.com/api_keys)`DEEPSEEK_API_KEY`\n\n`deepseek/deepseek-chat`\n\n[Groq](https://console.groq.com/keys)`GROQ_API_KEY`\n\n`groq/llama-3.3-70b-versatile`\n\n[Hugging Face](https://huggingface.co/settings/tokens)`HF_TOKEN`\n\n`huggingface/together/deepseek-ai/DeepSeek-R1`\n\n[Ollama](https://ollama.com)(local, no key)`ollama/qwen3`\n\nReasoning models stream their thinking live.\n\n**Local OpenAI-compatible servers** (llama.cpp / `llama-server`\n\n, vLLM, LM Studio):\npoint opendot at the server with `--api-base`\n\nand an `openai/`\n\n-prefixed model.\n\n```\n# e.g. llama.cpp: llama-server -m model.gguf --port 8080\nopendot --model openai/local --api-base http://localhost:8080/v1\n```\n\n**Which model runs.** The default is `gpt-5.1`\n\n. If its key (`OPENAI_API_KEY`\n\n)\nisn't set but another provider's key is, opendot automatically switches to that\nprovider on launch — e.g. with only `DEEPSEEK_API_KEY`\n\nset, a bare `opendot`\n\nuses `deepseek/deepseek-chat`\n\n. If **no** provider key is found, opendot starts\nfine but the first message shows a hint to set a key or run `/provider`\n\n(rather\nthan a raw provider error). `ollama/*`\n\nmodels need no key — just a local Ollama.\n\nopendot is an [MCP](https://modelcontextprotocol.io) client: connect any MCP\nserver and its tools become available to the agent alongside the built-in ones.\nManage them from inside the chat with ** /mcp** (a dropdown of your servers and\ntheir status, with \"➕ Add a server\"), or from the command line:\n\n```\n# a stdio server — put its launch command after `--`\nopendot mcp add <name> --env KEY=VALUE -- <command> [args...]\n\n# a remote server (http/sse)\nopendot mcp add <name> --url <https url>\n\n# a remote server that needs auth — pass an HTTP header\nopendot mcp add supabase \\\n  --url \"https://mcp.supabase.com/mcp?project_ref=<id>&read_only=true\" \\\n  --header \"Authorization=Bearer <your-supabase-access-token>\"\n\nopendot mcp list           # show configured servers\nopendot mcp remove <name>  # remove one\n```\n\nServers are stored in `~/.opendot/mcp.json`\n\nand connect automatically on the\nnext launch; connected servers appear in the sidebar. For authenticated remote\nservers, opendot supports the header/token method (e.g. Supabase's access\ntoken) — the interactive browser-OAuth flow is not implemented yet.\n\nBecause opendot can't know what an external tool does, **every MCP tool call is\ntreated as irreversible** — it's confirmed before running and marked ✗ in the\nledger. Your built-in file/shell actions stay snapshotted and undoable as usual.\n\nBeyond MCP, opendot can connect to [Composio](https://composio.dev)'s 1000+ app\ntools (Gmail, Slack, GitHub, Notion, Linear, …) using **your own** Composio API\nkey. Just use `/composio`\n\nin the chat:\n\n- The first\n`/composio`\n\nasks for your Composio API key (stored in`~/.opendot/composio.json`\n\n, owner-readable only). - After that,\n`/composio`\n\nlists the available apps. Pick one — if it needs OAuth, opendot opens your browser to authorize and waits for you to finish; direct/API-key connectors activate immediately. - Enabled apps appear in the sidebar; their tools load on the next launch.\n\nComposio tools reach external services, so — like MCP — **every call is treated\nas irreversible**: confirmed first, marked ✗ in the ledger.\n\nDrop an `OPENDOT.md`\n\nin your project. Its prose is given to the agent as\ncontext. You can also control what gets snapshotted with an `opendot`\n\nblock:\n\nopendot\n# snapshot these even though they'd normally be skipped:\nsnapshot: dist\n# never snapshot these:\nskip: data, *.log\nBy default opendot skips `.git`\n\n, `node_modules`\n\n, virtualenvs, and build caches\nwhen snapshotting — your rules override those in either direction.\n\n- Before every file write or shell command, opendot snapshots the working\ndirectory into a\n**content-addressed store** in`~/.opendot`\n\n(each unique file stored once, so snapshots are cheap). - Every action is recorded in an\n**append-only ledger** you can inspect with`opendot log`\n\n. `opendot undo`\n\nrestores the workspace to a chosen point, exactly.- A conservative\n**classifier** decides which shell commands are workspace- contained (auto-run, undoable) vs. escaping (confirmed first, marked irreversible). When unsure, it asks.\n\nHonest boundary: opendot cannot undo effects that leave your machine (a sent\nemail, a dropped remote database, a `git push`\n\n). It tells you *before* running\nthose, rather than pretending otherwise.\n\nIssues and PRs welcome — see [CONTRIBUTING.md](/vedaant00/opendot/blob/main/CONTRIBUTING.md) for setup and\nthe one hard rule (don't break reversibility). Security reports go through\n[SECURITY.md](/vedaant00/opendot/blob/main/SECURITY.md).\n\n```\ngit clone https://github.com/vedaant00/opendot\ncd opendot\nuv pip install -e \".[dev]\"   # or: pip install -e \".[dev]\"\npytest\n```\n\nEarly (alpha). The interactive agent, local tools, and the full reversibility\nengine work and are tested. Streaming, slash-commands, and `OPENDOT.md`\n\nrules\nare in. A richer TUI and more tools are coming.", "url": "https://wpnews.pro/news/opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it", "canonical_source": "https://github.com/vedaant00/opendot", "published_at": "2026-07-29 18:11:00+00:00", "updated_at": "2026-07-29 18:24:06.980821+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "artificial-intelligence"], "entities": ["opendot", "LiteLLM", "OpenAI", "Anthropic", "Google", "DeepSeek", "Ollama", "MCP"], "alternates": {"html": "https://wpnews.pro/news/opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it", "markdown": "https://wpnews.pro/news/opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it.md", "text": "https://wpnews.pro/news/opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it.txt", "jsonld": "https://wpnews.pro/news/opendot-a-terminal-ai-agent-that-snapshots-every-action-so-you-can-undo-it.jsonld"}}