Agent Browser
quran/quran.com-frontend-next
Automates browser interactions for web testing, form filling, screenshots, and data extraction.
Run an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual wfweb rigs.
$ npx skills add adecarolis/wfweb --skill freedv-test -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install adecarolis/wfweb freedv-test --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/freedv-test .claude/skills/freedv-test && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .claude/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-testType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add adecarolis/wfweb --skill freedv-test -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install adecarolis/wfweb freedv-test --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/freedv-test .agents/skills/freedv-test && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .agents/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adecarolis/wfweb --skill freedv-test -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install adecarolis/wfweb freedv-test --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/freedv-test .cursor/skills/freedv-test && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .cursor/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/adecarolis/wfweb.git --path .claude/skills/freedv-test--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add adecarolis/wfweb --skill freedv-test -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install adecarolis/wfweb freedv-test --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/freedv-test .gemini/skills/freedv-test && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .gemini/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install adecarolis/wfweb freedv-testInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add adecarolis/wfweb --skill freedv-test -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/freedv-test .github/skills/freedv-test && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .github/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adecarolis/wfweb --skill freedv-test -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install adecarolis/wfweb freedv-test --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adecarolis/wfweb.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/freedv-test .opencode/skills/freedv-test && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "freedv-test" agent skill from https://github.com/adecarolis/wfweb/tree/master/.claude/skills/freedv-test into .opencode/skills/freedv-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freedv-test", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
freedv-testRun an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual wfweb rigs.
Freedv Test is an agent skill from adecarolis/wfweb. Run an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual wfweb rigs. Boots the testrig bench, puts both rigs in RADE mode, transmits from one by injecting synthesized audio into the server's RADE encoder (the headless browser has no mic), and verifies the other decodes the EOO callsign from the server log. Use when the user asks to test FreeDV, test RADE, or verify the RADE EOO callsign TX/RX path. (RADE only — classic 700D/700E/1600 are out of scope.)
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation, covering Browser automation. The repository describes itself as: Turn any Icom transceiver into a web-accessible station. Headless wfview fork with browser-based control, audio streaming, SSB, FreeDV, AX.25, CW, JS8 and FT8. The licence is GPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7cd5d2f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Freedv Test loads about 2.8k tokens when it runs. Until then it costs about 121 tokens; SKILL.md has 1,332 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from adecarolis/wfweb at commit 7cd5d2f, republished under its GPL-3.0 licence (© adecarolis). 1,332 words, ~2,845 tokens.
.claude/skills/freedv-test/SKILL.md (or your agent's skills folder).Run an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual rigs: one station transmits a RADE signal and the other must decode the transmitting station's callsign from the EOO (End-Of-Over) frame. Bench-only (virtual rigs, no hardware, no real RF). RADE only — the classic FreeDV modes (700D/700E/1600) are out of scope.
This is the outlier among the mode-test skills. Unlike CW/FT8/JS8 (browser-side codecs), RADE runs server-side (C++), and it breaks the pure-browser pattern in three ways you must handle:
getUserMedia, so you can't drive a real voice TX. Instead you inject synthesized audio straight into the server's RADE encoder by sending 0x03 TX-audio WebSocket frames (the same frame type the mic worklet uses) via window.sendTxAudio().window.radeRxCallsign is racy. The authoritative, race-free signal is the RX rig's log line RADE: decoded callsign from EOO: "<CALL>"../wfweb and ./tools/virtualrig/virtualrig are built (qmake wfweb.pro && make -j$(nproc); cd tools/virtualrig && qmake && make -j$(nproc)). The server build is required — RADE is server-side and disabled in the Standalone bundle..mcp.json includes --ignore-https-errors for the playwright MCP. Verify: pgrep -af @playwright/mcp must show --ignore-https-errors. If .mcp.json was just edited, the user must restart Claude Code. Stop and tell them.select:mcp__playwright__browser_navigate,mcp__playwright__browser_snapshot,mcp__playwright__browser_click,mcp__playwright__browser_type,mcp__playwright__browser_take_screenshot,mcp__playwright__browser_wait_for,mcp__playwright__browser_evaluate,mcp__playwright__browser_close,mcp__playwright__browser_tabs,mcp__playwright__browser_select_option../scripts/testrig.sh up 2Both rigs come up on 14.074.000 USB (FreeDV is a USB data mode — same freq + mode means audio gates and A's RADE signal reaches B). Prefer a freshly-booted bench: RADE sync gets flakier after many TX cycles on a long-lived bench.
.testrig/wfweb_0.log.testrig/wfweb_1.logbrowser_navigate to the rig URL.browser_evaluate () => { localStorage.clear(); sessionStorage.clear(); }, then browser_navigate to the same URL again.window.audioEnabled === true (RX audio enables ~1 s later — B's RADE decoder is fed from this RX-audio path).window.App.callsign.set('W1AAA') then window.sendReporterConfig() (pushes it to the server's reporterCallsign, which sets the RADE TX callsign). A: W1AAA, B: W1BBB.window.toggleFreeDV() (RADE is freedvModes[0], advertised first by the server; opening forces USB). Confirm window.freedvEnabled === true and window.freedvModeName === 'RADE'.Stable handles / state:
#freedvSyncEl (SYNC/NO SYNC), #freedvSnrEl, #freedvCallsign (only present while a decoded callsign is showing — clears after 5 s)toggleFreeDV(), cycleFreeDVMode(), sendReporterConfig(), send(obj) (raw WS command), sendTxAudio(arrayBuffer) (raw 0x03 TX-audio frame)window): freedvEnabled, freedvModeName, freedvSync, freedvSNR, radeRxCallsign (the 5 s flash)The headless browser can't capture a mic, so transmit by streaming synthesized 48 kHz Int16LE PCM as 0x03 frames. Frame layout: [0x03][0x00][seq_u16LE][reserved_u16LE][PCM_Int16LE…]. Run this in browser_evaluate on the transmitting tab, keeping that tab foreground for the whole burst (background tabs throttle setTimeout, stalling the 20 ms pacing and breaking the stream):
async () => {
const RATE = 48000;
function frame(seq, tSec) {
const N = 960; const buf = new ArrayBuffer(6 + N*2); const dv = new DataView(buf);
dv.setUint8(0,0x03); dv.setUint8(1,0x00); dv.setUint16(2,seq&0xFFFF,true); dv.setUint16(4,0,true);
const f0 = 140 + 30*Math.sin(tSec*5.0); // pitch with vibrato
for (let i=0;i<N;i++){ const t=tSec+i/RATE;
let v = 0.6*Math.sin(2*Math.PI*f0*t) + 0.3*Math.sin(2*Math.PI*(f0*2)*t)
+ 0.25*Math.sin(2*Math.PI*(f0*3.5)*t) + 0.15*Math.sin(2*Math.PI*(f0*6)*t);
let s = 0.95*Math.max(-1,Math.min(1,v)); // NEAR FULL-SCALE — quiet audio won't sync
dv.setInt16(6+i*2, s<0 ? s*32768 : s*32767, true);
}
return buf;
}
window.send({cmd:'enableMic', value:true});
await new Promise(r=>setTimeout(r,300));
window.send({cmd:'setPTT', value:true});
for (let k=0;k<600;k++){ window.sendTxAudio(frame(k, k*0.020)); await new Promise(r=>setTimeout(r,20)); } // ~12 s
window.send({cmd:'setPTT', value:false}); // PTT-off → server generates the EOO frame w/ callsign
await new Promise(r=>setTimeout(r,300));
window.send({cmd:'enableMic', value:false});
return 'TX done';
}Two things make or break this: the audio must be loud (~0.95 full-scale — a quiet signal lands at ~−5 dB SNR and never syncs), and the burst must be long (~12 s, raise to 15 s on retry) so the receiver acquires sync before the trailing EOO. A lone EOO with no preceding signal will not decode.
For each direction (A→B, then optionally B→A):
grep 'RADE: decoded callsign from EOO' .testrig/wfweb_1.log # B is the RX side for A→Bdecoded callsign from EOO: "W1AAA". (For B→A, grep .testrig/wfweb_0.log for "W1BBB".)k<750). Give up after window.freedvSNR on the RX tab) — a floor value (window.radeRxCallsign tightly (every ~120 ms); the instant it's truthy, browser_take_screenshot. This is best-effort — the log is the real evidence.Save screenshots as .playwright-mcp/wfweb-rade-A.png / ...-B.png (project-dir/.playwright-mcp/ only; /tmp is rejected).
The tone/noise synthetic audio above is the weak link — it gives good SNR but marginal sync. Two more reliable approaches, in order of preference:
0x03 payload instead of the synthesized tones. Real speech drives the RADE encoder to produce a properly-syncable modem signal, which is what RADE was trained on. This is the right long-term fix.--use-fake-device-for-media-stream --use-fake-ui-for-media-stream on the chromium launch) so getUserMedia returns Chromium's fake audio and the real mic→RADE path works. This needs a .mcp.json change + Claude Code restart, so confirm with the user first.Until one of those is in place, treat a PASS as "decoded on retry" and a no-decode-after-N as inconclusive (capability is proven; the synthetic-audio test is just flaky), not a regression.
browser_close (both tabs), then ./scripts/testrig.sh down.RADE: decoded callsign from EOO: "<the TX station's call>".getUserMedia is denied headless (NotAllowedError) — there is no browser mic. You MUST inject 0x03 audio via sendTxAudio(); the normal mic/PTT UI path produces no TX audio. (Server confirms the route: a 0x03 frame in RADE mode is fed to the RADE encoder.)freedvSNR === -5 throughout, your TX is too quiet (or not arriving).window.radeRxCallsign (and #freedvCallsign) is cleared after 5 s by radeCallsignClearTimer. The log line is permanent and race-free. Don't gate on freedvSync either — the callsign arrives in the EOO after sync is already lost (this is by design; see CLAUDE.md).setTimeout and stalls the 20 ms frame pacing.setTxCallsign ← reporterCallsign ← App.callsign).toggleFreeDV() sets USB; the bench defaults both to 14.074. If they diverge, B won't gate A's audio in.© adecarolis, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/freedv-test of adecarolis/wfweb.
Open the folder on GitHubat commit 7cd5d2f
Freedv Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Freedv Test this skilladecarolis/wfweb | 108 | — | ~2.8k | Automated safety check: Pass | GPL-3.0 | |
| Agent Browserquran/quran.com-frontend-next | 1.9k | 40 repos | ~3.3k | Automated safety check: Pass | None | |
| Dev-Browser CLI AutomationSawyerHood/dev-browser | 6.7k | 1 repos | ~455 | Automated safety check: Pass | MIT | |
| Browser Automationopenclaw/openclaw | 392k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Camoufox CLIBin-Huang/camoufox-cli | 350 | 1 repos | ~4.5k | Automated safety check: Pass | MIT | |
| BrowserVibiumDev/vibium | 2.9k | — | ~4.8k | Automated safety check: Pass | Apache-2.0 |
quran/quran.com-frontend-next
Automates browser interactions for web testing, form filling, screenshots, and data extraction.
SawyerHood/dev-browser
Browser automation with persistent named pages via the dev-browser CLI. Use when users ask to navigate websites, fill forms, take screenshots, extract web…
openclaw/openclaw
A skill your agent uses when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.
Bin-Huang/camoufox-cli
Anti-detect browser automation CLI & Skills for AI agents. An agent skill from Bin-Huang/camoufox-cli.
VibiumDev/vibium
Automate browsers with the Vibium CLI. An agent skill from VibiumDev/vibium.
moeru-ai/airi
Test AIRI display-model imports with agent-browser across stage-tamagotchi Electron, stage-web, and stage-pocket mobile web layouts.
adecarolis/wfweb
Run an end-to-end CW (morse) decode round-trip between two virtual wfweb rigs.
adecarolis/wfweb
Run an end-to-end FT8 decode round-trip between two virtual wfweb rigs.
adecarolis/wfweb
Run an end-to-end JS8 message round-trip between two virtual wfweb rigs.
adecarolis/wfweb
Run an end-to-end AX.25 packet QSO test between two virtual wfweb rigs at 300 bd and 1200 bd.
Categories
Run an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual wfweb rigs. Freedv Test is an agent skill from adecarolis/wfweb. Run an end-to-end FreeDV RADE EOO-callsign round-trip between two virtual wfweb rigs.
Freedv Test fits situations like: the user asks to test FreeDV; verify the RADE EOO callsign TX/RX path.
Run `npx skills add adecarolis/wfweb --skill freedv-test -a claude-code`. Or copy the skill folder (.claude/skills/freedv-test in adecarolis/wfweb) into .claude/skills/freedv-test in your project. Claude Code loads it when a task matches its description.
Run `npx skills add adecarolis/wfweb --skill freedv-test -a codex`. Or copy the skill folder (.claude/skills/freedv-test in adecarolis/wfweb) into .agents/skills/freedv-test in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add adecarolis/wfweb --skill freedv-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/freedv-test, .gemini/skills/freedv-test, .github/skills/freedv-test and .opencode/skills/freedv-test in your project.
Going by SKILL.md and its folder, Freedv Test needs the command-line tools its instructions call (make).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Freedv Test is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Freedv Test: Agent Browser (quran/quran.com-frontend-next, 1.9k stars), Dev-Browser CLI Automation (SawyerHood/dev-browser, 6.7k stars), Browser Automation (openclaw/openclaw, 392k stars) and Camoufox CLI (Bin-Huang/camoufox-cli, 350 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
adecarolis (a GitHub user) maintains it in adecarolis/wfweb, which has 108 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.
Source: adecarolis/wfweb on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.