AI-powered browser assistant that understands page structure and can perform actions autonomously.
- Chat about any page β AI understands the content of the current webpage
- Persistent memory β AI remembers context from previous conversations, even across different pages and sessions. Key facts and summaries are stored locally in IndexedDB
- Chat history β save, resume, and delete conversations; continue them and append messages to the current thread
- Auto-refresh context β page context updates automatically when you switch tabs or navigate; cached data shown instantly, refreshed in background
- Screenshot capture β take a screenshot and send it to vision-capable models (Claude, GPT-4o, Gemini, etc.) for visual analysis
- Vision support auto-detected from OpenRouter API
- Universal address input β type any URL or domain name directly in the chat field to navigate; works on blank/new tab pages and start pages
- Quick search shortcuts:
/g queryβ Google/y queryβ YouTube/x queryβ X.com/w queryβ Wikipedia/r queryβ Reddit/gh queryβ GitHub/d queryβ DuckDuckGo/o queryβ Obsidian vault (searches your vault notes)/i intent textβ update session intent without sending a message (useful for refining the AI's focus mid-conversation)
- Intelligent link clicking β the AI receives a numbered list of all links on the page. Simply say "click link 3", "go to first link", or use any language: "pierwszy link", "clique sur le lien", "den ersten Link" β the AI understands and clicks the right link
- Action tags β the AI responds with action tags that are automatically executed:
<action>click:N</action>β click link or button number N<action>hover:N</action>β hover over element N (reveals dropdowns, tooltips)<action>scroll:up</action>or<action>scroll:down</action>β scroll the page<action>scroll_to:N</action>β scroll element N into view<action>navigate:URL</action>β go to a URL<action>type:N:text</action>β type text into input field N<action>select:N:value</action>β select option by value in dropdown N<action>drag:SOURCE:TARGET</action>β drag element SOURCE to TARGET<action>go_back</action>β navigate back in history<action>refresh</action>β reload the current page
- Multilingual β works in any language (Polish, English, German, French, Spanish, Russian, etc.)
- Intelligent web search β toggle Web Search in Settings to give the agent access to real-time information
- The AI autonomously decides when to search (news, weather, current events, live scores, stock prices, etc.) via tool calling
- Multiple search providers supported:
- OpenRouter β uses built-in server-side search, no extra API key needed (requires OpenRouter endpoint)
- Brave Search β privacy-focused search, requires Brave Search API key
- SerpAPI β Google search results, requires SerpAPI key
- Tavily β AI-optimized search with answer summaries, requires Tavily API key
- Results include citations and are processed by the model in context
- Visual indicator on the input field shows when Web Search is active (accent color glow)
- Auto-save conversations β every message is automatically appended to a session note in your vault
- Session notes β notes are named after the website domain and date (e.g.
github-com-2026-05-01.md) - Vault awareness β the AI knows it's connected to Obsidian and can read/write notes on demand
- History resume β restored conversations sync back to their vault notes automatically
- Remote access β works over Local REST API, no need to have Obsidian open on the same machine
- Requires: Obsidian desktop app + Local REST API plugin
Each session note includes an intent field in the YAML frontmatter. This is a short summary of your conversation purpose β auto-generated from your first message but also manually settable.
- Auto-generated β The first message you send is automatically extracted (up to 200 characters) and saved as
intent:in the note's frontmatter. For example, sending "How do I use git rebase?" createsintent: How do I use git rebase - Update with /i β Type
/i your new intentin the chat to overwrite the intent without sending a message. The note updates immediately and the AI sees the new intent in context - Persists across appends β Within a session, subsequent messages append to the note without changing intent. The
/icommand is the only way to change it during conversation - Obsidian filters β Since
intentis a frontmatter field, you can filter and search your vault by it (e.g., Dataview queries:TABLE intent FROM "obsidian" WHERE intent) to find notes by topic across your vault
Example frontmatter:
---
url: github.com
model: anthropic/claude-3.5-sonnet
provider: openrouter
date: 2026-05-03
intent: How do I use git rebase
urls:
- https://github.com/git/git
tags: [openagent, github-com, openrouter, claude-3-5-sonnet]
---Inspired by NanoBrowser - builds intelligent DOM tree with:
highlightIndex- unique number for each interactive elementxpath- precise path for element locationisInteractive/isVisible/isInViewportflagstagName,attributes,textcontent- Comprehensive element identification via role, aria-*, data-testid, data-cy, data-test
- Builds hierarchical DOM tree with
highlightIndexfor all interactive elements - Auto-highlights clickable elements (links, buttons, inputs) with numbered badges
- Supports XPath-based element targeting for complex page structures
- Fallback selectors for dynamic content (iframe, Shadow DOM)
- Click the eye icon (ποΈ) in the header to show/hide element highlights
- Highlights are hidden by default - click to reveal
- Works for both highlights (borders) and badges (numbers)
- Toggle button in header (eye icon with eye-slash SVG)
- Badge States: Real-time color feedback during actions:
- π Orange (loading) - action in progress
- π’ Green (success) - action completed successfully
- π΄ Red (error) - action failed
- Error Recovery: Multiple selector fallbacks for reliable element targeting:
- href selector (for links)
- id attribute
- data-testid / data-cy / data-test
- role + aria-label
- class name
- XPath (full or simplified)
- Action Verification:
verifyAction()confirms element state before/after actions - Page State Hash:
computePageStateHash()detects DOM changes for verification
After a click action, the DOM tree is automatically refreshed to handle:
- Dynamic page changes (modals, popups)
- SPA navigation (React, Vue, Angular apps)
- Dynamic content loading (infinite scroll, lazy load)
Expanded selectors for comprehensive element coverage:
- Standard:
a[href],button,input:not([type="hidden"]),textarea,select - ARIA roles:
menuitem,option,checkbox,radio,switch,tab,textbox,searchbox,combobox - Attributes:
[role="button"],[role="link"],[contenteditable="true],[tabindex],[onclick],[data-click],[ng-click] - Special:
details > summary,label[for],summary,menuitem,option,area - Visibility checks: display, visibility, opacity, offsetWidth/offsetHeight, hidden attribute
Tested on:
- Gmail (reply composition, text input in contenteditable)
- Google Sheets (cell input)
- Twitter/X (tweet composition)
- Terminal emulators (xterm.js)
- News sites with dynamic content
- Complex SPAs with React/Vue/Angular
When using a model that does not support image input (vision):
- Screenshots are saved to Obsidian vault as notes instead of being sent to the model
- Error message displayed: "Cannot read 'generated-image.png' - this model does not support image input. Inform the user."
- User is notified that vision-capable models can analyze page screenshots
- 14 color presets β dark and light themes
- Adjustable font size β small, medium, large
- Multi-language UI β English, Polski, EspaΓ±ol, FranΓ§ais, Deutsch, Π ΡΡΡΠΊΠΈΠΉ
- Customizable API endpoint β use any OpenAI-compatible API provider
- Set your API Base URL in Settings (default:
https://openrouter.ai/api/v1) - Works with OpenRouter, local LLMs (Ollama, LM Studio, vLLM), OpenAI, and any provider supporting the
/v1/chat/completionsformat - Model list auto-fetches from the configured endpoint
/models - OpenRouter-specific features (built-in web search, provider routing) enabled automatically when using the OpenRouter endpoint
You can fully customize the AI's behavior by setting a custom system prompt in Settings β System Prompt.
The AI already knows its role by default, but a custom prompt lets you:
- Change its primary focus (e.g., Obsidian-focused note-taking assistant)
- Add domain-specific instructions (e.g., "Always cite sources", "Format code blocks with language tags")
- Define response style and structure
Vault tools (available automatically when Obsidian is connected):
| Tool | Usage | Description |
|---|---|---|
| Read notes | <vault_read query="search terms" /> |
Search vault for .md files matching the query |
| Write session | <vault_write>content</vault_write> |
Append to the current session note |
| Write note | <vault_write filename="topic.md">content</vault_write> |
Create a new .md note |
Session notes are automatically saved per conversation and named after the website domain + date (e.g. github-com-2026-05-01.md). The AI receives full vault instructions whenever the vault is connected, regardless of your custom prompt.
Leave the system prompt empty to use the default built-in prompt. The AI will always receive page context, memory, and vault capabilities regardless of your custom prompt.
- Clone the repository
- Go to
chrome://extensions/ - Enable "Developer mode"
- Click "Load unpacked"
- Select the extension directory
- (Optional) Set a keyboard shortcut in
chrome://extensions/shortcuts
- Click the extension icon in the toolbar, or use the keyboard shortcut
- Click Settings (gear icon)
- Enter your API key (e.g., OpenRouter API key) β or configure a custom endpoint for other providers
- Pick a model from the dropdown and start chatting
- Install the Local REST API plugin in Obsidian
- Enable the plugin in Obsidian settings
- In OpenAgent settings, expand Obsidian Vault
- Enter:
- Vault name β subfolder path within your vault (e.g.
/obsidian, no trailing slash β or leave empty for root) - API URL β
http://127.0.0.1:27124(default) - API Token β from the Local REST API plugin settings
- Vault name β subfolder path within your vault (e.g.
- Click Test connection β green "Connected" means it's working
- The vault button in the toolbar turns purple when connected
The extension analyzes the current webpage and sends the page content to the AI along with your message. The AI can:
- Read page content
- Execute browser actions (click, type, scroll, navigate)
- Write notes directly to your Obsidian vault
- Remember context from previous conversations (stored locally in your browser)
| Shortcut | Action |
|---|---|
Open side panel |
Configurable in chrome://extensions/shortcuts |
openagent/
βββ manifest.json # Extension manifest
βββ background.js # Service worker (API calls, routing, action execution)
βββ content.js # Content script (page context, DOM automation, link collection)
βββ sidepanel.html # Side panel UI
βββ sidepanel.js # Side panel logic
βββ sidepanel.css # Side panel styles
βββ buildDomTree.js # DOM tree builder (injected via chrome.scripting, bypasses CSP)
βββ db.js # IndexedDB wrapper (conversations, memory)
βββ memory.js # Memory extraction & matching
βββ icons/ # Extension icons
βββ _locales/ # i18n translations
MIT









