Denis Berekchiyan114 downloadsFile-backed AI agents, task scheduling, and inbox monitoring inside Obsidian.
Turn Obsidian into an AI-powered command center. Create autonomous agents on Claude Code or OpenAI Codex, schedule tasks, chat in real-time, connect via Slack or Telegram, and hook into any MCP service — all from your vault.

Agent Fleet is an Obsidian plugin that lets you build, configure, and run AI agents directly from your vault. Agents run on the CLI backend of your choice — Claude Code (Claude Max/Pro subscription or Anthropic API key) or OpenAI Codex — selectable per agent. Every agent, skill, task, and run log is a markdown file. If the plugin disappears, your knowledge stays.
🤖 AI Agents — Create specialized agents with system prompts, skills, permissions, heartbeat schedules, and memory. Each agent is a folder of markdown files you fully own and control.
🔀 Dual CLI backends — Run each agent on Claude Code or OpenAI Codex, set per agent. Models, chat, tasks, heartbeat, channels, and permission rules all work the same on either backend — pick the engine, keep the workflow.
📚 Wiki Keeper — Turn any folder in your vault into a self-maintaining wiki in the spirit of Karpathy's "LLM wiki" pattern. Drop sources into an inbox, point at existing note folders as passive watched sources, and a scoped keeper agent ingests them into an interlinked _topics/ tree with cross-references, citations, and a log. Each topic page carries a refreshable ## Summary block synthesized from its claims history, so query-time reads stay cheap as the wiki grows. Substantive Q&A answers compound back into the wiki — both as filed synthesis pages and as dated bullets on every cited topic. Weekly lint surfaces orphans, contradictions, dedup candidates, and stale summaries; the dashboard's Wiki Keepers tab renders the review queue. Scales from one whole-vault keeper to many project-scoped instances; any other agent (e.g. a PM agent) can reference a keeper's scope and query or contribute. See the Wiki Keeper Guide.
💬 Interactive Chat — Dock a chat panel anywhere in Obsidian. Switch between agents. Attach documents and images. Send follow-up messages while the agent works. Inline threads under any assistant reply let you tangent without polluting the main thread — each thread has its own backend session, its own context, its own stats.
📊 Live chat stats — Compact terminal-style strip under the composer shows the model and a context-usage bar so you always know where you stand on context.
📡 Slack & Telegram — Chat with your agents from Slack or Telegram. Multi-agent routing via @agent-name prefix or interactive buttons. Slack Assistants API with native "is thinking..." indicator. Telegram with inline keyboard agent picker and typing dots. Session persistence across restarts.
💓 Heartbeat — Autonomous periodic agent runs. Define what an agent does when no one is asking — monitoring, reports, health checks — with results posted to Slack.
📋 Task Board — Kanban view with scheduling, priority, real-time progress tracking, and abort. Tasks run on cron schedules or on-demand. Per-task model override lets you route a simple nightly summary to Haiku while keeping the agent on Opus.
🎛️ Model picker — Choose between aliases (opus / sonnet / haiku / opusplan — backend-agnostic), pinned IDs, or Bedrock/Vertex/Foundry formats. One place to configure: settings default, per-agent, or per-task override. Runs log both the requested alias and the concrete resolved model.
🔌 MCP Integration — Register an MCP server once and it's available to any agent on either adapter (Claude Code or Codex). Servers live in a fleet-owned registry (_fleet/mcp/) and are projected into each run; your native ~/.claude.json and ~/.codex/config.toml are never modified. One-click OAuth 2.1 (or a static bearer token), stored in your OS keychain and projected to both backends.
🧠 Agent Memory — A two-tier, self-curating memory (curated working set + append-only ground truth) that agents write via a remember tool or [REMEMBER] tags, on both Claude and Codex. An optional nightly reflection consolidates it and can propose new skills from recurring patterns (approval-gated).
📊 Dashboard — Overview with run charts, success rates, token/cost tracking, activity timeline, fleet status, streaming output from active agents, and focused run-detail panels that lead with the final result and hide the full reasoning transcript behind a toggle.
Via npm (recommended):
npm install -g obsidian-agent-fleet
The installer automatically finds your Obsidian vaults and copies the plugin files.
Via BRAT:
denberek/obsidian-agent-fleetManual:
main.js, manifest.json, styles.css from the latest release<vault>/.obsidian/plugins/agent-fleet/Obsidian 1.11.4+ (desktop — macOS, Windows, Linux)
At least one CLI backend — install whichever engine(s) your agents will use:
npm install -g @anthropic-ai/claude-code
claude # authenticate on first run
Works with a Claude Max or Pro subscription or an Anthropic API key — no separate API costs if you already subscribe.codex agents):npm install -g @openai/codex
codex login # authenticate on first run
Works with a ChatGPT Plus/Pro plan or an OpenAI API key.You only need the backend(s) your agents are configured to use — Claude-only users never pay the Codex probe, and vice versa.
On first launch, Agent Fleet creates a _fleet/ folder in your vault:
_fleet/
├── agents/
│ └── fleet-orchestrator/ ← default agent (manages the fleet)
├── skills/ ← 22 built-in skills
├── tasks/
├── channels/
├── mcp/ ← registered MCP servers (one file each)
├── runs/
└── memory/
The Fleet Orchestrator agent is ready — click Chat to ask it to create new agents, tasks, skills, or channels.
npm update -g obsidian-agent-fleet
Or via BRAT: settings → check for updates.
Agents are AI assistants with specific personalities, capabilities, and permissions. Each agent is a folder in _fleet/agents/ containing markdown files:
agents/my-agent/
├── agent.md ← Identity: name, description, system prompt
├── config.md ← Runtime: model, timeout, permissions
├── SKILLS.md ← Agent-specific skills
├── CONTEXT.md ← Project context
└── HEARTBEAT.md ← Autonomous periodic run instruction (optional)
What you can configure:
| Setting | Description |
|---|---|
| Name & Description | Identity shown in the dashboard |
| Avatar | Lucide icon picker (1,400+ icons) or emoji |
| System Prompt | Core instructions that define the agent's behavior |
| Model | Backend-aware picker — Claude aliases (opus/sonnet/haiku/opusplan), pinned IDs, Bedrock/Vertex/Foundry, or Codex slugs; free-text for anything else |
| Adapter | Claude Code or OpenAI Codex — set per agent |
| Working Directory | Where the agent operates (defaults to vault root) |
| Timeout | Max execution time in seconds |
| Permission Mode | bypassPermissions, dontAsk, acceptEdits, or plan |
| Allow/Deny Lists | Fine-grained tool control (e.g., allow Bash(curl *), deny Bash(rm -rf *)). Enforced on both backends — Claude Code natively, Codex via execpolicy command rules (see Backends) |
| Skills | Shared skills from the skill library |
| MCP Servers | Which MCP servers the agent can access |
| Memory | Two-tier self-curating memory: remember tool / [REMEMBER] tags → working set + raw archive, with optional nightly reflection |
| Heartbeat | Autonomous periodic run with schedule and instruction |
Permission Modes:
| Mode | Behavior |
|---|---|
bypassPermissions |
Auto-runs everything except deny list |
dontAsk |
Only allow-listed commands run |
acceptEdits |
File edits auto-approved, bash blocked unless allowed |
plan |
Read-only — no writes, no commands |
Each agent runs on one of two CLI backends, selected by the Adapter field in the agent editor:
| Claude Code (default) | OpenAI Codex | |
|---|---|---|
| Engine | @anthropic-ai/claude-code |
@openai/codex (codex exec) |
| Auth | Claude Max/Pro subscription or Anthropic API key | ChatGPT Plus/Pro plan or OpenAI API key |
| Models | opus / sonnet / haiku / opusplan aliases, pinned IDs, Bedrock/Vertex/Foundry |
Codex slugs (e.g. gpt-5.5-codex) + free-text |
| Permission rules | Native — .claude/settings.local.json |
execpolicy command rules via per-agent CODEX_HOME overlay |
| File/network sandbox | Permission Mode | Permission Mode (workspace-write / read-only); codex exec forces approval policy never |
| MCP servers | Fleet registry (_fleet/mcp/), projected via --mcp-config |
Fleet registry (_fleet/mcp/), projected via -c mcp_servers.* |
Everything else — chat, tasks, heartbeat, Slack/Telegram channels, memory, run logs, model picker — works identically on both. The picker switches its alias list based on the selected adapter; free-text remains the escape hatch for any model ID.
How Codex permission rules work. Your Bash(...) allow/deny rules are translated into Codex execpolicy rules and injected through a per-agent CODEX_HOME overlay (the agent's ~/.codex with auth/config/sessions symlinked through, but its own rules directory). This enforcement is lossy by design and degrades safely:
Bash(git push *) → deny git push …. Tool-name rules (Read/Write/Edit) and mid-pattern wildcards (Bash(* --force)) are dropped; file/network access is governed by the Permission Mode sandbox instead.allow rules are additive, so "only the allow-list runs" (Claude's dontAsk) is not reproducible; the sandbox is the real boundary.~/.codex isn't set up, or symlinks are unavailable), the agent falls back to sandbox-only enforcement with a one-time console warning — the run never breaks.Codex reports no per-run dollar cost, so
cost_usdis blank on Codex runs. Compact/rate-limit telemetry is Claude-only.
A heartbeat gives an agent autonomous behavior — what it does when no one is asking. Think periodic monitoring, daily reports, health checks, or trend analysis.
Setup: Create a HEARTBEAT.md file in the agent's folder, or configure it in the dashboard's agent edit page:
---
enabled: true
schedule: "0 */6 * * *" # every 6 hours
notify: true # Obsidian notice on completion
channel: my-slack # post results to Slack (optional)
---
Check all monitored endpoints for availability and response time.
Compare with previous checks using your memory. Report anomalies.
If everything is healthy, respond with a one-line "all clear".
Key behaviors:
[REMEMBER] tags to track trends across runsChat with your agents from Slack — every message flows through the same chat-session pipeline as the in-app panel (Claude Code or Codex), with full tool use, session persistence, and agent memory.
📖 Step-by-step Slack setup guide → — complete walkthrough from creating the Slack app to sending your first message.
Quick overview:
_fleet/channels/my-slack.md---
name: my-slack
type: slack
default_agent: fleet-orchestrator
allowed_agents:
- fleet-orchestrator
- site-monitor
- code-reviewer
enabled: true
credential_ref: my-slack-creds
allowed_users:
- U0AQW6P37N1
per_user_sessions: true
channel_context: |
You are being contacted via Slack. Keep replies concise.
---
Features:
@agent-name: message to switch agents mid-thread. Each agent gets its own isolated session. /agents slash command lists available agents.--resume / Codex exec resume)Important: Obsidian must be running for channels to work. When Obsidian is closed, the bot goes offline.
Chat with your agents from Telegram — simpler setup than Slack, no @mention required in DMs.
Setup:
/newbot, pick a name and username, copy the token_fleet/channels/my-telegram.mdFeatures:
typing... dots while the agent works (auto-refreshed every 4.5s)/agents command shows interactive buttons to switch agentssetMyCommands[agent-name] when multiple agents are configured--resume / Codex exec resume)The chat panel is a first-class Obsidian view — dock it in the sidebar, center, or any split.
Features:
--resume / Codex exec resume)A kanban view for managing agent tasks with five columns:
| Column | Description |
|---|---|
| Backlog | Tasks with no schedule, waiting to be run manually |
| Scheduled | Tasks with a cron schedule, enabled and waiting |
| Running | Currently executing — shows real-time progress bar tied to timeout |
| Done | Completed today |
| Failed | Failed, timed out, or cancelled today |
Task features:
Register an MCP server once and it works for any agent on either adapter (Claude Code or Codex). Servers are a fleet-owned registry — one markdown file per server under _fleet/mcp/<name>.md — and are projected into each run at spawn time (Claude via --mcp-config, Codex via -c mcp_servers.*). Your native ~/.claude.json and ~/.codex/config.toml are read-only; Agent Fleet never modifies them.
One-time import. On first load, your existing Claude and Codex MCP servers are imported into the registry (a server configured in both becomes one entry, marked imported), and any bearer tokens found are moved into your OS keychain. Idempotent.
Add Server UI:
_fleet/mcp/; secrets never touch the vaultServer Management:
OAuth 2.1 Authentication:
One-click browser-based auth, projected to both backends:
Authorization header, to Codex via bearer_token_env_var (passed through the spawn environment, never written to argv or any config file)Reusable instruction sets that agents share. Each skill is a folder:
skills/my-skill/
├── skill.md ← Core instructions
├── tools.md ← CLI/API tool documentation
├── references.md ← Background docs
└── examples.md ← Few-shot examples
22 Built-in Skills:
| Skill | Description |
|---|---|
agent-fleet-system |
Full knowledge of the Agent Fleet plugin |
algorithmic-art |
Generative art with p5.js |
canvas-design |
Visual art, posters, static designs as PNG/PDF |
claude-api |
Build apps with the Claude API and Anthropic SDKs |
doc-coauthoring |
Structured co-authoring workflow for documentation |
docx |
Create, read, edit Word (.docx) files |
frontend-design |
Production-grade web UIs and components |
internal-comms |
Status reports, newsletters, incident reports |
mcp-builder |
Build MCP servers for LLM-to-service integration |
pdf |
Read, create, merge, split, OCR PDF files |
pptx |
Create, read, edit PowerPoint (.pptx) files |
skill-creator |
Create, evaluate, and optimize skills |
slack-gif-creator |
Animated GIFs optimized for Slack |
taste-skill |
Senior UI/UX engineering for frontend design |
theme-factory |
Apply visual themes (colors, fonts) to slides, docs, HTML |
web-artifacts-builder |
Multi-component HTML artifacts with React, Tailwind, shadcn/ui |
webapp-testing |
Test local web apps with Playwright — UI checks, screenshots |
xlsx |
Create, read, edit spreadsheets (.xlsx, .csv, .tsv) |
wiki-ingest |
Ingest sources into a scoped Wiki Keeper wiki |
wiki-query |
Answer a question strictly from wiki content |
wiki-refresh |
Regenerate topic-page ## Summary blocks from claim history |
wiki-lint |
Weekly Wiki Keeper health check (orphans, stale pages, missing links) |
The main overview with:
Sidebar navigation:
Agent detail page tabs:
A two-tier, self-curating memory that works on task, heartbeat, and chat runs and on both Claude Code and Codex backends. Per agent, under _fleet/memory/<agent>/:
working.md — curated, token-budgeted memory (memory_token_budget, default 1500) injected into every run, organized into Preferences (pinned) / Procedures / Observations / Recent.raw/<date>.md — append-only ground-truth log of everything captured (never injected), so summaries can always be re-derived.How an agent records something (two channels, same sink):
remember tool — remember(fact, pin?, section?), auto-enabled for memory agents (preferred, structured).[REMEMBER] … [/REMEMBER] text tag as a fallback ([REMEMBER:pin] for standing preferences).Captures land in working.md immediately, so the next run/turn sees them. Memory is agent-scoped (shared across all conversations, including channels).
Reflection ("dreaming") — enable reflection_enabled and a nightly run (reflection_schedule, default 0 3 * * *) consolidates memory from the raw log: dedups, resolves contradictions, summarizes from ground truth to fit the budget, and keeps pinned preferences. With reflection_propose_skills, recurring friction becomes an approval-gated skill proposal in the Inbox. A failed reflection never wipes memory. Trigger manually with Reflect now on the agent.
Legacy single-file memory (
_fleet/memory/<agent>.md) is migrated automatically.memory_max_entriesis superseded bymemory_token_budget.
Every execution is logged in _fleet/runs/YYYY-MM-DD/:
---
run_id: abc123
agent: fleet-orchestrator
task: daily-report
status: success
started: 2026-04-03T09:00:00
completed: 2026-04-03T09:02:30
duration_seconds: 150
tokens_used: 4500
cost_usd: 0.07
model: claude-opus-4-8
tags: [heartbeat]
---
## Prompt
...
## Output
...
## Tools Used
...
Click any run in the dashboard to see full details in a slideover panel.
| Setting | Default | Description |
|---|---|---|
| Fleet Folder | _fleet |
Root folder for all fleet data |
| Claude CLI Path | claude |
Path to the Claude Code CLI |
| Codex CLI Path | codex |
Path to the OpenAI Codex CLI (used by codex agents) |
| Default Model | default |
Default model for new agents. Pick Default / Alias (opus/sonnet/haiku/opusplan) / Custom (manual ID for Bedrock/Vertex/etc.) |
| AWS Region | us-east-1 |
For AWS Bedrock model support |
| Max Concurrent Runs | 2 |
Parallel task execution limit |
| Run Log Retention | 30 days |
Auto-cleanup old logs |
| Catch Up Missed Tasks | true |
Run overdue tasks on startup |
| Notification Level | all |
all, failures-only, none |
| Status Bar | true |
Show the fleet status indicator in Obsidian's status bar |
| Chat Watchdog Timeout | 10 min |
Kill a chat turn after this much silence from the CLI |
All secrets — MCP OAuth/bearer tokens and channel credentials (Slack/Telegram) — are stored in your OS keychain via Obsidian's SecretStorage API, never in the vault or in your native ~/.claude.json / ~/.codex/config.toml. Existing plaintext credentials are migrated from data.json to the keychain automatically on first load and the plaintext copies are cleared.
Keychain storage uses Obsidian's SecretStorage API (Obsidian 1.11.4+, the minimum supported version).
| Setting | Default | Description |
|---|---|---|
| Max Concurrent Sessions | 5 |
Live agent chat sessions across all channels |
| Idle Timeout | 15 min |
Hibernate sessions after inactivity |
| Rate Limit | 20 msgs / 5 min |
Per-conversation sliding window |
All data lives in _fleet/ as plain markdown:
_fleet/
├── agents/ Agent folders (agent.md, config.md, HEARTBEAT.md, etc.)
├── skills/ Shared skill folders (skill.md, tools.md, etc.)
├── tasks/ Task files with frontmatter
├── channels/ Channel bindings (Slack, Telegram)
├── mcp/ Registered MCP servers (one markdown file each)
├── runs/ Execution logs by date
│ └── YYYY-MM-DD/
├── memory/ Per-agent memory (working.md + raw/ archive)
└── chat-images/ Images pasted into chat
Everything is searchable, version-controllable, and fully yours.
Q: Do I need an API key? Not necessarily. Agent Fleet works with your Claude Max or Pro subscription via Claude Code CLI. No separate API key or billing. If you prefer, you can also use an Anthropic API key directly.
Q: Can I use OpenAI Codex instead of Claude?
Yes. Set an agent's Adapter to OpenAI Codex and it runs on the @openai/codex CLI (ChatGPT plan or OpenAI API key) instead of Claude Code. You can mix freely — some agents on Claude, others on Codex — in the same fleet. Chat, tasks, heartbeat, channels, and memory all work the same. See Backends for the per-backend differences (notably how command permission rules are enforced and that Codex runs report no dollar cost).
Q: Does it work without internet? No — agents need their CLI backend (Claude Code or OpenAI Codex) to reach its API. But all your data (agents, tasks, skills, memory) is local markdown.
Q: Can I use different models per agent or per task?
Yes. Each agent has its own model setting, and you can override it per task (e.g. keep the agent on Opus but run a simple nightly summary task on Haiku to cut cost). Supports Anthropic direct, AWS Bedrock, Google Vertex, Foundry, and Mantle. Claude aliases opus / sonnet / haiku / opusplan cover the Claude backend; Codex agents use Codex slugs (a Claude-shaped default is ignored on Codex and vice-versa). Resolution order: task → agent → settings → the backend's own CLI default.
Q: What happens if I delete the plugin?
Your _fleet/ folder stays. All agents, tasks, skills, run logs, and memory are plain markdown files in your vault.
Q: Can multiple agents run at the same time?
Yes, up to maxConcurrentRuns (default 2). Additional tasks queue until a slot opens.
Q: Does the chat remember previous conversations?
Yes. Each agent has persistent chat sessions that survive Obsidian restarts via the backend's session resume (Claude --resume / Codex exec resume).
Q: Does the Slack bot work when Obsidian is closed? No. The bot runs inside Obsidian via Socket Mode — when Obsidian is closed, the bot goes offline. Slack buffers messages briefly during short disconnects.
Q: Can I use multiple agents in Slack or Telegram?
Yes. Type @agent-name: message to switch agents, or use /agents to get interactive buttons. Each agent maintains its own session. Works in both Slack and Telegram.
Q: Which is easier to set up — Slack or Telegram? Telegram. Create a bot via @BotFather (30 seconds), paste the token, create a channel. Slack requires creating an app with Socket Mode, scopes, events, and reinstalls after scope changes.
Q: What is a heartbeat?
An autonomous periodic run — what an agent does on a schedule without user input. Configured via HEARTBEAT.md in the agent's folder. Results can be posted to Slack or Telegram automatically.
MIT License — © 2026 Denis Berekchiyan