Not in the top 1,000 by GitHub stars
frane/vibesurfer
A browser for LLMs, not humans.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
crates/vs-cli/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
docs/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
plugin/skills/debug-failed-action/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
plugin/skills/vibesurfer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
skills/debug-failed-action/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
skills/vibesurfer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
485112319300 → 485112319300
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 485112319300
No earlier version was observed for comparison.
Verified commit 4851123193006a26cda3836fcad5a9bf96fb9c9c
git clone --filter=blob:none --no-checkout https://github.com/frane/vibesurfer.git .hotskills/frane-vibesurfer && git -C .hotskills/frane-vibesurfer checkout --detach 4851123193006a26cda3836fcad5a9bf96fb9c9c
# Copy each selected skill directory from .hotskills/frane-vibesurfer into .claude/skills/<skill-name>/Heat
1.8- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- vibesurfer
crates/vs-cli - docs
docs - debug-failed-action
plugin/skills/debug-failed-action - vibesurfer
plugin/skills/vibesurfer - debug-failed-action
skills/debug-failed-action - vibesurfer
skills/vibesurfer
How it works
vibesurfer
When your agent uses it
Agent-native headless browser. 26 primitives over a Unix-socket wire protocol. Real WKWebView (macOS), WebKitGTK 6 (Linux), or WebView2 (Windows) — all three engines verified per-commit by a real-browser integration suite. Optimistic concurrency via state tokens; tree-delta wire format; durable session/page/auth state in SQLite.
What it loads into context
Frontmatter
97 tokensAlways available to the agent
SKILL.md
6,650 tokensWhen the skill is activated
Reference documents
5,182 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Short forms are the default in agent contexts
- Use this tool when
- Don't use this tool for
- The 26 primitives
- When the tree isn't enough: look, then act at coordinates
- Optimistic concurrency
- Idempotency
- Auth flow
- How the wire stays cheap
- Common mistakes to avoid
- Capabilities by platform
- Where things live
Scripts executed separately
src/mcp/tools.rs
Files
../../.claude-plugin/marketplace.jsonasset714 bytesCargo.tomlasset2,193 bytesREADME.mddoc20,532 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesbuild.rsasset1,733 bytessrc/active_session.rsasset2,363 bytessrc/caller.rsasset7,427 bytessrc/client.rsasset5,215 bytessrc/commands/dispatch.rsasset25,437 bytessrc/commands/mod.rsasset41,122 bytessrc/commands/render.rsasset1,495 bytessrc/flow.rsasset5,891 bytessrc/lib.rsasset752 bytessrc/main.rsasset3,479 bytessrc/mcp/content.rsasset4,537 bytessrc/mcp/live-panel.htmlasset2,870 bytessrc/mcp/mod.rsasset14,117 bytessrc/mcp/tools.rsruns34,308 bytessrc/paths.rsasset2,206 bytessrc/serve.rsasset36,732 bytessrc/skill_install.rsasset22,533 bytessrc/spawn.rsasset2,404 bytestests/alias_parity.rsasset7,419 bytestests/auto_spawn.rsasset4,674 bytestests/e2e_cli.rsasset11,974 bytestests/m6/act.rsasset21,115 bytestests/m6/auth.rsasset16,998 bytestests/m6/challenge.rsasset3,361 bytestests/m6/download.rsasset5,791 bytestests/m6/extract.rsasset3,936 bytestests/m6/fingerprint.rsasset2,009 bytestests/m6/helpers.rsasset2,755 bytestests/m6/inspect.rsasset12,744 bytestests/m6/lifecycle.rsasset16,902 bytestests/m6/main.rsasset1,144 bytestests/m6/memory.rsasset6,477 bytestests/m6/visual.rsasset6,258 bytestests/m6/wait.rsasset6,111 bytestests/m6/webentry.rsasset19,485 bytestests/m6_smoke.rsasset1,231 bytestests/support/fixture_server.rsasset10,562 bytestests/support/mod.rsasset11,268 bytes../../plugin/.claude-plugin/plugin.jsonasset402 bytes
Read SKILL.md
# vibesurfer (binary: `vs`)
`vs` is a stateless CLI that talks to a daemon (`vs serve`, auto-spawned on first call) over a Unix socket. Not installed? `npx vibesurfer <args>` runs the same binary (downloaded and cached on first use); `vs skill install` wires it into every detected agent. The daemon owns one long-lived browser engine on the OS main thread and a SQLite store at `~/.vibesurfer/state.db`. Every primitive writes one audit row before returning — there's no opt-out, no untracked operation.
## Short forms are the default in agent contexts
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way around. The 19-primitive tables below lead with the short form and show the long form in parens; both work identically.
Frequent flags also have short forms: `-S` (`--session`), `-j` (`--json`), `-F` (`--full`), `-s` (`--since`), `-n` (`--limit`), `-P` (`--page`). The `--token` flag stays verbose because it's never typed by hand — you paste it from the previous read.
## Use this tool when
- You need to drive a real browser to read or interact with a web app (login, scrape behind auth, click through SPA state).
- You need stable refs across snapshots so you can plan a multi-step interaction without scraping coordinates.View the complete source on GitHubWhen your agent uses it
What it loads into context
Frontmatter
0 tokensAlways available to the agent
SKILL.md
331 tokensWhen the skill is activated
Reference documents
29,729 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Scripts executed separately
demo/record-claude.shdemo/render.sh
Files
ARCHITECTURE.mddoc8,639 bytesDEVELOPMENT.mddoc3,087 bytesM6_PLAN.mddoc6,021 bytesPRIMITIVES.mddoc10,334 bytesPROTOCOL.mddoc12,375 bytesRATIONALE.mddoc5,585 bytesREALITY_CHECK.mddoc9,522 bytesROADMAP.mddoc6,772 bytesSKILL.mdcore1,112 bytesSKILL.mdcore1,112 bytescodes.mddoc5,444 bytesdecisions/0001-engine-webkit.mddoc4,126 bytesdecisions/0002-no-transactions.mddoc1,640 bytesdecisions/0003-line-protocol-not-json.mddoc1,539 bytesdecisions/0004-stable-refs-not-line-numbers.mddoc2,184 bytesdecisions/0005-tree-deltas-default.mddoc2,248 bytesdecisions/0006-composite-flags-are-observation-driven.mddoc2,054 bytesdecisions/0007-pipeline-syntax-v2.mddoc2,323 bytesdecisions/0008-inspector-protocol-internal-only.mddoc2,193 bytesdemo-claude.gifasset1,063,518 bytesdemo/demo.tapeasset1,018 bytesdemo/record-claude.shruns5,776 bytesdemo/render.shruns2,273 bytesimg/demo-trending.pngasset355,162 bytesknown-issues.mddoc4,603 bytes../skills/vibesurfer/SKILL.mddoc24,742 bytes
Read SKILL.md
# Skill
The skill that gets installed into every detected agent by `vs skill install` lives at:
[`skills/vibesurfer/SKILL.md`](../skills/vibesurfer/SKILL.md)
That file is the single source of truth — it's what the agent reads, and it's the file `vs skill install` writes (verbatim) into each agent's conventional skill location:
| Agent | Path |
|---|---|
| Claude Code | `~/.claude/skills/vibesurfer/SKILL.md` |
| Codex CLI | `~/.codex/skills/vibesurfer/SKILL.md` |
| Cursor | `<workspace>/.cursor/skills/vibesurfer/SKILL.md` |
| Gemini | `~/.gemini/extensions/vibesurfer/GEMINI.md` (renamed) |
| OpenClaw | `~/.openclaw/workspace/skills/vibesurfer/SKILL.md` |View the complete source on GitHubdebug-failed-action
When your agent uses it
When your last `vs_act` returned an unexpected result (NOT_FOUND, no visible state change, suspected silent failure), run this skill with the action's pre-token. Pulls console errors, network failures, and current performance into one report.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
482 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use
- What it does
- Arguments
- Why this is the canonical use case
Files
SKILL.mdcore2,004 bytesskill.tomlasset400 bytes
Read SKILL.md
# debug-failed-action
## When to use
You ran `vs_act` and one of:
- The next `vs_view` looks identical to the previous one (no DOM change).
- You got `! NOT_FOUND ref=N` even though the ref was in the most recent tree.
- A button you clicked appears `disabled` / `aria-busy` / `pointer-events: none` in the DOM but not in the semantic tree.
- A form submission completed in the UI but the underlying API call returned 4xx/5xx silently.
## What it does
Runs three on-demand inspections in sequence against the page that owns the failed action:View the complete source on GitHubvibesurfer
When your agent uses it
Agent-native headless browser. 26 primitives over a Unix-socket wire protocol. Real WKWebView (macOS), WebKitGTK 6 (Linux), or WebView2 (Windows) — all three engines verified per-commit by a real-browser integration suite. Optimistic concurrency via state tokens; tree-delta wire format; durable session/page/auth state in SQLite.
What it loads into context
Frontmatter
97 tokensAlways available to the agent
SKILL.md
6,650 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Short forms are the default in agent contexts
- Use this tool when
- Don't use this tool for
- The 26 primitives
- When the tree isn't enough: look, then act at coordinates
- Optimistic concurrency
- Idempotency
- Auth flow
- How the wire stays cheap
- Common mistakes to avoid
- Capabilities by platform
- Where things live
Files
SKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytes
Read SKILL.md
# vibesurfer (binary: `vs`)
`vs` is a stateless CLI that talks to a daemon (`vs serve`, auto-spawned on first call) over a Unix socket. Not installed? `npx vibesurfer <args>` runs the same binary (downloaded and cached on first use); `vs skill install` wires it into every detected agent. The daemon owns one long-lived browser engine on the OS main thread and a SQLite store at `~/.vibesurfer/state.db`. Every primitive writes one audit row before returning — there's no opt-out, no untracked operation.
## Short forms are the default in agent contexts
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way around. The 19-primitive tables below lead with the short form and show the long form in parens; both work identically.
Frequent flags also have short forms: `-S` (`--session`), `-j` (`--json`), `-F` (`--full`), `-s` (`--since`), `-n` (`--limit`), `-P` (`--page`). The `--token` flag stays verbose because it's never typed by hand — you paste it from the previous read.
## Use this tool when
- You need to drive a real browser to read or interact with a web app (login, scrape behind auth, click through SPA state).
- You need stable refs across snapshots so you can plan a multi-step interaction without scraping coordinates.View the complete source on GitHubdebug-failed-action
When your agent uses it
When your last `vs_act` returned an unexpected result (NOT_FOUND, no visible state change, suspected silent failure), run this skill with the action's pre-token. Pulls console errors, network failures, and current performance into one report.
What it loads into context
Frontmatter
67 tokensAlways available to the agent
SKILL.md
482 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use
- What it does
- Arguments
- Why this is the canonical use case
Files
SKILL.mdcore2,004 bytesskill.tomlasset400 bytes
Read SKILL.md
# debug-failed-action
## When to use
You ran `vs_act` and one of:
- The next `vs_view` looks identical to the previous one (no DOM change).
- You got `! NOT_FOUND ref=N` even though the ref was in the most recent tree.
- A button you clicked appears `disabled` / `aria-busy` / `pointer-events: none` in the DOM but not in the semantic tree.
- A form submission completed in the UI but the underlying API call returned 4xx/5xx silently.
## What it does
Runs three on-demand inspections in sequence against the page that owns the failed action:View the complete source on GitHubvibesurfer
When your agent uses it
Agent-native headless browser. 26 primitives over a Unix-socket wire protocol. Real WKWebView (macOS), WebKitGTK 6 (Linux), or WebView2 (Windows) — all three engines verified per-commit by a real-browser integration suite. Optimistic concurrency via state tokens; tree-delta wire format; durable session/page/auth state in SQLite.
What it loads into context
Frontmatter
97 tokensAlways available to the agent
SKILL.md
6,650 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Short forms are the default in agent contexts
- Use this tool when
- Don't use this tool for
- The 26 primitives
- When the tree isn't enough: look, then act at coordinates
- Optimistic concurrency
- Idempotency
- Auth flow
- How the wire stays cheap
- Common mistakes to avoid
- Capabilities by platform
- Where things live
Files
SKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytesSKILL.mdcore24,742 bytes
Read SKILL.md
# vibesurfer (binary: `vs`)
`vs` is a stateless CLI that talks to a daemon (`vs serve`, auto-spawned on first call) over a Unix socket. Not installed? `npx vibesurfer <args>` runs the same binary (downloaded and cached on first use); `vs skill install` wires it into every detected agent. The daemon owns one long-lived browser engine on the OS main thread and a SQLite store at `~/.vibesurfer/state.db`. Every primitive writes one audit row before returning — there's no opt-out, no untracked operation.
## Short forms are the default in agent contexts
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way around. The 19-primitive tables below lead with the short form and show the long form in parens; both work identically.
Frequent flags also have short forms: `-S` (`--session`), `-j` (`--json`), `-F` (`--full`), `-s` (`--since`), `-n` (`--limit`), `-P` (`--page`). The `--token` flag stays verbose because it's never typed by hand — you paste it from the previous read.
## Use this tool when
- You need to drive a real browser to read or interact with a web app (login, scrape behind auth, click through SPA state).
- You need stable refs across snapshots so you can plan a multi-step interaction without scraping coordinates.View the complete source on GitHubSkills included
- vibesurfer
- debug-failed-action
- vibesurfer
- debug-failed-action
- vibesurfer
Repository facts
- License
- Apache-2.0
- Created
- May 8, 2026
- Last pushed
- Sep 24, 2026
- Forks
- 0
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 10 notes
crates/vs-cli/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcrates/vs-cli/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedcrates/vs-cli/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddocs/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugin/skills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugin/skills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugin/skills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/vibesurfer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 4 dangerous shell commandsin 4 files: vs-cli/README.md:48 docs/REALITY_CHECK.md:124 docs/demo/record-claude.sh:68 and 1 more
- 118 network referencesin 17 files: vs-cli/README.md:5 skills/vibesurfer/SKILL.md:14 vs-cli/SKILL.md:14 and 14 more
- No hidden or obfuscated text
- No instruction overrides
- 3 executable scriptsin 3 files: vs-cli/src/mcp/tools.rs:1 docs/demo/record-claude.sh:1 docs/demo/render.sh:1
- 8 references to secretsin 7 files: skills/vibesurfer/SKILL.md:164 vs-cli/SKILL.md:164 vs-cli/src/commands/mod.rs:262 and 4 more
- No requests to vote in Hot
Show all 133 signals by file
.claude-plugin/marketplace.json
- Network accessline 10
"name": "vibesurfer", "source": "./plugin", "description": "Headless real browser (WKWebView/WebKitGTK/WebView2) driven over a Unix-socket wire protocol. 20 primitives, state-token concurrency, tree deltas, audit-by-construction - Network accessline 11
"source": "./plugin", "description": "Headless real browser (WKWebView/WebKitGTK/WebView2) driven over a Unix-socket wire protocol. 20 primitives, state-token concurrency, tree deltas, audit-by-construction. Requires the `vs` binary o - Network accessline 12
"description": "Headless real browser (WKWebView/WebKitGTK/WebView2) driven over a Unix-socket wire protocol. 20 primitives, state-token concurrency, tree deltas, audit-by-construction. Requires the `vs` binary on PATH (install via `brew ta
crates/vs-cli/README.md
- Network accessline 5
<p align="center"> <a href="https://github.com/frane/vibesurfer/actions/workflows/ci.yml"><img alt="ci" src="https://img.shields.io/github/actions/workflow/status/frane/vibesurfer/ci.yml?branch=main&label=ci&style=flat-square"></a> - Network accessline 6
<a href="https://github.com/frane/vibesurfer/actions/workflows/ci.yml"><img alt="ci" src="https://img.shields.io/github/actions/workflow/status/frane/vibesurfer/ci.yml?branch=main&label=ci&style=flat-square"></a> - Network accessline 7
<a href="https://github.com/frane/vibesurfer/actions/workflows/engine-tests.yml"><img alt="engine-tests" src="https://img.shields.io/github/actions/workflow/status/frane/vibesurfer/engine-tests.yml?branch=main&label=engine-tests&style=flat- - Network accessline 8
<a href="https://github.com/frane/vibesurfer/releases/latest"><img alt="release" src="https://img.shields.io/github/v/release/frane/vibesurfer?style=flat-square"></a> - Network accessline 9
<a href="https://www.npmjs.com/package/vibesurfer"><img alt="npm" src="https://img.shields.io/npm/v/vibesurfer?style=flat-square&label=npm"></a> - Network accessline 10
<a href="https://crates.io/crates/vibesurfer"><img alt="crates.io" src="https://img.shields.io/crates/v/vibesurfer?style=flat-square"></a> - Network accessline 11
<a href="https://github.com/frane/vibesurfer/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/badge/license-Apache_2.0-blue?style=flat-square"></a> - Network accessline 14
<p align="center"> <img src="https://github.com/frane/vibesurfer/raw/main/docs/demo-claude.gif" alt="Claude Code using vibesurfer" width="560"> - Network accessline 15
<img src="https://github.com/frane/vibesurfer/raw/main/docs/demo-claude.gif" alt="Claude Code using vibesurfer" width="560"> - Network accessline 35
npx vibesurfer session-open npx vibesurfer open https://example.com - Network accessline 36
npx vibesurfer open https://example.com - Network accessline 45
curl (macOS, Linux): - Dangerous shell operationline 48
curl -sSL https://raw.githubusercontent.com/frane/vibesurfer/main/install.sh | sh - Network accessline 48
curl -sSL https://raw.githubusercontent.com/frane/vibesurfer/main/install.sh | sh - Network accessline 54
irm https://raw.githubusercontent.com/frane/vibesurfer/main/install.ps1 | iex - Network accessline 66
git clone https://github.com/frane/vibesurfer && cd vibesurfer - Network accessline 133
| Probe | Result | |---|---| | [bot.sannysoft.com](https://bot.sannysoft.com/) | Every headless-artifact check passes — WebDriver, plugin array, languages, the PHANTOM_* and HEADCHR_* families, Selenium markers. `window.chrome` reports miss - Network accessline 134
|---|---| | [bot.sannysoft.com](https://bot.sannysoft.com/) | Every headless-artifact check passes — WebDriver, plugin array, languages, the PHANTOM_* and HEADCHR_* families, Selenium markers. `window.chrome` reports missing, which is corre - Network accessline 135
| [bot.sannysoft.com](https://bot.sannysoft.com/) | Every headless-artifact check passes — WebDriver, plugin array, languages, the PHANTOM_* and HEADCHR_* families, Selenium markers. `window.chrome` reports missing, which is correct for a W - Network accessline 136
| [bot.incolumitas.com](https://bot.incolumitas.com/) | 31 checks OK, 1 FAIL (`webDriverAdvanced`). `navigator.webdriver` is `false` behind a native getter on `Navigator.prototype`, with no own-property override and absent from `Object.keys - Network accessline 137
| [CreepJS](https://abrahamjuliot.github.io/creepjs/) | Stable fingerprint, no lies section rendered. Headless heuristics: `chromium: false 6%`, `like headless: 33%`, `headless: 20%`. Evaluating its heuristic set directly, every flag that f - Network accessline 175
$ vs o https://example.com # open the URL - Network accessline 202
[Credential-related source omitted] - Network accessline 204
[Credential-related source omitted] - Network accessline 243
git clone https://github.com/frane/vibesurfer && cd vibesurfer - Network accessline 274
Issues and pull requests welcome. Open an issue first for anything beyond a small fix so we can discuss the approach. The codebase uses [agented](https://github.com/frane/agented) for transactional file edits during development; agented's w - Network accessline 280
- [objc2](https://github.com/madsmtm/objc2), macOS WebKit FFI. - Network accessline 281
- [webkit6](https://github.com/gtk-rs/gtk-rs-core), Linux engine bindings. - Network accessline 282
- [webview2-com](https://github.com/wravery/webview2-rs), Windows COM layer. - Network accessline 283
- [interprocess](https://github.com/kotauskas/interprocess), cross-platform IPC transport. - Network accessline 284
- [tiny_http](https://github.com/tiny-http/tiny-http), integration test fixture server. - Network accessline 286
Protocol borrows from [agented](https://github.com/frane/agented), an editor for AI agents.
crates/vs-cli/SKILL.md
- Network accessline 14
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way aroun - Network accessline 90
[Credential-related source omitted] - Network accessline 92
[Credential-related source omitted] - Network accessline 157
`vs watch <PAGE> [--open]` prints a read-only live-view URL (`http://127.0.0.1:…/live/<nonce>`, 30 min): an HTML page showing ~1 fps screenshots of the page while open. Relay it so the human can watch the browser work; MCP tool `vs_watch` r - Access to secretsline 164
[Credential-related source omitted] - Network accessline 181
# First time (browser, real human) vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 182
vs session-open PAGE=$(vs open https://app.example.com) # ...log in via the page... - Network accessline 183
PAGE=$(vs open https://app.example.com) - Network accessline 187
# Tomorrow vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 188
vs session-open PAGE=$(vs open https://app.example.com) vs auth load "$PAGE" example-prod # restores the session - Network accessline 189
PAGE=$(vs open https://app.example.com)
crates/vs-cli/src/commands/mod.rs
- Access to secretsline 262
[Credential-related source omitted] - Network accessline 507
/// so login-and-drive scripts need no manual id/token threading. /// Stops at the first failing step. Example file contents: /// `[["open","https://x"],["act","$page","5","fill","hi","--token","$token"]]` - Network accessline 508
/// Stops at the first failing step. Example file contents: /// `[["open","https://x"],["act","$page","5","fill","hi","--token","$token"]]` Flow { - Network accessline 509
/// `[["open","https://x"],["act","$page","5","fill","hi","--token","$token"]]`
crates/vs-cli/src/flow.rs
- Network accessline 38
.with_context(|| format!("read flow file {}", file.display()))?; let steps: Vec<Vec<String>> = serde_json::from_str(&text) .context("flow file must be a JSON array of arg arrays, e.g. [[\"open\",\"https://x\"]]")?; - Network accessline 40
.context("flow file must be a JSON array of arg arrays, e.g. [[\"open\",\"https://x\"]]")?;
crates/vs-cli/src/mcp/tools.rs
crates/vs-cli/tests/alias_parity.rs
crates/vs-cli/tests/e2e_cli.rs
crates/vs-cli/tests/m6/auth.rs
- Access to secretsline 158
[Credential-related source omitted] - Network accessline 164
let blob = serde_json::json!({ "version": 2, "url": "http://127.0.0.1/", - Network accessline 165
"version": 2, "url": "http://127.0.0.1/", "origin": "http://127.0.0.1", - Network accessline 166
"url": "http://127.0.0.1/", - Network accessline 167
"origin": "http://127.0.0.1",
crates/vs-cli/tests/m6/webentry.rs
crates/vs-cli/tests/support/fixture_server.rs
docs/PRIMITIVES.md
- Access to secretsline 28
[Credential-related source omitted]
docs/PROTOCOL.md
- Network accessline 67
vs_session_open --policy=default vs_open https://example.com - Network accessline 68
vs_open https://example.com - Network accessline 88
? nav https://example.com/login - Network accessline 162
2 hd "Example Domain" 3 p "This domain is for use in illustrative examples..." 4 lnk "More information..." click href=https://www.iana.org/domains/example - Network accessline 164
4 lnk "More information..." click href=https://www.iana.org/domains/example
docs/REALITY_CHECK.md
- Network accessline 97
`vs_type` joined the matrix in v0.2.5, cited from engine-tests run [35242053354](https://github.com/frane/vibesurfer/actions/runs/35242053354): - Network accessline 98
[35242053354](https://github.com/frane/vibesurfer/actions/runs/35242053354): - Dangerous shell operationline 124
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - Network accessline 142
domain. Addressing the fixture as `localhost` fixed it, and the cell now runs unskipped on all of them (run [35250587754](https://github.com/frane/vibesurfer/actions/runs/35250587754)). - Network accessline 144
[35250587754](https://github.com/frane/vibesurfer/actions/runs/35250587754)).
docs/demo/record-claude.sh
docs/demo/render.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 3
# # Boots a real daemon, opens a real session+page against # https://example.com, then materializes the tape with the actual - Network accessline 4
# Boots a real daemon, opens a real session+page against # https://example.com, then materializes the tape with the actual # session and page ids substituted in. This avoids putting `$(...)` - Network accessline 5
# https://example.com, then materializes the tape with the actual - Dangerous shell operationline 32
rm -rf "$VS_HOME" - Network accessline 60
SESSION_OUT=$("$BIN_DIR/vs" session-open) SESSION=$(echo "$SESSION_OUT" | tail -1) PAGE_OUT=$("$BIN_DIR/vs" open https://news.ycombinator.com) - Network accessline 61
SESSION=$(echo "$SESSION_OUT" | tail -1) PAGE_OUT=$("$BIN_DIR/vs" open https://news.ycombinator.com) PAGE=$(echo "$PAGE_OUT" | tail -1) - Network accessline 62
PAGE_OUT=$("$BIN_DIR/vs" open https://news.ycombinator.com)
plugin/.claude-plugin/plugin.json
- Network accessline 5
"author": { "name": "Frane Bandov", "url": "https://github.com/frane" - Network accessline 6
"name": "Frane Bandov", "url": "https://github.com/frane" }, - Network accessline 7
"url": "https://github.com/frane" - Network accessline 8
}, "homepage": "https://github.com/frane/vibesurfer", "repository": "https://github.com/frane/vibesurfer", - Network accessline 9
"homepage": "https://github.com/frane/vibesurfer", - Network accessline 10
"repository": "https://github.com/frane/vibesurfer",
plugin/skills/vibesurfer/SKILL.md
- Network accessline 14
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way aroun - Network accessline 90
[Credential-related source omitted] - Network accessline 92
[Credential-related source omitted] - Network accessline 157
`vs watch <PAGE> [--open]` prints a read-only live-view URL (`http://127.0.0.1:…/live/<nonce>`, 30 min): an HTML page showing ~1 fps screenshots of the page while open. Relay it so the human can watch the browser work; MCP tool `vs_watch` r - Access to secretsline 164
[Credential-related source omitted] - Network accessline 181
# First time (browser, real human) vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 182
vs session-open PAGE=$(vs open https://app.example.com) # ...log in via the page... - Network accessline 183
PAGE=$(vs open https://app.example.com) - Network accessline 187
# Tomorrow vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 188
vs session-open PAGE=$(vs open https://app.example.com) vs auth load "$PAGE" example-prod # restores the session - Network accessline 189
PAGE=$(vs open https://app.example.com)
skills/vibesurfer/SKILL.md
- Network accessline 14
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way aroun - Network accessline 14
Every primitive has a short alias. Long forms exist for human-readable documentation; agent invocations should use the shorter form to save tokens. `vs o https://...` is the canonical shape for `vs open https://...`, not the other way aroun - Network accessline 90
[Credential-related source omitted] - Network accessline 90
[Credential-related source omitted] - Network accessline 92
[Credential-related source omitted] - Network accessline 92
[Credential-related source omitted] - Network accessline 157
`vs watch <PAGE> [--open]` prints a read-only live-view URL (`http://127.0.0.1:…/live/<nonce>`, 30 min): an HTML page showing ~1 fps screenshots of the page while open. Relay it so the human can watch the browser work; MCP tool `vs_watch` r - Network accessline 157
`vs watch <PAGE> [--open]` prints a read-only live-view URL (`http://127.0.0.1:…/live/<nonce>`, 30 min): an HTML page showing ~1 fps screenshots of the page while open. Relay it so the human can watch the browser work; MCP tool `vs_watch` r - Access to secretsline 164
[Credential-related source omitted] - Access to secretsline 164
[Credential-related source omitted] - Network accessline 181
# First time (browser, real human) vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 181
# First time (browser, real human) vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 182
vs session-open PAGE=$(vs open https://app.example.com) # ...log in via the page... - Network accessline 182
vs session-open PAGE=$(vs open https://app.example.com) # ...log in via the page... - Network accessline 183
PAGE=$(vs open https://app.example.com) - Network accessline 183
PAGE=$(vs open https://app.example.com) - Network accessline 187
# Tomorrow vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 187
# Tomorrow vs session-open PAGE=$(vs open https://app.example.com) - Network accessline 188
vs session-open PAGE=$(vs open https://app.example.com) vs auth load "$PAGE" example-prod # restores the session - Network accessline 188
vs session-open PAGE=$(vs open https://app.example.com) vs auth load "$PAGE" example-prod # restores the session - Network accessline 189
PAGE=$(vs open https://app.example.com) - Network accessline 189
PAGE=$(vs open https://app.example.com)
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 2 facts
- Contacts news.ycombinator.com, which SKILL.md, the README and the plugin manifest do not mentiondocs/demo/record-claude.sh:119High confidence
- Contacts news.ycombinator.com, which SKILL.md, the README and the plugin manifest do not mentiondocs/demo/render.sh:62High confidence
Signal confidence: 101 facts
- Network access in prose of documentationvs-cli/README.md:5Low confidence
- Network access in prose of documentationvs-cli/README.md:6Low confidence
- Network access in prose of documentationvs-cli/README.md:7Low confidence
- Network access in prose of documentationvs-cli/README.md:8Low confidence
- Network access in prose of documentationvs-cli/README.md:9Low confidence
- Network access in prose of documentationvs-cli/README.md:10Low confidence
- Network access in prose of documentationvs-cli/README.md:11Low confidence
- Network access in prose of documentationvs-cli/README.md:14Low confidence
- Network access in prose of documentationvs-cli/README.md:15Low confidence
- Network access in code of documentationvs-cli/README.md:35Low confidence
- Network access in code of documentationvs-cli/README.md:36Low confidence
- Network access in prose of documentationvs-cli/README.md:45Low confidence
- Dangerous shell operation in code of documentationvs-cli/README.md:48Low confidence
- Network access in code of documentationvs-cli/README.md:48Low confidence
- Network access in code of documentationvs-cli/README.md:54Low confidence
- Network access in code of documentationvs-cli/README.md:66Low confidence
- Network access in prose of documentationvs-cli/README.md:133Low confidence
- Network access in prose of documentationvs-cli/README.md:134Low confidence
- Network access in prose of documentationvs-cli/README.md:135Low confidence
- Network access in prose of documentationvs-cli/README.md:136Low confidence
- Network access in prose of documentationvs-cli/README.md:137Low confidence
- Network access in code of documentationvs-cli/README.md:175Low confidence
- Network access in code of documentationvs-cli/README.md:202Low confidence
- Network access in code of documentationvs-cli/README.md:204Low confidence
- Network access in code of documentationvs-cli/README.md:243Low confidence
- Network access in prose of documentationvs-cli/README.md:274Low confidence
- Network access in prose of documentationvs-cli/README.md:280Low confidence
- Network access in prose of documentationvs-cli/README.md:281Low confidence
- Network access in prose of documentationvs-cli/README.md:282Low confidence
- Network access in prose of documentationvs-cli/README.md:283Low confidence
- Network access in prose of documentationvs-cli/README.md:284Low confidence
- Network access in prose of documentationvs-cli/README.md:286Low confidence
- Network access in prose of the SKILL.mdvs-cli/SKILL.md:14Low confidence
- Network access in prose of the SKILL.mdvs-cli/SKILL.md:90Low confidence
- Network access in prose of the SKILL.mdvs-cli/SKILL.md:92Low confidence
- Network access in prose of the SKILL.mdvs-cli/SKILL.md:157Low confidence
- Access to secrets in prose of the SKILL.md: a variable, placeholder or call, not a stored valuevs-cli/SKILL.md:164Low confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:181High confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:182High confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:183High confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:187High confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:188High confidence
- Network access in code of the SKILL.mdvs-cli/SKILL.md:189High confidence
- Executable script in code of a file that runsvs-cli/src/mcp/tools.rs:1High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuevs-cli/src/mcp/tools.rs:227Low confidence
- Access to secrets in prose of documentationdocs/PRIMITIVES.md:28Low confidence
- Network access in code of documentationdocs/PROTOCOL.md:67Low confidence
- Network access in code of documentationdocs/PROTOCOL.md:68Low confidence
- Network access in code of documentationdocs/PROTOCOL.md:88Low confidence
- Network access in code of documentationdocs/PROTOCOL.md:162Low confidence
and 51 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md crates/vs-cli/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md crates/vs-cli/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md crates/vs-cli/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md crates/vs-cli/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md crates/vs-cli/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.