{"id":45818849,"url":"https://github.com/unbrowse-ai/unbrowse","last_synced_at":"2026-06-06T04:00:47.365Z","repository":{"id":336354271,"uuid":"1143440578","full_name":"unbrowse-ai/unbrowse","owner":"unbrowse-ai","description":"Unbrowse — api native browser MCP/SDK for any agent. Auto-discovers APIs from browser traffic, generates skills on the fly to call APIs directly 100x faster, 80% cheaper locally.","archived":false,"fork":false,"pushed_at":"2026-06-02T08:08:53.000Z","size":30655,"stargazers_count":699,"open_issues_count":22,"forks_count":58,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T09:15:16.249Z","etag":null,"topics":["agents","agentskills","browser-use","clawdbot","clawdbot-plugin","har","moltbot","openclaw","openclaw-skills","reverse-engineering","skills"],"latest_commit_sha":null,"homepage":"https://unbrowse.ai","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unbrowse-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-27T15:30:07.000Z","updated_at":"2026-06-02T08:27:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/unbrowse-ai/unbrowse","commit_stats":null,"previous_names":["lekt9/unbrowse-openclaw","lekt9/unbrowse"],"tags_count":193,"template":false,"template_full_name":null,"purl":"pkg:github/unbrowse-ai/unbrowse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbrowse-ai%2Funbrowse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbrowse-ai%2Funbrowse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbrowse-ai%2Funbrowse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbrowse-ai%2Funbrowse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unbrowse-ai","download_url":"https://codeload.github.com/unbrowse-ai/unbrowse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbrowse-ai%2Funbrowse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33968711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","agentskills","browser-use","clawdbot","clawdbot-plugin","har","moltbot","openclaw","openclaw-skills","reverse-engineering","skills"],"created_at":"2026-02-26T19:38:30.224Z","updated_at":"2026-06-06T04:00:47.358Z","avatar_url":"https://github.com/unbrowse-ai.png","language":"TypeScript","funding_links":[],"categories":["Developer Tools","🧰 Skills \u0026 Registries"],"sub_categories":["Infrastructure"],"readme":"# Unbrowse\n\n\u003e **The full Unbrowse client is open and auditable.** The entire client runtime — capture, route inference, indexing, execution, the SDK, and the wallet/auth/signing layer — is MIT and readable here, so you can verify what it does on your machine rather than trust a black box. Only the backend (marketplace, settlement) and the web app stay private. The CLI ships unsigned and readable by design: trust comes from being able to read the code, not from a signature. See [docs/OPEN-SOURCE-NOTICE.md](./docs/OPEN-SOURCE-NOTICE.md) for the exact open/private split.\n\nUnbrowse is a local Model Context Protocol (MCP) server, CLI, and TypeScript SDK that turns websites into reusable API routes for agents. It learns callable routes from real browsing, keeps credentials local, and shares only sanitized route metadata with the marketplace when you explicitly publish.\n\nOne agent learns a site once. Every later agent gets the fast path.\n\nOn the API-native path Unbrowse is typically ~30x faster and ~90x cheaper than driving a browser, and turns repeated browser work into reusable, payable route assets. Peer-reviewed benchmark across 94 live domains: **3.6× mean speedup, 5.4× median, 40× fewer tokens** — see [arXiv:2604.00694](https://arxiv.org/abs/2604.00694). For the release-coverage methodology (corpus shape, rubric, current numbers), see [docs/benchmarks.md](./docs/benchmarks.md).\n\nOn adversarial, JavaScript-challenge-gated anti-bot content, a reproducible nine-post retrieval benchmark across three communities of a major social platform — ground-truthed against the platform's own data — recovers the real content on **9/9 posts where a naive HTTP client is blocked on every request (HTTP 403)**. The benchmark is re-runnable and reports the naive-vs-Unbrowse head-to-head directly.\n\n\u003e Security note: capture and execution stay local by default. Credentials stay on your machine. Learned API contracts are only shared after an explicit checkpoint (`sync`, `close`, or manual `publish`). Agents should connect via the MCP server or the SDK.\n\n## A uniform agent interface\n\nEvery web action an agent takes collapses onto **three verbs** — the same shape the binary speaks internally:\n\n| Verb | What it is | Examples |\n|---|---|---|\n| `create` | **Declare** what you'll reuse — a skill, a fill-template, a value-source. | `create skill`, `create template` |\n| `act` | **Act** on the internet — navigate, fill, click, type, submit, execute. | `act go`, `act fill`, `act execute` |\n| `read` | **Observe** state — snapshot, resolve, read, status, earnings. | `read snap`, `read resolve`, `read text` |\n\nEach op produces a **pointer-only, wallet-signed receipt**: it points *at* values (a URL, a `value:ptr`, a `sha256:` address) and carries a signature from your key — it never carries the secret value itself. `act fill` dereferences a credential pointer **locally** and types the result into the page; the secret never crosses the wire. *We never see your secret values.*\n\nReceipts are Ed25519-signed today. Stronger authorization and provenance schemes are an active research direction; specifics will be detailed in a forthcoming whitepaper. The pointer-only invariant holds regardless. Full public surface — all 37 ops, the two-call contract, the receipt shape, and the honest open/closed split — is in [docs/agent-internet-layer.md](./docs/agent-internet-layer.md).\n\n\u003e The three-verb surface (`unbrowse {create,act,read}`) ships in the v7 preview alongside the unchanged v6 commands (`go`, `snap`, `fill`, …). No migration required.\n\n## Drop-in client adapters\n\nAlready using a search or browsing client? Swap one import. Unbrowse ships **drop-in\nadapters** that mirror the call shapes of `exa-js`, `@tavily/core`, and `browser-use`, all\nrouted through a single streaming `fill` tool (resolve → execute → capture; a browser opens\nonly as a fallback) that can be wallet-bound so each request is Ed25519-signed:\n\n```ts\nimport Exa from \"@unbrowse/sdk/adapters/exa\";        // was: import Exa from \"exa-js\"\nconst { results } = await new Exa(key).search(\"anthropic news\", { numResults: 5 });\n```\n\nFull surface (exa / tavily / browser-use + the wallet-protected `fill` tool): [docs/adapters.md](./docs/adapters.md).\n\n## Install — pick one\n\n### Option 1 — MCP (drop-in for any MCP host)\n\nAdd this once to your host config (Claude Desktop, Cursor, Codex, Open Code, Windsurf, or anything that speaks MCP):\n\n```json\n{\n  \"mcpServers\": {\n    \"unbrowse\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"unbrowse\", \"mcp\"]\n    }\n  }\n}\n```\n\nThat's it. `npx` fetches the `unbrowse` binary on first run; every web task in that host now routes through Unbrowse. Local browsing tools (`unbrowse_go`, `unbrowse_snap`, `unbrowse_eval`, `unbrowse_fetch`) work without registration. Backend-bound tools (`unbrowse_resolve`, `unbrowse_execute`, `unbrowse_publish`, `unbrowse_earnings`) require an API key — register at [unbrowse.ai/login?cli=1](https://unbrowse.ai/login?cli=1) or run `npx unbrowse register`. To earn USDC on captured routes, pair a wallet via `npx @crossmint/lobster-cli setup`.\n\n### Option 2 — TypeScript SDK\n\nOne SDK, one install. The HTTP-first client ships inside the `unbrowse` package and is imported from `unbrowse/sdk` — browser + Node 18+, zero runtime deps, talks directly to the hosted Unbrowse API (no local binary required).\n\n```bash\nnpm i unbrowse\n```\n\n```ts\nimport { Unbrowse } from \"unbrowse/sdk\";\n\nconst unbrowse = new Unbrowse({ apiKey: process.env.UNBROWSE_API_KEY });\n\nconst result = await unbrowse.resolve({\n  intent: \"search hackernews for AI agent papers\",\n});\n\nconst data = await unbrowse.execute({\n  endpoint_id: result.available_operations![0].endpoint_id,\n  params: { q: \"agents\" },\n});\n```\n\nRegister at [unbrowse.ai/login?cli=1](https://unbrowse.ai/login?cli=1) for an API key. The same install also provides the `unbrowse` CLI and the MCP server (`npx unbrowse mcp`) — see [SKILL.md](./SKILL.md) for the full surface.\n\n### Option 3 — Standalone CLI\n\nIf you just want the binary on your machine:\n\n```bash\ncurl -fsSL https://unbrowse.ai/install.sh | sh\n```\n\nThe installer detects your platform, downloads the matching release tarball, installs `unbrowse` into `~/.local/bin`, then runs `unbrowse setup`.\n\nFor OpenClaw / `agent-browser` users, the plugin form is also still around — `npx unbrowse-openclaw install --restart` routes every `page.goto()` through Unbrowse — but it is no longer the primary install path.\n\n### Option 4 — Drop-in shim for an existing browser tool\n\nIf you already have a codebase on Playwright, Firecrawl, or Browserbase Stagehand, change **one import line**:\n\n```diff\n- import { chromium } from 'playwright';\n+ import { chromium } from '@unbrowse/playwright-shim';\n\n- import Firecrawl from '@mendable/firecrawl-js';\n+ import Firecrawl from '@unbrowse/firecrawl-shim';\n\n- import { Stagehand } from '@browserbasehq/stagehand';\n+ import { Stagehand } from '@unbrowse/stagehand-shim';\n```\n\nEvery `goto / scrape / act / extract` short-circuits through the Unbrowse marketplace cache first. Cache hit → free synthesized response. Miss → falls through to the original library (kept as an optional peer dep) so your existing API key still works. **You pay the original vendor only when we miss.**\n\nSide-by-side on each: [/compare/playwright](https://unbrowse.ai/compare/playwright), [/compare/firecrawl](https://unbrowse.ai/compare/firecrawl), [/compare/browserbase](https://unbrowse.ai/compare/browserbase).\n\n## How payments work\n\nUnbrowse routes monetize on use. Every `unbrowse_execute` against a priced route, every `unbrowse_search`, and any priced shortlist returned by `unbrowse_resolve` settles inline through HTTP-native micropayments on Solana mainnet via [Faremeter Flex](https://docs.faremeter.xyz/flex/overview) (v6.16+). The server replies `402 Payment Required` with a Flex-shaped `accepts[]`; the client signs an off-chain Ed25519 authorization with their session key; the response carries the proof. Protocol-level mechanics in the developer appendix below.\n\nYou have three ways to pay:\n\n1. **Sponsored credit (default).** Brand-new agents get a daily allowance of platform-sponsored execute calls before they need to fund a wallet — so creators start earning USDC the moment their captured routes are reused. Sponsored responses include `X-Sponsored: \u003cledger_id\u003e`. Once you've burned through the daily allowance the server returns 402 with `X-Sponsor-Exhausted: 1`; the SDK throws `SponsorExhaustedError`. Opt out per-request with `X-No-Sponsor: 1`.\n2. **Your wallet + Flex escrow.** Pair a Solana mainnet wallet, fund a Flex escrow with USDC, register a session key — three steps walked through by `unbrowse setup` or `/account`. The SDK catches `PaymentRequiredError`, calls `payAndRetryFlex(error, wallet)`, signs the authorization, packs a payment header, and returns the data. Your wallet's USDC ATA also receives your contributor share when other agents replay routes you captured. Settlement is split natively in every signed authorization across the indexer, the platform, and (when claimed) the site owner — the exact mechanics live in [`docs/concepts/fare-splits.md`](./docs/concepts/fare-splits.md).\n3. **Stripe subscription + overage.** Same `/v1/account` surface, same `unbrowse_settings`, for teams that prefer a card on file.\n\n\u003e Protocol appendix (for implementers): the payment flow is the canonical [x402](https://www.x402.org) protocol; payment proofs travel in the `X-PAYMENT` request header. The runtime exposes `payAndRetryFlex` so most agents never touch the protocol directly.\n\nPayment architecture: [`docs/concepts/fare-splits.md`](./docs/concepts/fare-splits.md). Wallet + escrow + session-key setup: [`docs/wallets.md`](./docs/wallets.md). SDK-level error handling: [`packages/sdk/docs/payments/`](./packages/sdk/docs/payments/).\n\n## MCP server\n\n`unbrowse mcp` is the MCP server entrypoint over stdio.\n\n- Protocol: JSON-RPC 2.0 MCP over stdio\n- Handshake: `initialize`, `notifications/initialized`, `ping`\n- Capability surface: `tools/list`, `tools/call`, `resources/list`, `resources/read`, `prompts/list`, `prompts/get`\n- Runtime model: the MCP server fronts the local Unbrowse runtime on `http://localhost:6969`; hosts talk standard MCP, and Unbrowse uses the local HTTP runtime behind the scenes.\n\nCore MCP tools:\n\n- Discovery: `unbrowse_health`, `unbrowse_search`, `unbrowse_resolve`, `unbrowse_execute`, `unbrowse_feedback`\n- Auth/cache: `unbrowse_login`, `unbrowse_skills`, `unbrowse_skill`, `unbrowse_sessions`\n- Browser capture: `unbrowse_go`, `unbrowse_snap`, `unbrowse_click`, `unbrowse_fill`, `unbrowse_type`, `unbrowse_press`, `unbrowse_select`, `unbrowse_scroll`, `unbrowse_submit`, `unbrowse_screenshot`, `unbrowse_text`, `unbrowse_markdown`, `unbrowse_cookies`, `unbrowse_eval`, `unbrowse_sync`, `unbrowse_close`\n- Local pipeline + introspection: `unbrowse_index`, `unbrowse_settings` (now also reports `sponsor_status` — daily credit remaining and cap)\n\nIndexed/published workflow MCP resources/prompts:\n\n- `workflow_publish://\u003cskill\u003e` — exported workflow artifact summary\n- `workflow_contract://\u003cskill\u003e/\u003cendpoint\u003e` — sanitized replay contract: params, enums, prerequisites, payment requirements, provenance hints, next-state checks\n- `workflow_dag://\u003cskill\u003e/\u003cendpoint\u003e` — dependency walk view for one indexed/published edge\n- `plan_workflow_execution` — prompt scaffold for inspecting the contract + DAG before traversal vs explicit replay\n\nFor most MCP hosts the standard flow is `unbrowse_resolve` → `unbrowse_execute`. For JS-heavy or first-time capture, use the browser tool chain: `unbrowse_go` → `unbrowse_snap` → action tools → `unbrowse_submit` → `unbrowse_sync` → `unbrowse_close`.\n\n## Common commands\n\n```bash\nunbrowse health\nunbrowse mcp\nunbrowse resolve --intent \"get trending searches\" --url \"https://google.com\" --pretty\nunbrowse login --url \"https://calendar.google.com\"\nunbrowse skills\nunbrowse search --intent \"get stock prices\"\n```\n\nLocal capture/publish policy is configurable:\n\n```bash\nunbrowse config set telemetry false\nunbrowse settings --auto-publish off\nunbrowse settings --publish-blacklist \"linkedin.com,x.com\"\nunbrowse settings --publish-promptlist \"github.com\"\n```\n\nAuto-publish is off by default. `fetch` stays local unless you pass `--publish`. Those settings only affect automatic publish after explicit checkpoints (`sync`, `close`). Local `index` still works, and explicit `publish` is still available with confirmation when a guarded domain is intentional.\n\n## Upgrading\n\nUnbrowse no longer self-updates at runtime. After each release, run:\n\n```bash\nunbrowse upgrade\n```\n\nCodex and Claude hosts also get a session-start update hint during `unbrowse setup`, so newer releases are surfaced before the CLI drifts too far behind.\n\nIf you installed from a repo clone:\n\n```bash\ncd ~/unbrowse\ngit pull --ff-only\n./setup --host off\n```\n\nNeed help or want release updates? Discord: [discord.gg/VWugEeFNsG](https://discord.gg/VWugEeFNsG). Public docs: [docs.unbrowse.ai](https://docs.unbrowse.ai).\n\n## Repo checkout\n\nFor monorepo development, initialize submodules after cloning:\n\n```bash\ngit submodule update --init --recursive\n```\n\nThis pulls the tracked Kuri source into `submodules/kuri` from [justrach/kuri](https://github.com/justrach/kuri.git). `npm pack --workspace packages/skill` (directory name historical — the package publishes as `unbrowse` on npm) then bundles platform-specific Kuri binaries from that source into the published CLI package.\n\n## Docs\n\nLong-form docs live under [`docs/`](./docs/). Public repo entrypoints:\n\n- [`docs/guides/quickstart.md`](./docs/guides/quickstart.md) — canonical install, setup, and headless bootstrap path\n- [`docs/for-agents/how-an-agent-uses-unbrowse.md`](./docs/for-agents/how-an-agent-uses-unbrowse.md) — route-level behavior and agent workflow\n- [`docs/for-developers/integration-surfaces.md`](./docs/for-developers/integration-surfaces.md) — MCP, SDK, and CLI integration surfaces\n- [`docs/concepts/fare-splits.md`](./docs/concepts/fare-splits.md) — payment + sponsor flow on Faremeter Flex\n- [`docs/wallets.md`](./docs/wallets.md) — wallet, escrow, session-key setup, payout\n- [`docs/SECURITY.md`](./docs/SECURITY.md) — security model for public packages and runtime integrity\n\nWhitepaper companion set:\n\n- [`docs/whitepaper/README.md`](./docs/whitepaper/README.md) — public companion index\n- [`docs/whitepaper/for-technical-readers.md`](./docs/whitepaper/for-technical-readers.md) — architecture, eval truth, product boundary\n- [`docs/whitepaper/for-investors.md`](./docs/whitepaper/for-investors.md) — market and business framing\n\n## Architecture\n\nUnbrowse is a monorepo with two tiers:\n\n**Local server** (`localhost:6969`) — Handles the core workflow: intent resolution, browser capture, skill execution, auth management, background indexing, payment gates. Local routes are handled directly; marketplace routes are proxied transparently.\n\n**Backend API** (`beta-api.unbrowse.ai`) — Cloudflare Worker that powers the shared marketplace:\n\n- **Skill storage** — KV-backed skill manifests with versioning and intent-based dedup\n- **Discovery** — Semantic vector search using Gemini embeddings (1536-dim) indexed in EmergentDB, with KV keyword fallback\n- **Scoring** — EMA-based reliability scoring factoring success ratio, consecutive failures, feedback ratings, schema drift, and verification status\n- **Agents** — Self-registration via Unkey API keys, profiles tracking contributions\n- **Endpoint graph** — Operation nodes and typed edges (parent/child, pagination, auth) published alongside skills\n- **Transactions** — KV-based payment ledger with consumer/creator visibility (and a sponsor-ledger lane for platform-funded calls)\n- **Issues** — Auto-filed from agent telemetry and manual agent reports\n\nSix-layer pipeline:\n\n1. **Passive capture** — the local runtime observes browser requests during an explicit session and keeps sensitive request material local.\n2. **Checkpoint + indexing** — `sync` or `close` queues a background route-indexing pass; only sanitized route metadata is eligible for marketplace publish.\n3. **Cache-first resolution** — In-memory cache → route cache (24h) → domain skill cache (7d) → local skill snapshots → marketplace semantic search → first-pass browser (8s) → live capture (last resort). Second visits resolve in \u003c200 ms with no browser launch.\n4. **Browser replacement API** — `Browser.launch()` + `page.goto()` from the `unbrowse` import resolves from the skill cache first; cache miss falls through to kuri.\n5. **Endpoint graph** — Typed edges (list→detail, pagination, auth) prefetched in the same round-trip. `available_endpoints` in the resolve response reflects graph reachability given the agent's current bindings.\n6. **Marketplace + payments** — New unverified submissions land in a shadow state until corroborated. Brand-new endpoints on an existing public skill also stay shadow until independently verified. Skill creators set a price per execution; sponsored calls cover brand-new agents' first calls so creators earn from day zero. See [`docs/concepts/fare-splits.md`](./docs/concepts/fare-splits.md) (payment + sponsor flow).\n\n## Authentication\n\nFor sites that require login, Unbrowse opens a visible browser window and waits for you to complete the login flow. Cookies and session state are saved to a persistent profile under `~/.unbrowse/profiles/\u003cdomain\u003e/` and reused automatically.\n\n```bash\ncurl -s -X POST http://localhost:6969/v1/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"https://calendar.google.com\"}'\n```\n\n### How marketing-page redirects are handled\n\nMany sites redirect unauthenticated users to a marketing page (e.g. `calendar.google.com` → `workspace.google.com/products/calendar`) instead of a login form. Unbrowse detects this and redirects to the canonical sign-in URL for Google, Microsoft, GitHub, Notion, LinkedIn, X, Slack, Atlassian, Salesforce, Figma, Airtable, Dropbox, and HubSpot. For anything not in that table, Unbrowse falls back to `\u003corigin\u003e/login`. If that's wrong, pass the login URL directly. To add a provider, append an entry to `SIGN_IN_PROVIDERS` in `src/auth/index.ts`.\n\n## Debug logs\n\nAll auth and capture activity is logged to `~/.unbrowse/logs/unbrowse-YYYY-MM-DD.log` (one file per day) and printed to the server terminal in real time.\n\n```bash\ntail -f ~/.unbrowse/logs/unbrowse-$(date +%F).log\n```\n\nLog files are plain text — cookie values are present, so redact before sharing.\n\n## Data directories\n\n| Path                                  | Contents                                                    |\n| ------------------------------------- | ----------------------------------------------------------- |\n| `~/.unbrowse/profiles/\u003cdomain\u003e/`      | Persistent browser profile (cookies, localStorage, session) |\n| `~/.unbrowse/config.json`             | Agent credentials and marketplace API key                   |\n| `~/.unbrowse/logs/`                   | Daily debug logs                                            |\n| `~/.unbrowse/skill-snapshots/`        | Cached skill manifests from background indexing             |\n| `~/.unbrowse/route-cache.json`        | Intent+URL → skill route cache (24h TTL)                    |\n| `~/.unbrowse/domain-skill-cache.json` | Domain → skill mapping for cross-intent reuse (7d TTL)      |\n| `~/.unbrowse/traces/`                 | Anonymized route trace artifacts for telemetry              |\n\n## Environment variables\n\n| Variable           | Default                 | Description                                            |\n| ------------------ | ----------------------- | ------------------------------------------------------ |\n| `PORT`             | `6969`                  | Server port                                            |\n| `HOST`             | `127.0.0.1`             | Server bind address (localhost only by default)        |\n| `UNBROWSE_URL`     | `http://localhost:6969` | Base URL used by the SDK and skill-bundle              |\n| `UNBROWSE_API_KEY` | (auto-generated)        | Marketplace API key (auto-registered on first startup) |\n| `UNBROWSE_API_URL` | `beta-api.unbrowse.ai`  | Backend API URL override                               |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funbrowse-ai%2Funbrowse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funbrowse-ai%2Funbrowse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funbrowse-ai%2Funbrowse/lists"}