{"id":"776dcd84-722c-4715-b5a8-9dba51ddacf8","shortId":"Ew9LbR","kind":"skill","title":"open-browser","tagline":"Launch vibestack Browser — AI-controlled Chromium with the sidebar extension baked in.\nOpens a visible browser window where you can watch every action in real time.\nThe sidebar shows a live activity feed and chat. Anti-bot stealth built in.\nUse when asked to \"open browser\", \"laun","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# /open-browser — Launch vibestack Browser\n\nLaunch vibestack Browser — AI-controlled Chromium with the sidebar extension,\nanti-bot stealth, and real-time visibility. You see every action as it happens.\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---\n\n## Step 0: Pre-flight cleanup\n\nBefore connecting, kill any stale browse servers and clean up lock files that\nmay have persisted from a crash. This prevents \"already connected\" false\npositives and Chromium profile lock conflicts.\n\n```bash\n# Kill any existing browse server\n_REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)\n_BROWSE_STATE=\"\"\n[ -n \"$_REPO_ROOT\" ] && _BROWSE_STATE=\"$_REPO_ROOT/.vibestack/browse.json\"\n[ -z \"$_BROWSE_STATE\" ] || [ ! -f \"$_BROWSE_STATE\" ] && _BROWSE_STATE=\"$HOME/.vibestack/browse.json\"\nif [ -f \"$_BROWSE_STATE\" ]; then\n  _OLD_PID=$(grep -o '\"pid\":[0-9]*' \"$_BROWSE_STATE\" 2>/dev/null | grep -o '[0-9]*')\n  [ -n \"$_OLD_PID\" ] && kill \"$_OLD_PID\" 2>/dev/null || true\n  sleep 1\n  [ -n \"$_OLD_PID\" ] && kill -9 \"$_OLD_PID\" 2>/dev/null || true\n  rm -f \"$_BROWSE_STATE\"\nfi\n# Clean Chromium profile locks (can persist after crashes)\n_PROFILE_DIR=\"$HOME/.vibestack/chromium-profile\"\nfor _LF in SingletonLock SingletonSocket SingletonCookie; do\n  rm -f \"$_PROFILE_DIR/$_LF\" 2>/dev/null || true\ndone\necho \"Pre-flight cleanup done\"\n```\n\n## Step 1: Connect\n\n```bash\n$B connect\n```\n\nThis launches vibestack Browser (rebranded Chromium) in headed mode with:\n- A visible window you can watch (not your regular Chrome — it stays untouched)\n- The sidebar extension auto-loaded via `launchPersistentContext`\n- Anti-bot stealth patches (sites like Google and NYTimes work without captchas)\n- Custom user agent in Dock/menu bar\n- A sidebar agent process for chat commands\n\nThe `connect` command auto-discovers the extension from the install directory.\nIt always uses port **34567** so the extension can auto-connect.\n\nAfter connecting, print the full output to the user. Confirm you see\n`Mode: headed` in the output.\n\nIf the output shows an error or the mode is not `headed`, run `$B status` and\nshare the output with the user before proceeding.\n\n## Step 2: Verify\n\n```bash\n$B status\n```\n\nConfirm the output shows `Mode: headed`. Read the port from the state file:\n\n```bash\n_REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)\n_STATE_FILE=\"\"\n[ -n \"$_REPO_ROOT\" ] && [ -f \"$_REPO_ROOT/.vibestack/browse.json\" ] && _STATE_FILE=\"$_REPO_ROOT/.vibestack/browse.json\"\n[ -z \"$_STATE_FILE\" ] && _STATE_FILE=\"$HOME/.vibestack/browse.json\"\ngrep -o '\"port\":[0-9]*' \"$_STATE_FILE\" 2>/dev/null | grep -o '[0-9]*'\n```\n\nThe port should be **34567**. If it's different, note it — the user may need it\nfor the Side Panel.\n\nAlso find the extension path so you can help the user if they need to load it manually:\n\n```bash\n_EXT_PATH=\"\"\n_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)\n[ -n \"$_ROOT\" ] && [ -f \"$_ROOT/.claude/skills/vibestack/extension/manifest.json\" ] && _EXT_PATH=\"$_ROOT/.claude/skills/vibestack/extension\"\n[ -z \"$_EXT_PATH\" ] && [ -f \"$HOME/.claude/skills/vibestack/extension/manifest.json\" ] && _EXT_PATH=\"$HOME/.claude/skills/vibestack/extension\"\necho \"EXTENSION_PATH: ${_EXT_PATH:-NOT FOUND}\"\n```\n\n## Step 3: Guide the user to the Side Panel\n\nUse AskUserQuestion:\n\n> Chrome is launched with vibestack control. You should see Playwright's Chromium\n> (not your regular Chrome) with a shimmer line at the top of the page.\n>\n> The Side Panel extension should be auto-loaded. To open it:\n> 1. Look for the **puzzle piece icon** (Extensions) in the toolbar\n> 2. Click the **puzzle piece** → find **vibestack browse** → click the **pin icon**\n> 3. Click the pinned icon in the toolbar\n> 4. The Side Panel should open on the right showing a live activity feed\n>\n> **Port:** 34567 (auto-detected — the extension connects automatically in the\n> Playwright-controlled Chrome).\n\nOptions:\n- A) I can see the Side Panel — let's go!\n- B) I can see Chrome but can't find the extension\n- C) Something went wrong\n\nIf B: Tell the user:\n\n> The extension is loaded into Playwright's Chromium at launch time, but\n> sometimes it doesn't appear immediately. Try these steps:\n>\n> 1. Type `chrome://extensions` in the address bar\n> 2. Look for the **vibestack browse** extension — it should be listed and enabled\n> 3. If it's there but not pinned, go back to any page, click the puzzle piece\n>    icon, and pin it\n> 4. If it's NOT listed at all, click **\"Load unpacked\"** and navigate to:\n>    - Press **Cmd+Shift+G** in the file picker dialog\n>    - Paste this path: `{EXTENSION_PATH}` (use the path from Step 2)\n>    - Click **Select**\n>\n> After loading, pin it and click the icon to open the Side Panel.\n>\n> If the Side Panel badge stays gray (disconnected), click the icon\n> and enter port **34567** manually.\n\nIf C:\n\n1. Run `$B status` and show the output\n2. If the server is not healthy, re-run Step 0 cleanup + Step 1 connect\n3. If the server IS healthy but the browser isn't visible, try `$B focus`\n4. If that fails, ask the user what they see (error message, blank screen, etc.)\n\n## Step 4: Demo\n\nAfter the user confirms the Side Panel is working, run a quick demo:\n\n```bash\n$B goto https://github.com\n```\n\nWait 2 seconds, then:\n\n```bash\n$B snapshot -i\n```\n\nTell the user: \"Check the Side Panel — you should see the `goto` and `snapshot`\ncommands appear in the activity feed. Every command Claude runs shows up here\nin real time.\"\n\n## Step 5: Sidebar chat\n\nAfter the activity feed demo, tell the user about the sidebar chat:\n\n> The Side Panel also has a **chat tab**. Try typing a message like \"take a\n> snapshot and describe this page.\" A sidebar agent (a child Claude instance)\n> executes your request in the browser — you'll see the commands appear in\n> the activity feed as they happen.\n>\n> The sidebar agent can navigate pages, click buttons, fill forms, and read\n> content. Each task gets up to 5 minutes. It runs in an isolated session, so\n> it won't interfere with this Claude Code window.\n\n## Step 6: What's next\n\nTell the user:\n\n> You're all set! Here's what you can do with the connected Chrome:\n>\n> **Watch Claude work in real time:**\n> - Run any vibestack skill (`/qa`, `/design-review`, `/benchmark`) and watch\n>   every action happen in the visible Chrome window + Side Panel feed\n> - No cookie import needed — the Playwright browser shares its own session\n>\n> **Control the browser directly:**\n> - **Sidebar chat** — type natural language in the Side Panel and the sidebar\n>   agent executes it (e.g., \"fill in the login form and submit\")\n> - **Browse commands** — `$B goto <url>`, `$B click <sel>`, `$B fill <sel> <val>`,\n>   `$B snapshot -i` — all visible in Chrome + Side Panel\n>\n> **Window management:**\n> - `$B focus` — bring Chrome to the foreground anytime\n> - `$B disconnect` — close headed Chrome and return to headless mode\n>\n> **What skills look like in headed mode:**\n> - `/qa` runs its full test suite in the visible browser — you see every page\n>   load, every click, every assertion\n> - `/design-review` takes screenshots in the real browser — same pixels you see\n> - `/benchmark` measures performance in the headed browser\n\nThen proceed with whatever the user asked to do. If they didn't specify a task,\nask what they'd like to test or browse.","tags":["open","browser","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering"],"capabilities":["skill","source-timurgaleev","skill-open-browser","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/open-browser","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,376 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.334Z","embedding":null,"createdAt":"2026-05-18T19:06:22.334Z","updatedAt":"2026-05-18T19:06:22.334Z","lastSeenAt":"2026-05-18T19:06:22.334Z","tsv":"'-9':310,318,334,559,567 '/../docs/external-tools.md':221 '/.vibestack/bin/vibe-learnings-search':101 '/.vibestack/bin/vibe-slug':56 '/benchmark':1154,1280 '/design-review':1153,1269 '/dev/null':58,60,84,99,105,163,280,314,326,338,369,536,563,618 '/learnings.jsonl':71 '/open-browser':114 '/projects':68 '/qa':1152,1250 '0':229,309,317,558,566,929 '1':329,379,690,802,910,932 '2':57,59,83,98,104,162,279,313,325,337,368,507,535,562,617,701,809,876,918,985 '3':642,713,822,934 '34567':457,572,736,906 '4':721,843,949,965 '5':97,103,1023,1102 '6':1121 'action':27,141,1158 'activ':36,733,1010,1028,1079 'address':807 'agent':430,436,1060,1086,1195 'ai':8,122 'ai-control':7,121 'alreadi':255 'also':588,1041 'alway':454 'anti':41,130,416 'anti-bot':40,129,415 'anytim':1232 'appear':797,1007,1076 'ask':48,953,1293,1303 'askuserquest':651 'assert':1268 'auto':411,445,463,685,738 'auto-connect':462 'auto-detect':737 'auto-discov':444 'auto-load':410,684 'automat':743 'b':164,169,172,173,177,181,382,495,510,761,777,912,947,981,989,1208,1210,1212,1214,1225,1233 'back':831 'badg':896 'bake':15 'bar':433,808 'bash':54,153,264,381,509,525,606,980,988 'blank':961 'bot':42,131,417 'bring':1227 'brows':151,196,212,223,239,268,281,286,291,294,296,301,311,342,708,814,1206,1311 'browse-daemon':222 'browser':3,6,20,51,117,120,387,942,1070,1174,1181,1259,1275,1286 'built':44 'bundl':210 'button':1091 'c':772,909 'captcha':427 'chat':39,439,1025,1037,1044,1184 'check':148,995 'child':1062 'chrome':403,652,667,749,765,1141,1163,1220,1228,1237 'chromium':10,124,260,346,389,663,788 'claud':1014,1063,1117,1143 'clean':242,345 'cleanup':233,376,930 'click':702,709,714,835,851,877,884,900,1090,1211,1266 'close':1235 'cmd':858 'code':1118 'command':152,440,443,1006,1013,1075,1207 'confirm':474,512,970 'conflict':263 'connect':235,256,380,383,442,464,466,742,933,1140 'content':1096 'control':9,123,657,748,1179 'cooki':1169 'count':78,90,95 'crash':252,352 'current':226 'custom':428 'd':86,1306 'daemon':197,213,224 'demo':966,979,1030 'depend':218 'describ':1055 'detect':739 'dialog':865 'didn':1298 'differ':576 'dir':354,366 'direct':1182 'directori':452 'disconnect':899,1234 'discov':446 'dock/menu':432 'docs/external-tools.md':220 'doesn':795 'done':371,377 'e.g':1198 'echo':87,109,179,183,372,634 'els':108,182 'enabl':821 'enter':904 'entri':91 'error':487,959 'etc':963 'eval':55 'everi':26,140,1012,1157,1262,1265,1267 'execut':1065,1196 'exist':267 'ext':607,623,627,631,637 'extens':14,128,409,448,460,591,635,681,697,741,771,782,804,815,869 'f':73,293,300,341,364,542,621,629 'fail':952 'fals':257 'feed':37,734,1011,1029,1080,1167 'fi':107,113,186,344 'file':64,75,82,245,524,538,546,551,553,561,863 'fill':1092,1199,1213 'find':589,706,769 'flight':232,375 'focus':948,1226 'foreground':1231 'form':1093,1203 'found':640 'full':469,1253 'g':860 'get':1099 'git':155,272,528,610 'github.com':983 'go':760,830 'googl':422 'goto':982,1003,1209 'gray':898 'grep':306,315,555,564 'gt':96 'guid':643 'happen':144,1083,1159 'head':391,478,493,517,1236,1248,1285 'headless':1241 'healthi':924,939 'help':596 'home':66 'home/.claude/skills/vibestack/browse/dist/browse':174 'home/.claude/skills/vibestack/extension':633 'home/.claude/skills/vibestack/extension/manifest.json':630 'home/.vibestack':67 'home/.vibestack/browse.json':298,554 'home/.vibestack/chromium-profile':355 'icon':696,712,717,839,886,902 'immedi':798 'import':1170 'instal':206,451 'instanc':1064 'interfer':1114 'isn':943 'isol':1108 'kill':236,265,322,333 'l':80 'languag':1187 'laun':52 'launch':4,115,118,385,654,790 'launchpersistentcontext':414 'learn':63,74,77,81,88,89,94,110 'let':758 'lf':357,367 'like':421,1050,1246,1307 'limit':102 'line':671 'list':819,848 'live':35,732 'll':1072 'load':92,412,603,686,784,852,880,1264 'lock':244,262,348 'login':1202 'look':691,810,1245 'manag':1224 'manual':605,907 'may':247,581 'measur':1281 'messag':960,1049 'minut':1103 'mode':392,477,490,516,1242,1249 'n':165,283,319,330,539,619 'natur':1186 'navig':855,1088 'need':184,188,582,601,1171 'next':1124 'none':111 'note':577 'nytim':424 'o':307,316,556,565 'old':304,320,323,331,335 'open':2,17,50,688,726,888 'open-brows':1 'option':227,750 'output':470,481,484,500,514,917 'page':677,834,1057,1089,1263 'panel':587,649,680,724,757,891,895,973,998,1040,1166,1191,1222 'pars':158,275,531,613 'past':866 'patch':419 'path':592,608,624,628,632,636,638,868,870,873 'perform':1282 'persist':249,350 'picker':864 'pid':305,308,321,324,332,336 'piec':695,705,838 'pin':711,716,829,841,881 'pixel':1277 'playwright':661,747,786,1173 'playwright-control':746 'port':456,520,557,569,735,905 'posit':258 'pre':231,374 'pre-flight':230,373 'preambl':53 'press':857 'prevent':254 'print':467 'proceed':505,1288 'process':437 'profil':261,347,353,365 'puzzl':694,704,837 'quick':978 're':926,1129 're-run':925 'read':518,1095 'readi':180 'real':29,135,1020,1146,1274 'real-tim':134 'rebrand':388 'regular':402,666 'repo':270,284,288,526,540,543,547 'request':1067 'requir':199 'return':1239 'rev':157,274,530,612 'rev-pars':156,273,529,611 'right':729 'rm':340,363 'root':154,166,271,285,527,541,609,620 'root/.claude/skills/vibestack/browse/dist/browse':168,170 'root/.claude/skills/vibestack/extension':625 'root/.claude/skills/vibestack/extension/manifest.json':622 'root/.vibestack/browse.json':289,544,548 'run':146,494,911,927,976,1015,1105,1148,1251 'screen':962 'screenshot':1271 'second':986 'see':139,219,476,660,754,764,958,1001,1073,1261,1279 'select':878 'separ':217 'server':240,269,921,937 'session':1109,1178 'set':1131 'setup':145,185,189 'share':498,1175 'shift':859 'shimmer':670 'show':33,160,277,485,515,533,615,730,915,1016 'show-toplevel':159,276,532,614 'side':586,648,679,723,756,890,894,972,997,1039,1165,1190,1221 'sidebar':13,32,127,408,435,1024,1036,1059,1085,1183,1194 'singletoncooki':361 'singletonlock':359 'singletonsocket':360 'site':420 'skill':202,1151,1244 'skill-open-browser' 'sleep':328 'slug':61,69 'snapshot':990,1005,1053,1215 'someth':773 'sometim':793 'source-timurgaleev' 'specifi':1300 'stale':238 'state':282,287,292,295,297,302,312,343,523,537,545,550,552,560 'status':496,511,913 'stay':405,897 'stealth':43,132,418 'step':228,378,506,641,801,875,928,931,964,1022,1120 'stop':190 'submit':1205 'suit':1255 'tab':1045 'take':1051,1270 'task':1098,1302 'tell':192,778,992,1031,1125 'test':1254,1309 'time':30,136,791,1021,1147 'toolbar':700,720 'top':674 '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':161,278,534,616 'tr':85 'tri':799,946,1046 'true':106,327,339,370 'type':803,1047,1185 'unknown':62,70 'unpack':853 'untouch':406 'use':46,455,650,871 'user':194,429,473,503,580,598,645,780,955,969,994,1033,1127,1292 'verifi':508 'via':413 'vibestack':5,65,116,119,207,386,656,707,813,1150 'visibl':19,137,395,945,1162,1218,1258 'wait':984 'watch':25,399,1142,1156 'wc':79 'went':774 'whatev':1290 'window':21,396,1119,1164,1223 'without':426 'won':1112 'work':425,975,1144 'wrong':775 'x':167,176 'yet':112 'z':171,290,549,626","prices":[{"id":"4e8a4041-dd1f-40fe-939d-0feb28cdaebb","listingId":"776dcd84-722c-4715-b5a8-9dba51ddacf8","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.334Z"}],"sources":[{"listingId":"776dcd84-722c-4715-b5a8-9dba51ddacf8","source":"github","sourceId":"timurgaleev/vibestack/open-browser","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/open-browser","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:22.334Z","lastSeenAt":"2026-05-18T19:06:22.334Z"}],"details":{"listingId":"776dcd84-722c-4715-b5a8-9dba51ddacf8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"open-browser","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":"d6dffa947b9cd0d4e8dc994dece222f3e84529e3","skill_md_path":"skills/open-browser/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/open-browser"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"open-browser","description":"Launch vibestack Browser — AI-controlled Chromium with the sidebar extension baked in.\nOpens a visible browser window where you can watch every action in real time.\nThe sidebar shows a live activity feed and chat. Anti-bot stealth built in.\nUse when asked to \"open browser\", \"launch browser\", \"connect chrome\",\n\"open chrome\", \"real browser\", \"launch chrome\", \"side panel\", or \"control my browser\"."},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/open-browser"},"updatedAt":"2026-05-18T19:06:22.334Z"}}