blamouche340 downloadsRun AI coding CLIs like Claude Code or Codex from a right sidebar terminal panel.

Run any local AI coding CLI — Claude, Codex, or your own — inside a right sidebar terminal in Obsidian.
The plugin embeds a real PTY-backed terminal in the sidebar and lets you declare an unlimited list of CLI runtimes from settings (each with a display name and a launch command). Open as many sessions as you like — each runs in its own tab with its own process, so several runtimes (or several instances of the same one) run in parallel in a single panel. Launch sessions in your active vault folder, switch tabs on the fly, and inject the active file or folder as a mention with one click. You can also schedule reusable prompts: drop markdown files in a vault folder and the plugin fires each one into its own fresh session tab on an interval or cron — or run them on demand from the Automations panel, with a per-run history you can export.
New to this? Follow these three steps. No prior coding experience needed.
You install it straight from inside Obsidian, the same way as any other community plugin:
Any AI CLI in the search box.That's it — a robot icon appears in the left ribbon. Click it to open the panel on the right.
The plugin is a window onto an AI coding assistant — but the assistant itself is a separate program you install once on your computer. Pick one to start with (you can add more later). Each is installed from your computer's Terminal app (on macOS: open Terminal; on Windows: open PowerShell) by copy-pasting one line.
| Tool | What it is | Install (copy-paste one line) | Command name |
|---|---|---|---|
| Claude Code | Anthropic's coding assistant (recommended to start) | npm install -g @anthropic-ai/claude-code |
claude |
| Codex | OpenAI's coding assistant | npm install -g @openai/codex |
codex |
| opencode | Open-source, works with many AI providers | npm install -g opencode-ai |
opencode |
| Ollama | Runs AI models fully locally (offline, private) | Download the installer from ollama.com/download | ollama |
Notes for non-technical users:
npm install ... lines need Node.js on your machine. If a line says npm: command not found, install Node.js first from nodejs.org (the "LTS" button), then re-run the line.claude) in the Terminal and pressing Enter. If it starts, you're ready.ollama run llama3 once to download a model).+ in the tab bar) and pick the tool you installed.Stuck on
command not found? See Troubleshooting — you can point the plugin at the tool's exact location in settings.
xterm terminal.+ control opens a new session from any configured runtime.PATH).@active file and @active folder buttons that insert the current note path (or its parent folder) as a mention in the active session's stdin.interval or cron, or run them manually from a modal with a per-run history log.New session, Stop, Restart, Clear.node-pty → Python PTY bridge → direct pipe → script) so it works on macOS, Linux, and Windows.Status: ...) and clear error reporting in the panel.isDesktopOnly plugin).PATH (e.g. claude, codex, aider).python3 recommended.The easiest way is the Community plugins browser inside Obsidian — see Getting Started above. The methods below are alternatives for manual or offline installs.
Open the latest release.
Download any-ai-cli-<version>.zip.
Unzip it directly inside your vault's plugin folder so the resulting path is:
/PATH/TO/VAULT/.obsidian/plugins/any-ai-cli/
In Obsidian, enable the plugin: Settings → Community plugins → Installed plugins → Any AI CLI.
That's it. No commands required — the plugin uses an embedded Python PTY bridge fallback so it works out of the box on macOS / Linux (and falls back to direct pipe mode on Windows).
The bundle ships without node-pty (a native module that has to be compiled for your specific Node ABI). The plugin works without it, but installing it gives you a fully native PTY (better full-screen TUI rendering and resize behavior). To enable it:
cd "/PATH/TO/VAULT/.obsidian/plugins/any-ai-cli"
npm install --omit=dev
Reload the plugin afterwards.
/PATH/TO/VAULT/.obsidian/plugins/any-ai-cli/.npm install and npm run build inside the folder to produce main.js.Settings → Community plugins.The community-store auto-install and the release zip both ship only the three canonical Obsidian plugin files. Everything else the plugin needs at runtime is bootstrapped from main.js:
In the release zip / plugin folder:
manifest.json — Obsidian plugin metadata (id, version, minAppVersion).main.js — bundled plugin code. Embeds the full source of pty-proxy.js and pty-bridge.py (injected by esbuild's define at build time) and writes them next to itself on first Start.styles.css — sidebar / toolbar / dropdown styling. Without it the panel renders with raw browser defaults.Auto-generated on first run (from main.js):
pty-proxy.js — Node child process that runs your CLI inside a PTY.pty-bridge.py — Python PTY fallback used on macOS/Linux when node-pty is not installed.Available on the GitHub release page but not in the zip:
versions.json — used by Obsidian to find a backwards-compatible plugin version when the current minAppVersion is too high for the user's app. Obsidian fetches it directly from the release URL.Not shipped with the plugin (only in the repo, for advanced users):
package.json + package-lock.json — needed only if you opt into the native node-pty backend. Download them from the repo for the matching tag, drop them in the plugin folder, and run npm install --omit=dev.Open panel, to reveal the panel on the right.New session (or the + at the end of the tab bar) and pick a runtime to launch it in the active vault folder. With auto-start enabled, the default runtime opens automatically as the first session.Claude, Claude (2), …).× on a tab closes that session (and kills its process). Each tab has a status dot reflecting activity: green = the AI is working, purple = an automation's AI is working, gray = the CLI is idle (finished its turn) or stopped.@active file or @active folder (second toolbar row) to insert the current note path or its parent folder as a mention.Restart to relaunch the active session's runtime in place, Stop to terminate it, Clear to wipe its terminal output.Automations (second toolbar row) to open the Automations modal: run any prompt manually with Run now, or browse the History tab to see what fired and when.Automations let you store reusable prompts as markdown files in your vault. When an automation fires (on a schedule or manually), the plugin opens a new session tab for the target runtime and sends the prompt to it — so scheduled runs execute in parallel without disturbing your other sessions.
Automations).Tip: in plugin settings, click Create example to drop a fully documented
hello-world.md(every field explained) into the configured folder — the fastest way to see the format.
Each automation is a regular markdown file with YAML frontmatter that sets the schedule, plus a body containing the prompt that will be sent to the CLI verbatim.
---
name: Daily summary # optional, defaults to the filename
enabled: true # optional, defaults to true
interval: 60 # minutes — exclusive with `cron`
# cron: "0 9 * * 1-5" # standard 5-field cron — exclusive with `interval`
runtime: claude # optional — runtime id or display name to spawn; omit to use the default runtime
appendNewline: true # optional, defaults to true (adds Enter so the CLI executes the prompt)
---
Summarize my notes from the last 24h and propose three priorities for today.
Rules:
interval or cron must be set. interval is in whole minutes (>= 1). cron uses standard 5-field syntax (cron-parser).enabled: false keeps the entry visible in the modal but skips scheduling (you can still trigger it with Run now).--- (trimmed).runtime field selects which runtime to spawn, matched by id or display name. If it names a runtime that is not configured, the run is skipped and logged in History.runtime is omitted, the automation spawns the default runtime (set in plugin settings).The Automations toolbar button opens a modal with two tabs:
General:
runtime.10.0 = unlimited). Protects against runaway automation spawns.Runtimes section (the customizable list of CLIs available from the new-session menu):
Claude → claudeCodex → codex --no-alt-screen -c check_for_update_on_startup=false ...Aider → aider --model openrouter/...command / codexCommand settings from earlier versions are migrated automatically.Automations section:
hello-world.md (all fields explained) into the configured folder and open it.Advanced:
auto for automatic detection, or override with an explicit path (/opt/homebrew/bin/node, C:\Program Files\nodejs\node.exe, etc.).[proxy-info] / [proxy-warn] for the node-pty → python bridge → pipe fallback chain) in the terminal. Off by default; these are normal fallback notes, not errors. Real launch failures ([proxy-error] / [proxy-fatal]) are always shown regardless. Applies to the next session you start.The plugin tries multiple strategies to maximize startup success:
node-ptypty-bridge.py) on macOS/Linuxchild_process)script fallback (last resort on Unix)The chosen strategy is silent by default; enable Verbose proxy logs in settings to see the [proxy-info] / [proxy-warn] diagnostics. Genuine failures ([proxy-error] / [proxy-fatal]) always appear.
command not found: <cli>The CLI binary is not in Obsidian's process PATH. Either:
/Users/<you>/.local/bin/claude or /opt/homebrew/bin/codex.PATH.Cannot find module 'node-pty'Since 0.1.25, this no longer crashes the plugin — node-pty is optional and the proxy automatically falls back to the Python bridge (or direct pipe). If you want the native PTY backend anyway:
cd "/PATH/TO/VAULT/.obsidian/plugins/any-ai-cli"
npm install --omit=dev
posix_spawnp failedNative PTY failed in the current runtime environment.
python3 is installed for Python PTY fallback.main.js and styles.css are up to datenpm install
npm run lint
npm run test
npm run build
npm run dev: esbuild watch modenpm run build: compile main.ts -> main.jsnpm run lint: run eslint-plugin-obsidianmd so violations of the Obsidian community-store guidelines are caught locally before submissiontests/**/*.test.tsnpm run testnpm run test:watchGitHub Actions workflow: .github/workflows/ci.yml
Triggers:
pushpull_requestSteps:
npm cinpm run lintnpm run testnpm run buildGitHub Actions workflow: .github/workflows/release.yml
Triggered by pushing a git tag (e.g. 0.1.25):
git tag 0.1.25
git push origin 0.1.25
The workflow:
npm ci + npm run build. At build time, esbuild inlines pty-proxy.js and pty-bridge.py into main.js (via define) so they no longer need to ship as separate files.manifest.json, main.js, styles.css) into an any-ai-cli/ folder.any-ai-cli-<tag>.zip for drop-in install.manifest.json, main.js, styles.css, and versions.json (the assets Obsidian's plugin update protocol and tools like BRAT actually fetch).Before tagging, keep these versions in sync: manifest.json, versions.json, package.json.
main.ts: Obsidian plugin logicmain.js: built distribution filestyles.css: terminal panel stylingmanifest.json: Obsidian plugin metadatapty-proxy.js: runtime proxy (Node)pty-bridge.py: Python PTY fallbackruntime-utils.ts: testable shared utilitiestests/runtime-utils.test.ts: unit testsnode-pty or pipe fallbackisDesktopOnly)MIT