← All skills
browse
61 / 100 · Review before installing
Check before installing.
By garrytan/gstack (GitHub) · other · 141,312 stars · scanned at commit bc858ff
Drive a real browser through Aside: open a page, read it, click through a flow, take screenshots, check console errors. (gstack)
Works with any agent that supports SKILL.md skills.
What this skill can do
Runs commands on your computer
This is disclosed by the author in the skill's SKILL.md or README.
Found in 348 places.
Show 17 more
- browse/SKILL.md, line 161
_gs_d() { if command -v gtimeout >/dev/null; then gtimeout 30 "$@"; elif command -v timeout >/dev/null; then timeout 30 "$@" - browse/SKILL.md, line 205
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) - browse/SKILL.md, line 251
aside repl ' - browse/SKILL.md, line 272
aside repl ' - browse/SKILL.md, line 298
aside repl ' - browse/SKILL.md, line 309
aside repl ' - browse/SKILL.md, line 324
aside repl ' - browse/SKILL.md, line 335
aside repl ' - browse/SKILL.md, line 347
aside repl ' - browse/SKILL.md, line 369
_GT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.gstack/tmp" - browse/SKILL.md, line 378
_EG="$HOME/.claude/skills/gstack/bin/gstack-egress-lib.sh"; [ -r "$_EG" ] && . "$_EG"; _aside_exec() { if command -v _gstack_egress_run >/dev/null 2>&1; then _g - browse/SKILL.md, line 430
R=".gstack/browse-reports/$(date +%Y-%m-%d-%H%M)"; mkdir -p "$R/screenshots" - browse/src/browse-client.ts, line 36
import * as cp from 'child_process'; - browse/src/browse-client.ts, line 108
const proc = cp.spawnSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf-8', timeout: 2000, windowsHide: true }); - browse/src/browser-manager.ts, line 18
import type { ChildProcess } from 'node:child_process'; - browse/src/browser-manager.ts, line 909
const versionProc = Bun.spawnSync([chromePath, '--version'], { - browse/src/browser-skill-commands.ts, line 258
const proc = Bun.spawn(cmd, {
and 328 more places
Connects to the internet
This is disclosed by the author in the skill's SKILL.md or README.
Found in 161 places.
Show 17 more
- browse/src/cli.ts, line 231
const resp = await fetch(`http://127.0.0.1:${port}/health`, { - browse/src/cli.ts, line 1109
const resp = await fetch(`http://127.0.0.1:${state.port}/command`, { - browse/src/cli.ts, line 1278
curl -s -X POST \\ - browse/src/cli.ts, line 1288
curl -s -X POST \\ - browse/src/cli.ts, line 1299
curl -s -X POST \\ - browse/src/cli.ts, line 1460
const resp = await fetch(`http://127.0.0.1:${state.port}/agents`, { - browse/src/cli.ts, line 1481
resp = await fetch(`http://127.0.0.1:${state.port}/token/${encodeURIComponent(name)}`, { - browse/src/cli.ts, line 1621
const pairResp = await fetch(`http://127.0.0.1:${state.port}/pair`, { - browse/src/cli.ts, line 1671
const cliProbe = await fetch(`${pairData.tunnel_url}/health`, { - browse/src/cli.ts, line 1698
const tunnelResp = await fetch(`http://127.0.0.1:${state.port}/tunnel/start`, { - browse/src/cli.ts, line 1909
const resp = await fetch(`http://127.0.0.1:${existingState.port}/health`, { - browse/src/cli.ts, line 1972
const resp = await fetch(`http://127.0.0.1:${newState.port}/command`, { - browse/src/cli.ts, line 2101
const resp = await fetch(`http://127.0.0.1:${existingState.port}/command`, { - browse/src/cookie-picker-ui.ts, line 475
const response = await fetch(BASE + '/cookie-picker' + path, { ...opts, headers, credentials: 'same-origin' }); - browse/src/routes/pairing.ts, line 124
const probe = await fetch(`${tunnel.url}/connect`, { - browse/src/routes/tunnel.ts, line 32
const probe = await fetch(`${tunnel.url}/connect`, { - browse/src/security-classifier.ts, line 82
const res = await fetch(url);
and 141 more places
Downloads and installs other software
The author does not mention this.
Found in 13 places.
Show 10 more
- browse/src/xvfb.ts, line 312
return 'Xvfb not installed. apt-get install xvfb (Debian/Ubuntu) or yum install xorg-x11-server-Xvfb (RHEL/CentOS). Note: minimal containers (alpine, distroless - browse/test/xprotect-heal.test.ts, line 64
║ bunx playwright install ║ - browse/test/xprotect-heal.test.ts, line 371
expect(thrown!.message).toContain('bunx playwright install chromium'); - browse/test/xprotect-heal.test.ts, line 391
expect(out).toContain('bunx playwright install chromium'); - BROWSER.md, line 438
plus manual `bunx playwright install chromium` guidance lands on daemon - setup, line 1754
DEBIAN_FRONTEND=noninteractive timeout 120 $sudo apt-get install -y -qq fonts-noto-color-emoji >/dev/null 2>&1 || return 1 - setup, line 1757
timeout 120 $sudo dnf install -y google-noto-color-emoji-fonts >/dev/null 2>&1 || return 1 - setup, line 2232
brew install coreutils >/dev/null 2>&1 || log "warning: brew install coreutils failed; /codex will run without hang protection" - setup, line 2548
echo " Debian/Ubuntu: sudo apt-get install fonts-noto-color-emoji" >&2 - setup, line 2549
echo " Fedora: sudo dnf install google-noto-color-emoji-fonts" >&2
Reads your browser cookies or saved passwords
This is disclosed by the author in the skill's SKILL.md or README.
Found in 24 places.
Show 17 more
- browse/test/cookie-import-browser.test.ts, line 437
await withInstalledProfile('.config/chromium', LINUX_FIXTURE_DB, async () => { - browse/test/cookie-import-browser.test.ts, line 447
test('imports Linux v10 cookies from ~/.config/chromium', async () => { - browse/test/cookie-import-browser.test.ts, line 448
await withInstalledProfile('.config/chromium', LINUX_FIXTURE_DB, async () => { - browse/test/cookie-import-browser.test.ts, line 459
await withInstalledProfile('.config/chromium', LINUX_FIXTURE_DB, async () => { - browse/test/cookie-import-browser.test.ts, line 470
await withInstalledProfile('.config/chromium', LINUX_FIXTURE_DB, async () => { - browse/test/cookie-import-node.test.ts, line 20
const profile = path.join(root, '.config/chromium/Default'); - browse/test/cookie-import-operation.test.ts, line 24
const dir = path.join(home, '.config/chromium', name); - browse/test/cookie-import-operation.test.ts, line 160
fs.writeFileSync(path.join(home, '.config/chromium/Profile 2/Cookies'), 'not a database'); - browse/test/cookie-import-operation.test.ts, line 207
const db = new Database(path.join(home, '.config/chromium/Default/Cookies')); - browse/test/cookie-import-operation.test.ts, line 434
fs.writeFileSync(path.join(home, '.config/chromium/Profile 2/Cookies'), 'not a database'); - browse/test/cookie-import-reliability.test.ts, line 112
profile('Library/Application Support/Arc/User Data', 'Profile 2'); - browse/test/cookie-import-reliability.test.ts, line 118
const root = '.config/chromium'; - browse/test/cookie-import-reliability.test.ts, line 132
const dir = profile('.config/chromium', 'Default'); - browse/test/cookie-import-reliability.test.ts, line 133
fs.writeFileSync(path.join(home, '.config/chromium/Local State'), '{'); - browse/test/cookie-import-reliability.test.ts, line 139
const dir = profile('.config/chromium', 'Default'); - browse/test/cookie-import-reliability.test.ts, line 151
const dir = profile('.config/chromium', 'Default'); - browse/test/cookie-import-reliability.test.ts, line 162
profile('.config/chromium', 'Default', 'constructor');
and 4 more places
Changes files outside its own folder
This is disclosed by the author in the skill's SKILL.md or README.
Found in 6 places.
Show 3 more
- setup, line 2559
mkdir -p "$HOME/.gstack/projects" - setup, line 3927
echo " still discovers it as a skill. For a Codex-only install, move it: mv $INSTALL_GSTACK_DIR ~/gstack && cd ~/gstack && ./setup --host codex" >&2 ;; - setup, line 4303
touch "$HOME/.gstack/.welcome-seen"
Safer alternatives
Low-risk skills in the same category (other) that look related. Check that one does what you need.
Install
Paste this into your terminal. It downloads exactly the version we scanned, not whatever is newest.
if [ -e ~/.agents/skills/'browse' ] || [ -L ~/.agents/skills/'browse' ]; then echo 'A skill folder named browse already exists — not replacing it' >&2; false; else d=$(mktemp -d) && git clone --quiet --filter=blob:none --no-checkout 'https://github.com/garrytan/gstack' "$d" && git -C "$d" checkout --quiet 'bc858ffc659bcc61558f60d0e023a009817dd48f' -- 'browse' && mkdir -p ~/.agents/skills && cp -R "$d"/'browse' ~/.agents/skills/'browse' && rm -rf "$d"; fi
Codex reads ~/.agents/skills directly. For Claude Code, Cursor, Copilot, Gemini CLI, Antigravity or OpenCode, also link it. For Claude Code: ln -s ~/.agents/skills/'browse' ~/.claude/skills/'browse' (other agents: ~/.cursor/skills, ~/.copilot/skills, ~/.gemini/skills, ~/.gemini/config/skills, ~/.config/opencode/skills). Or install through the finder skill, which does both.
Badge for your README
The badge for garrytan/gstack shows the score of its lowest-scoring skill.

[](https://zalavijaysinh.github.io/skilltrust/repos/garrytan/gstack/)
Score history
| Date | Version | Score |
|---|
| 2026-11-12 | bc858ff | 61 |
| 2026-11-11 | f0cd9f8 | 61 |
| 2026-11-10 | 6b32714 | 61 |
| 2026-11-09 | c25580e | 61 |
| 2026-11-08 | 9740bfd | 61 |
| 2026-11-08 | d479c5b | 61 |
| 2026-11-06 | 0c41ced | 41 |