Browser Use
aiskillstore/marketplace
Browser automation using Playwright MCP. An agent skill from aiskillstore/marketplace.
When you need a browser, read this Skill by default. An agent skill from kwakseongjae/oh-my-design.
$ npx skills add kwakseongjae/oh-my-design --skill ego-browser -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kwakseongjae/oh-my-design ego-browser --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/kwakseongjae/oh-my-design.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ego-browser .claude/skills/ego-browser && 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 "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .claude/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browserType 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 kwakseongjae/oh-my-design --skill ego-browser -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kwakseongjae/oh-my-design ego-browser --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kwakseongjae/oh-my-design.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ego-browser .agents/skills/ego-browser && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .agents/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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 kwakseongjae/oh-my-design --skill ego-browser -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kwakseongjae/oh-my-design ego-browser --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kwakseongjae/oh-my-design.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ego-browser .cursor/skills/ego-browser && 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 "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .cursor/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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/kwakseongjae/oh-my-design.git --path .agents/skills/ego-browser--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 kwakseongjae/oh-my-design --skill ego-browser -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kwakseongjae/oh-my-design ego-browser --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kwakseongjae/oh-my-design.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ego-browser .gemini/skills/ego-browser && 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 "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .gemini/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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 kwakseongjae/oh-my-design ego-browserInstalls 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 kwakseongjae/oh-my-design --skill ego-browser -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kwakseongjae/oh-my-design.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ego-browser .github/skills/ego-browser && 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 "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .github/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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 kwakseongjae/oh-my-design --skill ego-browser -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kwakseongjae/oh-my-design ego-browser --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kwakseongjae/oh-my-design.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ego-browser .opencode/skills/ego-browser && 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 "ego-browser" agent skill from https://github.com/kwakseongjae/oh-my-design/tree/main/.agents/skills/ego-browser into .opencode/skills/ego-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ego-browser", 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.
ego-browserWhen you need a browser, read this Skill by default. An agent skill from kwakseongjae/oh-my-design.
Ego Browser is an agent skill from kwakseongjae/oh-my-design. When you need a browser, read this Skill by default. Use it to open and operate websites, fill forms, click buttons, take screenshots, extract page data, sign in, and perform other browser automation tasks, as well as web app testing, dogfooding, QA, bug investigation, and app-quality review. ego-browser (ego-lite) is a Chromium browser designed for both human users and AI Agents. Agents can use the user's logged-in websites and personal context to complete tasks and collaborate smoothly with the user through the…
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 34 other files, including scripts and reference files (for example `learnings/github/browser-tools/repo-stats.js`, `learnings/github/manifest.json` and `learnings/github/notes/overview.md`).
It sits in Productivity & Automation, covering Browser testing, Forms and invoices and Browser automation. It works with Playwright, JavaScript and Node.js. The repository describes itself as: Give your AI coding agent a design system. One command installs 500+ quality-graded company DESIGN.md references + skills into Claude Code, Codex, Cursor, and OpenCode. Free… The licence is MIT.
Read from SKILL.md and the folder at commit c0ec438. 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.
Ships 1 file in scripts/ (JavaScript, from the files we listed), which the agent can run.
From 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.
Ego Browser loads about 4.9k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 156 tokens; SKILL.md has 2,112 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); the scripts in this folder are not scanned.
The full file from kwakseongjae/oh-my-design at commit c0ec438, republished under its MIT licence (© kwakseongjae). 2,112 words, ~4,889 tokens.
.claude/skills/ego-browser/SKILL.md (or your agent's skills folder). This skill also uses 24 other files; get the full folder from GitHub.For installation, connection, or runtime problems, read
references/install.md. Use help() or references/api.md for signatures and
uncommon options of APIs named below.
Run JavaScript through a heredoc:
ego-browser nodejs <<'EOF'
const task = await taskSpace("inspect example page");
const page = task.page("p1");
await page.goto("https://example.com");
console.log({ taskSpaceId: task.spaceId, page: page.label });
console.log(await page.snapshot());
EOFIn some sandbox environments, heredoc input may not work; use -e instead:
ego-browser nodejs -e '
const task = await taskSpace("inspect example page");
const page = task.page("p1");
await page.goto("https://example.com");
console.log({ taskSpaceId: task.spaceId, page: page.label });
console.log(await page.snapshot());
'In Bash/Zsh, use single quotes around the code and double quotes for JavaScript strings. Single quotes within the code require shell quoting.
The script always runs in Node.js, not in the web Page. Browser helpers and
Node.js APIs belong in the script; Page globals such as window, document,
location, and DOM APIs do not. Put browser-side JavaScript inside
page.evaluate(). Do not import Playwright or launch another browser.
The Node.js runtime uses ESM. When a script needs local files, load built-ins
with dynamic imports such as await import("node:fs/promises").
Ego-browser deliberately exposes a small custom API. It is not Playwright, even
where method names and options look similar. Use only the TaskSpace, Page,
FileChooser, mouse, and keyboard APIs explicitly listed in this Skill. Do not
infer Playwright methods such as locator(), getByRole(), context(),
expect(), or route(). When the listed API does not cover an operation, use
the documented page.evaluate() or page.cdp() escape hatches instead of
guessing another method.
Pointer actions accept an optional label with a concise 3-6 word description.
Pass it with clicks, hovers, drags, or scrolling to keep the action text next to
the visible agent cursor in sync with the action.
When the user explicitly asks for ego-browser, start with a real browser command and diagnose the CLI or installation only if it fails.
spaceId, and resume that same space in later rounds. Use multiple spaces
only when the user explicitly requests them.p1; navigate it instead of opening
another Page.goto() instead of opening a new Page for every URL.// Later round: use the space id and Page label printed earlier.
const resumed = await taskSpace(7);
const source = resumed.page("p1");
await source.goto("https://example.com/releases");Do not inspect or select profiles unless the user explicitly requests a
particular Ego Lite profile. A profileId applies only when creating a space;
use help("profiles") for the exact workflow.
Supported TaskSpace API:
spaceId, name, ownership, page(label), userPage()await task.pages(), await task.tabs(), newPage(),
adopt(page, { as? }), release(label)waitForControl(options), handOff(), finish({ keep })cdp(method, params, options)Pages receive permanent labels such as p1, p2, and p3. Prefer these labels
to custom { as } values. Reuse or close Pages as the task proceeds; the runtime
reports the configured Page budget when it is reached.
task.newPage() creates another blank Page when multiple Pages must stay open.
Navigate it separately with page.goto().
await task.pages() returns managed Pages. await task.tabs() returns every tab in the
space as { label?, page, targetId, title, url, active, openedBy }. A tab
without a label is unmanaged; adopt it before operating:
const active = (await task.tabs()).find((item) => item.active);
if (active && !active.label) {
const page = await task.adopt(active.page);
console.log({ page: page.label, url: await page.url() });
}release(label) returns an unknown-origin Page to the user without closing its
tab. Close Agent-created Pages with page.close(). Treat openedBy: "unknown"
as user-owned when deciding whether a Page may be closed.
ego-browser provides the following Page API:
label, spaceId, openedBy, targetId, url(),
title(), info(), snapshot(), screenshot()goto(), reload(), waitForURL(),
waitForEvent(), waitForSelector(), waitForLoadState(),
waitForFunction(), waitForTimeout()click(), dblclick(), hover(), dragAndDrop(), fill(),
selectOption(), focus(), press(), setInputFiles(),
waitForFileChooser(), close()acceptDialog(promptText?), dismissDialog()mouse.click(), move(), down(), up(), wheel()keyboard.down(), up(), press(), type(), insertText(),
paste()evaluate(fnOrString, argument),
fetch(url, options), cdp(method, params, options)page.evaluate() callbacks run only inside the Page; they cannot read variables
or Node.js modules from the surrounding script. Define browser-side helpers
inside the callback or pass one JSON-serializable value as its second argument.
Work efficiently:
Prefer snapshots and semantic selectors for ordinary DOM pages. Use screenshots and coordinates only when useful DOM semantics are unavailable.
Before choosing an unfamiliar target, take a snapshot. When the current state is sufficient to plan several actions on the same Page, complete them in one script invocation, then observe the result once. Observe between actions only when an intermediate result changes what should happen next. Keep the action sequence, the wait for its final expected state, and the next snapshot in the same script invocation. Print the snapshot last so the next round can act on it directly. The final snapshot is the next round's starting view of the changed page; without it, that round usually has to spend a separate browser call observing before it can choose the next target, which wastes compute.
Wait for the expected result: use waitForURL() for navigation,
waitForSelector() for element state, or waitForFunction() for application
state. Avoid fixed delays when an observable condition exists. A snapshot
captures the current moment; it does not wait for the page to become stable.
page.snapshot() captures the current viewport. For content outside it, use
page.snapshot({ scope: "full_page" }).
The default viewport snapshot includes visible iframe content returned by the
browser. To focus on a frame's subtree, reuse the ref printed on its iframe
line:
console.log(await page.snapshot({ scope: "subtree", root: "@12" }));Use the refs returned by the subtree for actions inside the iframe. A subtree snapshot does not scope later locator actions; they still prefer actionable matches in the top document before searching frames.
waitForLoadState() defaults to load. waitForFunction() follows the
Playwright argument order; pass undefined before options when there is no Page
argument:
await page.waitForFunction(() => window.appReady, undefined, {
timeout: 10_000,
});// Round 1: inspect and choose targets from this output.
const page = task.page("p1");
console.log(await page.snapshot());// Next round: act using the previous output, verify, then prepare the next round.
const page = task.page("p1");
await page.fill("@21", "user@example.com");
await page.click("loc=role:button[name='Sign in']");
await page.waitForSelector("loc=css:#account-home", { state: "visible" });
console.log(await page.snapshot());Element actions accept:
@21 or ref=21text=... for page contentloc=css:, loc=role:, and loc=href: locatorsxpath=...Selector actions require exactly one match. Unquoted text normalizes whitespace,
ignores case, and matches a substring; quoted text such as
text="Save changes" is exact and case-sensitive.
A small Playwright-compatible selector subset is also accepted: css=...,
terminal :has-text("...") and :text-is("..."), >> nth=N after a CSS,
text, or href selector (N is -1 or non-negative), plus
loc=role:...[name*="..."] for accessible-name substrings. Other Playwright
selector syntax is not supported.
When a selector identifies a wrapper, focus() and press() may use its
interactive ancestor or unique editable descendant; fill() and
setInputFiles() only continue to a unique compatible control.
click(), fill(), hover(), and dragAndDrop() automatically bring their
target into view with browser wheel input. Do not pre-scroll solely to make a
DOM target actionable.
Snapshot node names are accessibility roles. Use a ref now or loc=... to find
the element again. After the page changes, take a new snapshot. When a useful
node has no ref, construct a selector from its role, text, or surrounding
context. CSS searches nested open shadow roots. Actions use an actionable match
in the top document first, then search frames when the top document has none.
Multiple actionable matches in the selected document or frame are ambiguous.
Select options by value, visible label, or zero-based index. A string matches either value or label; pass an array for a multiple select:
await page.selectOption("select[name=month]", { label: "October" });Pass null or [] to clear the current selection.
Use a screenshot with mouse and keyboard operations for canvas, rich-text, spreadsheets, maps, and other interfaces that lack useful DOM semantics:
const path = await page.screenshot({ path: "/absolute/path/before.png" });
await page.mouse.click(420, 260, { label: "open spreadsheet cell" });
await page.mouse.wheel(0, 600, { label: "scroll project board" });
await page.keyboard.paste("hello\tworld");
console.log({ screenshot: path });Inspect the screenshot with an image-viewing tool. Coordinates use CSS pixels;
keyboard names and +-separated chords follow Playwright syntax. Use
ControlOrMeta for portable shortcuts and verify the resulting page state.
mouse.wheel() performs a short wheel-input motion at the current mouse
position and resolves when that motion completes. In each script invocation, move or
click over the intended scrollable area before using it.
On macOS, keyboard.paste() sends the native paste shortcut and then restores
the user's clipboard. Pass { text, html } when a rich editor needs structured
clipboard content; text is the plain-text fallback. On other platforms, use
keyboard.insertText() for plain text.
await page.keyboard.paste({
text: "Name\tStatus",
html: "<table><tr><td>Name</td><td>Status</td></tr></table>",
});For rich-text editors and editable grids, validate a small edit before repeating it at scale. Canvas-backed editors may not expose visible content through DOM text or selectors; verify those results with a screenshot or an application-specific visible state.
Use page.evaluate() for bulk extraction or complex in-page work. It accepts
one JSON-serializable argument and returns a JSON-serializable value:
const rows = await page.evaluate(
({ selector, limit }) =>
[...document.querySelectorAll(selector)].slice(0, limit).map((node) => ({
text: node.textContent?.trim(),
href: node.querySelector("a")?.href,
})),
{ selector: "article", limit: 20 },
);page.evaluate() has no timeout option. Keep long work in bounded calls; on a
safety timeout, use executionStopped and mayHaveLateEffects to decide
whether an unsafe follow-up requires reloading or closing the Page first.
Use documented Page methods first. If a wrapper is missing or does not work
reliably on the current page, use page.cdp() as a lower-level path for
diagnosis or control. It accepts Page, Runtime, DOM, Network, Input, and similar
commands; use task.cdp() for Target and Browser commands. Raw CDP invalidates
refs. Do not persist page.targetId across rounds.
When an action is expected to open a new Page, start the wait before the action:
const popupPromise = page.waitForEvent("popup");
await page.click('a[target="_blank"]');
const popupPage = await popupPromise;
await popupPage.waitForLoadState();High-level actions also report immediately observed popups in receipt.popups
as { label, targetId }. Resolve the Page with
task.page(receipt.popups[0].label) and continue there; wait for its URL when
the destination matters.
For uncommon protocol-event workflows, await page.events() returns and clears
the buffered event array; it is not an EventEmitter.
A synchronous JavaScript dialog may appear as receipt.dialog or in
page.info(). Handle it before continuing:
await page.acceptDialog("prompt response");
// Or: await page.dismissDialog();A receipt describes only the dispatched action and immediate popup or dialog observations; it does not verify the resulting application state.
Set an existing file input with absolute paths:
await page.setInputFiles("input[type=file]", ["/absolute/path/report.pdf"]);If a click creates the file input, start waiting before the click:
const chooserPromise = page.waitForFileChooser({ timeout: 10_000 });
await page.click("button.upload");
const chooser = await chooserPromise;
const result = await chooser.setFiles("/absolute/path/report.pdf");An upload-triggered JavaScript dialog may be returned as result.dialog; when
present, handle it with the dialog methods above.
For a browser download, arm the event before the triggering action and save the returned artifact to an absolute path in the same script:
const downloadPromise = page.waitForEvent("download", { timeout: 30_000 });
await page.click("button.download");
const download = await downloadPromise;
console.log({
url: download.url(),
suggestedFilename: download.suggestedFilename(),
});
await download.saveAs("/absolute/path/report.pdf");download.saveAs() waits for completion and creates missing parent
directories. download.path() returns the round-local temporary file;
failure(), cancel(), and delete() manage its lifecycle. Temporary download
files are removed when the SDK round is disposed, so call saveAs() before the
script ends. Do not set a global download directory with raw CDP; each download
wait configures and restores only the addressed Page session.
page.fetch() runs window.fetch() in the Page: relative URLs, cookies, and
service workers use that Page, and browser CORS still applies. It returns
{ ok, status, statusText, url, headers, body }:
const response = await page.fetch("/api/items", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ limit: 20 }),
timeout: 10_000,
});Save binary responses without converting them to text:
await page.fetch("/image.png", { saveAs: "/absolute/path/image.png" });Use standard Node.js fetch() for background requests that do not need Page
browser semantics.
Stop when the user takes control or the space is inactive or unassigned. Do not retry or route around the stop. Permission prompts, device choosers, and other browser-owned prompts require the user to handle them.
When the user must act in the browser, call await task.handOff(), end the
round, and explain what they should do. After the user confirms, resume the
same space:
const task = await takeOverTaskSpace(7);
const userPage = task.userPage();Adopt userPage if it is unmanaged. Use waitForControl() only when the current
script must wait in place. Claim a user-owned or inactive space only when the
user explicitly asks. Find its numeric id first; names may be duplicated:
const spaces = await listTaskSpaces();
console.log(spaces.filter((space) => space.ownership === "user"));
const task = await claimTaskSpace(7);
const userPage = task.userPage();When the task succeeds, close the TaskSpace by default with
await task.finish({ keep: [] }). Call finish() exactly once and wait for it
to resolve before reporting completion.
Keeping Pages is a rare exception: retain only necessary Pages when the user explicitly asks, or when the result must remain in the browser for the user to view or continue working with. Pages merely visited, search results, and intermediate steps do not need to remain open.
await task.finish({ keep: [] }); // Default: keep no Agent-managed Pages.
await task.finish({ keep: ["p2"] }); // Exception: keep only the result Page for the user.User-created and unmanaged tabs are protected; if any remain, keep: [] does
not close the whole space. Do not close unwanted Pages one by one at completion;
list the Pages to keep instead.
Use page.close() only while the task is still in progress. Do not call
finish() when the task stops for user control or an error.
If the final output contains [ego-browser:notice], finish the current browser
task, tell the user an Ego Lite update is available, and run
ego-browser upgrade only with their approval. Re-read this Skill after the
upgrade.
© kwakseongjae, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 24 other files (scripts, references) in .agents/skills/ego-browser of kwakseongjae/oh-my-design.
Open the folder on GitHubat commit c0ec438
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in kwakseongjae/oh-my-design, which our catalogue first saw on October 7, 2026.
Ego Browser 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 |
|---|---|---|---|---|---|---|
| Ego Browser this skillkwakseongjae/oh-my-design | 531 | 1 repos | ~4.9k | Automated safety check: Pass | MIT | |
| Browser Useaiskillstore/marketplace | 430 | — | ~1.1k | Automated safety check: Pass | None | |
| Agent Browseroxylabs/agent-skills | 875 | — | ~3k | Automated safety check: Pass | MIT | |
| Agenttinyfish-io/tinyfish-cookbook | 2.2k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Browser NavigationFactory-AI/factory-plugins | 111 | — | ~2.7k | Automated safety check: Pass | None | |
| Playwright SkillAratKruglik/claude-laravel | 155 | 10 repos | ~3.5k | Automated safety check: Pass | None |
aiskillstore/marketplace
Browser automation using Playwright MCP. An agent skill from aiskillstore/marketplace.
oxylabs/agent-skills
Connects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer.
tinyfish-io/tinyfish-cookbook
Default browser automation agent — click, fill forms, navigate, log in, and extract structured data from any website using a natural-language goal, or run the same task across multiple sites in…
Factory-AI/factory-plugins
Automate browser interactions for web testing, form filling, screenshots, and data extraction.
AratKruglik/claude-laravel
Complete browser automation with Playwright. An agent skill from AratKruglik/claude-laravel.
antibrow/anti-detect-browser-skills
Drive Chromium from standard Playwright APIs with a real-device fingerprint applied in the kernel, one persistent isolated profile per identity, and a per-profile proxy whose exit IP sets timezone…
kwakseongjae/oh-my-design
현재 코드베이스(또는 폴더)를 분석해 "디자인 컨텍스트 브리프"(스택/디자인 토큰/컴포넌트/ 라우트/실제 UI 카피/큐레이션된 에셋/레포 링크)를 합성하고, 그걸 Claude Design (claude.ai/design)에 자동으로 전달해 디자인을 생성한 뒤 결과 링크를 터미널에 클릭 가능한 형태로 돌려주는 스킬.
kwakseongjae/oh-my-design
Maximum-craft one-page landing — the wow bar. An agent skill from kwakseongjae/oh-my-design.
kwakseongjae/oh-my-design
One-prompt autonomous product design and implementation. An agent skill from kwakseongjae/oh-my-design.
kwakseongjae/oh-my-design
Scroll-native one-page landing that overwhelms — concept, composition, asset placement, and scroll choreography derived from DESIGN.md and the measured landing-craft codex.
kwakseongjae/oh-my-design
Brand-consistent asset sets from DESIGN.md — hero, section illustrations, icon sets, OG image — generated through whichever channel the user actually has (grok build imagegen, Codex $imagegen…
kwakseongjae/oh-my-design
Guided setup of the tools the design harness can use — image/video generation channels, browser, encoders.
Works with
Categories
When you need a browser, read this Skill by default. An agent skill from kwakseongjae/oh-my-design. Ego Browser is an agent skill from kwakseongjae/oh-my-design. When you need a browser, read this Skill by default.
Ego Browser fits situations like: open and operate websites; take screenshots; extract page data; perform other browser automation tasks.
Run `npx skills add kwakseongjae/oh-my-design --skill ego-browser -a claude-code`. Or copy the skill folder (.agents/skills/ego-browser in kwakseongjae/oh-my-design) into .claude/skills/ego-browser in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kwakseongjae/oh-my-design --skill ego-browser -a codex`. Or copy the skill folder (.agents/skills/ego-browser in kwakseongjae/oh-my-design) into .agents/skills/ego-browser 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 kwakseongjae/oh-my-design --skill ego-browser -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ego-browser, .gemini/skills/ego-browser, .github/skills/ego-browser and .opencode/skills/ego-browser in your project.
Going by SKILL.md and its folder, Ego Browser needs JavaScript for the scripts in its folder. Our summary lists: Node.js.
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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Ego Browser is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 15k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ego Browser: Browser Use (aiskillstore/marketplace, 430 stars), Agent Browser (oxylabs/agent-skills, 875 stars), Agent (tinyfish-io/tinyfish-cookbook, 2.2k stars) and Browser Navigation (Factory-AI/factory-plugins, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kwakseongjae (a GitHub user) maintains it in kwakseongjae/oh-my-design, which has 531 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 1, 2026.
Source: kwakseongjae/oh-my-design on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.