Skip to content

Claude Code plugin install is 291 MB (99.9% of bytes not used at runtime) #107

@popmechanic

Description

@popmechanic

Hi Paul — first off, thanks for impeccable. The skills themselves are fantastic and I rely on several of them daily. This is a packaging observation, not a complaint about the content.

What I noticed

When Claude Code installs the plugin from this marketplace, the resulting cache directory is 291 MB. For comparison, my other Claude Code plugins are in the 0.3–15 MB range. I got curious and audited the install.

Install location on my machine: ~/.claude/plugins/cache/impeccable/impeccable/2.1.1/

Size breakdown

Size Path Used by Claude Code at runtime?
280 MB node_modules/ (209 packages — @cloudflare 101 MB, wrangler, miniflare, puppeteer-core, playwright, jsdom, framer-motion, esbuild, zod, lodash, …) No
6.4 MB public/ (impeccable.style static assets) No
~3 MB .gemini/ .cursor/ .codex/ .kiro/ .opencode/ .trae/ .trae-cn/ .rovodev/ .pi/ .agents/ (pre-transformed skill copies for other harnesses) No
464 KB tests/ No
296 KB .claude/skills/ + .claude/agents/the 18 skills Yes
276 KB source/skills/ (source-of-truth before transforming) No
240 KB src/ (npm CLI source) No
156 KB scripts/ (build scripts) No
148 KB extension/ No
136 KB content/ (website article source) No
28 KB bin/ (npx impeccable CLI) No
20 KB server/ (dev server for website) No
8 KB .claude-plugin/ (manifest) Yes
various AGENTS.md, CLAUDE.md, HARNESSES.md, DEVELOP.md, README.md, README.npm.md, LICENSE, NOTICE.md, package.json, bun.lock, biome.json, wrangler.toml, skills-lock.json, .github/, functions/, lib/, impeccable/ (empty) No

plugin.json only declares "skills": "./.claude/skills" — so effectively ~300 KB is the runtime payload and the other 290+ MB is bystander content from the monorepo.

About that node_modules/

There's no .git in the installed tree (so Claude Code is unpacking a tarball at the recorded gitCommitSha, not cloning), and your .gitignore correctly excludes node_modules/. Yet node_modules/ is fully populated, including binaries in node_modules/.bin/. So Claude Code's installer appears to be running bun install/npm install whenever it finds a package.json + lockfile. That means every Claude Code user is paying the cost of your dev dependencies even though package.json#files declares ["bin/", "src/", "LICENSE"] for npm.

Also worth a look

  • impeccable/ at the repo root is an empty 0-byte directory. Looks like a stray publish artifact.
  • In the Claude Code plugin install path, the outer cache/impeccable/ (marketplace slot) collides with the installer's retry logic and produces ENOTEMPTY: directory not empty, rename '…/temp_local_…' → '…/cache/impeccable' when users reinstall. That's likely a Claude Code bug rather than yours, but your plugin's large tree makes it more noticeable.

Possible ways to slim this down

Pick whichever fits your release workflow — these aren't either/or:

  1. Dedicated plugin subtree or branch. Publish the Claude Code plugin from a plugin/ subdirectory (or a claude-plugin branch) containing only .claude-plugin/, .claude/skills/, .claude/agents/, README.md, LICENSE. Point marketplace.json at that source. Keeps this repo untouched.

  2. Add a .claudeignore / installer allowlist. If Claude Code honors files in package.json or a plugin-level ignore file (worth checking the plugin docs), list only the runtime payload. Not sure this is supported today, but raising the same feedback with the Claude team would help.

  3. Drop the other-harness dirs from the release. .gemini/, .cursor/, .codex/, .kiro/, .opencode/, .trae/, .trae-cn/, .rovodev/, .pi/, .agents/ are all dead weight to a Claude Code user. Maybe generate them at install-time via npx impeccable skills install (which the npm README already documents) rather than pre-bundling all 10 copies.

  4. Make sure the packed tarball doesn't include node_modules/ or lockfiles that trigger the installer's bun install. If Claude Code's installer is in fact running bun install on plugin extraction, the easiest win is to not have a bun.lock present — move build-time deps to a separate tooling/ subpackage or have the release tarball strip it.

Rough back-of-envelope: options (1) or (3)+(4) would take the install from 291 MB to ~0.3–1 MB — a ~300× reduction — without any functional change for Claude Code users.

Happy to send a PR for option (1) if it's a direction you'd entertain. Thanks again for the great work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions