A tiny, zero-dependency Python CLI that removes the friction between “I want to build something” and “Claude is working inside a well-structured environment.” It scaffolds the project, injects an opinionated CLAUDE.md behavior contract, and launches Claude Code.
cleanvibe is not a coding tool — it is a state initializer. The real value lives in the CLAUDE.md it injects: a behavior contract that enforces documentation discipline, meaningful commits, and iterative file-based thinking. Alongside it every project gets a pre-seeded queue.md (concrete steps, delete-only), a todo.md (the abstract long horizon), and a devlog.md — finishing a queue item means deleting it and appending a dated devlog entry in the same commit, so queue.md can never rot into a status journal. Every project starts disciplined instead of as a blank-repo scramble. Zero runtime dependencies; Windows, Linux, macOS; Python 3.9+.
Scaffold a fresh project: CLAUDE.md, README.md, queue.md (pre-seeded bootstrap), todo.md, devlog.md, .gitignore — an initial commit on a main branch, then launch Claude Code. Run in a non-empty directory and it prompts instead of erroring.
Onboard an existing repo. Works on a dedicated cleanvibe-onboarding branch — the default branch is untouched. Prepends scaffold if files exist; never overwrites.
In-place onboarding for a project you are already in: injects only the scaffold files that are missing. Non-destructive by contract.
Point it at an arXiv or alphaxiv URL and it scaffolds a standalone paper-replication project: SKILL.md plan, the paper as a submodule target, and CI that builds a findings site, a PDF report, and a ZIP package.
Semantic versioning since v1.0.0 (currently v1.2.0). new, clone, convert, and replicate are stable within the 1.x line; the guaranteed injected set — CLAUDE.md, README.md, queue.md, todo.md, devlog.md, .gitignore — is fixed; new repos initialize on main; clone/convert never overwrite and replicate never errors on a name collision; zero runtime dependencies is a hard guarantee. Preview anything with --dry-run.