diff --git a/.planning/STATE.md b/.planning/STATE.md
index 4176ca2..71da506 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -11,7 +11,7 @@ See: .planning/PROJECT.md (updated 2026-02-24)
Milestone: v1.0 MVP — SHIPPED 2026-02-24
Status: Milestone Complete
-Last activity: 2026-03-08 - Completed quick task 1: Add tmux theme and ease of use config to base Dockerfile
+Last activity: 2026-03-23 - Completed quick task 260322-wyy: add gstack to CLAUDE, update README, validate it works by building and creating a mock devcontainer
Progress: [##########] 100%
@@ -36,9 +36,10 @@ None.
| # | Description | Date | Commit | Directory |
|---|-------------|------|--------|-----------|
| 1 | Add tmux theme and ease of use config to base Dockerfile | 2026-03-08 | 7fc04c9 | [1-add-tmux-theme-and-ease-of-use-config-to](./quick/1-add-tmux-theme-and-ease-of-use-config-to/) |
+| 260322-wyy | add gstack to CLAUDE, update README, validate it works by building and creating a mock devcontainer | 2026-03-23 | 9ef5374 | [260322-wyy-add-gstack-to-claude-update-readme-valid](./quick/260322-wyy-add-gstack-to-claude-update-readme-valid/) |
## Session Continuity
-Last session: 2026-03-08
-Stopped at: Completed quick/1-PLAN.md (tmux config)
+Last session: 2026-03-23
+Stopped at: Completed quick task 260322-wyy (gstack + Bun)
Resume file: None
diff --git a/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-PLAN.md b/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-PLAN.md
new file mode 100644
index 0000000..52d06ad
--- /dev/null
+++ b/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-PLAN.md
@@ -0,0 +1,159 @@
+---
+phase: quick
+plan: 260322-wyy
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - scripts/setup-claude.sh
+ - base/devcontainer-claude.md
+ - README.md
+ - base/Dockerfile
+autonomous: false
+requirements: [add-gstack, update-docs, validate-build]
+must_haves:
+ truths:
+ - "gstack is cloned and set up during Docker image build"
+ - "devcontainer-claude.md lists gstack in Plugins & Skills"
+ - "README.md lists gstack in What's Included > All images (base)"
+ - "Base Docker image builds successfully with gstack installed"
+ artifacts:
+ - path: "scripts/setup-claude.sh"
+ provides: "gstack clone + setup commands"
+ contains: "gstack"
+ - path: "base/devcontainer-claude.md"
+ provides: "gstack listed in Plugins & Skills"
+ contains: "gstack"
+ - path: "README.md"
+ provides: "gstack listed in base image tools"
+ contains: "gstack"
+ key_links:
+ - from: "base/Dockerfile"
+ to: "scripts/setup-claude.sh"
+ via: "COPY + bash execution during build"
+ pattern: "setup-claude.sh"
+---
+
+
+Add gstack (garrytan/gstack) to the base DevContainer image, update documentation (devcontainer-claude.md and README.md), and validate the build works.
+
+Purpose: gstack provides 28 specialized Claude Code skills as slash commands, enhancing the DevContainer's AI capabilities out of the box.
+Output: Updated setup script, documentation, and a validated Docker build.
+
+
+
+@$HOME/.claude/get-shit-done/workflows/execute-plan.md
+@$HOME/.claude/get-shit-done/templates/summary.md
+
+
+
+@./CLAUDE.md
+@scripts/setup-claude.sh
+@base/devcontainer-claude.md
+@README.md
+@base/Dockerfile
+
+
+
+
+
+ Task 1: Add gstack installation to setup-claude.sh and install Bun in base Dockerfile
+ scripts/setup-claude.sh, base/Dockerfile
+
+1. **base/Dockerfile** — Add Bun installation in the USER dev section, BEFORE `setup-claude.sh` is executed (around line 209, after UV install). Use the official install script:
+ ```
+ # Bun
+ RUN curl -fsSL https://bun.sh/install | bash
+ ```
+ This installs bun to `~/.bun/bin/bun`. The `.bashrc` sourced by NVM already handles PATH, but the Dockerfile RUN shell won't have it. So for subsequent RUN commands that need bun, use the full path or add to PATH explicitly.
+
+ Also add `ENV PATH="/home/dev/.bun/bin:${PATH}"` right after the bun install RUN so subsequent layers (including setup-claude.sh) can find `bun`.
+
+2. **scripts/setup-claude.sh** — Add a `# --- gstack ---` section AFTER the `# --- GSD ---` block (line 58) and BEFORE the `# --- MCP Servers ---` block. Content:
+ ```bash
+ # --- gstack ---
+
+ git clone https://github.com/garrytan/gstack.git "$HOME/.claude/skills/gstack"
+ cd "$HOME/.claude/skills/gstack" && ./setup
+ cd /workspace
+ ```
+
+ The setup script likely requires bun (now available from the Dockerfile step above).
+
+
+ grep -q "gstack" /workspace/scripts/setup-claude.sh && grep -q "bun" /workspace/base/Dockerfile && echo "PASS" || echo "FAIL"
+
+ setup-claude.sh contains gstack clone+setup section; base/Dockerfile installs Bun before running setup-claude.sh
+
+
+
+ Task 2: Update devcontainer-claude.md and README.md with gstack documentation
+ base/devcontainer-claude.md, README.md
+
+1. **base/devcontainer-claude.md** — In the `## Plugins & Skills` section (line 51-60), add a new line after the GSD entry (line 52):
+ ```
+ - gstack — 28 specialized engineering skills as slash commands (garrytan/gstack)
+ ```
+
+ Also in `### Languages & Runtimes` section (line 7-9), add Bun:
+ ```
+ - Bun — `bun`, `bunx`
+ ```
+
+2. **README.md** — In the `### All images (base)` section (around line 157-174), add after the "Agent Browser" line (line 164):
+ ```
+ - **gstack** — 28 specialized Claude Code engineering skills ([garrytan/gstack](https://github.com/garrytan/gstack))
+ ```
+
+ Also add Bun to the base section since it is now in the base image:
+ ```
+ - **Bun** runtime (`bun`, `bunx`)
+ ```
+
+ Since Bun is now in base, the Bun variant section becomes a thin wrapper. Keep the variant as-is for now but add Bun to the base section. The variant may add bun-specific extras in the future.
+
+
+ grep -q "gstack" /workspace/base/devcontainer-claude.md && grep -q "gstack" /workspace/README.md && echo "PASS" || echo "FAIL"
+
+ Both devcontainer-claude.md and README.md document gstack and Bun in the base image tooling
+
+
+
+ Task 3: Build base image and verify gstack installation
+ base/Dockerfile
+
+Build the base Docker image and verify gstack + Bun are correctly installed. Run:
+1. `docker build -t devcontainer-base:test -f base/Dockerfile .`
+2. `docker run --rm devcontainer-base:test ls ~/.claude/skills/gstack/`
+3. `docker run --rm devcontainer-base:test bun --version`
+4. `docker run --rm devcontainer-base:test ls ~/.claude/skills/gstack/skills/`
+Then present results for human review.
+
+
+ docker build -t devcontainer-base:test -f base/Dockerfile . 2>&1 | tail -5
+
+ Base Docker image builds successfully; gstack directory exists at ~/.claude/skills/gstack/ with skills populated; bun --version returns 1.x+
+
+
+
+
+
+- `grep -q "gstack" scripts/setup-claude.sh` returns 0
+- `grep -q "gstack" base/devcontainer-claude.md` returns 0
+- `grep -q "gstack" README.md` returns 0
+- `grep -q "bun" base/Dockerfile` returns 0
+- Docker base image builds successfully
+- gstack directory exists at ~/.claude/skills/gstack/ inside the built image
+
+
+
+- gstack is installed in the base Docker image during build
+- Bun runtime is available in the base image
+- devcontainer-claude.md documents gstack in Plugins & Skills and Bun in Languages & Runtimes
+- README.md documents gstack and Bun in the base image section
+- Base Docker image builds without errors
+
+
+
diff --git a/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-SUMMARY.md b/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-SUMMARY.md
new file mode 100644
index 0000000..bdd70b6
--- /dev/null
+++ b/.planning/quick/260322-wyy-add-gstack-to-claude-update-readme-valid/260322-wyy-SUMMARY.md
@@ -0,0 +1,38 @@
+# Quick Task 260322-wyy: Summary
+
+**Task:** add gstack to CLAUDE, update README, validate it works by building and creating a mock devcontainer
+**Date:** 2026-03-23
+**Status:** Complete
+
+## Changes
+
+### 1. base/Dockerfile
+- Added Bun runtime installation (`curl -fsSL https://bun.sh/install | bash`) after UV install
+- Added `ENV PATH="/home/dev/.bun/bin:${PATH}"` so Bun is available in subsequent layers
+
+### 2. scripts/setup-claude.sh
+- Added `# --- gstack ---` section between GSD and MCP Servers
+- Clones `garrytan/gstack` into `~/.claude/skills/gstack`
+- Runs `bun install && bun run build` to compile browse binary
+- Creates `~/.gstack/projects` global state directory
+- Symlinks all 27 skill subdirectories into `~/.claude/skills/` for Claude Code discovery
+- Uses manual setup instead of `./setup` to skip Chromium launch verification (incompatible with Docker build — no display)
+
+### 3. base/devcontainer-claude.md
+- Added `Bun — bun, bunx` to Languages & Runtimes section
+- Added `gstack — 28 specialized engineering skills as slash commands (garrytan/gstack)` to Plugins & Skills section
+
+### 4. README.md
+- Added `gstack` and `Bun` entries to "What's Included > All images (base)" section
+
+## Validation
+
+- Docker base image builds successfully
+- `bun --version` returns 1.3.11 inside container
+- `~/.claude/skills/gstack/` contains full repo with all skill directories
+- `browse/dist/browse` binary built successfully
+- 27 skill symlinks created in `~/.claude/skills/`
+
+## Design Decision
+
+gstack's `./setup` script tries to launch Playwright Chromium for verification, which fails in Docker build (no display server). Solution: manual setup that replicates all setup steps except the Chromium launch check. agent-browser already installs Playwright + Chromium, so the verification is unnecessary.
diff --git a/README.md b/README.md
index a05a516..d9daeb9 100644
--- a/README.md
+++ b/README.md
@@ -162,6 +162,8 @@ All images extend a shared base (`base/Dockerfile` — `debian:trixie`) and run
- **MCP servers**: Serena, Context7, Automem
- **GSD** (Get Shit Done for Claude Code)
- **Agent Browser** + Chrome
+- **gstack** — 28 specialized Claude Code engineering skills ([garrytan/gstack](https://github.com/garrytan/gstack))
+- **Bun** runtime (`bun`, `bunx`)
- **Docker** CLI + Compose plugin (`docker`, `docker compose`) — mount the host socket to use; works without `sudo` (the entrypoint automatically matches the socket's GID)
- **CLI tools**: git, curl, wget, vim, nano, jq, tmux, xclip, openssh-client, gnupg, cmake, less, unzip, gh, pnpm, tsx
- **Search & file tools**: ripgrep, fd-find, fzf, bat, tree
@@ -172,6 +174,8 @@ All images extend a shared base (`base/Dockerfile` — `debian:trixie`) and run
- **ttyd** (web terminal)
- **Database clients**: postgresql-client, default-mysql-client, redis-tools
- **ntfy** notification hooks (Notification + Stop events)
+- **pi** a minimal terminal coding harness
+- **CliDeck** one dashboard for all your AI coding agents
### Bun (`trixie-bun-nvm-uv-claude`)
diff --git a/base/Dockerfile b/base/Dockerfile
index 717404a..4669622 100644
--- a/base/Dockerfile
+++ b/base/Dockerfile
@@ -208,6 +208,10 @@ WORKDIR /workspace
# UV
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
+# Bun
+RUN curl -fsSL https://bun.sh/install | bash
+ENV PATH="/home/dev/.bun/bin:${PATH}"
+
# Claude Plugins, MCP, Hooks
ARG CONTEXT7_API_KEY=""
ARG AUTOMEM_ENDPOINT=""
@@ -246,7 +250,7 @@ RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# agent-browser
WORKDIR /workspace
-RUN npm install -y -g agent-browser
+RUN npm install -y -g agent-browser clideck @mariozechner/pi-coding-agent
RUN agent-browser install --with-deps
diff --git a/base/devcontainer-claude.md b/base/devcontainer-claude.md
index e860144..e7815e0 100644
--- a/base/devcontainer-claude.md
+++ b/base/devcontainer-claude.md
@@ -7,6 +7,7 @@ This is a DevContainer running Debian Trixie. You are the `dev` user with passwo
### Languages & Runtimes
- Node.js via NVM — `nvm`, `node`, `npm`, `tsx`, `pnpm`
- Python 3 — `python3`, `pip`, `uv`
+- Bun — `bun`, `bunx`
### CLI Tools
- `git`, `gh` (GitHub CLI), `delta` (git-delta)
@@ -50,6 +51,7 @@ MCP servers are configured on first shell login via `init-claude-mcp.sh`. Option
## Plugins & Skills
- GSD (`/gsd:*`) — project management and execution workflow
+- gstack — 28 specialized engineering skills as slash commands (garrytan/gstack)
- superpowers — brainstorming, TDD, debugging, code review skills
- everything-claude-code (ECC) — rules installed at `~/.claude/rules/`
- feature-dev, frontend-design, code-review, commit-commands, pr-review-toolkit
diff --git a/scripts/setup-claude.sh b/scripts/setup-claude.sh
index 88b639f..98e62a3 100755
--- a/scripts/setup-claude.sh
+++ b/scripts/setup-claude.sh
@@ -57,6 +57,26 @@ rm -rf /tmp/everything-claude-code
npx -y get-shit-done-cc --claude --global
+# --- gstack ---
+# Manual setup (skips Chromium launch check — agent-browser already provides Playwright)
+
+git clone https://github.com/garrytan/gstack.git "$HOME/.claude/skills/gstack"
+cd "$HOME/.claude/skills/gstack"
+bun install
+bun run build
+mkdir -p "$HOME/.gstack/projects"
+
+# Register skills — symlink each skill subdir into the skills parent
+for skill_dir in "$HOME/.claude/skills/gstack"/*/; do
+ if [ -f "$skill_dir/SKILL.md" ]; then
+ skill_name="$(basename "$skill_dir")"
+ [ "$skill_name" = "node_modules" ] && continue
+ ln -snf "gstack/$skill_name" "$HOME/.claude/skills/$skill_name"
+ fi
+done
+
+cd /workspace
+
# --- MCP Servers ---
if [ -x "$CLAUDE" ]; then
diff --git a/scripts/verify-tools.sh b/scripts/verify-tools.sh
index 61fba61..0649cb0 100755
--- a/scripts/verify-tools.sh
+++ b/scripts/verify-tools.sh
@@ -124,7 +124,7 @@ verify_base() {
done
# Other
- for cmd in ttyd delta agent-browser claude; do
+ for cmd in ttyd delta agent-browser claude pi clideck; do
check_cmd "$cmd"
done