browser-profile
Manage named persistent browser profiles (cookies, localStorage, IndexedDB, cache) that both you and Claude can use against the SAME Chrome window without…
Skill by vanducng
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/vanducng-browser-profile
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: frontend, testing, data, security
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Shell scripts
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/browser-profile
Tools it pre-approves 2
From allowed-tools in SKILL.md: the agent may use these without asking you each time.
Bash,Read
What's inside
- Skill name
browser-profile- Description
- Manage named persistent browser profiles (cookies, localStorage, IndexedDB, cache) that both you and Claude can use against the SAME Chrome window without collisions. Each profile lives in its own `--user-data-dir` and exposes a deterministic `--remote-debugging-port`. Use when the user says "open profile X", "attach to profile X", "log me into staging once and reuse it", or asks to test frontend flows with persistent auth across runs. Pairs with the `agent-browser` CLI (`agent-browser connect <port>`) for the CDP attach step.
- License
- MIT
- Allowed tools
- Bash,, Read
- Metadata
- author: vanducng · version: 0.1.0
- Instructions
- 117 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Pre-approves some shell commands
Files (8)
- SKILL.md
- _lib.sh · scripts/
- profile-attach.sh · scripts/
- profile-close.sh · scripts/
- profile-export.sh · scripts/
- profile-list.sh · scripts/
- profile-open.sh · scripts/
- profile-reset.sh · scripts/
SKILL.md (first lines)
# browser-profile
A thin profile registry on top of Chrome's `--user-data-dir` + `--remote-debugging-port`. Solves three problems at once:
1. **Persistent state per logical user.** Cookies, localStorage, IndexedDB, disk cache survive across runs.
2. **Manual access.** You open the profile in real Chrome and log in / poke around without Claude involved.
3. **Programmatic access on the same window.** Claude attaches via CDP using `agent-browser connect <port>` - no separate Chromium spawn, no SingletonLock collision.
Why not Playwright `launchPersistentContext`? Because that path requires Playwright to own the browser lifecycle - you can't have a normal Chrome window on the same `user-data-dir` simultaneously. The CDP-attach pattern here lets both of you share one window; connect-over-CDP is exactly how agent-browser participates in it. That's also why agent-browser must attach in `connect` mode, never `--profile` mode: profile mode launches its own Playwright-owned browser, which breaks the shared window this skill exists to provide.
## When to use
- Frontend tests where re-running the login flow on every iteration is wasteful or impossible (MFA, SSO).
- Long-lived debugging sessions where you want to come back tomorrow and have the same logged-in dashboards.
- Hand-off flows: you log in manually, then ask Claude to drive the rest.
**Not for:** cloud-only / anti-bot use cases (use Browserbase contexts via `vd:browser` `--context-id` instead) or one-shot ephemeral scraping (just use `agent-browser` directly, no profile needed).
## Prerequisites
- macOS with Google Chrome at `/Applications/Google Chrome.app` (override via `BROWSER_PROFILE_CHROME` env var).
- `agent-browser` CLI on PATH (`npm install -g agent-browser`, then one-time `agent-browser install`) - used by `attach`.
- `npx` / Node 18+ for `profile-export.sh` (it shells out to Playwright's `connectOverCDP` via `npx -y -p '@playwright/test'`).
## Quick start
```bash
SKILL="${CLAUDE_SKILL_DIR:-$(for d in "$HOME/skills/skills/browser-profile" "$HOME/.claude/skills/browser-profile" "$HOME/.agents/skills/browser-profile"; do [ -d "$d" ] && { echo "$d"; break; }; done)}/scripts"
# 1. Open a fresh profile manually (you'll log in once)
"$SKILL/profile-open.sh" acme-staging
# 2. In another shell - let Claude attach to that same window
"$SKILL/profile-attach.sh" acme-staging
# → env-sanitized `agent-browser connect <port-for-acme-staging>` + UA verification
# 3. List profiles and their status
"$SKILL/profile-list.sh"
# 4. When done
"$SKILL/profile-close.sh" acme-staging
```
Naming convention: `<env>-<role>`. Examples: `acme-staging`, `admin-console`, `warehouse-ui`.
## Command reference
| Script | Purpose |
|---|---|
| `profile-open.sh <name>` | Launch headed Chrome with the profile's user-data-dir and deterministic debug port. Creates the dir on first run. Refuses if already open, if the port is already serving CDP (hash collision with another profile - rename), and exits non-zero if the CDP endpoint never comes up. |
| `profile-attach.sh <name>` | Run env-sanitized `agent-browser connect <port>` so the agent-browser daemon drives this profile's Chrome (connect mode, never `--profile`), then verify the attachment via `navigator.userAgent`. Probes the CDP endpoint first; suggests `open` if nothing is listening. |
| `profile-list.sh` | Show all profiles with status (`open`, `no-cdp`, `stale`, `closed`), port, dir size. |
| `profile-close.sh <name>` | Send SIGTERM to the Chrome PID for that profile, clear stale lock files. |
| `profile-export.sh <name> [<out.json>]` | Dump cookies + localStorage as Playwright-compatible `storageState.json` for CI replay. Requires the profile to be open and `npx` / Node 18+ on PATH. |
| `profile-reset.sh <name> [--force]` | **Destructive.** Wipe the profile dir. Asks you to type the profile name to confirm; pass `--force` to skip the prompt (use this from non-interactive agents - without it the script blocks on `read`). |
## How port allocation works
Ports are deterministic from the profile name so `attach` doesn't need a registry file:
```
port = 9300 + (cksum(name) % 100)
```
Range 9300-9399 avoids the conventional 9222. If two names hash to the same port, `open` refuses before launching - rename one (e.g., add a `-2` suffix).
## Profile directory layout
Profiles live under `$HOME/.claude/browser-profiles/` by default; override the root with the `BROWSER_PROFILE_ROOT` env var (all scripts read it).
```
$BROWSER_PROFILE_ROOT/ # default: $HOME/.claude/browser-profiles/
├── acme-staging/
│ ├── Default/ # Chrome user data (cookies.db, Local Storage/, IndexedDB/, Cache/, …)
│ ├── DevToolsActivePort # written by Chrome on launch; contains the actual port + WS path
│ ├── SingletonLock # dangling symlink to "<hostname>-<pid>"; may be stale after a crash
│ └── .browser-profile.pid # PID of the Chrome process we launched (for `close`)
└── admin-console/
└── ...
```
`SingletonLock` is Chrome's own collision marker - a *dangling symlink* whose target encodes `<hostname>-<pid>` (so `-f`/`-e` tests see nothing; only `-L` does). The scripts treat a profile as open only when that PID is a live Chrome whose command line carries this `--user-data-dir`; stale locks left by crashed sessions are cleared automatically on `open`.
## Security
- Profile dirs are created with `chmod 700`. Storage cookies are tied to your user account.
- Never commit `$HOME/.claude/browser-profiles/` to any repo.
- Same applies to `storageState.json` exports - those are bearer credentials.
- The skill **never** prints cookies / tokens to stdout.
## Integration points
- **`vd:cook` flows that hit authenticated dashboards** - start a step with `profile-attach.sh <name>` so agent-browser is pre-connected to the right session.
- **`vd:browser-trace`** - attaches as a third CDP client on the same target, gets a full trace without interfering. Use the profile's deterministic port as the trace target.
- **`vd:web-e2e`** - project-aware full e2e on top of these profiles: boot/health checks, auth-state probing, flows, and reports. The e2e config's `profile` field names a profile managed here.
- **Playwright `storageState` fixtures** - export `storageState.json` once, then any Playwright test (local or CI) gets the same identity via `{ storageState: '<path>' }`.
## Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| `open` refuses: "profile already open" | A live Chrome owns this profile | Run `profile-close.sh <name>` first, or use `profile-attach.sh` if you intended to share |
| `list` shows `stale` | A `SingletonLock` is present but no live Chrome owns it (left by a crash) | Harmless - `profile-open.sh <name>` clears it automatically on next launch |
| `list` shows `no-cdp` | Chrome is running but not answering on the deterministic port (launched without the debug flag, or another Chrome took over) | `profile-close.sh <name>` then `profile-open.sh <name>` |
| `attach` says "no CDP endpoint" | Chrome not running on that port | Run `profile-open.sh <name>` first |
| Cookies disappear after sleep/wake | Service-worker eviction by Chrome | Re-login. Chrome's call, not ours. Open issue if reproducible. |
| Port collision between two profiles | cksum hash collision | Rename one of them (e.g., add a `-2` suffix) |
| Chrome won't launch (corrupted profile) | Crash during last session | `profile-reset.sh <name>` and re-login - wipes the whole dir |
## Future (deliberately out of scope for MVP)
- Cross-platform Chrome path resolution (Linux, Windows).
- Registry JSON with `last_used`, custom port overrides, descriptions.
- Auto-renew expired cookies via headless re-login.
- Headless mode for CI - use `profile-export.sh` + Playwright `storageState` instead; persistent-context headless is flaky upstream.From vanducng/skills, MIT.
More from vanducng/skills
- 0.631score
agent-readiness
vanducng
Scores how ready a repository is for AI coding agents to work in it effectively, then remediates the gaps - grades agent instruction files, verifiable…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
apidesign
vanducng
Design stable, hard-to-misuse interfaces - REST/GraphQL endpoints, module boundaries, type contracts, component props, anything where one piece of code talks…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
astro-airflow
vanducng
Inspect and debug Airflow on Astronomer (Astro) deployments - DAG runs, task logs, container logs, env vars, and deployment state.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
auto-loop
vanducng
Drive a Claude Code session toward a verifiable goal until done or a hard cap fires - autonomous loop, no user intervention.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
aws
vanducng
Operate AWS accounts and services with the AWS CLI using identity-first, read-before-write, evidence-backed workflows.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
better-ui
vanducng
Applies exact UI polish values: concentric border radius, optical alignment, layered surface shadows, neutral image outlines, a 0.96 press scale, icon…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
brainstorm
vanducng
Explore the solution space when the path isn't obvious - invent options, stress-test them, pick one.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
browser-trace
vanducng
Capture a full DevTools-protocol trace of a locally driven browser automation - CDP firehose, screenshots, and DOM dumps - then bisect the stream into…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
cli-ts
vanducng
Build and maintain production TypeScript CLIs as stable public APIs - command contracts, packed-artifact correctness, npm publishing, CI/CD, docs, providers…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
cnpg
vanducng
Create and operate CloudNativePG (CNPG) Postgres databases on Kubernetes the GitOps/Flux way - on managed cloud (GKE + GCS via Workload Identity) OR…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
code-review
vanducng
Review code with a sharp, encouraging voice - inline GitHub PR comments + a tight summary.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
codex-workflow
vanducng
Run deterministic multi-step agent workflows in Codex - fan-out, parallel, schema-validated structured output - via the codex-workflow MCP orchestrator…
SkillAFreshness: A★ 8Claude Code +9
Signals
- Stars
- 8
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 11, 2026 (1 month ago)
- Last release
- Oct 23, 2026 (5 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Version
- 0.1.0
- License
- MIT
- Repository
- github.com/vanducng/skills
- Website
- skills.vanducng.dev
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from vanducng
- 0.631score
apidesign
vanducng
Design stable, hard-to-misuse interfaces - REST/GraphQL endpoints, module boundaries, type contracts, component props, anything where one piece of code talks…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
astro-airflow
vanducng
Inspect and debug Airflow on Astronomer (Astro) deployments - DAG runs, task logs, container logs, env vars, and deployment state.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
auto-loop
vanducng
Drive a Claude Code session toward a verifiable goal until done or a hard cap fires - autonomous loop, no user intervention.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
aws
vanducng
Operate AWS accounts and services with the AWS CLI using identity-first, read-before-write, evidence-backed workflows.
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
better-ui
vanducng
Applies exact UI polish values: concentric border radius, optical alignment, layered surface shadows, neutral image outlines, a 0.96 press scale, icon…
SkillAFreshness: A★ 8Claude Code +9 - 0.631score
agent-readiness
vanducng
Scores how ready a repository is for AI coding agents to work in it effectively, then remediates the gaps - grades agent instruction files, verifiable…
SkillAFreshness: A★ 8Claude Code +9
Cite this page
browser-profile skill. Agent Mart. https://agentmart.dev/skills/vanducng-browser-profile (last updated 2026-10-24)