{"id":"426b59fb-5923-467c-9f6e-7d403c38dc06","shortId":"UQPVRm","kind":"skill","title":"pair-agent","tagline":"Pair a remote AI agent with your browser. One command generates a setup key and\nprints instructions the other agent can follow to connect. Works with OpenClaw,\nHermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent\ngets its own tab with scoped access (r","description":"## Preamble\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" 2>/dev/null || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l < \"$_LEARN_FILE\" 2>/dev/null | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>/dev/null; then\n    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n# /pair-agent — Share Your Browser With Another AI Agent\n\nYou're sitting in Claude Code with a browser running. You also have another AI agent\nopen (OpenClaw, Hermes, Codex, Cursor, whatever). You want that other agent to be\nable to browse the web using YOUR browser. This skill makes that happen.\n\n## How it works\n\nYour vibestack browser runs a local HTTP server. This skill creates a one-time setup\nkey, prints a block of instructions, and you paste those instructions into the other\nagent. The other agent exchanges the key for a session token, creates its own tab,\nand starts browsing. Each agent gets its own tab. They can't mess with each other's\ntabs.\n\nThe setup key expires in 5 minutes and can only be used once. If it leaks, it's dead\nbefore anyone can abuse it. The session token lasts 24 hours.\n\n**Same machine:** If the other agent is on the same machine (like OpenClaw running\nlocally), you can skip the copy-paste ceremony and write the credentials directly to\nthe agent's config directory.\n\n**Remote:** If the other agent is on a different machine, you need an ngrok tunnel.\nThe skill will tell you if one is needed and how to set it up.\n\n## SETUP (run this check BEFORE any browse command)\n\n```bash\n_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)\nB=\"\"\n[ -n \"$_ROOT\" ] && [ -x \"$_ROOT/.claude/skills/vibestack/browse/dist/browse\" ] && B=\"$_ROOT/.claude/skills/vibestack/browse/dist/browse\"\n[ -z \"$B\" ] && B=\"$HOME/.claude/skills/vibestack/browse/dist/browse\"\nif [ -x \"$B\" ]; then echo \"READY: $B\"; else echo \"NEEDS_SETUP\"; fi\n```\n\nIf `NEEDS_SETUP`, stop and tell the user:\n\"The browse daemon is required for this skill but is not installed. **vibestack does not bundle the browse daemon** — it's a separate dependency. See [`docs/external-tools.md`](../../docs/external-tools.md#browse-daemon) for current options.\"\n\n## Step 1: Check prerequisites\n\n```bash\n$B status 2>/dev/null\n```\n\nIf the browse server is not running, start it:\n\n```bash\n$B goto about:blank\n```\n\nThis ensures the server is up and healthy before pairing.\n\n## Step 2: Ask what they want\n\nUse AskUserQuestion:\n\n> Which agent do you want to pair with your browser? This determines the\n> instructions format and where credentials get written.\n\nOptions:\n- A) OpenClaw (local or remote)\n- B) Codex / OpenAI Agents (local)\n- C) Cursor (local)\n- D) Another Claude Code session (local or remote)\n- E) Something else (generic HTTP instructions — use this for Hermes)\n\nBased on the answer, set `TARGET_HOST`:\n- A → `openclaw`\n- B → `codex`\n- C → `cursor`\n- D → `claude`\n- E → generic (no host-specific config)\n\n## Step 3: Local or remote?\n\nUse AskUserQuestion:\n\n> Is the other agent running on this same machine, or on a different machine/server?\n>\n> **Same machine** skips the copy-paste ceremony. Credentials are written directly to\n> the agent's config directory. No tunnel needed.\n>\n> **Different machine** generates a setup key and instruction block. If ngrok is\n> installed, the tunnel starts automatically. If not, I'll walk you through setup.\n>\n> RECOMMENDATION: Choose A if the agent is local. It's instant, no copy-paste needed.\n\nOptions:\n- A) Same machine (write credentials directly)\n- B) Different machine (generate instruction block for copy-paste)\n\n## Step 4: Execute pairing\n\n### If same machine (option A):\n\nRun pair-agent with --local flag:\n\n```bash\n$B pair-agent --local TARGET_HOST\n```\n\nReplace `TARGET_HOST` with the value from Step 2 (openclaw, codex, cursor, etc.).\n\nIf it succeeds, tell the user:\n\"Done. TARGET_HOST can now use your browser. It will read credentials from the\nconfig file that was written. Try asking it to navigate to a URL.\"\n\nIf it fails (host not found, write permission error), show the error and suggest\nusing the generic remote flow instead.\n\n### If different machine (option B):\n\nFirst, detect ngrok status:\n\n```bash\nwhich ngrok 2>/dev/null && echo \"NGROK_INSTALLED\" || echo \"NGROK_NOT_INSTALLED\"\nngrok config check 2>/dev/null && echo \"NGROK_AUTHED\" || echo \"NGROK_NOT_AUTHED\"\n```\n\n**If ngrok is installed and authed:** Just run the command. The CLI will auto-detect\nngrok, start the tunnel, and print the instruction block with the tunnel URL:\n\n```bash\n$B pair-agent --client TARGET_HOST\n```\n\nIf the user also needs admin access (JS execution, cookies, storage):\n\n```bash\n$B pair-agent --admin --client TARGET_HOST\n```\n\n**CRITICAL: You MUST output the full instruction block to the user.** The command\nprints everything between ═══ lines. Copy the ENTIRE block verbatim into your\nresponse so the user can copy-paste it into their other agent. Do NOT summarize it,\ndo NOT skip it, do NOT just say \"here's the output.\" The user needs to SEE the block\nto copy it. Output it inside a markdown code block so it's easy to select and copy.\n\nThen tell the user:\n\"Copy the block above and paste it into your other agent's chat. The setup key\nexpires in 5 minutes.\"\n\n**If ngrok is installed but NOT authed:** Walk the user through authentication:\n\nTell the user:\n\"ngrok is installed but not logged in. Let's fix that:\n\n1. Go to https://dashboard.ngrok.com/get-started/your-authtoken\n2. Copy your auth token\n3. Come back here and I'll run the auth command for you.\"\n\nSTOP here and wait for the user to provide their auth token.\n\nWhen they provide it, run:\n```bash\nngrok config add-authtoken THEIR_TOKEN\n```\n\nThen retry `$B pair-agent --client TARGET_HOST`.\n\n**If ngrok is NOT installed:** Walk the user through installation:\n\nTell the user:\n\"To connect a remote agent, we need ngrok (a tunnel that exposes your local\nbrowser to the internet securely).\n\n1. Go to https://ngrok.com and sign up (free tier works)\n2. Install ngrok:\n   - macOS: `brew install ngrok`\n   - Linux: `snap install ngrok` or download from ngrok.com/download\n3. Auth it: `ngrok config add-authtoken YOUR_TOKEN`\n   (get your token from https://dashboard.ngrok.com/get-started/your-authtoken)\n4. Come back here and run `/pair-agent` again.\"\n\nSTOP here. Wait for the user to install ngrok and re-invoke.\n\n## Step 5: Verify connection\n\nAfter the user pastes the instructions into the other agent, wait a moment then check:\n\n```bash\n$B status\n```\n\nLook for the connected agent in the status output. If it appears, tell the user:\n\"The remote agent is connected and has its own tab. You'll see its activity in the\nside panel if you have vibestack Browser open.\"\n\n## What the remote agent can do\n\nWith default (read+write) access:\n- Navigate to URLs, click elements, fill forms, take screenshots\n- Read page content (text, HTML, snapshot)\n- Create new tabs (each agent gets its own)\n- Cannot execute arbitrary JavaScript, read cookies, or access storage\n\nWith admin access (--admin flag):\n- Everything above, plus JS execution, cookie access, storage access\n- Use sparingly. Only for agents you fully trust.\n\n## Troubleshooting\n\n**\"Tab not owned by your agent\"** — The remote agent tried to interact with a tab\nit didn't create. Tell it to run `newtab` first to get its own tab.\n\n**\"Domain not allowed\"** — The token has domain restrictions. Re-pair with broader\ndomain access or no domain restrictions.\n\n**\"Rate limit exceeded\"** — The agent is sending > 10 requests/second. It should\nwait for the Retry-After header and slow down.\n\n**\"Token expired\"** — The 24-hour session expired. Run `/pair-agent` again to\ngenerate a new setup key.\n\n**Agent can't reach the server** — If remote, check the ngrok tunnel is running\n(`$B status`). If local, check the browse server is running.\n\n## Platform-specific notes\n\n### OpenClaw / AlphaClaw\n\nOpenClaw agents use the `exec` tool instead of `Bash`. The instruction block uses\n`exec curl` syntax which OpenClaw understands natively. When using `--local openclaw`,\ncredentials are written to `~/.openclaw/skills/vibestack/browse-remote.json`.\n\n### Codex\n\nCodex agents can execute shell commands via `codex exec`. The instruction block's\ncurl commands work directly. When using `--local codex`, credentials are written\nto `~/.codex/skills/vibestack/browse-remote.json`.\n\n### Cursor\n\nCursor's AI can run terminal commands. The instruction block works as-is.\nWhen using `--local cursor`, credentials are written to\n`~/.cursor/skills/vibestack/browse-remote.json`.\n\n## Revoking access\n\nTo disconnect a specific agent:\n\n```bash\n$B tunnel revoke AGENT_NAME\n```\n\nTo disconnect all agents and rotate the root token:\n\n```bash\n# This invalidates ALL scoped tokens immediately\n$B tunnel rotate\n```","tags":["pair","agent","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering"],"capabilities":["skill","source-timurgaleev","skill-pair-agent","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-cursor-ide","topic-developer-tools","topic-kiro","topic-mcp","topic-prompt-engineering","topic-slash-commands"],"categories":["vibestack"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/timurgaleev/vibestack/pair-agent","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add timurgaleev/vibestack","source_repo":"https://github.com/timurgaleev/vibestack","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (8,908 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:22.427Z","embedding":null,"createdAt":"2026-05-18T19:06:22.427Z","updatedAt":"2026-05-18T19:06:22.427Z","lastSeenAt":"2026-05-18T19:06:22.427Z","tsv":"'/../docs/external-tools.md':400 '/.codex/skills/vibestack/browse-remote.json':1384 '/.cursor/skills/vibestack/browse-remote.json':1408 '/.openclaw/skills/vibestack/browse-remote.json':1357 '/.vibestack/bin/vibe-learnings-search':101 '/.vibestack/bin/vibe-slug':56 '/dev/null':58,60,84,99,105,342,415,725,737 '/download':1046 '/get-started/your-authtoken':935 '/get-started/your-authtoken)':1063 '/learnings.jsonl':71 '/pair-agent':114,1070,1291 '/projects':68 '1':408,930,1020 '10':1269 '2':57,59,83,98,104,341,414,441,654,724,736,936,1030 '24':258,1286 '3':523,941,1047 '4':623,1064 '5':97,103,235,902,1086 'abl':151 'abus':252 'access':51,788,1157,1188,1192,1201,1203,1257,1410 'activ':1136 'add':975,1053 'add-authtoken':974,1052 'admin':787,798,1191,1193 'agent':3,8,23,36,44,121,137,148,197,200,216,265,290,298,449,477,532,557,594,634,642,778,797,838,894,984,1005,1098,1111,1124,1150,1177,1208,1218,1221,1266,1299,1330,1360,1415,1420,1425 'ai':7,120,136,1388 'allow':1245 'alphaclaw':1328 'also':133,785 'anoth':119,135,483 'answer':503 'anyon':250 'appear':1118 'arbitrari':1183 'as-i':1397 'ask':442,685 'askuserquest':447,528 'auth':740,744,750,910,939,950,964,1048 'authent':915 'authtoken':976,1054 'auto':759 'auto-detect':758 'automat':580 'b':343,348,351,352,356,360,412,426,474,509,612,639,716,775,794,981,1105,1313,1417,1438 'back':943,1066 'base':500 'bash':54,332,411,425,638,721,774,793,971,1104,1337,1416,1431 'blank':429 'block':186,572,617,769,809,822,861,871,886,1340,1370,1395 'brew':1034 'broader':1255 'brows':153,214,330,375,391,402,418,1319 'browse-daemon':401 'browser':11,117,130,158,169,457,672,1015,1145 'bundl':389 'c':479,511 'cannot':1181 'ceremoni':282,550 'chat':896 'check':327,409,735,1103,1307,1317 'choos':590 'claud':126,484,514 'cli':756 'click':1161 'client':779,799,985 'code':127,485,870 'codex':32,141,475,510,656,1358,1359,1366,1379 'come':942,1065 'command':13,331,754,814,951,1364,1373,1392 'config':292,521,559,679,734,973,1051 'connect':27,1002,1088,1110,1126 'content':1169 'cooki':791,1186,1200 'copi':280,548,602,620,819,832,863,879,884,937 'copy-past':279,547,601,619,831 'count':78,90,95 'creat':177,208,1173,1231 'credenti':286,465,551,610,676,1353,1380,1404 'critic':802 'curl':1343,1372 'current':405 'cursor':33,142,480,512,657,1385,1386,1403 'd':86,482,513 'daemon':376,392,403 'dashboard.ngrok.com':934,1062 'dashboard.ngrok.com/get-started/your-authtoken':933 'dashboard.ngrok.com/get-started/your-authtoken)':1061 'dead':248 'default':1154 'depend':397 'detect':718,760 'determin':459 'didn':1229 'differ':302,541,564,613,713 'direct':287,554,611,1375 'directori':293,560 'disconnect':1412,1423 'docs/external-tools.md':399 'domain':1243,1249,1256,1260 'done':665 'download':1042 'e':490,515 'easi':875 'echo':87,109,358,362,726,729,738,741 'element':1162 'els':108,361,492 'ensur':431 'entir':821 'entri':91 'error':700,703 'etc':658 'eval':55 'everyth':816,1195 'exceed':1264 'exchang':201 'exec':1333,1342,1367 'execut':624,790,1182,1199,1362 'expir':233,900,1284,1289 'expos':1012 'f':73 'fail':694 'fi':107,113,365 'file':64,75,82,680 'fill':1163 'first':717,1237 'fix':928 'flag':637,1194 'flow':710 'follow':25 'form':1164 'format':462 'found':697 'free':1027 'full':807 'fulli':1210 'generat':14,566,615,1294 'generic':493,516,708 'get':45,217,466,1057,1178,1239 'git':334 'go':931,1021 'goto':427 'gt':96 'happen':163 'header':1279 'healthi':437 'herm':31,140,499 'home':66 'home/.claude/skills/vibestack/browse/dist/browse':353 'home/.vibestack':67 'host':506,519,645,648,667,695,781,801,987 'host-specif':518 'hour':259,1287 'html':1171 'http':40,173,494 'immedi':1437 'insid':867 'instal':385,576,728,732,748,907,921,992,997,1031,1035,1039,1079 'instant':599 'instead':711,1335 'instruct':20,188,193,461,495,571,616,768,808,1094,1339,1369,1394 'interact':1224 'internet':1018 'invalid':1433 'invok':1084 'javascript':1184 'js':789,1198 'key':17,183,203,232,569,899,1298 'l':80 'last':257 'leak':245 'learn':63,74,77,81,88,89,94,110 'let':926 'like':271 'limit':102,1263 'line':818 'linux':1037 'll':584,947,1133 'load':92 'local':172,274,471,478,481,487,524,596,636,643,1014,1316,1351,1378,1402 'log':924 'look':1107 'machin':261,270,303,537,544,565,608,614,628,714 'machine/server':542 'maco':1033 'make':39,161 'markdown':869 'mess':224 'minut':236,903 'moment':1101 'must':804 'n':344 'name':1421 'nativ':1348 'navig':688,1158 'need':305,317,363,367,563,604,786,857,1007 'new':1174,1296 'newtab':1236 'ngrok':307,574,719,723,727,730,733,739,742,746,761,905,919,972,989,1008,1032,1036,1040,1050,1080,1309 'ngrok.com':1023,1045 'ngrok.com/download':1044 'none':111 'note':1326 'one':12,180,315 'one-tim':179 'open':138,1146 'openai':476 'openclaw':30,139,272,470,508,655,1327,1329,1346,1352 'option':406,468,605,629,715 'output':805,854,865,1115 'own':1215 'page':1168 'pair':2,4,439,454,625,633,641,777,796,983,1253 'pair-ag':1,632,640,776,795,982 'panel':1140 'pars':337 'past':191,281,549,603,621,833,889,1092 'permiss':699 'platform':1324 'platform-specif':1323 'plus':1197 'preambl':53 'prerequisit':410 'print':19,184,766,815 'provid':962,968 'r':52 'rate':1262 're':123,1083,1252 're-invok':1082 're-pair':1251 'reach':1302 'read':675,1155,1167,1185 'readi':359 'recommend':589 'remot':6,43,294,473,489,526,709,1004,1123,1149,1220,1306 'replac':646 'request':41 'requests/second':1270 'requir':378 'respons':826 'restrict':1250,1261 'retri':980,1277 'retry-aft':1276 'rev':336 'rev-pars':335 'revok':1409,1419 'root':333,345,1429 'root/.claude/skills/vibestack/browse/dist/browse':347,349 'rotat':1427,1440 'run':131,170,273,325,422,533,631,752,948,970,1069,1235,1290,1312,1322,1390 'say':850 'scope':50,1435 'screenshot':1166 'secur':1019 'see':398,859,1134 'select':877 'send':1268 'separ':396 'server':174,419,433,1304,1320 'session':206,255,486,1288 'set':321,504 'setup':16,182,231,324,364,368,568,588,898,1297 'share':115 'shell':1363 'show':339,701 'show-toplevel':338 'side':1139 'sign':1025 'sit':124 'skill':160,176,310,381 'skill-pair-agent' 'skip':277,545,845 'slow':1281 'slug':61,69 'snap':1038 'snapshot':1172 'someth':491 'source-timurgaleev' 'spare':1205 'specif':520,1325,1414 'start':213,423,579,762 'status':413,720,1106,1114,1314 'step':407,440,522,622,653,1085 'stop':369,954,1072 'storag':792,1189,1202 'succeed':661 'suggest':705 'summar':841 'syntax':1344 'tab':48,211,220,229,1131,1175,1213,1227,1242 'take':1165 'target':505,644,647,666,780,800,986 'tell':312,371,662,881,916,998,1119,1232 'termin':1391 'text':1170 'tier':1028 'time':181 'token':207,256,940,965,978,1056,1059,1247,1283,1430,1436 'tool':1334 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-cursor-ide' 'topic-developer-tools' 'topic-kiro' 'topic-mcp' 'topic-prompt-engineering' 'topic-slash-commands' 'toplevel':340 'tr':85 'tri':684,1222 'troubleshoot':1212 'true':106 'trust':1211 'tunnel':308,562,578,764,772,1010,1310,1418,1439 'understand':1347 'unknown':62,70 'url':691,773,1160 'use':156,241,446,496,527,670,706,1204,1331,1341,1350,1377,1401 'user':373,664,784,812,829,856,883,913,918,960,995,1000,1077,1091,1121 'valu':651 'verbatim':823 'verifi':1087 'via':1365 'vibestack':65,168,386,1144 'wait':957,1074,1099,1273 'walk':585,911,993 'want':145,445,452 'wc':79 'web':155 'whatev':143 'work':28,166,1029,1374,1396 'write':284,609,698,1156 'written':467,553,683,1355,1382,1406 'x':346,355 'yet':112 'z':350","prices":[{"id":"216c9961-8045-4cb5-838d-6233e6e23a0b","listingId":"426b59fb-5923-467c-9f6e-7d403c38dc06","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"timurgaleev","category":"vibestack","install_from":"skills.sh"},"createdAt":"2026-05-18T19:06:22.427Z"}],"sources":[{"listingId":"426b59fb-5923-467c-9f6e-7d403c38dc06","source":"github","sourceId":"timurgaleev/vibestack/pair-agent","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/pair-agent","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:22.427Z","lastSeenAt":"2026-05-18T19:06:22.427Z"}],"details":{"listingId":"426b59fb-5923-467c-9f6e-7d403c38dc06","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"pair-agent","github":{"repo":"timurgaleev/vibestack","stars":15,"topics":["agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"license":"mit","html_url":"https://github.com/timurgaleev/vibestack","pushed_at":"2026-05-18T18:19:05Z","description":"vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others. ","skill_md_sha":"c0c24c1ba48a4167227a71e85797a37435d247e7","skill_md_path":"skills/pair-agent/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/pair-agent"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"pair-agent","description":"Pair a remote AI agent with your browser. One command generates a setup key and\nprints instructions the other agent can follow to connect. Works with OpenClaw,\nHermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent\ngets its own tab with scoped access (read+write by default, admin on request).\nUse when asked to \"pair agent\", \"connect agent\", \"share browser\", \"remote browser\",\n\"let another agent use my browser\", or \"give browser access\"."},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/pair-agent"},"updatedAt":"2026-05-18T19:06:22.427Z"}}