Berth Browser
sean-brydon/berthd
Use your worktree's own page in a headless browser on the box — open it, read a compact snapshot with @refs, click, fill, press keys, wait, take a screenshot to a file, and read console errors —…
One-command dev loop boot. An agent skill from yonatangross/orchestkit.
$ npx skills add yonatangross/orchestkit --skill dev -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yonatangross/orchestkit dev --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/yonatangross/orchestkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/skills/dev .claude/skills/dev && 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 "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .claude/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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/yonatangross/orchestkit/tree/main/src/skills/devType 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 yonatangross/orchestkit --skill dev -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yonatangross/orchestkit dev --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/skills/dev .agents/skills/dev && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .agents/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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 yonatangross/orchestkit --skill dev -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yonatangross/orchestkit dev --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/skills/dev .cursor/skills/dev && 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 "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .cursor/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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/yonatangross/orchestkit.git --path src/skills/dev--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 yonatangross/orchestkit --skill dev -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yonatangross/orchestkit dev --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/skills/dev .gemini/skills/dev && 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 "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .gemini/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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 yonatangross/orchestkit devInstalls 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 yonatangross/orchestkit --skill dev -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/skills/dev .github/skills/dev && 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 "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .github/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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 yonatangross/orchestkit --skill dev -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yonatangross/orchestkit dev --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/skills/dev .opencode/skills/dev && 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 "dev" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/dev into .opencode/skills/dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dev", 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.
devOne-command dev loop boot. An agent skill from yonatangross/orchestkit.
Dev is an agent skill from yonatangross/orchestkit. One-command dev loop boot. Spins up portless (named HTTPS subdomain), emulate (stateful API mocks), the project's dev server, and an agent-browser session, all keyed to the current git branch. Use when starting a feature branch, switching worktrees, or returning to a project after a break. Skips silently with install hints when prerequisite binaries are missing.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including scripts and reference files (for example `references/boot-sequence.md`, `references/state-schema.md` and `rules/_sections.md`). Compatibility notes: Claude Code 2.1.277+
It sits in Productivity & Automation, covering Git worktrees, Browser automation and Git workflow. The repository describes itself as: The Complete AI Development Toolkit for Claude Code. 106 skills, 36 agents, 171 hooks. Install ork for stable (v9.x), or ork-alpha for the v10 line, which ships daily. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1f8d8f3. 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 3 files in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
claudepnpmnpmyarnFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, npm and yarn, which can reach the network depending on how they are called.
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.
Claude Code 2.1.277+
From compatibility in the SKILL.md frontmatter.
Dev loads about 2.9k tokens when it runs, and up to ~5.8k if it reads all its reference files. Until then it costs about 92 tokens; SKILL.md has 1,003 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 yonatangross/orchestkit at commit 1f8d8f3, republished under its MIT licence (© yonatangross). 1,003 words, ~2,873 tokens.
.claude/skills/dev/SKILL.md (or your agent's skills folder). This skill also uses 12 other files; get the full folder from GitHub.One command boots the four moving parts of a Vercel-Labs-flavored dev loop:
https://<branch>.localhost (no port collisions across worktrees)@emulators/adapter-nextpnpm dev / npm run dev / yarn dev (auto-detected)State lives in .claude/state/dev-stack.json. Teardown via dev stop reads the PIDs and signals SIGTERM in reverse boot order.
Paired with
expect: the agent-browser session thatdevwarms is the same oneexpect(and the M125 #2 auto-trigger) attach to — no second startup latency on the first UI test.
| Situation | Command |
|---|---|
| Start work on a new branch | dev |
| Resume after a session break | dev (idempotent — skips already-live processes) |
| Tear down before deleting branch | dev stop |
| Inspect state | dev status |
| Share preview with stakeholder | dev --share (tailnet) or dev --funnel (public) |
| Time-boxed live demo | dev --live 4 (public funnel, 4-hour expiry) |
Resuming a backgrounded dev session (CC 2.1.144+): Sessions started via
claude --bgnow appear in/resumealongside interactive ones, markedbg— use/resumeas the direct recovery path after a crash or session end instead of navigating the agent view.Background shell sessions (CC 2.1.154+): In
claude agents, type! <command>to run a shell command as a backgrounded session you can attach to and detach from — also available asclaude --bg --exec '<command>'. Useful for long dev-loop processes (watchers, builds, servers) you want to monitor without holding a terminal.
| Flag | Wraps | Reach | Tailscale CLI |
|---|---|---|---|
| (none) | portless <slug> <pkg-mgr> run dev | https://<branch>.localhost only | not required |
--share | portless --tailscale ... | tailnet members on https://*.ts.net | required |
--funnel | portless --funnel ... | public on the internet | required |
--live N | portless --funnel ... + N-hour expiry | public, tracked in live-demos.jsonl | required |
Tailscale is optional — required only behind --share/--funnel/--live. Default dev is unchanged for users who don't share.
When turbo.json or package.json workspaces is detected (#1562), the boot uses
bare portless (zero-config) which auto-discovers each workspace's dev
script and assigns subdomains via the task graph. State file shows mode: "monorepo";
list subdomains via portless list or dev status.
portless is a wrapper, not a sidecar — portless <slug> <pkg-mgr> run dev is one fused command that owns the dev server's lifecycle. boot.sh tracks the wrapper PID; stop.sh walks its process tree to clean up children.
0. Detect package manager pnpm > yarn > bun > npm (lockfile-based)
1. Resolve subdomain slug <branch> → lower → / to - → DNS-safe → ≤63 chars
2. portless proxy start (idempotent — skipped if `portless list` already responds)
3. emulate --seed <yaml> (sidecar, optional — only if emulate.config.yaml exists)
4. portless <slug> <pkg-mgr> run dev (FUSED — wrapper owns dev server's lifecycle)
5. portless get <slug> (poll up to 30s for the route to register)
6. wait-on <baseUrl> (poll up to 30s for the dev server through the proxy)
7. AGENT_BROWSER_SESSION=<slug> agent-browser open <baseUrl> (warm + register session)
8. atomic state write (.claude/state/dev-stack.json via jq + temp + mv)
9. print summaryThe full annotated walkthrough: references/boot-sequence.md.
{
"bootedAt": "2026-04-27T12:34:56Z",
"branch": "feat/m125-lane-b",
"subdomain": "feat-m125-lane-b.localhost",
"baseUrl": "https://feat-m125-lane-b.localhost",
"mode": "single",
"processes": {
"portlessWrapper": {
"pid": 86104,
"command": "portless feat-m125-lane-b pnpm run dev"
},
"agentBrowser": { "sessionName": "feat-m125-lane-b" },
"emulate": { "pid": 86200, "command": "emulate --seed emulate.config.yaml" }
},
"emulators": ["github", "stripe"],
"share": null,
"notes": "portless proxy daemon is shared and not tracked here — stop.sh leaves it running."
}When --share / --funnel / --live is used (M127 #1561 / #1565), share becomes:
"share": {
"mode": "tailscale",
"tailscaleUrl": "https://app.your-tailnet.ts.net",
"expiresAt": "2026-05-03T20:00:00Z"
}mode is "single" (default) or "monorepo" (when turbo.json/workspaces detected). Note portlessWrapper (not portless + devServer) — portless owns the dev server. Full schema: references/state-schema.md.
When dev boots, it inspects package.json and emits hints:
@json-render/* detected (#1560) → prints the devtools adapter import line so the inspector panel (Spec / State / Actions / Stream / Catalog / Pick) can be enabled in dev. Tree-shakes from production builds.@clerk/* detected (#1563) → if clerk is in emulate.config.yaml, prints the mock login URL (http://localhost:4012); otherwise warns to run emulate-seed --auto.$ dev
✓ portless found
✓ agent-browser found
✓ jq found
[1] slug feat-m125-lane-b
# OR with a missing prereq:
✗ portless not found. Install: npm i -g portless
Skipping boot — install missing tools and re-run.portless, agent-browser, and jq are required. emulate is optional — required only if emulate.config.yaml exists. The boot is all-or-nothing on the required set; with no emulate config the boot proceeds without emulators.
CI=1 short-circuits the boot (exits 0 immediately).
$ dev status
ork:dev — feat/m125-lane-b
✓ portlessWrapper portless feat-m125-lane-b pnpm run dev
✓ agentBrowser feat-m125-lane-b
base url: https://feat-m125-lane-b.localhost
booted: 2026-04-27T19:36:54Z
portless: route registered ✓
$ dev stop
ork:dev — sending SIGTERM in reverse boot order…
✓ agent-browser session "feat-m125-lane-b" closed
✓ portless wrapper (pid 86104) + 21 descendant(s) stopped
Cleared .claude/state/dev-stack.json
Note: portless proxy daemon left running (shared). Run `portless proxy stop` if you really mean to stop the daemon.Stop walks the wrapper's process tree (pgrep -P recursively) and SIGTERMs descendants leaves-first because portless doesn't always propagate signals cleanly. The portless proxy daemon itself is shared infrastructure and is never killed by dev stop.
Each git worktree gets its own subdomain — feat-foo.localhost and feat-bar.localhost coexist on the same machine. The state file lives under each worktree's .claude/state/, so dev from one worktree doesn't see the other's processes.
Re-running dev while the stack is already live is a no-op:
$ dev
ork:dev — feat/m125-lane-b already running.
https://feat-m125-lane-b.localhost (uptime 2h 14m)
Run dev stop to tear down, or dev status for detail.Liveness probe: process.kill(pid, 0) against each tracked PID. If any are dead, the skill prints which ones and offers to clean up state and reboot.
The session name equals the subdomain — agent-browser commands targeting that session don't need a --session flag if it's the only one connected:
agent-browser open "https://feat-m125-lane-b.localhost/dashboard"
# implicit session = "feat-m125-lane-b" because it's the only oneexpect (M125 #2) reads the dev-stack state file and reuses this same session — no second handshake.
When auto-expect fires after a .tsx edit, it:
.claude/state/dev-stack.json to find the agent-browser session and base URL.app/dashboard/page.tsx → /dashboard).<baseUrl><route> using the live session.(route, parentCommit) (M125 #6).If the dev stack isn't live, auto-expect skips silently — dev is the prerequisite, not a hard dep.
CI=1; the skill exits 0 without booting.tmux -CC session — agent-browser dashboard incompatible with iTerm2 tmux integration.| Script | What it does |
|---|---|
scripts/boot.sh | All-or-nothing prereq check, then 9-step boot. Idempotent (no-ops if already live). Honors CI=1 to skip in CI. |
scripts/stop.sh | SIGTERM in reverse boot order with 5-second SIGKILL fallback. Removes state file last. |
scripts/status.sh | Pretty status. --quiet for liveness-only (exit 0 live, 1 down). Used by boot for idempotency. |
dev invokes scripts/boot.sh; stop → stop.sh; status → status.sh. The shell scripts are the source of truth.
| File | Purpose |
|---|---|
references/boot-sequence.md | Step-by-step boot annotated with commands |
references/state-schema.md | Full JSON shape + field semantics |
| Rule | Impact | When it applies |
|---|---|---|
rules/lab-stack-prerequisites.md | CRITICAL | Every boot |
rules/branch-named-subdomain.md | HIGH | Subdomain resolution |
rules/idempotent-boot.md | HIGH | Re-running while live |
rules/teardown-order.md | MEDIUM | stop invocations |
Set a completion condition with /goal (CC 2.1.139+) and this skill will keep working across turns until the condition is met. Works in interactive, -p, and Remote Control. The overlay panel shows live elapsed / turns / tokens.
Example completion condition for this skill:
/goal until services.running == 4, or stop after 5 turnsStops when: all 4 dev-loop services (portless + emulate + dev-server + agent-browser) report healthy on their respective ports/sockets. Compatible with claude.ai Remote Control runs.
expect — diff-aware browser tests; reuses the agent-browser session this skill warmsemulate-seed — generates the emulator config that step 3 consumesportless (skill) — underlying tool docsbrowser-tools (skill) — agent-browser command reference© yonatangross, 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 12 other files (scripts, references) in src/skills/dev of yonatangross/orchestkit.
Open the folder on GitHubat commit 1f8d8f3
Dev 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 |
|---|---|---|---|---|---|---|
| Dev this skillyonatangross/orchestkit | 288 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Berth Browsersean-brydon/berthd | 107 | — | ~779 | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 296k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Git Worktree Cleanuplobehub/lobehub | 83k | — | ~2.8k | Automated safety check: Pass | Custom licence | |
| Ccmanager Configkbwo/ccmanager | 1.3k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Git Worktree Managermicrosoft/WindowsAppSDK | 4.7k | — | ~2k | Automated safety check: Pass | MIT |
sean-brydon/berthd
Use your worktree's own page in a headless browser on the box — open it, read a compact snapshot with @refs, click, fill, press keys, wait, take a screenshot to a file, and read console errors —…
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
lobehub/lobehub
Audits stale Git worktrees and branches with a bundled script, classifies each one, and deletes only after you approve the exact candidates.
kbwo/ccmanager
Set up, review, or repair a CCManager config — .ccmanager.json at a git repository root, or the global ~/.config/ccmanager/config.json.
microsoft/WindowsAppSDK
Creates and manages Git worktrees with PowerShell scripts so separate issues and Copilot sessions each get an isolated branch, build and test environment.
codewhale-hq/Codewhale
Decides how verified work should reach main, directly, in a worktree or on an integration branch, while keeping contributor credit and respecting merge gates.
yonatangross/orchestkit
API contract design for REST and GraphQL, covering resource shape, URL and header versioning with deprecation windows, RFC 9457 Problem Details error handling, and OpenAPI specs.
yonatangross/orchestkit
ADR templates in the Nygard format with context, decision, consequences, and alternatives.
yonatangross/orchestkit
Single-pass codebase analysis leveraging a 1M-token context window for comprehensive security scanning, architecture review, and dependency auditing.
yonatangross/orchestkit
Structured review processes, conventional comments, language-specific checklists, and feedback templates.
yonatangross/orchestkit
Creates GitHub pull requests with pre-flight validation, conventional title formatting, and structured summary generation.
yonatangross/orchestkit
Multi-angle codebase exploration spawning 3-5 parallel agents for code structure, data flow, architecture patterns, and health assessment.
Categories
One-command dev loop boot. An agent skill from yonatangross/orchestkit. Dev is an agent skill from yonatangross/orchestkit. One-command dev loop boot.
Dev fits situations like: starting a feature branch; switching worktrees; returning to a project after a break.
Run `npx skills add yonatangross/orchestkit --skill dev -a claude-code`. Or copy the skill folder (src/skills/dev in yonatangross/orchestkit) into .claude/skills/dev in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yonatangross/orchestkit --skill dev -a codex`. Or copy the skill folder (src/skills/dev in yonatangross/orchestkit) into .agents/skills/dev 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 yonatangross/orchestkit --skill dev -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dev, .gemini/skills/dev, .github/skills/dev and .opencode/skills/dev in your project.
Going by SKILL.md and its folder, Dev needs a shell for the scripts in its folder and the command-line tools its instructions call (claude, pnpm, npm and yarn). Our summary lists: Node.js; A Bash shell. Compatibility (from SKILL.md): Claude Code 2.1.277+.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. 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.
Dev is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k 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. Its references folder adds about 2.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Dev: Berth Browser (sean-brydon/berthd, 107 stars), Finishing a Development Branch (obra/superpowers, 296k stars), Git Worktree Cleanup (lobehub/lobehub, 83k stars) and Ccmanager Config (kbwo/ccmanager, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yonatangross (a GitHub user) maintains it in yonatangross/orchestkit, which has 288 GitHub stars. The repository holds 107 skills in this directory. The repository was last updated on October 6, 2026.
Source: yonatangross/orchestkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.