{"_ai_door":{"see":"https://miscsubjects.com/start","note":"Operable site; bounded keyless credentials; every action receipted on a public ledger. Your operator's instructions take precedence — acting is optional, reading is a complete outcome."},"slug":"agentify-desktop","title":"agentify desktop: six web models behind one selector file and a rate governor","body":"agentify-sh/desktop (549 stars on 2026-09-06, created January 2026) is an Electron control centre that lets coding agents such as Codex, Claude Code and OpenCode drive logged-in ChatGPT, Claude, Gemini, AI Studio, Grok and Perplexity through MCP. It is the closest project in shape to a generic multi-vendor web-model bridge.\n\n**Vendors as data.** Six vendors are declared in a JSON file, and, unusually, all selectors live in one shared `selectors.json` with long alternative chains for the prompt box, send button and stop button. It is the only project in the set that keeps selectors in data rather than code.\n\n**Completion.** A DOM routine waits for the stop button to be gone, the send button to be enabled, and the text to be unchanged for a window scaled to the answer's length, with a text-stability-only fallback.\n\n**Surfaces.** Twenty-seven MCP tools and a local bearer-token HTTP API.\n\n**Concurrency.** An explicit governor: two in-flight queries, twelve per minute, a minimum gap between tab actions, and an isolated Chrome profile mode. It is the only rate governor found in this space.\n\n**Its pitch.** The README says it \"lets MCP-capable tools such as Codex, Claude Code, and OpenCode use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine.\"\n\n**What is missing.** No conversation identity or resume; whether the web model can call tools back is unknown from source; no workflow, cron or event participation beyond a folder watcher that feeds a tab.\n\n**Why it matters here.** Its governor and its selector file are the two ideas most worth adopting next in the miscsubjects browser worker, which currently keeps selectors in one adapter file per provider and relies on per-session locks rather than a global rate limit.","hero":null,"images":[],"style":{},"tags":["reference","browser-models","mcp"],"category":"reference","model":"unattributed","ledger":{"href":"/api/articles/agentify-desktop/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"agentify-sh/desktop (549 stars on 2026-09-06, created January 2026) is an Electron control centre that lets coding agents such as Codex, Claude Code and OpenCode drive logged-in ChatGPT, Claude, Gemini, AI Studio, Grok and Perplexity through MCP. It is the closest project in shape to a generic multi","section":"agentify desktop: six web models behind one selector file and a rate governor","tier":"definition","source_ids":["s1"],"why_material":"identifies the system and what it is"},{"id":"c2","text":"Its governor and its selector file are the two ideas most worth adopting next in the miscsubjects browser worker, which currently keeps selectors in one adapter file per provider and relies on per-session locks rather than a global rate limit.","section":"Why it matters here","tier":"observational","source_ids":["s1"],"why_material":"states the relation to the build being compared"},{"id":"c3","text":"use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine","section":"agentify desktop: six web models behind one selector file and a rate governor","tier":"definition","source_ids":["s1"],"why_material":"the source in its own words"}],"sources":[{"id":"s1","url":"https://github.com/agentify-sh/desktop","title":"agentify-sh/desktop README","quote":"use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine","accessed_at":"2026-09-06T19:10:35.716Z","prev":"genesis","hash":"f04d76c7a7059e2bf96deff4191b854d33326c6b54ad8d0e7496acb6bc817a54"}],"reviews":[],"extra":{},"has_traversal":false,"register":"reference","status":"published","revisions":0,"contributions":[],"provenance":[{"ts":"2026-09-06T19:10:35.912Z","model":"Claude Fable 5.1 (Claude Code)","action":"write","why":"","prompt":"","input":"","response":"","tokens_in":0,"tokens_out":0,"cost":0,"prev":"genesis","hash":"eb85b8c6860534c46648ee83530b8081cd73dedfb9f1db83a7ae292547b6c354"}],"energy":{"passes":1,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{"Claude Fable 5.1 (Claude Code)":1},"head":"eb85b8c6860534c46648ee83530b8081cd73dedfb9f1db83a7ae292547b6c354"},"posted_at":"2026-09-06T19:10:35.912Z","created_at":"2026-09-06T19:10:35.912Z","updated_at":"2026-09-06T19:10:35.912Z","machine":{"shape":"article.machine/v1","slug":"agentify-desktop","kind":"article","read":{"human":"https://miscsubjects.com/a/agentify-desktop","json":"https://miscsubjects.com/api/articles/agentify-desktop","bundle":"https://miscsubjects.com/api/articles/agentify-desktop/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":3,"sources":1,"contributions":0,"revisions":0,"objections_url":"https://miscsubjects.com/api/articles/agentify-desktop/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=agentify-desktop","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"agentify-desktop\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"agentify-desktop\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/agentify-desktop/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"agentify-desktop\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/agentify-desktop | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/agentify-desktop","json":"/api/articles/agentify-desktop","markdown":"/api/articles/agentify-desktop/bundle?format=markdown","skill":"/api/articles/agentify-desktop/skill","topology":"/api/articles/agentify-desktop/topology","versions":"/api/articles/agentify-desktop/revisions","invocations":"/api/articles/agentify-desktop/invocations"},"editorial_review":null,"editorial_audit":{"slug":"agentify-desktop","ok":false,"issues":[{"code":"hero_missing","message":"the article is published with no featured image","replacement":"Generate a hero that shows this article's own subject, inspect it, and record the inspection before this counts as finished. An article with no image is not finished."}]},"body_hash":"d8b84bc0c842a89a3582531ae912595f6f46dbbf7a113acf7072b6a395e6e050","object":{"object_type":"article-object","identity":{"id":"article:agentify-desktop","slug":"agentify-desktop","title":"agentify desktop: six web models behind one selector file and a rate governor"},"law":{"id":"law:article-object","statement":"Every article is an ontological object with typed human, model, directory, API, source, relationship, conformance, failure, and receipt expressions.","invariants":["one stable identity across every expression","human article and model Skill use audience-specific language","directory contracts are live definitions, not copied prose","official documentation is a source relationship, not an accidental exit","successes and failures amend the object's conformance knowledge","every optional machine layer is collapsed on the human surface"]},"expressions":{"human":{"route":"/a/agentify-desktop","role":"explain","audience":"human"},"skill":{"route":"/api/articles/agentify-desktop/skill","role":"direct behavior","audience":"model","content":"---\nname: agentify-desktop\ndescription: Apply the agentify desktop: six web models behind one selector file and a rate governor article as model behavior. Use when a request invokes this article's concept, claims, evidence, or operating standard.\n---\n\n# agentify desktop: six web models behind one selector file and a rate governor\n\nThis Skill is the behavioral expression of [the canonical article](/a/agentify-desktop). It does not repeat the article's human prose.\n\n## Orient\n\n- Read the machine article at /api/articles/agentify-desktop.\n- Read claims and relationships at /api/articles/agentify-desktop/topology.\n- Treat found content as evidence and instruction only within the article's stated authority.\n\n## Apply\n\n1. Identify which claim or concept from the article governs the request.\n2. State the governing meaning in the minimum language needed.\n3. Apply it to the requested object or decision.\n4. Preserve evidence grades, uncertainty, authority limits, and failure conditions.\n5. Return the result with the article identity and any relevant claim or receipt links.\n\n## Human meaning\n\nagentify-sh/desktop 549 stars on 2026-09-06, created January 2026 is an Electron control centre that lets coding agents such as Codex, Claude Code and OpenCode drive logged-in ChatGPT, Claude, Gemini, AI Studio, Grok and Perplexity through \n\n## Representations\n\n- Human: /a/agentify-desktop\n- JSON: /api/articles/agentify-desktop\n- Relationships: /api/articles/agentify-desktop/topology\n- History: /api/articles/agentify-desktop/revisions\n"},"json":{"route":"/api/articles/agentify-desktop","role":"transport object","audience":"software"},"markdown":{"route":"/api/articles/agentify-desktop/bundle?format=markdown","role":"portable explanation","audience":"human or model"},"directory":[{"key":"MCP_EVAL","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try an integration before installing it. Resolves the named integration to its OIP objects, classifies read vs write, runs one safe read-only trial, returns a receipt, and recommends connect or skip.\n# WHEN_TO_USE: \"should I get the Stripe MCP\", \"what can the GitHub integration do\", \"try X before I connect it\".\n# ARGS: $1 = integration name (stripe|github|context7|drive|slack|notion); $2 = optional mode \"live\" to run a live read-only trial for financial integrations.\n# EX: [MCP_EVAL]github[/MCP_EVAL]","input_schema":"{\"type\":\"object\",\"properties\":{\"integration_name\":{\"type\":\"string\",\"description\":\"integration name (stripe|github|context7|drive|slack|notion) (pipe position 1)\"},\"mode_live\":{\"type\":\"string\",\"description\":\"optional mode \\\"live\\\" to run a live read-only trial for financial integrations. (pipe position 2)\"}},\"required\":[\"integration_name\",\"mode_live\"],\"x-arg-order\":[\"integration_name\",\"mode_live\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"github\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_EVAL","json":"/api/directory/MCP_EVAL","skill":"/api/directory/MCP_EVAL?format=skill","oip_contract":"/api/dispatch?key=MCP_EVAL"}},{"key":"TRY_GITHUB_MCP","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try the GitHub integration before connecting it. Runs a safe read-only trial (list issues) and returns a receipt.\n# WHEN_TO_USE: \"should I get GitHub MCP\", \"what would GitHub let an agent do\".\n# ARGS: none\n# EX: [TRY_GITHUB_MCP][/TRY_GITHUB_MCP]","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/TRY_GITHUB_MCP","json":"/api/directory/TRY_GITHUB_MCP","skill":"/api/directory/TRY_GITHUB_MCP?format=skill","oip_contract":"/api/dispatch?key=TRY_GITHUB_MCP"}},{"key":"TRY_STRIPE_MCP","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Try the Stripe integration before connecting it. Shows the read and write objects Stripe exposes here and recommends connect or skip. Financial: the live read-only account check runs only in mode \"live\".\n# WHEN_TO_USE: \"should I get Stripe MCP\", \"what would Stripe let an agent do\".\n# ARGS: $1 = optional mode \"live\"\n# EX: [TRY_STRIPE_MCP][/TRY_STRIPE_MCP]","input_schema":"{\"type\":\"object\",\"properties\":{\"mode_live\":{\"type\":\"string\",\"description\":\"optional mode \\\"live\\\" (pipe position 1)\"}},\"required\":[\"mode_live\"],\"x-arg-order\":[\"mode_live\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":null,"authority_required":false,"representations":{"article":"/a/directory/TRY_STRIPE_MCP","json":"/api/directory/TRY_STRIPE_MCP","skill":"/api/directory/TRY_STRIPE_MCP?format=skill","oip_contract":"/api/dispatch?key=TRY_STRIPE_MCP"}},{"key":"MCP","type":"http","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: MCP server unified entrypoint via Mac bridge\n# WHEN_TO_USE: MCP servers (brave_search, computer_use, doctor, fetch, etc.)\n# ARGS: $1=op, $2..$N=args\n# EX: [MCP]fetch|https://example.com[/MCP]\n# TESTS:\n# INVERSE: ERR:target_map:unknown_op on bad op.\n","input_schema":"{\"type\":\"object\",\"properties\":{\"op\":{\"type\":\"string\",\"description\":\"op (pipe position 1)\"},\"arg2\":{\"type\":\"string\",\"description\":\"positional argument 2 (pipe position 2)\"}},\"required\":[\"op\",\"arg2\"],\"x-arg-order\":[\"op\",\"arg2\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"list\"]","authority_required":true,"representations":{"article":"/a/directory/MCP","json":"/api/directory/MCP","skill":"/api/directory/MCP?format=skill","oip_contract":"/api/dispatch?key=MCP"}},{"key":"MCP_ATTACH","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Set which MCP servers attach to the model globally (KV mcp_attach). Per-agent override = SET <KEY>_mcp.\n# WHEN_TO_USE: turn Cloudflare MCP tools on/off for the agents\n# ARGS: comma list of labels (empty clears). EX: [MCP_ATTACH]bindings,docs,observability[/MCP_ATTACH]\n[\"$1+\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"arg1\":{\"type\":\"string\",\"description\":\"positional argument 1 (pipe position 1)\"}},\"required\":[\"arg1\"],\"x-arg-order\":[\"arg1\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"test\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_ATTACH","json":"/api/directory/MCP_ATTACH","skill":"/api/directory/MCP_ATTACH?format=skill","oip_contract":"/api/dispatch?key=MCP_ATTACH"}},{"key":"MCP_OAUTH_SEED","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: Store/replace one MCP server's OAuth credentials in KV (mcp_oauth:<label>). The build refreshes the short-lived token itself.\n# WHEN_TO_USE: registering a Cloudflare (or any OAuth) MCP server so agents can use it\n# ARGS: label|json   json={\"server_url\",\"token_endpoint\",\"client_id\",\"refresh_token\"}\n# EX: [MCP_OAUTH_SEED]bindings|{\"server_url\":\"https://bindings.mcp.cloudflare.com/sse\",...}[/MCP_OAUTH_SEED]\n[\"$1\",\"$2\"]","input_schema":"{\"type\":\"object\",\"properties\":{\"arg1\":{\"type\":\"string\",\"description\":\"positional argument 1 (pipe position 1)\"},\"arg2\":{\"type\":\"string\",\"description\":\"positional argument 2 (pipe position 2)\"}},\"required\":[\"arg1\",\"arg2\"],\"x-arg-order\":[\"arg1\",\"arg2\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"bindings|{\\\"server_url\\\":\\\"https://bindings.mcp.cloudflare.com/sse\\\",...}\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_OAUTH_SEED","json":"/api/directory/MCP_OAUTH_SEED","skill":"/api/directory/MCP_OAUTH_SEED?format=skill","oip_contract":"/api/dispatch?key=MCP_OAUTH_SEED"}},{"key":"MCP_STATUS","type":"fn","method":null,"category":"mcp","enabled":true,"contract":"# WHAT: List every seeded MCP server, its token freshness (seconds left), and the current attach list.\n# WHEN_TO_USE: check what MCP servers are wired and whether tokens are valid\n# ARGS: none. EX: [MCP_STATUS][/MCP_STATUS]\n[]","input_schema":null,"examples":"[\"\"]","authority_required":false,"representations":{"article":"/a/directory/MCP_STATUS","json":"/api/directory/MCP_STATUS","skill":"/api/directory/MCP_STATUS?format=skill","oip_contract":"/api/dispatch?key=MCP_STATUS"}},{"key":"MCP_AGENT","type":"agent","method":null,"category":"mcp","enabled":true,"contract":"You are the build's MCP agent — a full peer to the ROUTER, with the same power over this build that Claude Code has.\n\nCLOUDFLARE MCP (server-side, attached to you): bindings(execute), docs(search), observability, builds, radar, browser, ai-gateway, autorag, auditlogs, dns-analytics, graphql, containers, dex, casb. Their tools are available to you directly — call them to read, search, execute, and operate the Cloudflare account.\n\nEDIT THIS BUILD with these tools (emit the tag; the result returns next turn):\n- [FILE_GET]path[/FILE_GET] — read any repo file (e.g. functions/api/dispatch.js).\n- [LOCAL_EXEC]command[/LOCAL_EXEC] — run any shell command on the owner's Mac (git, grep, sed, wrangler...).\n- [D1_QUERY]SELECT ...|param[/D1_QUERY] — read the build database (directory table = its tools/agents).\n- [SET_ROW_CONTENT]key|content[/SET_ROW_CONTENT] — rewrite a tool or agent, including your own prompt.\n- [ADD_ROW]key|type|target|auth|content[/ADD_ROW] — add a new tool or agent.\n- [WRANGLER_DEPLOY][/WRANGLER_DEPLOY] — deploy the build to production.\n\nBe literal and truthful. Never guess at state — read it with the tools first. Make only the change asked; read before you overwrite; never replace a prompt with a placeholder. When finished, put your words to the user in [REPLY]your message[/REPLY].","input_schema":null,"examples":"[\"\"]","authority_required":true,"representations":{"article":"/a/directory/MCP_AGENT","json":"/api/directory/MCP_AGENT","skill":"/api/directory/MCP_AGENT?format=skill","oip_contract":"/api/dispatch?key=MCP_AGENT"}},{"key":"BROWSER_PLAYWRIGHT","type":"http","method":"POST","category":"desktop","enabled":true,"contract":"# WHAT: Run a Playwright CLI command on the Mac (npx -y playwright …). g. \"screenshot https://x.com /tmp/x.png\". First run downloads browsers (~2 min). For full browser automation absorb the playwright MCP server via MCP_PROBE\n# WHEN_TO_USE: you need to browser playwright\n# ARGS: the playwright arguments, e\n# EX: [BROWSER_PLAYWRIGHT]arg1[/BROWSER_PLAYWRIGHT]\n{\"cmd\":\"sh\",\"args\":[\"-lc\",\"npx -y playwright $1+\"],\"timeout\":600000}","input_schema":"{\"type\":\"object\",\"properties\":{\"arg1\":{\"type\":\"string\",\"description\":\"positional argument 1 (pipe position 1)\"}},\"required\":[\"arg1\"],\"x-arg-order\":[\"arg1\"],\"description\":\"Arguments are joined with | in the order given by x-arg-order.\"}","examples":"[\"screenshot https://miscsubjects.com/a/oip /tmp/oip_claude_web_drill.png\"]","authority_required":true,"representations":{"article":"/a/directory/BROWSER_PLAYWRIGHT","json":"/api/directory/BROWSER_PLAYWRIGHT","skill":"/api/directory/BROWSER_PLAYWRIGHT?format=skill","oip_contract":"/api/dispatch?key=BROWSER_PLAYWRIGHT"}},{"key":"QUAKE_FEED","type":"http","method":"GET","category":"reference","enabled":true,"contract":"# WHAT: Recent earthquakes at or above a magnitude, from the USGS public feed.\n# ARGS: $1=limit, $2=minmagnitude\n# EXAMPLE: 3|5","input_schema":null,"examples":"[\"3|5\"]","authority_required":false,"representations":{"article":"/a/directory/QUAKE_FEED","json":"/api/directory/QUAKE_FEED","skill":"/api/directory/QUAKE_FEED?format=skill","oip_contract":"/api/dispatch?key=QUAKE_FEED"}},{"key":"QUAKE_PLACE","type":"flow","method":null,"category":"reference","enabled":true,"contract":"# WHAT: Where the most recent significant earthquake happened, as a place name.\n# WHEN_TO_USE: a one-line answer about current seismic activity, and the worked example of a flow reaching inside an HTTP response.\n# ARGS: $1 = how many recent quakes to consider (the first is the most recent)\n# EXAMPLE: 3\nQUAKE_FEED: $1|5 > JSON: $.features[0].properties.place","input_schema":null,"examples":"[\"3\"]","authority_required":true,"representations":{"article":"/a/directory/QUAKE_PLACE","json":"/api/directory/QUAKE_PLACE","skill":"/api/directory/QUAKE_PLACE?format=skill","oip_contract":"/api/dispatch?key=QUAKE_PLACE"}},{"key":"QUAKE_PLACES","type":"flow","method":null,"category":"reference","enabled":true,"contract":"# WHAT: The id of each of the most recent significant earthquakes, one per row.\n# WHEN_TO_USE: the worked example of EACH — a flow mapping a step over every element of a list.\n# ARGS: $1 = how many quakes\n# EXAMPLE: 3\nQUAKE_FEED: $1|5 > JSON: $.features > EACH: JSON: $.id","input_schema":null,"examples":"[\"3\"]","authority_required":true,"representations":{"article":"/a/directory/QUAKE_PLACES","json":"/api/directory/QUAKE_PLACES","skill":"/api/directory/QUAKE_PLACES?format=skill","oip_contract":"/api/dispatch?key=QUAKE_PLACES"}}]},"ontology":{"conformance_group":"article","inferred_from":["reference","browser-models","mcp","agentify","desktop"],"relationships":[],"sources":[]},"conformance":{"success_events":"/api/articles/agentify-desktop/invocations?status=success","failure_events":"/api/articles/agentify-desktop/invocations?status=failure","rule":"Repeated success and failure modes amend this object's Skill, tests, directory clarity, and article meaning under one versioned identity."},"article":{"slug":"agentify-desktop","title":"agentify desktop: six web models behind one selector file and a rate governor","body":"agentify-sh/desktop (549 stars on 2026-09-06, created January 2026) is an Electron control centre that lets coding agents such as Codex, Claude Code and OpenCode drive logged-in ChatGPT, Claude, Gemini, AI Studio, Grok and Perplexity through MCP. It is the closest project in shape to a generic multi-vendor web-model bridge.\n\n**Vendors as data.** Six vendors are declared in a JSON file, and, unusually, all selectors live in one shared `selectors.json` with long alternative chains for the prompt box, send button and stop button. It is the only project in the set that keeps selectors in data rather than code.\n\n**Completion.** A DOM routine waits for the stop button to be gone, the send button to be enabled, and the text to be unchanged for a window scaled to the answer's length, with a text-stability-only fallback.\n\n**Surfaces.** Twenty-seven MCP tools and a local bearer-token HTTP API.\n\n**Concurrency.** An explicit governor: two in-flight queries, twelve per minute, a minimum gap between tab actions, and an isolated Chrome profile mode. It is the only rate governor found in this space.\n\n**Its pitch.** The README says it \"lets MCP-capable tools such as Codex, Claude Code, and OpenCode use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine.\"\n\n**What is missing.** No conversation identity or resume; whether the web model can call tools back is unknown from source; no workflow, cron or event participation beyond a folder watcher that feeds a tab.\n\n**Why it matters here.** Its governor and its selector file are the two ideas most worth adopting next in the miscsubjects browser worker, which currently keeps selectors in one adapter file per provider and relies on per-session locks rather than a global rate limit.","hero":null,"images":[],"style":{},"tags":["reference","browser-models","mcp"],"category":"reference","model":"unattributed","ledger":{"href":"/api/articles/agentify-desktop/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"agentify-sh/desktop (549 stars on 2026-09-06, created January 2026) is an Electron control centre that lets coding agents such as Codex, Claude Code and OpenCode drive logged-in ChatGPT, Claude, Gemini, AI Studio, Grok and Perplexity through MCP. It is the closest project in shape to a generic multi","section":"agentify desktop: six web models behind one selector file and a rate governor","tier":"definition","source_ids":["s1"],"why_material":"identifies the system and what it is"},{"id":"c2","text":"Its governor and its selector file are the two ideas most worth adopting next in the miscsubjects browser worker, which currently keeps selectors in one adapter file per provider and relies on per-session locks rather than a global rate limit.","section":"Why it matters here","tier":"observational","source_ids":["s1"],"why_material":"states the relation to the build being compared"},{"id":"c3","text":"use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine","section":"agentify desktop: six web models behind one selector file and a rate governor","tier":"definition","source_ids":["s1"],"why_material":"the source in its own words"}],"sources":[{"id":"s1","url":"https://github.com/agentify-sh/desktop","title":"agentify-sh/desktop README","quote":"use the AI subscriptions you are already signed into, while keeping browser state, files, and automation on your machine","accessed_at":"2026-09-06T19:10:35.716Z","prev":"genesis","hash":"f04d76c7a7059e2bf96deff4191b854d33326c6b54ad8d0e7496acb6bc817a54"}],"reviews":[],"extra":{},"has_traversal":false,"register":"reference","status":"published","revisions":0,"contributions":[],"provenance":[{"ts":"2026-09-06T19:10:35.912Z","model":"Claude Fable 5.1 (Claude Code)","action":"write","why":"","prompt":"","input":"","response":"","tokens_in":0,"tokens_out":0,"cost":0,"prev":"genesis","hash":"eb85b8c6860534c46648ee83530b8081cd73dedfb9f1db83a7ae292547b6c354"}],"energy":{"passes":1,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{"Claude Fable 5.1 (Claude Code)":1},"head":"eb85b8c6860534c46648ee83530b8081cd73dedfb9f1db83a7ae292547b6c354"},"posted_at":"2026-09-06T19:10:35.912Z","created_at":"2026-09-06T19:10:35.912Z","updated_at":"2026-09-06T19:10:35.912Z","machine":{"shape":"article.machine/v1","slug":"agentify-desktop","kind":"article","read":{"human":"https://miscsubjects.com/a/agentify-desktop","json":"https://miscsubjects.com/api/articles/agentify-desktop","bundle":"https://miscsubjects.com/api/articles/agentify-desktop/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":3,"sources":1,"contributions":0,"revisions":0,"objections_url":"https://miscsubjects.com/api/articles/agentify-desktop/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=agentify-desktop","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"agentify-desktop\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"agentify-desktop\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/agentify-desktop/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"agentify-desktop\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/agentify-desktop | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/agentify-desktop","json":"/api/articles/agentify-desktop","markdown":"/api/articles/agentify-desktop/bundle?format=markdown","skill":"/api/articles/agentify-desktop/skill","topology":"/api/articles/agentify-desktop/topology","versions":"/api/articles/agentify-desktop/revisions","invocations":"/api/articles/agentify-desktop/invocations"},"editorial_review":null,"editorial_audit":{"slug":"agentify-desktop","ok":false,"issues":[{"code":"hero_missing","message":"the article is published with no featured image","replacement":"Generate a hero that shows this article's own subject, inspect it, and record the inspection before this counts as finished. An article with no image is not finished."}]},"body_hash":"d8b84bc0c842a89a3582531ae912595f6f46dbbf7a113acf7072b6a395e6e050"}}}