# Repository: garrytan/gstack # Stars: 74596 ## CLAUDE.md # gstack development ## Commands ```bash bun install # install dependencies bun test # run free tests (browse + snapshot + skill validation) bun run test:evals # run paid evals: LLM judge + E2E (diff-based, ~$4/run max) bun run test:evals:all # run ALL paid evals regardless of diff bun run test:gate # run gate-tier tests only (CI default, blocks merge) bun run test:periodic # run periodic-tier tests only (weekly cron / manual) bun run test:e2e # run E2E tests only (diff-based, ~$3.85/run max) bun run test:e2e:all # run ALL E2E tests regardless of diff bun run eval:select # show which tests would run based on current diff bun run dev # run CLI in dev mode, e.g. bun run dev goto https://example.com bun run build # gen docs + compile binaries bun run gen:skill-docs # regenerate SKILL.md files from templates bun run skill:check # health dashboard for all skills bun run dev:skill # watch mode: auto-regen + validate on change bun run eval:list # list all eval runs from ~/.gstack-dev/evals/ bun run eval:compare # compare two eval runs (auto-picks most recent) bun run eval:summary # aggregate stats across all eval runs bun run slop # full slop-scan report (all files) bun run slop:diff # slop findings in files changed on this branch only ``` `test:evals` requires `ANTHROPIC_API_KEY`. Codex E2E tests (`test/codex-e2e.test.ts`) use Codex's own auth from `~/.codex/` config — no `OPENAI_API_KEY` env var needed. E2E tests stream progress in real-time (tool-by-tool via `--output-format stream-json --verbose`). Results are persisted to `~/.gstack-dev/evals/` with auto-comparison against the previous run. **Diff-based test selection:** `test:evals` and `test:e2e` auto-select tests based on `git diff` against the base branch. Each test declares its file dependencies in `test/helpers/touchfiles.ts`. Changes to global touchfiles (session-runner, eval-store, touchfiles.ts itself) trigger all tests. Use `EVALS_ALL=1` or the `:all` script variants to force all tests. Run `eval:select` to preview which tests would run. **Two-tier system:** Tests are classified as `gate` or `periodic` in `E2E_TIERS` (in `test/helpers/touchfiles.ts`). CI runs only gate tests (`EVALS_TIER=gate`); periodic tests run weekly via cron or manually. Use `EVALS_TIER=gate` or `EVALS_TIER=periodic` to filter. When adding new E2E tests, classify them: 1. Safety guardrail or deterministic functional test? -> `gate` 2. Quality benchmark, Opus model test, or non-deterministic? -> `periodic` 3. Requires external service (Codex, Gemini)? -> `periodic` ## Testing ```bash bun test # run before every commit — free, <2s bun run test:evals # run before shipping — paid, diff-based (~$4/run max) ``` `bun test` runs skill validation, gen-skill-docs quality checks, and browse integration tests. `bun run test:evals` runs LLM-judge quality evals and E2E tests via `claude -p`. Both must pass before creating a PR. ## Project structure ``` gstack/ ├── browse/ # Headless browser CLI (Playwright) │ ├── src/ # CLI + server + commands │ │ ├── commands.ts # Command registry (single source of truth) │ │ └── snapshot.ts # SNAPSHOT_FLAGS metadata array │ ├── test/ # Integration tests + fixtures │ └── dist/ # Compiled binary ├── hosts/ # Typed host configs (one per AI agent) │ ├── claude.ts # Primary host config │ ├── codex.ts, factory.ts, kiro.ts # Existing hosts │ ├── opencode.ts, slate.ts, cursor.ts, openclaw.ts # IDE hosts │ ├── hermes.ts, gbrain.ts # Agent runtime hosts │ └── index.ts # Registry: exports all, derives Host type ├── scripts/ # Build + DX tooling │ ├── gen-skill-docs.ts # Template → SKILL.md generator (config-driven) │ ├── host-config.ts # HostConfig interface + validator │ ├── host-config-export.ts # Shell bridge for setup script │ ├── host-adapters/ # Host-specific adapters (OpenClaw tool mapping) │ ├── resolvers/ # Template resolver modules (preamble, design, review, gbrain, etc.) │ ├── skill-check.ts # Health dashboard │ └── dev-skill.ts # Watch mode ├── test/ # Skill validation + eval tests │ ├── helpers/ # skill-parser.ts, session-runner.ts, llm-judge.ts, eval-store.ts │ ├── fixtures/ # Ground truth JSON, planted-bug fixtures, eval baselines │ ├── skill-validation.test.ts # Tier 1: static validation (free, <1s) │ ├── gen-skill-docs.test.ts # Tier 1: generator quality (free, <1s) │ ├── skill-llm-eval.test.ts # Tier 3: LLM-as-judge (~$0.15/run) │ └── skill-e2e-*.test.ts # Tier 2: E2E via claude -p (~$3.85/run, split by category) ├── qa-only/ # /qa-only skill (report-only QA, no fixes) ├── plan-design-review/ # /plan-design-review skill (report-only design audit) ├── design-review/ # /design-review skill (design audit + fix loop) ├── ship/ # Ship workflow skill ├── review/ # PR review skill ├── plan-ceo-review/ # /plan-ceo-review skill ├── plan-eng-review/ # /plan-eng-review skill ├── autoplan/ # /autoplan skill (auto-review pipeline: CEO → design → eng) ├── benchmark/ # /benchmark skill (performance regression detection) ├── canary/ # /canary skill (post-deploy monitoring loop) ├── codex/ # /codex skill (multi-AI second opinion via OpenAI Codex CLI) ├── land-and-deploy/ # /land-and-deploy skill (merge → deploy → canary verify) ├── office-hours/ # /office-hours skill (YC Office Hours — startup diagnostic + builder brainstorm) ├── investigate/ # /investigate skill (systematic root-cause debugging) ├── retro/ # Retrospective skill (includes /retro global cross-project mode) ├── bin/ # CLI utilities (gstack-repo-mode, gstack-slug, gstack-config, etc.) ├── document-release/ # /document-release skill (post-ship doc updates) ├── cso/ # /cso skill (OWASP Top 10 + STRIDE security audit) ├── design-consultation/ # /design-consultation skill (design system from scratch) ├── design-shotgun/ # /design-shotgun skill (visual design exploration) ├── open-gstack-browser/ # /open-gstack-browser skill (launch GStack Browser) ├── connect-chrome/ # symlink → open-gstack-browser (backwards compat) ├── design/ # Design binary CLI (GPT Image API) │ ├── src/ # CLI + commands (generate, variants, compare, serve, etc.) │ ├── test/ # Integration tests │ └── dist/ # Compiled binary ├── extension/ # Chrome extension (side panel + activity feed + CSS inspector) ├── lib/ # Shared libraries (worktree.ts) ├── docs/designs/ # Design documents ├── setup-deploy/ # /setup-deploy skill (one-time deploy config) ├── .github/ # CI workflows + Docker image │ ├── workflows/ # evals.yml (E2E on Ubicloud), skill-docs.yml, actionlint.yml │ └── docker/ # Dockerfile.ci (pre-baked toolchain + Playwright/Chromium) ├── contrib/ # Contributor-only tools (never installed for users) │ └── add-host/ # /gstack-contrib-add-host skill ├── setup # One-time setup: build binary + symlink skills ├── SKILL.md # Generated from SKILL.md.tmpl (don't edit directly) ├── SKILL.md.tmpl # Template: edit this, run gen:skill-docs ├── ETHOS.md # Builder philosophy (Boil the Lake, Search Before Building) └── package.json # Build scripts for browse ``` ## SKILL.md workflow SKILL.md files are **generated** from `.tmpl` templates. To update docs: 1. Edit the `.tmpl` file (e.g. `SKILL.md.tmpl` or `browse/SKILL.md.tmpl`) 2. Run `bun run gen:skill-docs` (or `bun run build` which does it automatically) 3. Commit both the `.tmpl` and generated `.md` files To add a new browse command: add it to `browse/src/commands.ts` and rebuild. To add a snapshot flag: add it to `SNAPSHOT_FLAGS` in `browse/src/snapshot.ts` and rebuild. **Token ceiling:** Generated SKILL.md files must stay under 100KB (~25K tokens). `gen-skill-docs` warns if any file exceeds this. If a skill template grows past the ceiling, consider extracting optional sections into separate resolvers that only inject when relevant, or making verbose evaluation rubrics more concise. **Merge conflicts on SKILL.md files:** NEVER resolve conflicts on generated SKILL.md files by accepting either side. Instead: (1) resolve conflicts on the `.tmpl` templates and `scripts/gen-skill-docs.ts` (the sources of truth), (2) run `bun run gen:skill-docs` to regenerate all SKILL.md files, (3) stage the regenerated files. Accepting one side's generated output silently drops the other side's template changes. ## Platform-agnostic design Skills must NEVER hardcode framework-specific commands, file patterns, or directory structures. Instead: 1. **Read CLAUDE.md** for project-specific config (test commands, eval commands, etc.) 2. **If missing, AskUserQuestion** — let the user tell you or let gstack search the repo 3. **Persist the answer to CLAUDE.md** so we never have to ask again This applies to test commands, eval commands, deploy commands, and any other project-specific behavior. The project owns its config; gstack reads it. ## Writing SKILL templates SKILL.md.tmpl files are **prompt templates read by Claude**, not bash scripts. Each bash code block runs in a separate shell — variables do not persist between blocks. Rules: - **Use natural language for logic and state.** Don't use shell variables to pass state between code blocks. Instead, tell Claude what to remember and reference it in prose (e.g., "the base branch detected in Step 0"). - **Don't hardcode branch names.** Detect `main`/`master`/etc dynamically via `gh pr view` or `gh repo view`. Use `{{BASE_BRANCH_DETECT}}` for PR-targeting skills. Use "the base branch" in prose, `` in code block placeholders. - **Keep bash blocks self-contained.** Each code block should work independently. If a block needs context from a previous step, restate it in the prose above. - **Express conditionals as English.** Instead of nested `if/elif/else` in bash, write numbered decision steps: "1. If X, do Y. 2. Otherwise, do Z." ## Browser interaction When you need to interact with a browser (QA, dogfooding, cookie setup), use the `/browse` skill or run the browse binary directly via `$B `. NEVER use `mcp__claude-in-chrome__*` tools — they are slow, unreliable, and not what this project uses. **Sidebar architecture:** Before modifying `sidepanel.js`, `background.js`, `content.js`, `sidebar-agent.ts`, or sidebar-related server endpoints, read `docs/designs/SIDEBAR_MESSAGE_FLOW.md`. It documents the full initialization timeline, message flow, auth token chain, tab concurrency model, and known failure modes. The sidebar spans 5 files across 2 codebases (extension + server) with non-obvious ordering dependencies. The doc exists to prevent the kind of silent failures that come from not understanding the cross-component flow. ## Dev symlink awareness When developing gstack, `.claude/skills/gstack` may be a symlink back to this working directory (gitignored). This means skill changes are **live immediately**, great for rapid iteration, risky during big refactors where half-written skills could break other Claude Code sessions using gstack concurrently. **Check once per session:** Run `ls -la .claude/skills/gstack` to see if it's a symlink or a real copy. If it's a symlink to your working directory, be aware that: - Template changes + `bun run gen:skill-docs` immediately affect all gstack invocations - Breaking changes to SKILL.md.tmpl files can break concurrent gstack sessions - During large refactors, remove the symlink (`rm .claude/skills/gstack`) so the global install at `~/.claude/skills/gstack/` is used instead **Prefix setting:** Setup creates real directories (not symlinks) at the top level with a SKILL.md symlink inside (e.g., `qa/SKILL.md -> gstack/qa/SKILL.md`). This ensures Claude discovers them as top-level skills, not nested under `gstack/`. Names are either short (`qa`) or namespaced (`gstack-qa`), controlled by `skill_prefix` in `~/.gstack/config.yaml`. Pass `--no-prefix` or `--prefix` to skip the interactive prompt. **Note:** Vendoring gstack into a project's repo is deprecated. Use global install + `./setup --team` instead. See README.md for team mode instructions. **For plan reviews:** When reviewing plans that modify skill templates or the gen-skill-docs pipeline, consider whether the changes should be tested in isolation before going live (especially if the user is actively using gstack in other windows). **Upgrade migrations:** When a change modifies on-disk state (directory structure, config format, stale files) in ways that could break existing user installs, add a migration script to `gstack-upgrade/migrations/`. Read CONTRIBUTING.md's "Upgrade migrations" section for the format and testing requirements. The upgrade skill runs these automatically after `./setup` during `/gstack-upgrade`. ## Compiled binaries — NEVER commit browse/dist/ or design/dist/ The `browse/dist/` and `design/dist/` directories contain compiled Bun binaries (`browse`, `find-browse`, `design`, ~58MB each). These are Mach-O arm64 only — they do NOT work on Linux, Windows, or Intel Macs. The `./setup` script already builds from source for every platform, so the checked-in binaries are redundant. They are tracked by git due to a historical mistake and should eventually be removed with `git rm --cached`. **NEVER stage or commit these files.** They show up as modified in `git status` because they're tracked despite `.gitignore` — ignore them. When staging files, always use specific filenames (`git add file1 file2`) — never `git add .` or `git add -A`, which will accidentally include the binaries. ## Commit style **Always bisect commits.** Every commit should be a single logical change. When you've made multiple changes (e.g., a rename + a rewrite + new tests), split them into separate commits before pushing. Each commit should be independently understandable and revertable. Examples of good bisection: - Rename/move separate from behavior changes - Test infrastructure (touchfiles, helpers) separate from test implementations - Template changes separate from generated file regeneration - Mechanical refactors separate from new features When the user says "bisect commit" or "bisect and push," split staged/unstaged changes into logical commits and push. ## Slop-scan: AI code quality, not AI code hiding We use [slop-scan](https://github.com/benvinegar/slop-scan) to catch patterns where AI-generated code is genuinely worse than what a human would write. We are NOT trying to pass as human code. We are AI-coded and proud of it. The goal is code quality. ```bash npx slop-scan scan . # human-readable report npx slop-scan scan . --json # machine-readable for diffing ``` Config: `slop-scan.config.json` at repo root (currently excludes `**/vendor/**`). ### What to fix (genuine quality improvements) - **Empty catches around file ops** — use `safeUnlink()` (ignores ENOENT, rethrows EPERM/EIO). A swallowed EPERM in cleanup means silent data loss. - **Empty catches around process kills** — use `safeKill()` (ignores ESRCH, rethrows EPERM). A swallowed EPERM means you think you killed something you didn't. - **Redundant `return await`** — remove when there's no enclosing try block. Saves a microtask, signals intent. - **Typed exception catches** — `catch (err) { if (!(err instanceof TypeError)) throw err }` is genuinely better than `catch {}` when the try block does URL parsing or DOM work. You know what error you expect, so say so. ### What NOT to fix (linter gaming, not quality) - **String-matching on error messages** — `err.message.includes('closed')` is brittle. Playwright/Chrome can change wording anytime. If a fire-and-forget operation can fail for ANY reason and you don't care, `catch {}` is the correct pattern. - **Adding comments to exempt pass-through wrappers** — "alias for active session" above a method just to trip slop-scan's exemption rule is noise, not documentation. - **Converting extension catch-and-log to selective rethrow** — Chrome extensions crash entirely on uncaught errors. If the catch logs and continues, that IS the right pattern for extension code. Don't make it throw. - **Tightening best-effort cleanup paths** — shutdown, emergency cleanup, and disconnect code should use `safeUnlinkQuiet()` (swallows ALL errors). A cleanup path that throws on EPERM means the rest of cleanup doesn't run. That's worse. ### Utilities in `browse/src/error-handling.ts` | Function | Use when | Behavior | |----------|----------|----------| | `safeUnlink(path)` | Normal file deletion | Ignores ENOENT, rethrows others | | `safeUnlinkQuiet(path)` | Shutdown/emergency cleanup | Swallows all errors | | `safeKill(pid, signal)` | Sending signals | Ignores ESRCH, rethrows others | | `isProcessAlive(pid)` | Boolean process checks | Returns true/false, never throws | ### Score tracking Baseline (2026-04-09, before cleanup): 100 findings, 432.8 score, 2.38 score/file. After cleanup: 90 findings, 358.1 score, 1.96 score/file. Don't chase the number. Fix patterns that represent actual code quality problems. Accept findings where the "sloppy" pattern is the correct engineering choice. ## Community PR guardrails When reviewing or merging community PRs, **always AskUserQuestion** before accepting any commit that: 1. **Touches ETHOS.md** — this file is Garry's personal builder philosophy. No edits from external contributors or AI agents, period. 2. **Removes or softens promotional material** — YC references, founder perspective, and product voice are intentional. PRs that frame these as "unnecessary" or "too promotional" must be rejected. 3. **Changes Garry's voice** — the tone, humor, directness, and perspective in skill templates, CHANGELOG, and docs are not generic. PRs that rewrite voice to be more "neutral" or "professional" must be rejected. Even if the agent strongly believes a change improves the project, these three categories require explicit user approval via AskUserQuestion. No exceptions. No auto-merging. No "I'll just clean this up." ## CHANGELOG + VERSION style **VERSION and CHANGELOG are branch-scoped.** Every feature branch that ships gets its own version bump and CHANGELOG entry. The entry describes what THIS branch adds — not what was already on main. **When to write the CHANGELOG entry:** - At `/ship` time (Step 13), not during development or mid-branch. - The entry covers ALL commits on this branch vs the base branch. - Never fold new work into an existing CHANGELOG entry from a prior version that already landed on main. If main has v0.10.0.0 and your branch adds features, bump to v0.10.1.0 with a new entry — don't edit the v0.10.0.0 entry. **Key questions before writing:** 1. What branch am I on? What did THIS branch change? 2. Is the base branch version already released? (If yes, bump and create new entry.) 3. Does an existing entry on this branch already cover earlier work? (If yes, replace it with one unified entry for the final version.) **Merging main does NOT mean adopting main's version.** When you merge origin/main into a feature branch, main may bring new CHANGELOG entries and a higher VERSION. Your branch still needs its OWN version bump on top. If main is at v0.13.8.0 and your branch adds features, bump to v0.13.9.0 with a new entry. Never jam your changes into an entry that already landed on main. Your entry goes on top because your branch lands next. **After merging main, always check:** - Does CHANGELOG have your branch's own entry separate from main's entries? - Is VERSION higher than main's VERSION? - Is your entry the topmost entry in CHANGELOG (above main's latest)? If any answer is no, fix it before continuing. **After any CHANGELOG edit that moves, adds, or removes entries,** immediately run `grep "^## \[" CHANGELOG.md` and verify the full version sequence is contiguous with no gaps or duplicates before committing. If a version is missing, the edit broke something. Fix it before moving on. CHANGELOG.md is **for users**, not contributors. Write it like product release notes: - Lead with what the user can now **do** that they couldn't before. Sell the feature. - Use plain language, not implementation details. "You can now..." not "Refactored the..." - **Never mention TODOS.md, internal tracking, eval infrastructure, or contributor-facing details.** These are invisible to users and meaningless to them. - Put contributor/internal changes in a separate "For contributors" section at the bottom. - Every entry should make someone think "oh nice, I want to try that." - No jargon: say "every question now tells you which project and branch you're in" not "AskUserQuestion format standardized across skill templates via preamble resolver." ## AI effort compression When estimating or discussing effort, always show both human-team and CC+gstack time: | Task type | Human team | CC+gstack | Compression | |-----------|-----------|-----------|-------------| | Boilerplate / scaffolding | 2 days | 15 min | ~100x | | Test writing | 1 day | 15 min | ~50x | | Feature implementation | 1 week | 30 min | ~30x | | Bug fix + regression test | 4 hours | 15 min | ~20x | | Architecture / design | 2 days | 4 hours | ~5x | | Research / exploration | 1 day | 3 hours | ~3x | Completeness is cheap. Don't recommend shortcuts when the complete implementation is a "lake" (achievable) not an "ocean" (multi-quarter migration). See the Completeness Principle in the skill preamble for the full philosophy. ## Search before building Before designing any solution that involves concurrency, unfamiliar patterns, infrastructure, or anything where the runtime/framework might have a built-in: 1. Search for "{runtime} {thing} built-in" 2. Search for "{thing} best practice {current year}" 3. Check official runtime/framework docs Three layers of knowledge: tried-and-true (Layer 1), new-and-popular (Layer 2), first-principles (Layer 3). Prize Layer 3 above all. See ETHOS.md for the full builder philosophy. ## Local plans Contributors can store long-range vision docs and design documents in `~/.gstack-dev/plans/`. These are local-only (not checked in). When reviewing TODOS.md, check `plans/` for candidates that may be ready to promote to TODOs or implement. ## E2E eval failure blame protocol When an E2E eval fails during `/ship` or any other workflow, **never claim "not related to our changes" without proving it.** These systems have invisible couplings — a preamble text change affects agent behavior, a new helper changes timing, a regenerated SKILL.md shifts prompt context. **Required before attributing a failure to "pre-existing":** 1. Run the same eval on main (or base branch) and show it fails there too 2. If it passes on main but fails on the branch — it IS your change. Trace the blame. 3. If you can't run on main, say "unverified — may or may not be related" and flag it as a risk in the PR body "Pre-existing" without receipts is a lazy claim. Prove it or don't say it. ## Long-running tasks: don't give up When running evals, E2E tests, or any long-running background task, **poll until completion**. Use `sleep 180 && echo "ready"` + `TaskOutput` in a loop every 3 minutes. Never switch to blocking mode and give up when the poll times out. Never say "I'll be notified when it completes" and stop checking — keep the loop going until the task finishes or the user tells you to stop. The full E2E suite can take 30-45 minutes. That's 10-15 polling cycles. Do all of them. Report progress at each check (which tests passed, which are running, any failures so far). The user wants to see the run complete, not a promise that you'll check later. ## E2E test fixtures: extract, don't copy **NEVER copy a full SKILL.md file into an E2E test fixture.** SKILL.md files are 1500-2000 lines. When `claude -p` reads a file that large, context bloat causes timeouts, flaky turn limits, and tests that take 5-10x longer than necessary. Instead, extract only the section the test actually needs: ```typescript // BAD — agent reads 1900 lines, burns tokens on irrelevant sections fs.copyFileSync(path.join(ROOT, 'ship', 'SKILL.md'), path.join(dir, 'ship-SKILL.md')); // GOOD — agent reads ~60 lines, finishes in 38s instead of timing out const full = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8'); const start = full.indexOf('## Review Readiness Dashboard'); const end = full.indexOf('\n---\n', start); fs.writeFileSync(path.join(dir, 'ship-SKILL.md'), full.slice(start, end > start ? end : undefined)); ``` Also when running targeted E2E tests to debug failures: - Run in **foreground** (`bun test ...`), not background with `&` and `tee` - Never `pkill` running eval processes and restart — you lose results and waste money - One clean run beats three killed-and-restarted runs ## Publishing native OpenClaw skills to ClawHub Native OpenClaw skills live in `openclaw/skills/gstack-openclaw-*/SKILL.md`. These are hand-crafted methodology skills (not generated by the pipeline) published to ClawHub so any OpenClaw user can install them. **Publishing:** The command is `clawhub publish` (NOT `clawhub skill publish`): ```bash clawhub publish openclaw/skills/gstack-openclaw-office-hours \ --slug gstack-openclaw-office-hours --name "gstack Office Hours" \ --version 1.0.0 --changelog "description of changes" ``` Repeat for each skill: `gstack-openclaw-ceo-review`, `gstack-openclaw-investigate`, `gstack-openclaw-retro`. Bump `--version` on each update. **Auth:** `clawhub login` (opens browser for GitHub auth). `clawhub whoami` to verify. **Updating:** Same `clawhub publish` command with a higher `--version` and `--changelog`. **Verification:** `clawhub search gstack` to confirm they're live. ## Deploying to the active skill The active skill lives at `~/.claude/skills/gstack/`. After making changes: 1. Push your branch 2. Fetch and reset in the skill directory: `cd ~/.claude/skills/gstack && git fetch origin && git reset --hard origin/main` 3. Rebuild: `cd ~/.claude/skills/gstack && bun run build` Or copy the binaries directly: - `cp browse/dist/browse ~/.claude/skills/gstack/browse/dist/browse` - `cp design/dist/design ~/.claude/skills/gstack/design/dist/design` ## README.md # gstack > "I don't think I've typed like a line of code probably since December, basically, which is an extremely large change." — [Andrej Karpathy](https://fortune.com/2026/03/21/andrej-karpathy-openai-cofounder-ai-agents-coding-state-of-psychosis-openclaw/), No Priors podcast, March 2026 When I heard Karpathy say this, I wanted to find out how. How does one person ship like a team of twenty? Peter Steinberger built [OpenClaw](https://github.com/openclaw/openclaw) — 247K GitHub stars — essentially solo with AI agents. The revolution is here. A single builder with the right tooling can move faster than a traditional team. I'm [Garry Tan](https://x.com/garrytan), President & CEO of [Y Combinator](https://www.ycombinator.com/). I've worked with thousands of startups — Coinbase, Instacart, Rippling — when they were one or two people in a garage. Before YC, I was one of the first eng/PM/designers at Palantir, cofounded Posterous (sold to Twitter), and built Bookface, YC's internal social network. **gstack is my answer.** I've been building products for twenty years, and right now I'm shipping more code than I ever have. In the last 60 days: **600,000+ lines of production code** (35% tests), **10,000-20,000 lines per day**, part-time, while running YC full-time. Here's my last `/retro` across 3 projects: **140,751 lines added, 362 commits, ~115k net LOC** in one week. **2026 — 1,237 contributions and counting:** ![GitHub contributions 2026 — 1,237 contributions, massive acceleration in Jan-Mar](docs/images/github-2026.png) **2013 — when I built Bookface at YC (772 contributions):** ![GitHub contributions 2013 — 772 contributions building Bookface at YC](docs/images/github-2013.png) Same person. Different era. The difference is the tooling. **gstack is how I do it.** It turns Claude Code into a virtual engineering team — a CEO who rethinks the product, an eng manager who locks architecture, a designer who catches AI slop, a reviewer who finds production bugs, a QA lead who opens a real browser, a security officer who runs OWASP + STRIDE audits, and a release engineer who ships the PR. Twenty-three specialists and eight power tools, all slash commands, all Markdown, all free, MIT license. This is my open source software factory. I use it every day. I'm sharing it because these tools should be available to everyone. Fork it. Improve it. Make it yours. And if you want to hate on free open source software — you're welcome to, but I'd rather you just try it first. **Who this is for:** - **Founders and CEOs** — especially technical ones who still want to ship - **First-time Claude Code users** — structured roles instead of a blank prompt - **Tech leads and staff engineers** — rigorous review, QA, and release automation on every PR ## Quick start 1. Install gstack (30 seconds — see below) 2. Run `/office-hours` — describe what you're building 3. Run `/plan-ceo-review` on any feature idea 4. Run `/review` on any branch with changes 5. Run `/qa` on your staging URL 6. Stop there. You'll know if this is for you. ## Install — 30 seconds **Requirements:** [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Git](https://git-scm.com/), [Bun](https://bun.sh/) v1.0+, [Node.js](https://nodejs.org/) (Windows only) ### Step 1: Install on your machine Open Claude Code and paste this. Claude does the rest. > Install gstack: run **`git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup`** then add a "gstack" section to CLAUDE.md that says to use the /browse skill from gstack for all web browsing, never use mcp\_\_claude-in-chrome\_\_\* tools, and lists the available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review, /design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy, /canary, /benchmark, /browse, /connect-chrome, /qa, /qa-only, /design-review, /setup-browser-cookies, /setup-deploy, /retro, /investigate, /document-release, /codex, /cso, /autoplan, /plan-devex-review, /devex-review, /careful, /freeze, /guard, /unfreeze, /gstack-upgrade, /learn. Then ask the user if they also want to add gstack to the current project so teammates get it. ### Step 2: Team mode — auto-update for shared repos (recommended) Every developer installs globally, updates happen automatically: ```bash cd ~/.claude/skills/gstack && ./setup --team ``` Then bootstrap your repo so teammates get it: ```bash cd ~/.claude/skills/gstack/bin/gstack-team-init required # or: optional git add .claude/ CLAUDE.md && git commit -m "require gstack for AI-assisted work" ``` No vendored files in your repo, no version drift, no manual upgrades. Every Claude Code session starts with a fast auto-update check (throttled to once/hour, network-failure-safe, completely silent). > **Contributing or need full history?** The commands above use `--depth 1` for a fast install. If you plan to contribute or need full git history, do a full clone instead: > ```bash > git clone https://github.com/garrytan/gstack.git ~/.claude/skills/gstack > ``` ### OpenClaw OpenClaw spawns Claude Code sessions via ACP, so every gstack skill just works when Claude Code has gstack installed. Paste this to your OpenClaw agent: > Install gstack: run `git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup` to install gstack for Claude Code. Then add a "Coding Tasks" section to AGENTS.md that says: when spawning Claude Code sessions for coding work, tell the session to use gstack skills. Include these examples — security audit: "Load gstack. Run /cso", code review: "Load gstack. Run /review", QA test a URL: "Load gstack. Run /qa https://...", build a feature end-to-end: "Load gstack. Run /autoplan, implement the plan, then run /ship", plan before building: "Load gstack. Run /office-hours then /autoplan. Save the plan, don't implement." **After setup, just talk to your OpenClaw agent naturally:** | You say | What happens | |---------|-------------| | "Fix the typo in README" | Simple — Claude Code session, no gstack needed | | "Run a security audit on this repo" | Spawns Claude Code with `Run /cso` | | "Build me a notifications feature" | Spawns Claude Code with /autoplan → implement → /ship | | "Help me plan the v2 API redesign" | Spawns Claude Code with /office-hours → /autoplan, saves plan | See [docs/OPENCLAW.md](docs/OPENCLAW.md) for advanced dispatch routing and the gstack-lite/gstack-full prompt templates. ### Native OpenClaw Skills (via ClawHub) Four methodology skills that work directly in your OpenClaw agent, no Claude Code session needed. Install from ClawHub: ``` clawhub install gstack-openclaw-office-hours gstack-openclaw-ceo-review gstack-openclaw-investigate gstack-openclaw-retro ``` | Skill | What it does | |-------|-------------| | `gstack-openclaw-office-hours` | Product interrogation with 6 forcing questions | | `gstack-openclaw-ceo-review` | Strategic challenge with 4 scope modes | | `gstack-openclaw-investigate` | Root cause debugging methodology | | `gstack-openclaw-retro` | Weekly engineering retrospective | These are conversational skills. Your OpenClaw agent runs them directly via chat. ### Other AI Agents gstack works on 10 AI coding agents, not just Claude. Setup auto-detects which agents you have installed: ```bash git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/gstack cd ~/gstack && ./setup ``` Or target a specific agent with `./setup --host `: | Agent | Flag | Skills install to | |-------|------|-------------------| | OpenAI Codex CLI | `--host codex` | `~/.codex/skills/gstack-*/` | | OpenCode | `--host opencode` | `~/.config/opencode/skills/gstack-*/` | | Cursor | `--host cursor` | `~/.cursor/skills/gstack-*/` | | Factory Droid | `--host factory` | `~/.factory/skills/gstack-*/` | | Slate | `--host slate` | `~/.slate/skills/gstack-*/` | | Kiro | `--host kiro` | `~/.kiro/skills/gstack-*/` | | Hermes | `--host hermes` | `~/.hermes/skills/gstack-*/` | | GBrain (mod) | `--host gbrain` | `~/.gbrain/skills/gstack-*/` | **Want to add support for another agent?** See [docs/ADDING_A_HOST.md](docs/ADDING_A_HOST.md). It's one TypeScript config file, zero code changes. ## See it work ``` You: I want to build a daily briefing app for my calendar. You: /office-hours Claude: [asks about the pain — specific examples, not hypotheticals] You: Multiple Google calendars, events with stale info, wrong locations. Prep takes forever and the results aren't good enough... Claude: I'm going to push back on the framing. You said "daily briefing app." But what you actually described is a personal chief of staff AI. [extracts 5 capabilities you didn't realize you were describing] [challenges 4 premises — you agree, disagree, or adjust] [generates 3 implementation approaches with effort estimates] RECOMMENDATION: Ship the narrowest wedge tomorrow, learn from real usage. The full vision is a 3-month project — start with the daily briefing that actually works. [writes design doc → feeds into downstream skills automatically] You: /plan-ceo-review [reads the design doc, challenges scope, runs 10-section review] You: /plan-eng-review [ASCII diagrams for data flow, state machines, error paths] [test matrix, failure modes, security concerns] You: Approve plan. Exit plan mode. [writes 2,400 lines across 11 files. ~8 minutes.] You: /review [AUTO-FIXED] 2 issues. [ASK] Race condition → you approve fix. You: /qa https://staging.myapp.com [opens real browser, clicks through flows, finds and fixes a bug] You: /ship Tests: 42 → 51 (+9 new). PR: github.com/you/app/pull/42 ``` You said "daily briefing app." The agent said "you're building a chief of staff AI" — because it listened to your pain, not your feature request. Eight commands, end to end. That is not a copilot. That is a team. ## The sprint gstack is a process, not a collection of tools. The skills run in the order a sprint runs: **Think → Plan → Build → Review → Test → Ship → Reflect** Each skill feeds into the next. `/office-hours` writes a design doc that `/plan-ceo-review` reads. `/plan-eng-review` writes a test plan that `/qa` picks up. `/review` catches bugs that `/ship` verifies are fixed. Nothing falls through the cracks because every step knows what came before it. | Skill | Your specialist | What they do | |-------|----------------|--------------| | `/office-hours` | **YC Office Hours** | Start here. Six forcing questions that reframe your product before you write code. Pushes back on your framing, challenges premises, generates implementation alternatives. Design doc feeds into every downstream skill. | | `/plan-ceo-review` | **CEO / Founder** | Rethink the problem. Find the 10-star product hiding inside the request. Four modes: Expansion, Selective Expansion, Hold Scope, Reduction. | | `/plan-eng-review` | **Eng Manager** | Lock in architecture, data flow, diagrams, edge cases, and tests. Forces hidden assumptions into the open. | | `/plan-design-review` | **Senior Designer** | Rates each design dimension 0-10, explains what a 10 looks like, then edits the plan to get there. AI Slop detection. Interactive — one AskUserQuestion per design choice. | | `/plan-devex-review` | **Developer Experience Lead** | Interactive DX review: explores developer personas, benchmarks against competitors' TTHW, designs your magical moment, traces friction points step by step. Three modes: DX EXPANSION, DX POLISH, DX TRIAGE. 20-45 forcing questions. | | `/design-consultation` | **Design Partner** | Build a complete design system from scratch. Researches the landscape, proposes creative risks, generates realistic product mockups. | | `/review` | **Staff Engineer** | Find the bugs that pass CI but blow up in production. Auto-fixes the obvious ones. Flags completeness gaps. | | `/investigate` | **Debugger** | Systematic root-cause debugging. Iron Law: no fixes without investigation. Traces data flow, tests hypotheses, stops after 3 failed fixes. | | `/design-review` | **Designer Who Codes** | Same audit as /plan-design-review, then fixes what it finds. Atomic commits, before/after screenshots. | | `/devex-review` | **DX Tester** | Live developer experience audit. Actually tests your onboarding: navigates docs, tries the getting started flow, times TTHW, screenshots errors. Compares against `/plan-devex-review` scores — the boomerang that shows if your plan matched reality. | | `/design-shotgun` | **Design Explorer** | "Show me options." Generates 4-6 AI mockup variants, opens a comparison board in your browser, collects your feedback, and iterates. Taste memory learns what you like. Repeat until you love something, then hand it to `/design-html`. | | `/design-html` | **Design Engineer** | Turn a mockup into production HTML that actually works. Pretext computed layout: text reflows, heights adjust, layouts are dynamic. 30KB, zero deps. Detects React/Svelte/Vue. Smart API routing per design type (landing page vs dashboard vs form). The output is shippable, not a demo. | | `/qa` | **QA Lead** | Test your app, find bugs, fix them with atomic commits, re-verify. Auto-generates regression tests for every fix. | | `/qa-only` | **QA Reporter** | Same methodology as /qa but report only. Pure bug report without code changes. | | `/pair-agent` | **Multi-Agent Coordinator** | Share your browser with any AI agent. One command, one paste, connected. Works with OpenClaw, Hermes, Codex, Cursor, or anything that can curl. Each agent gets its own tab. Auto-launches headed mode so you watch everything. Auto-starts ngrok tunnel for remote agents. Scoped tokens, tab isolation, rate limiting, activity attribution. | | `/cso` | **Chief Security Officer** | OWASP Top 10 + STRIDE threat model. Zero-noise: 17 false positive exclusions, 8/10+ confidence gate, independent finding verification. Each finding includes a concrete exploit scenario. | | `/ship` | **Release Engineer** | Sync main, run tests, audit coverage, push, open PR. Bootstraps test frameworks if you don't have one. | | `/land-and-deploy` | **Release Engineer** | Merge the PR, wait for CI and deploy, verify production health. One command from "approved" to "verified in production." | | `/canary` | **SRE** | Post-deploy monitoring loop. Watches for console errors, performance regressions, and page failures. | | `/benchmark` | **Performance Engineer** | Baseline page load times, Core Web Vitals, and resource sizes. Compare before/after on every PR. | | `/document-release` | **Technical Writer** | Update all project docs to match what you just shipped. Catches stale READMEs automatically. | | `/retro` | **Eng Manager** | Team-aware weekly retro. Per-person breakdowns, shipping streaks, test health trends, growth opportunities. `/retro global` runs across all your projects and AI tools (Claude Code, Codex, Gemini). | | `/browse` | **QA Engineer** | Give the agent eyes. Real Chromium browser, real clicks, real screenshots. ~100ms per command. `/open-gstack-browser` launches GStack Browser with sidebar, anti-bot stealth, and auto model routing. | | `/setup-browser-cookies` | **Session Manager** | Import cookies from your real browser (Chrome, Arc, Brave, Edge) into the headless session. Test authenticated pages. | | `/autoplan` | **Review Pipeline** | One command, fully reviewed plan. Runs CEO → design → eng review automatically with encoded decision principles. Surfaces only taste decisions for your approval. | | `/learn` | **Memory** | Manage what gstack learned across sessions. Review, search, prune, and export project-specific patterns, pitfalls, and preferences. Learnings compound across sessions so gstack gets smarter on your codebase over time. | ### Which review should I use? | Building for... | Plan stage (before code) | Live audit (after shipping) | |-----------------|--------------------------|----------------------------| | **End users** (UI, web app, mobile) | `/plan-design-review` | `/design-review` | | **Developers** (API, CLI, SDK, docs) | `/plan-devex-review` | `/devex-review` | | **Architecture** (data flow, perf, tests) | `/plan-eng-review` | `/review` | | **All of the above** | `/autoplan` (runs CEO → design → eng → DX, auto-detects which apply) | — | ### Power tools | Skill | What it does | |-------|-------------| | `/codex` | **Second Opinion** — independent code review from OpenAI Codex CLI. Three modes: review (pass/fail gate), adversarial challenge, and open consultation. Cross-model analysis when both `/review` and `/codex` have run. | | `/careful` | **Safety Guardrails** — warns before destructive commands (rm -rf, DROP TABLE, force-push). Say "be careful" to activate. Override any warning. | | `/freeze` | **Edit Lock** — restrict file edits to one directory. Prevents accidental changes outside scope while debugging. | | `/guard` | **Full Safety** — `/careful` + `/freeze` in one command. Maximum safety for prod work. | | `/unfreeze` | **Unlock** — remove the `/freeze` boundary. | | `/open-gstack-browser` | **GStack Browser** — launch GStack Browser with sidebar, anti-bot stealth, auto model routing (Sonnet for actions, Opus for analysis), one-click cookie import, and Claude Code integration. Clean up pages, take smart screenshots, edit CSS, and pass info back to your terminal. | | `/setup-deploy` | **Deploy Configurator** — one-time setup for `/land-and-deploy`. Detects your platform, production URL, and deploy commands. | | `/gstack-upgrade` | **Self-Updater** — upgrade gstack to latest. Detects global vs vendored install, syncs both, shows what changed. | **[Deep dives with examples and philosophy for every skill →](docs/skills.md)** ### Karpathy's four failure modes? Already covered. Andrej Karpathy's [AI coding rules](https://github.com/forrestchang/andrej-karpathy-skills) (17K stars) nail four failure modes: wrong assumptions, overcomplexity, orthogonal edits, imperative over declarative. gstack's workflow skills enforce all four. `/office-hours` forces assumptions into the open before code is written. The Confusion Protocol stops Claude from guessing on architectural decisions. `/review` catches unnecessary complexity and drive-by edits. `/ship` transforms tasks into verifiable goals with test-first execution. If you already use Karpathy-style CLAUDE.md rules, gstack is the workflow enforcement layer that makes them stick across entire sprints, not just single prompts. ## Parallel sprints gstack works well with one sprint. It gets interesting with ten running at once. **Design is at the heart.** `/design-consultation` builds your design system from scratch, researches what's out there, proposes creative risks, and writes `DESIGN.md`. But the real magic is the shotgun-to-HTML pipeline. **`/design-shotgun` is how you explore.** You describe what you want. It generates 4-6 AI mockup variants using GPT Image. Then it opens a comparison board in your browser with all variants side by side. You pick favorites, leave feedback ("more whitespace", "bolder headline", "lose the gradient"), and it generates a new round. Repeat until you love something. Taste memory kicks in after a few rounds so it starts biasing toward what you actually like. No more describing your vision in words and hoping the AI gets it. You see options, pick the good ones, and iterate visually. **`/design-html` makes it real.** Take that approved mockup (from `/design-shotgun`, a CEO plan, a design review, or just a description) and turn it into production-quality HTML/CSS. Not the kind of AI HTML that looks fine at one viewport width and breaks everywhere else. This uses Pretext for computed text layout: text actually reflows on resize, heights adjust to content, layouts are dynamic. 30KB overhead, zero dependencies. It detects your framework (React, Svelte, Vue) and outputs the right format. Smart API routing picks different Pretext patterns depending on whether it's a landing page, dashboard, form, or card layout. The output is something you'd actually ship, not a demo. **`/qa` was a massive unlock.** It let me go from 6 to 12 parallel workers. Claude Code saying *"I SEE THE ISSUE"* and then actually fixing it, generating a regression test, and verifying the fix — that changed how I work. The agent has eyes now. **Smart review routing.** Just like at a well-run startup: CEO doesn't have to look at infra bug fixes, design review isn't needed for backend changes. gstack tracks what reviews are run, figures out what's appropriate, and just does the smart thing. The Review Readiness Dashboard tells you where you stand before you ship. **Test everything.** `/ship` bootstraps test frameworks from scratch if your project doesn't have one. Every `/ship` run produces a coverage audit. Every `/qa` bug fix generates a regression test. 100% test coverage is the goal — tests make vibe coding safe instead of yolo coding. **`/document-release` is the engineer you never had.** It reads every doc file in your project, cross-references the diff, and updates everything that drifted. README, ARCHITECTURE, CONTRIBUTING, CLAUDE.md, TODOS — all kept current automatically. And now `/ship` auto-invokes it — docs stay current without an extra command. **Real browser mode.** `/open-gstack-browser` launches GStack Browser, an AI-controlled Chromium with anti-bot stealth, custom branding, and the sidebar extension baked in. Sites like Google and NYTimes work without captchas. The menu bar says "GStack Browser" instead of "Chrome for Testing." Your regular Chrome stays untouched. All existing browse commands work unchanged. `$B disconnect` returns to headless. The browser stays alive as long as the window is open... no idle timeout killing it while you're working. **Sidebar agent — your AI browser assistant.** Type natural language in the Chrome side panel and a child Claude instance executes it. "Navigate to the settings page and screenshot it." "Fill out this form with test data." "Go through every item in this list and extract the prices." The sidebar auto-routes to the right model: Sonnet for fast actions (click, navigate, screenshot) and Opus for reading and analysis. Each task gets up to 5 minutes. The sidebar agent runs in an isolated session, so it won't interfere with your main Claude Code window. One-click cookie import right from the sidebar footer. **Personal automation.** The sidebar agent isn't just for dev workflows. Example: "Browse my kid's school parent portal and add all the other parents' names, phone numbers, and photos to my Google Contacts." Two ways to get authenticated: (1) log in once in the headed browser, your session persists, or (2) click the "cookies" button in the sidebar footer to import cookies from your real Chrome. Once authenticated, Claude navigates the directory, extracts the data, and creates the contacts. **Browser handoff when the AI gets stuck.** Hit a CAPTCHA, auth wall, or MFA prompt? `$B handoff` opens a visible Chrome at the exact same page with all your cookies and tabs intact. Solve the problem, tell Claude you're done, `$B resume` picks up right where it left off. The agent even suggests it automatically after 3 consecutive failures. **`/pair-agent` is cross-agent coordination.** You're in Claude Code. You also have OpenClaw running. Or Hermes. Or Codex. You want them both looking at the same website. Type `/pair-agent`, pick your agent, and a GStack Browser window opens so you can watch. The skill prints a block of instructions. Paste that block into the other agent's chat. It exchanges a one-time setup key for a session token, creates its own tab, and starts browsing. You see both agents working in the same browser, each in their own tab, neither able to interfere with the other. If ngrok is installed, the tunnel starts automatically so the other agent can be on a completely different machine. Same-machine agents get a zero-friction shortcut that writes credentials directly. This is the first time AI agents from different vendors can coordinate through a shared browser with real security: scoped tokens, tab isolation, rate limiting, domain restrictions, and activity attribution. **Multi-AI second opinion.** `/codex` gets an independent review from OpenAI's Codex CLI — a completely different AI looking at the same diff. Three modes: code review with a pass/fail gate, adversarial challenge that actively tries to break your code, and open consultation with session continuity. When both `/review` (Claude) and `/codex` (OpenAI) have reviewed the same branch, you get a cross-model analysis showing which findings overlap and which are unique to each. **Safety guardrails on demand.** Say "be careful" and `/careful` warns before any destructive command — rm -rf, DROP TABLE, force-push, git reset --hard. `/freeze` locks edits to one directory while debugging so Claude can't accidentally "fix" unrelated code. `/guard` activates both. `/investigate` auto-freezes to the module being investigated. **Proactive skill suggestions.** gstack notices what stage you're in — brainstorming, reviewing, debugging, testing — and suggests the right skill. Don't like it? Say "stop suggesting" and it remembers across sessions. ## 10-15 parallel sprints gstack is powerful with one sprint. It is transformative with ten running at once. [Conductor](https://conductor.build) runs multiple Claude Code sessions in parallel — each in its own isolated workspace. One session running `/office-hours` on a new idea, another doing `/review` on a PR, a third implementing a feature, a fourth running `/qa` on staging, and six more on other branches. All at the same time. I regularly run 10-15 parallel sprints — that's the practical max right now. The sprint structure is what makes parallelism work. Without a process, ten agents is ten sources of chaos. With a process — think, plan, build, review, test, ship — each agent knows exactly what to do and when to stop. You manage them the way a CEO manages a team: check in on the decisions that matter, let the rest run. ### Voice input (AquaVoice, Whisper, etc.) gstack skills have voice-friendly trigger phrases. Say what you want naturally — "run a security check", "test the website", "do an engineering review" — and the right skill activates. You don't need to remember slash command names or acronyms. ## Uninstall ### Option 1: Run the uninstall script If gstack is installed on your machine: ```bash ~/.claude/skills/gstack/bin/gstack-uninstall ``` This handles skills, symlinks, global state (`~/.gstack/`), project-local state, browse daemons, and temp files. Use `--keep-state` to preserve config and analytics. Use `--force` to skip confirmation. ### Option 2: Manual removal (no local repo) If you don't have the repo cloned (e.g. you installed via a Claude Code paste and later deleted the clone): ```bash # 1. Stop browse daemons pkill -f "gstack.*browse" 2>/dev/null || true # 2. Remove per-skill symlinks pointing into gstack/ find ~/.claude/skills -maxdepth 1 -type l 2>/dev/null | while read -r link; do case "$(readlink "$link" 2>/dev/null)" in gstack/*|*/gstack/*) rm -f "$link" ;; esac done # 3. Remove gstack rm -rf ~/.claude/skills/gstack # 4. Remove global state rm -rf ~/.gstack # 5. Remove integrations (skip any you never installed) rm -rf ~/.codex/skills/gstack* 2>/dev/null rm -rf ~/.factory/skills/gstack* 2>/dev/null rm -rf ~/.kiro/skills/gstack* 2>/dev/null rm -rf ~/.openclaw/skills/gstack* 2>/dev/null # 6. Remove temp files rm -f /tmp/gstack-* 2>/dev/null # 7. Per-project cleanup (run from each project root) rm -rf .gstack .gstack-worktrees .claude/skills/gstack 2>/dev/null rm -rf .agents/skills/gstack* .factory/skills/gstack* 2>/dev/null ``` ### Clean up CLAUDE.md The uninstall script does not edit CLAUDE.md. In each project where gstack was added, remove the `## gstack` and `## Skill routing` sections. ### Playwright `~/Library/Caches/ms-playwright/` (macOS) is left in place because other tools may share it. Remove it if nothing else needs it. --- Free, MIT licensed, open source. No premium tier, no waitlist. I open sourced how I build software. You can fork it and make it your own. > **We're hiring.** Want to ship 10K+ LOC/day and help harden gstack? > Come work at YC — [ycombinator.com/software](https://ycombinator.com/software) > Extremely competitive salary and equity. San Francisco, Dogpatch District. ## Docs | Doc | What it covers | |-----|---------------| | [Skill Deep Dives](docs/skills.md) | Philosophy, examples, and workflow for every skill (includes Greptile integration) | | [Builder Ethos](ETHOS.md) | Builder philosophy: Boil the Lake, Search Before Building, three layers of knowledge | | [Architecture](ARCHITECTURE.md) | Design decisions and system internals | | [Browser Reference](BROWSER.md) | Full command reference for `/browse` | | [Contributing](CONTRIBUTING.md) | Dev setup, testing, contributor mode, and dev mode | | [Changelog](CHANGELOG.md) | What's new in every version | ## Privacy & Telemetry gstack includes **opt-in** usage telemetry to help improve the project. Here's exactly what happens: - **Default is off.** Nothing is sent anywhere unless you explicitly say yes. - **On first run,** gstack asks if you want to share anonymous usage data. You can say no. - **What's sent (if you opt in):** skill name, duration, success/fail, gstack version, OS. That's it. - **What's never sent:** code, file paths, repo names, branch names, prompts, or any user-generated content. - **Change anytime:** `gstack-config set telemetry off` disables everything instantly. Data is stored in [Supabase](https://supabase.com) (open source Firebase alternative). The schema is in [`supabase/migrations/`](supabase/migrations/) — you can verify exactly what's collected. The Supabase publishable key in the repo is a public key (like a Firebase API key) — row-level security policies deny all direct access. Telemetry flows through validated edge functions that enforce schema checks, event type allowlists, and field length limits. **Local analytics are always available.** Run `gstack-analytics` to see your personal usage dashboard from the local JSONL file — no remote data needed. ## Troubleshooting **Skill not showing up?** `cd ~/.claude/skills/gstack && ./setup` **`/browse` fails?** `cd ~/.claude/skills/gstack && bun install && bun run build` **Stale install?** Run `/gstack-upgrade` — or set `auto_upgrade: true` in `~/.gstack/config.yaml` **Want shorter commands?** `cd ~/.claude/skills/gstack && ./setup --no-prefix` — switches from `/gstack-qa` to `/qa`. Your choice is remembered for future upgrades. **Want namespaced commands?** `cd ~/.claude/skills/gstack && ./setup --prefix` — switches from `/qa` to `/gstack-qa`. Useful if you run other skill packs alongside gstack. **Codex says "Skipped loading skill(s) due to invalid SKILL.md"?** Your Codex skill descriptions are stale. Fix: `cd ~/.codex/skills/gstack && git pull && ./setup --host codex` — or for repo-local installs: `cd "$(readlink -f .agents/skills/gstack)" && git pull && ./setup --host codex` **Windows users:** gstack works on Windows 11 via Git Bash or WSL. Node.js is required in addition to Bun — Bun has a known bug with Playwright's pipe transport on Windows ([bun#4253](https://github.com/oven-sh/bun/issues/4253)). The browse server automatically falls back to Node.js. Make sure both `bun` and `node` are on your PATH. **Claude says it can't see the skills?** Make sure your project's `CLAUDE.md` has a gstack section. Add this: ``` ## gstack Use /browse from gstack for all web browsing. Never use mcp__claude-in-chrome__* tools. Available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review, /design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy, /canary, /benchmark, /browse, /open-gstack-browser, /qa, /qa-only, /design-review, /setup-browser-cookies, /setup-deploy, /retro, /investigate, /document-release, /codex, /cso, /autoplan, /pair-agent, /careful, /freeze, /guard, /unfreeze, /gstack-upgrade, /learn. ``` ## License MIT. Free forever. Go build something.