[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94892":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":12,"openIssues":13,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":13,"stars7d":14,"stars30d":14,"stars90d":13,"forks30d":13,"starsTrendScore":13,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":16,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":17,"hasPages":17,"topics":19,"createdAt":9,"pushedAt":9,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":13,"starSnapshotCount":13,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},94892,"Endoplexity","Endokelp\u002FEndoplexity","Endokelp","Agentic browser control driven by your own Claude \u002F Cursor subscriptions",null,"TypeScript",210,1,0,9,46.3,"Apache License 2.0",false,"main",[20,21,22,23,24,25,26],"ai-agent","browser-automation","cdp","chrome-extension","claude","cursor","mcp","2026-08-24 04:01:22","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"extension\u002Ficons\u002Ficon-128.png\" width=\"72\" alt=\"Endoplexity\">\n\n# Endoplexity\n\n**Agentic browser control, driven by the AI subscription you already pay for.**\n\nA Chrome side panel that reads and acts on the page you're actually looking at:\nclick, type, fill forms, move between tabs, all through your existing `claude`\nor `cursor-agent` CLI instead of a metered API key.\n\n[![Licence](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicence-Apache--2.0-1f6f4a)](LICENSE)\n[![Node](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-24%2B-1f6f4a)](package.json)\n[![Tests](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftests-156%20passing-1f6f4a)](bridge\u002Ftest)\n[![API key](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FAPI%20key-not%20required-1f6f4a)](#what-it-costs)\n\n\u003Cimg src=\"docs\u002Fdemo.gif\" width=\"100%\" alt=\"Endoplexity opening three pricing pages in separate tabs and comparing their free tiers in one table\">\n\n\u003Csub>Real time, no cuts beyond a trim and a speed-up · \u003Ca href=\"docs\u002Fdemo.mp4\">full-quality video\u003C\u002Fa>\u003C\u002Fsub>\n\n\u003C\u002Fdiv>\n\n---\n\n## What you just watched\n\nOne instruction: *\"Open the pricing pages for Vercel, Netlify and Cloudflare\nPages in three tabs, then compare their free tiers in one table.\"*\n\nIt opened three tabs, read each pricing page, followed a plan link that\nactually lived on a different page, noticed when a link took it somewhere\nunexpected and recovered from it, then came back with a comparison table, the\nsources it used, and a takeaway naming the trade-off between Cloudflare's\nunlimited static bandwidth and Netlify's credit cap.\n\nThat banner reading *\"Endoplexity started debugging this browser\"* is\nChrome's own, and it stays up the whole time. This is your real browser, your\nreal session, on the pages you already had open. Not a headless copy that\nhas to log back in to everything.\n\n## Why this exists\n\nMost open-source \"browser agent\" projects need an API key and bill you per\nclick. But if you already pay for Claude or Cursor, a tool-calling agent loop\nis sitting on your machine right now, fully paid for, doing nothing.\n\nThe brain didn't need building. What was missing was **hands** (a browser it\ncan actually touch) and a **face** (a panel that shows its work). That's the\nwhole project: a tool server and a UI. The agent loop is the CLI you already\nhave installed.\n\n## How it works\n\nThe extension never talks to a model directly. The CLI never talks to\nChrome. Neither one holds the other's credentials.\n\n```\n┌──────────────────────┐   WebSocket    ┌──────────────┐    MCP\u002FHTTP   ┌──────────────────┐\n│  Chrome side panel   │  origin-pinned │ local bridge │  token-gated  │  claude -p       │\n│  (MV3)               │◄──────────────►│  127.0.0.1   │◄─────────────►│  cursor-agent -p │\n│  owns chrome.debugger│                │  :8787       │               │  (the agent loop)│\n└──────────────────────┘                └──────────────┘               └──────────────────┘\n```\n\nThe panel owns the CDP connection itself rather than handing it to the\nservice worker, which sidesteps MV3's idle teardown. The bridge exposes 14\nbrowser tools over MCP, and it's where the safety policy actually lives.\nNever in a prompt, so nothing the model says can widen its own permissions.\n\n**Tools:** `snapshot` `navigate` `click` `type` `key` `upload` `read_file`\n`select` `scroll` `hover` `back` `forward` `tabs` `use_tab`\n\nTwo decisions do most of the work here:\n\n- **Pages go to the model as an accessibility-tree snapshot, not raw HTML.**\n  It's what the model actually needs, at a fraction of the bytes.\n- **Actions return the page they produced**, so acting and re-reading happen\n  in one turn instead of two. After the first read, only the lines that\n  changed get sent again.\n\n`read_file` reads an attached document as text (PDF, DOCX, XLSX, PPTX, CSV,\nJSON, Markdown, or any text file), so the agent can answer questions *about* an\nattachment instead of only pushing it into a form field. You attach one by\ndropping it on the composer — see [Files](#6-files).\n\n## Getting started\n\nThis takes about five minutes. No API key, no billing page, no dashboard to\nconfigure. Just Node, Chrome, and a CLI you probably already have logged in.\n\n### 1. Check what you need first\n\n- **Node 24 or newer.** The bridge runs TypeScript directly, no build step,\n  and that only works on 24+. Check with `node -v`.\n- **Chrome 114 or newer.** 135+ gets themed dropdowns; anything older just\n  falls back to the native picker, nothing breaks.\n- **The `claude` CLI, the `cursor-agent` CLI, or both**, already logged in to\n  a real subscription. A **Claude Pro** plan is enough (you don't need Max);\n  pick Sonnet in the model dropdown once you're running, since reading a page\n  and clicking things doesn't need a frontier reasoning model.\n\n### 2. Clone it and install\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FEndokelp\u002FEndoplexity.git\ncd Endoplexity\nnpm install\n```\n\n### 3. Start the bridge\n\n```bash\nnpm run setup\n```\n\nThis writes a small launcher into your Windows Startup folder, so the bridge\ncomes up automatically every time you log in. No console window stays open,\nno token to copy anywhere. If you'd rather run it by hand instead (or you're\nnot on Windows), `npm start` runs it in the foreground so you can watch its\nlog directly. If something ever seems stuck, `.endo-bridge.log` at the repo\nroot is the first place to look.\n\n### 4. Load the extension into Chrome\n\n1. Open `chrome:\u002F\u002Fextensions`\n2. Turn on **Developer mode** (top right)\n3. Click **Load unpacked**\n4. Select the `extension\u002F` folder from this repo\n\nYou'll see the Endoplexity icon appear in your toolbar.\n\n### 5. (Optional) Log in to Cursor too\n\nOnly needed if you want to run tasks through Cursor's models as well as\nClaude's:\n\n```bash\nnpm run cursor-login\n```\n\nThis is a one-time login into a bridge-owned Cursor profile, kept separate\nfrom your normal `cursor-agent` login so the two never collide.\n\n### 6. Files\n\nDrag a file onto the composer, paste one, or use the paperclip. It shows up as\na chip, and from then on the agent can read it (`read_file`) or put it into a\nform field (`upload`). Any file type — anything it can't turn into text, it\nsays so rather than guessing.\n\nThe bridge keeps its own copy and hands the model a **key** (`resume`), never a\npath. Attachments survive restarts, and the `×` on a chip deletes the copy.\n\nIf you'd rather point at a file where it already lives, `.endo-files.json` still\nworks and behaves identically:\n\n```bash\ncp .endo-files.example.json .endo-files.json\n```\n\n```json\n{\n  \"resume\": \"C:\\\\Users\\\\you\\\\Documents\\\\resume.pdf\"\n}\n```\n\nBoth files are gitignored, and so is the attachment directory — everything\nstays on your machine.\n\n### 7. Run your first task\n\nClick the Endoplexity icon to open the side panel, type what you want, and\nhit **Run**. A couple of things worth knowing right away:\n\n- `Enter` starts a fresh task. `Ctrl`\u002F`Cmd`+`Enter` replies inside the\n  current conversation instead of starting over.\n- Type `@` in the box to hand the agent another tab you have open.\n- A fresh Run always attaches to whichever tab you're currently looking at,\n  so open the page you want it working on *before* you press Run.\n\nTry something low-stakes first, like summarizing whatever page you're on\nbefore you point it at a form. For a deeper look at what each part of the\npanel shows and how the approval gate behaves, see\n[docs\u002Fhandrun.md](docs\u002Fhandrun.md).\n\n## The safety model\n\nThis drives a browser that's logged into your real accounts, so the\nboundaries here are worth stating plainly, including where they stop.\n\n- **Loopback only.** The bridge binds `127.0.0.1`, never `0.0.0.0`.\n- **The panel is identified by origin, not a shared secret.** The extension\n  ID is pinned by an RSA `key` in the manifest, and the WebSocket upgrade has\n  to match that exact origin. Page script can't forge an `Origin` header.\n  The `\u002Fmcp` endpoint, which a CLI reaches with no origin at all, is gated\n  instead by a token in a `0600` gitignored file, never passed on a command\n  line.\n- **The agent gets browser tools and nothing else.** Claude runs with an\n  explicit allowlist plus `--strict-mcp-config --setting-sources \"\"`; Cursor\n  runs in an isolated profile with `Shell`, `Write`, `Read`, and `WebFetch`\n  all denied. Both were verified by actually trying to run a shell command,\n  not by reading the documentation and hoping.\n- **Irreversible actions stop for a human.** Submitting, deleting, and\n  purchasing all hit an approval gate that lives in the bridge. Silence\n  denies. A disconnected panel denies.\n  **Know exactly what that check is:** it matches the clicked element's\n  visible label against a list of English words (`submit`, `pay`, `delete`,\n  `confirm`, and a few more). It's a label heuristic, not real understanding\n  of the page. A button labelled in another language, worded unusually\n  (\"Finish\", \"Yes, place it\"), or carrying only an icon will **not** be\n  caught. Use `watch` mode where that matters.\n- **Three autonomy modes** (`watch` \u002F `normal` \u002F `trust`), chosen in the\n  panel and enforced in the bridge. An absent or unrecognised mode falls\n  back to `normal`, never `trust`, so it fails closed. `trust` disables the\n  gate entirely, which is why the panel shows it in red the whole time it's\n  set. *(The demo above runs in `trust` mode, which is why you never see the\n  gate fire.)*\n- **Files resolve a configured key, never a model-supplied path.**\n  `DOM.setFileInputFiles` runs in the browser process and can read almost\n  anything, so a model-chosen path would be an exfiltration primitive. Note\n  the asymmetry: `upload` hands a file to a page without the model ever\n  seeing its contents, but `read_file` puts those contents directly in the\n  model's context. That allow-list is the whole boundary, so only put in it\n  what you actually mean to share.\n\nFound a hole? See [SECURITY.md](SECURITY.md) and please report it privately.\n\n## What it costs\n\nA complete job application, filled agent-driven on a real Greenhouse form:\n\n| | |\n|---|---|\n| Cost | **$0.0959** |\n| Tokens | 112,064 |\n| Turns | 10 |\n| Wall clock | 42s |\n\nThat dollar figure is what the CLI reports as *equivalent* API spend. On a\nsubscription, it's already covered by what you're paying monthly, which is\nthe entire point of this project.\n\nThe same task measured flat against a 5-tool baseline, even while carrying\nabout 18k tokens more of tool schema, so going from 5 tools to 13 cost\nnothing per run in practice. Page returns were later cut **3.8x** by sending\na full page once and then only the lines that changed afterward: 119,856 →\n31,626 tokens on a ten-turn Hacker News task.\n\n## Status\n\nEarly. `v0.0.1`, and honest about it. The tool layer, approval gate, session\ncontinuity, and panel are all built and tested: **156 unit tests**, plus an\nin-panel self-test that drives the real CDP layer against a cross-origin\nfixture (run `await endo.selftest()` in the panel's own console).\n\nKnown gaps, stated rather than hidden:\n\n- **Windows-first.** `npm run setup` installs autostart via a Startup-folder\n  script. macOS and Linux autostart aren't implemented yet, though the\n  bridge itself is portable and `npm start` works anywhere.\n- **Sessions live in the bridge's memory.** Restarting it ends resumability\n  on purpose: resuming into a Chrome that's moved on would hand the agent a\n  transcript full of stale element references.\n- Real ATS comboboxes usually aren't `\u003Cselect>` elements, so they need a\n  click-then-click flow rather than the `select` tool.\n- `chrome:\u002F\u002F` pages and the Web Store can't be driven, since Chrome refuses\n  the debugger there.\n- After a lot of navigation, dead out-of-process iframe sessions can leave a\n  stray line of noise in a snapshot.\n\n## Development\n\n```bash\nnpm test     # 156 tests, node:test, no framework, no build step\nnpm start    # run the bridge in the foreground to watch its log\n```\n\nThere's no bundler and no framework here. The extension is plain HTML and\nJS, and the bridge is TypeScript run directly by Node 24.\n\n[docs\u002Fhandrun.md](docs\u002Fhandrun.md) is the manual verification checklist.\n\n## Licence\n\n[Apache-2.0](LICENSE). See [NOTICE](NOTICE) for trademark attribution.\n\n> Independent project. Not affiliated with, endorsed by, or sponsored by\n> Perplexity AI, Anthropic, or Anysphere.\n","Endoplexity 是一个基于本地 AI 工具调用的浏览器自动化代理扩展，通过 Chrome 侧边栏与用户已订阅的 Claude 或 Cursor CLI 代理（如 cursor-agent）协同工作，实现真实浏览器会话中的页面理解与操作。核心功能包括：利用 Chrome DevTools Protocol（CDP）直接控制当前标签页，执行点击、表单填写、多标签导航等动作；采用 WebSocket 连接本地桥接服务，不依赖远程 API 密钥或计量计费；支持 MCP 协议，保障模型与浏览器间权限隔离。适用于需在自有浏览器环境中完成重复性网页任务（如比价、数据采集、跨页信息整合）且已拥有 Claude\u002FCursor 订阅的开发者与技术用户。",2,"2026-08-17 02:30:12","CREATED_QUERY"]