Your Second Brain — chat with the LLM of your choice (Claude, GPT, Gemini, or local CLI), ingest URLs, manage knowledge, run projects. Powered by Gryphon.
Your Second Brain — in Obsidian.
Athena turns your Obsidian vault into a personal knowledge base that compounds over time. Ingest URLs, papers, GitHub repos, screenshots, and videos; an LLM synthesizes each one into a structured wiki page, cross-references it with what you already have, and keeps the whole graph navigable, searchable, and chat-queryable. Athena bundles Gryphon for the chat surface, so you can ask questions about your knowledge base using the LLM provider of your choice (Anthropic, OpenAI, Google, or a local CLI).
Athena is not affiliated with Anthropic, OpenAI, Google, or Obsidian. References to those services describe what the plugin and its bundled SDKs talk to; they do not imply endorsement.
kb command set — one verb-driven CLI for everything: ingest a URL (kb add), search (kb search), ask (kb query), reflect on recent journal entries (kb reflect), organize hubs (kb create, kb move, kb merge), prune (kb remove, kb trash, kb purge, kb undo). Available in-vault through Gryphon chat or directly in the terminal.raw/ sources, LLM-maintained wiki/ synthesis, and a schema (this repo's CLAUDE.md) that governs LLM behavior. Sources are never modified; wiki pages can be regenerated; the schema is the contract.## Key Findings, ## Methods / Architecture, ## Notable Quotes, and ## Relevance sections derived from the raw source by an LLM you choose. No 50K-character body copies.related: for graph view and search; body ## Connections section for human navigation.kb remove and kb merge move files to .kb-trash/ where they stay for 30 days. kb undo restores. kb purge permanently deletes. Even after purge, the original URL is preserved so the source can be recaptured from scratch.kb add, and Athena's own kb capture-deep (Playwright-based) all flow into the same ingest path. LinkedIn auto-promotes to the deep-capture path so JS-rendered content lands intact.kb lint. The lint set is the permanent safety net; LLM instructions are suggestions..git/, .obsidian/, .env, and other dangerous paths/commands even in YOLO mode.Via Obsidian's Community Plugins directory — once the submission is accepted, search for "Athena" in Obsidian → Settings → Community plugins → Browse.
Via BRAT (for early access to release candidates) — the Beta Reviewers Auto-update Tool is a community plugin that installs plugins directly from GitHub releases.
polleoai/athena and click "Add Plugin".From source (for contributors):
.obsidian/plugins/athena/ inside the vault.npm install and npm run build:all (the :all variant builds the bundled Gryphon submodule too).kb commands and Python KB engine need a desktop filesystem and Node child-process spawning).claude CLI (advanced opt-in — confirm your intended usage complies with that product's Commercial Terms).kb add worksThe plugin runs end-to-end synthesis on every supported platform (macOS, Linux, Windows):
raw/<type>/artifacts/{slug}.mdbin/lib/wiki_page.py writes a wiki page with frontmatter + Source/Local-Copy line + structure## Key Findings / ## Methods / Architecture / ## Notable Quotes / ## RelevanceIf synthesis can't run (no LLM configured), the page is still created with a "Pending synthesis" placeholder and you'll see *Synthesis skipped: no LLM provider configured* in the chat reply. Fix it with kb regen <url> once Gryphon is set up.
The wiki-page scaffolding step (step 2 above) is performed by python3 bin/lib/wiki_page.py. As of 1.0.9, the plugin bundle ships Athena's Python sources (bin/lib/*.py + bin/config/athena.default.json) inside the plugin install dir — earlier releases required cloning the full Athena vault. Community Plugins users just need:
brew install python (3.10+) or python.org/downloadspython3 --version to verifyThen one-time:
python -m pip install pydantic
Restart Obsidian. kb add runs end-to-end. The 1.2 milestone tracks porting the wiki-page builder to JS so this final Python dependency disappears too.
The full polleoai/athena repo carries additional terminal-only kb commands (kb search, kb query, kb reflect, kb merge, etc.), a lint suite (kb lint), and the bundled raw + wiki layers that make Athena a working knowledge base out of the box. Clone the repo and open the cloned directory as an Obsidian vault to use those.
Sites behind Cloudflare's bot challenge, JavaScript-rendered SPAs that require interaction, and authenticated content (LinkedIn timeline, X.com feed) often return a challenge page instead of the article when captured headlessly. Athena will save the challenge-page content as the raw file in those cases (not what you wanted). Workaround: open the page in your normal browser, use the Obsidian Web Clipper extension to drop a clipping into <vault>/clippings/, and Athena's watcher will pick it up.
On Ubuntu (especially 22.04+ with Snap-installed Obsidian under AppArmor), Chromium's sandbox helper sometimes fails to start the renderer for an Electron BrowserWindow. Athena's 15s outer timeout (added in 1.0.3) makes this a graceful 15s fall-through to the <webview> capture path rather than a permanent hang, but the first capture on a fresh Linux install can take up to 15s longer than on macOS / Windows. Subsequent captures usually work normally as the sandbox helper warms up.
Up-arrow recall (Gryphon's terminal-style prompt history) reads from the persisted chat-history.json on Obsidian launch. If you sent a prompt right before quitting Obsidian — especially while a slow operation was still in flight — the persistence may not have flushed yet, and that prompt won't be in the up-arrow walk after restart. The visible chat bubble survives (it's loaded from the same file, which DID save before quit); only the input-history index doesn't see it. Open issue under investigation for 1.1.
| Layer | What lives here | Who writes it |
|---|---|---|
Raw (raw/) |
Immutable source material — clipped webpages, PDFs, repo snapshots, screenshots, video transcripts | Ingest pipeline only; the LLM never modifies raw sources |
Wiki (wiki/) |
LLM-maintained synthesis pages — one per source, plus topic / entity / comparison pages cross-referencing them | LLM, via kb commands |
Schema (CLAUDE.md) |
Operating principles, command interface, safety rules | Maintainer |
When you run kb add <url>, Athena fetches the page into raw/, then generates a corresponding wiki/ page with structured sections, then cross-references it against existing pages. The wiki is the layer you read and chat with; the raw layer is the audit trail.
Athena's plugin runtime makes network calls only through the bundled Gryphon chat surface, which in turn talks to the LLM provider you've configured in Settings → Gryphon:
| Provider mode | Endpoint(s) contacted | Triggered by |
|---|---|---|
| Anthropic API (default) | https://api.anthropic.com |
Chat messages, tool-use loop |
| OpenAI | https://api.openai.com |
Chat messages, tool-use loop |
| Google Gemini | https://generativelanguage.googleapis.com |
Chat messages, tool-use loop |
| Claude Code (CLI) | None over the network from Athena — the CLI subprocess makes its own outbound calls | Chat messages, tool-use loop |
The terminal kb command set (run outside Obsidian, in a shell) makes additional outbound network calls when the user explicitly invokes them:
kb add <url> — fetches the URL via curl/wget (any host the user provides). For JS-heavy domains on a known allowlist (github.com, x.com, linkedin.com, youtube.com, arxiv.org, medium.com, etc.) it may launch a sandboxed Chromium via Playwright. The full allowlist is in bin/lib/capture.py.kb add with arXiv / HuggingFace / GitHub URLs — may follow canonical-source URLs derived from the captured page (arXiv abstract pages → PDFs, GitHub blob URLs → raw, etc.). This is the auto-discovery path documented in CLAUDE.md as "discover-and-surface, never auto-fetch new ingestion" — discovered sources are queued, not auto-pulled.kb report-bug / kb request-feature — opens a GitHub issue on the upstream Athena repo via gh CLI.http://localhost:11434 only. Athena never sends embedding requests to a remote service.Browser-based capture (Playwright) runs with Chromium's security sandbox enabled. The terminal kb commands never navigate to file:// URLs, localhost, or private IPs.
Athena reads the following system properties at runtime, in both the plugin and the terminal path:
app.vault.adapter.basePath in the plugin; via the script's working directory in the terminal). Required so the Python KB engine knows where to read/write raw/ and wiki/.process.platform) — only used to choose between macOS-specific paths (launchd) and Linux/Windows fallbacks in scripts/. Not transmitted.os.hostname() and os.userInfo() are read by bundled Gryphon for CLI-mode auto-detection (see Gryphon's own README for full disclosure). Athena itself does not read these.ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY (Gryphon), ATHENA_DISABLE_PLAYWRIGHT_PROMOTE (test escape hatch for the LinkedIn auto-promote path). All optional; absence falls back to in-app settings..kb-trash/ is local-only; nothing leaves your machine when you delete.data.json (API keys) and chat-history.json* for both Athena and Gryphon are gitignored. They never enter the repo.kb report-bug only sends data when you explicitly run it, and shows you the payload before transmission (see CLAUDE.md operating principle #6 for the data-integrity feedback loop spec).git clone --recurse-submodules https://github.com/polleoai/athena.git
cd athena
npm install
npm run build:all # builds bundled Gryphon plugin too, then Athena's bundle
Build outputs land in .obsidian/plugins/athena/:
main.js — Athena's plugin bundle (~1.3 MB, includes Gryphon)manifest.json — plugin manifeststyles.css — bundled stylesheet (sourced from Gryphon — Athena adds none of its own)To pre-flight a release, run scripts/release-smoke-test.sh. The --fresh variant clones into /tmp first so it exactly mirrors what Obsidian's submission scorecard sees.
See LICENSE if present. Bundled Gryphon retains its own license (see vendor/gryphon/LICENSE).