I'm Will Mitchell. I'm not the president of YC and I'm not on the React core team. I'm a marketer who has been vibe coding full time for almost four years, building solo on Windows. hov-stack is my answer. This is the Claude Code harness I work in every day, not a copy of it. My Codex and Pi setups load skills from it too.
Fork it. Improve it. Make it yours.
Receipts, not adjectives:
In the 60 days to 2026-10-19: 4,302 pull requests merged across 17 repos. Everything that got there is in this repo: the rules, the guards, the permission lists, the skills.
What nobody else publishes: the permission lists. 292 allow, 75 ask and 70 deny entries, grown from refusals through /denial-triage, plus 10 hooks that run before a tool call lands. The other public stacks hand you skills; this one hands you the part that decides what an agent may run.
- Non-technical builders who want a working setup without learning any of it. Paste the sentence below and you are done.
- Solo operators running several businesses on one machine. The guards and the permission lists exist so parallel agents stop colliding.
- Claude Code users with a setup already who want to cherry-pick the guards, the rules file, or the memory workflow.
Builders:
git clone --depth 1 https://github.com/StartupBros-com/hov-stack ~/hov-stack && cd ~/hov-stack && ./setupEveryone else, open Claude Code anywhere and paste:
Set me up from https://github.com/StartupBros-com/hov-stack. Read its README and HARNESS.md first, run its setup, apply what fits this machine, and tell me what you skipped and why.
./setup needs git and node, and dcg also needs minisign to check its signature (brew install minisign, or mise use -g minisign; without it dcg is skipped, and setup prints the command). Its plugin steps also need Claude Code 2.1.76 or later, since older releases refuse the hov marketplace's manifest. It symlinks this repo into ~/.claude, so the checkout has to stay where you cloned it. It keeps your existing memory and secrets where they are, and moves anything it replaces to ~/.hov-stack-backups/. It also links the data commands in bin/ (gsc, dfs, stripe-api and ten more, which the data-source-clis skill teaches agents to call) into ~/.local/bin, so they run by name; a path there that already holds something of yours is left alone and named, and hov-stack's copy still runs as ~/.claude/bin/<name>. Once ~/.local/bin is on PATH, rules/hov-stack-tools.md gets one line naming the data commands that run hov-stack's copy, so agents reach for them before an MCP server. If you already have a settings.json it is left alone and the seed lands next to it as settings.hov-stack.json, unless it is setup's own seed from a run before dcg was installed and nothing but Claude Code's plugin entries has changed it: then it is backed up and seeded again with dcg's hook, keeping those plugin entries. Your own settings, CLAUDE.md additions and environment variables go in the private overlay (below), which setup reads and never writes. It then installs dcg after checking its checksum and signature (it shows dcg's licence first; ./setup --no-dcg leaves dcg out), adds the hov marketplace, and installs the default plugins (papercut, skill-tuner, memory-dream, design-rails). When settings.json is setup's own seed, it also turns on auto-update for hov, so those plugins get new versions by themselves; in a settings.json you already had, it only reports whether auto-update is on, and /hov-setup asks before turning it on. Last, it writes rules/hov-stack-tools.md in the config dir: a line telling Claude when to use each of gh, ast-grep, codex, pro-gate and cass that is installed and whose program is on PATH, so Claude is never told to use a tool you lack. ./setup --update and /hov-setup rewrite it, and it is removed when none of them is installed. A file of yours at that path, or a symlink, is left alone; into a rules/ that is a symlink setup writes nothing, and names the files whose lines to add there. A step that cannot run (offline, no claude yet, a platform dcg has no build for) is reported with the command to run later, and ./setup --check shows what is in place without changing anything. tests/repo/setup.test.sh checks these promises on every push, against a stand-in claude and a stubbed download, and dcg/tests/install-test.sh checks that a tampered archive or a signature from another key installs nothing.
Setup ends by saying, in plain words, what it put in place. Then open a new Claude Code session, which loads the rules and safety checks setup just linked, and type /hov-setup, setup's second stage. Five plugins need what a script cannot do for you: a login, a sudo or Windows prompt, or a paid plan. They are sign-it, wsl-cdp, product-video, token-eater and pro-gate. For each one, /hov-setup says what it does for you, what it costs, what you would have to do yourself, and whether it recommends it. It installs the ones you pick, asks you to type /reload-plugins once so nothing restarts, and does every step it can itself; you only type logins and passwords, each into that service's own prompt and never into the chat. Each plugin ends with a check the session runs. It also offers the tuning plugins below, which need no setup, and the plugins and programs from other publishers listed under More that /hov-setup offers, and finishes with a short tour of everything setup installed.
To see later whether everything setup put in place is still there, run ./setup --check in the checkout. It changes nothing. It prints one row per setup step, names the fix for any step not in place, and exits 1 if one is not. For the plugins and programs /hov-setup offers, type /hov-setup again: it looks at what is installed and offers only what is not.
Run ./setup --update in the checkout. It fast-forwards the checkout to the latest main, runs the new copy of setup, and then updates what setup and /hov-setup installed:
dcg, to the version the checkout now names (never to an older one).- The
hovplugins, and the other publishers' plugins/hov-setupoffers that you installed. gh,uv,cassandjsm, where/hov-setupinstalled them, to the versions the checkout now names. Each new copy has to match its checksum and start before it replaces the old one, and an update that fails part way puts the old one back.ast-grepandsynthetic-panel, where uv installed them.
It leaves alone anything you installed some other way, a program that changed since /hov-setup installed it (jsm updates itself, and cass upgrade updates cass), and a checkout with commits or changes of yours that a fast-forward would lose, and says what it left and why. Plugin updates reach sessions started after it. Claude Code updates itself, and jsm upgrade updates the jeffreys-skills skills: setup prints that line rather than running it, since those skills come from your own subscription.
- Run
./setup - Run
claude agentsin any repo. That is the agents view, and it is how 90% of my Claude Code use happens. - Ask an agent to push to main. Watch
git-guardrefuse it and name the branch-and-pull-request route. The refusal comes from a hook, not a model call. - After a day of work, run
/denial-triage. It turns the calls the guards refused into permission fixes, each behind its own approval, so the prompts get rarer every week. - Run
/memory-dream:dreamon your busiest project.memory-dreamis one of the default plugins. - Stop there. You'll know if this is for you.
CLAUDE.md, the global rules file every session and subagent loads (14 KB), andHARNESS.mdwith 35 detail docs inharness/explaining the decisions behind ithooks/: 17 hook scripts thatsettings.jsonregisters across 6 hook events; 10 of them run before a tool call (git-guard,settings-guard,loop-guard,runner-guardand the rest), anddcgruns beside them when it is installed. The papercut plugin registers its own on top: failure capture, the Read ceiling guard and the StructuredOutput unwrap. The hook suite is the 46 test files inhooks/tests/.settings.json: the allow / ask / deny lists I run under bypass-permissions mode (292 / 75 / 70 entries)plugins/hov-stack/skills/(also reachable asskills/): 47 skills, 31 of them slash-command only so they never cost tokens until called, plus patches to 3 third-party skills inskills-patches/(papers, de-slopify's fact-check scripts, and security-audit-for-saas's lockfile-history, worm-sweep and EOL-check scripts), each with a note of its upstreamskills-stack/: 2 more slash-command skills (memory-mine, review-adversarial-first) that run this repo's scripts, so./setuplinks them and the plugin does not include themharnesses/: my Codex, fx, Pi and pi-lens config, whichinstall.shinstalls and./setupleaves alone. Nothing under it runs in this repo's CI.windows/: the Windows side of a WSL2 machine (WezTerm and Windows Terminal config,.wslconfig, and the disk and Defender scripts)install.shandsync.share the full installers for my own machines (systemd units, the destructive-command guard, the managed deny floor)../setupis the one for yours. The systemd units that make sense without them are documented, with copy-and-enable commands, insystemd/README.md.
This repository is the hov marketplace, and ./setup adds it. To add it by hand, in Claude Code: /plugin marketplace add StartupBros-com/hov-stack, then /plugin install <name>@hov. Claude Code leaves auto-update off for a third-party marketplace, so ./setup turns it on for hov in the settings.json it seeds, and /hov-setup offers to in yours. By hand: open /plugin, select Marketplaces, choose hov and select Enable auto-update. To turn it off, set autoUpdate to false under extraKnownMarketplaces.hov in settings.json; that setting wins over the /plugin switch. With it on, Claude Code fetches new versions in the background, and sessions started after that use them.
papercut: logs every hard tool failure from a hook, ranks them by how many distinct sessions hit each, and carries one family at a time into a tracked work item whose verification refuses to call it fixed on silence alone.skill-tuner: tells whether a change to aSKILL.md,AGENTS.mdorCLAUDE.mdworked, by paired comparison with a confidence interval./skill-tuner:tunefixes what three independent skeptics confirm and checks the description still routes.memory-dream: the sleep cycle for Claude Code's auto-memory./memory-dream:dreamfinds superseded, stale and oversized notes and drafts the fixes, and you approve each change before anything is written./memory-dream:evalmeasures whether recall improved.design-rails: keeps agents on your design system. It checks whether one exists and is enforced, derives aDESIGN.mdunderdesign/from the code you already have, and ratchets drift budgets that only move down. It never edits application source.
sign-it:/sign-itfinds a document's signature line, stamps your stored signature and today's date, and writes<file>-signed.pdf. It refuses to guess a missing or ambiguous line and never draws a signature for you.wsl-cdp: lets Claude Code in WSL2 drive your logged-in Windows browser (Chrome, Edge or Brave) over the Chrome DevTools Protocol. Its setup has one elevated Windows step, and the agent's browser profile keeps sessions, never passwords.product-video: records a product tour in a real, logged-in browser and renders a checked MP4.token-eater: puts expiring AI credits to work on code cleanup. It works in an isolated copy, verifies and reviews the result, and opens a draft pull request; it never merges. It runs shell commands unsandboxed on the target repository, after its first run asks for your consent, and its reviews need Every's compound-engineering plugin (/plugin marketplace add EveryInc/compound-engineering-plugin, then/plugin install compound-engineering).pro-gate: a final pull-request review by the Pro model your ChatGPT account selects. It fixes what it safely can, leaves a report and never merges. It needs a ChatGPT Pro plan.
harness-vet: an adoption gate that vets a skill, plugin, MCP server or repo against your own harness, reading it the way an adversary would.rent-check: audits whatCLAUDE.mdand always-on skills cost per prompt, measures which rules earn their tokens from real transcripts, and proposes demotions for the ones that do not.harness-optimizer: investigates recurring problems in your Claude Code setup across six evidence lanes, then has independent agents challenge its diagnosis, proposed changes and reported outcome. It runs only when you invoke it.
Most of these are not part of this repository: gsc, ga4 and vastai are its own commands, which ./setup links, and /hov-setup builds the Python environment each one runs from. /hov-setup offers each one with its publisher, cost and what it needs, installs only the ones you pick, and gets each working in the same session. Plugins come from their publishers' own marketplaces, which it adds after a yes. Programs go into ~/.local/bin without sudo: gh, uv, cass and jsm are release binaries checked against a SHA-256 written in install-release.sh, wacli has its own installer that checks its one release the same way, and synthetic-panel and ast-grep install through uv. vercel installs with pnpm add -g vercel into pnpm's global folder, which /hov-setup offers to point at ~/.local/bin. The Python environments for gsc, ga4 and vastai go into ~/.local/share through uv, with the package versions venv-install.sh names. ./setup --update leaves them as they are; rerunning venv-install.sh, as each one's /hov-setup section says, brings one to the versions the checkout names.
last30days(Matt Van Horn): a plugin that researches what people said about a topic in the last 30 days on Reddit, X, YouTube, Hacker News, GitHub and the web. Most sources are free; TikTok and Instagram go through ScrapeCreators, free for 10,000 calls and then paid. It needs Python 3.12 or later, which/hov-setupcan add with uv.synthetic-panel(StartupBros): ranks headlines, offers or product ideas by how a simulated customer panel reacts, scored locally with no account. On Linux it installs the CPU build of PyTorch (about 1.3 GB, against about 5.6 GB for the default CUDA build), and its skill is fetched at a fixed commit.wacli(OpenClaw): free, open source WhatsApp message reads and search through a linked device, with a local message copy. Linux on Intel or AMD only; not made or approved by WhatsApp or Meta.gsc(hov-stack): Google Search Console reads (searches, clicks, positions, indexing and sitemaps) through a Google service account you create; its Python environment is about 140 MB.ga4(hov-stack): Google Analytics 4 reports and property settings, through the same service account and Python environment asgsc.gh(GitHub): the GitHub CLI, which token-eater and pro-gate need. The login runs in the browser throughgh auth login --web.vercel(Vercel): Vercel's free program for projects, deployments, logs and settings, and deploying when asked. Installs through pnpm (about 60 MB download, 400 MB on disk), and you sign in through your browser.ast-grep(Herrington Darkholme): structural code search and rewrite. Once it is installed and on PATH,rules/hov-stack-tools.mdtells agents to prefer it over line-based grep.vastai(hov-stack): rents vast.ai GPU computers by the hour, through vast.ai's own program and your API key, in a Python environment of about 150 MB. Renting bills your vast.ai account, which tops itself up with no spending limit.compound-engineering(Every): Every's plan, build, review and learn loop, which token-eater's reviews use. MIT.codex(OpenAI): OpenAI's plugin for handing tasks and reviews to Codex. It needs a ChatGPT plan with Codex or OpenAI credits, and its stop-time review gate stays off unless you turn it on.skill-creator(Anthropic): Anthropic's skill for writing, testing and tuning your own skills.cass(Jeffrey Emanuel): searches past agent sessions on this machine; thecass-rerank-localskill builds on it. Its MIT licence carries a rider barring OpenAI, Anthropic and anyone acting for them.jeffreys-skills(Jeffrey Emanuel): a paid skill library ($20 a month or $216 a year, no trial) and its manager,jsm. This repository never redistributes those skills:/hov-setupinstallsjsm, the login runs in the browser throughjsm login --remote, and you choose which skills to install.
Keep your own skills in one plugin folder: <folder>/.claude-plugin/plugin.json
and <folder>/skills/<skill>/SKILL.md. The manifest's name identifies the plugin.
Claude Code loads such a folder found in ~/.claude/skills/ in place, as
<name>@skills-dir. A new, edited or deleted skill takes effect at the next session
start, with no command.
With only the plugin installed, create the folder inside ~/.claude/skills with
claude plugin init <name>, or link one kept in your own git repository there.
With a clone and ./setup, list the folder's absolute path in the overlay's
skill-plugins (see config/skill-plugins.example). Setup links it as
skills/<name>. ./setup --check reports a missing link, a skill in skills/
that shares a bare name with one of the folder's skills, a turned-off plugin,
and one Claude Code does not list. Setup refuses a name a hov-stack skill,
@hov plugin or mod already uses, since Claude Code would silently skip the folder.
Skills run as /<skill> or /<name>:<skill>. Which skill a shared bare name
runs is not established. skillOverrides in your settings does not reach plugin
skills. To keep the model from starting a skill on its own, put
disable-model-invocation: true in its SKILL.md frontmatter.
scripts/skills-localize.sh reads codex-skills.txt and retired-skills.txt
from the overlay too, each adding to this repository's. An overlay
codex-skills.txt name can come from a listed folder's skills/.
-
My memory notes, secrets, and business-specific skills. Those live in a private sibling.
-
The private overlay. Values the tree cannot carry live in
~/.config/hov-stack/(or$XDG_CONFIG_HOME/hov-stack/, or$HOV_STACK_OVERLAY)../setupandclaude-env.shcount only an absolute overlay path: a relative$HOV_STACK_OVERLAYis reported and read by nothing, and a relative$XDG_CONFIG_HOMEis ignored. The scripts read:private-tokens, the public-safety scan's fixed-string layer;foreign-units, one externally owned unit stem per line, excluded from sync's undeclared-unit findings (blank lines and#comments ignored);hosts.tsv, this host's copy of the fleet's host-to-role table (<hostname><TAB><workstation|satellite>lines), whichlib/profile.shreads when the tree carries none. Theworkstationrow is the one host allowed to push canonical state, so the operator writes it, andsync.sh checkreports a host whose live tree has no roster;hygiene-posture, the hygiene timers this host runs and their settings (deletion on, schedule), one<unit-stem> [KEY=value]per line;sync.sh installapplies it andsync.sh checkreports drift (systemd/README.md);memory-filename-allowlist.txt, the memory audit's reviewed-name list (the tracked copy has no entries);ga4-properties.json,posthog-projects.json,resend-bws-bindings.json,stripe-accounts.json,supabase-projects.jsonandmigration-targets.json, whose shapesconfig/*.example.jsonshow;repo-routes.json, which replaces the tracked placeholder;reclaim-sweep-keep, pathsreclaim-sweepnever removes, one absolute glob per line (systemd/README.md). Without it there is no keep list; one that cannot be read or parsed makes the sweep refuse to plan or apply.
Without one of the others, its consumer fails closed and names it.
./setupalso reads these, each optional, and does nothing without them:settings.json, merged into the seed setup writes. Its keys win, its lists add to the template's without repeats, anullremoves a key, and a hook of its that runs dcg is left out when dcg is not installed, as the template's is. It never changes asettings.jsonyou already have. One that gives a setting another kind of value than the template's, such as a string where the template has an object, gets no seed written, and the run exits 1.CLAUDE.md, imported in every project by therules/hov-stack-overlay.mdsetup writes in the config dir. Into arules/that is a symlink setup writes nothing, and names the line to add there yourself.env,NAME=valuelines thatclaude-env.shexports before each Bash call.skill-plugins, your plugin folders, as described in Where your own skills go.
config/settings.example.json,config/CLAUDE.example.mdandconfig/env.exampleshow each, and./setup --checknames an import not yet written, out of step with the overlay or whose file is gone, anenvthat does not parse, and asettings.jsonsetup would refuse.scripts/skills-localize.shalso readscodex-skills.txtandretired-skills.txt, as described in Where your own skills go, andskills-patches/, laid out like this repository's. Each file there adds to this repository's patch for that skill and never replaces one: where both carry a file, this repository's applies andskills-localize.sh checkreports a differing host copy. SettingSKILLS_PATCHES_DIRleaves the host's patches out;SKILLS_HOST_PATCHES_DIRnames another directory, or none when it is empty. -
A release train for the harness. It changes when my setup changes:
mainis its only version,./setup --updateis the update, and no editions or support are owed. Each plugin carries its own version, which thehovmarketplace serves. -
The private repo's test dispatcher. CI here runs the three repository suites under
tests/repo/(the fresh-HOME setup test, the layout and marketplace-collision check, the suite runner's own test), the hook tests, every unit suitetests/run-claude-tests.shfinds in the tree, a secrets scan (gitleaks) and the public-safety scan:scripts/public-safety-scan.shfails on a home-directory path, a personal address, a private-network host or a private repository name anywhere in the tree, the skipped suites' sources included, and.public-safety-allownames each exception and why.tests/claude-tests.skipsnames the 5 suites that cannot pass from this repo and why: 4 read the author's host roster, install manifest or install-smoke launcher, 1 needs real Docker. The runner still runs the first 4, each with the failure signature its log must match, and fails the day one of them passes, times out, or fails for a different reason, so the list cannot go stale quietly. -
A ccflare gateway.
scripts/reclaim-sweep.pyandscripts/dispatcher-cost.pyassume one (better-ccflare, state under~/.config/better-ccflare/) and have nothing to read without it.
- The two-hour walkthrough of this setup is the House of Vibe workshop "Steal My Whole Claude Code Setup" (Aug 5, 2026), at House of Vibe.
dcg, the third-party destructive-command guard this harness runs alongside its own hooks: https://github.com/Dicklesworthstone/destructive_command_guardcass, the third-party coding-agent session search thatscripts/cass-rerank,scripts/cass-search-health.sh,scripts/cass-release-promote.shandscripts/cass-index-rebuild.shdrive: https://github.com/Dicklesworthstone/coding_agent_session_search. Those scripts call an installedcassand carry none of its code.- Both tools are Jeffrey Emanuel's and are released under the MIT License with an OpenAI/Anthropic rider; read each project's
LICENSEbefore you install it.
MIT. Copyright (c) 2026 StartupBros LLC.
Related: HoV Router lets Claude Code use several AI accounts from one place, and synthetic-panel tests marketing copy on a synthetic customer panel. Each works without hov-stack.
Built by Will Mitchell at House of Vibe.