declaude
Remove Claude/AI attribution from a GitHub repo in one command.
declaude OWNER/REPO
It clones the repo, strips Claude/AI traces from your entire commit history
(e.g. Co-Authored-By: Claude <noreply@anthropic.com> or "Generated with
Claude Code"), force-pushes the cleaned branches, and refreshes GitHub's
Contributors graph so @claude actually disappears — all without touching your
code or your commit authorship.
Video
Why @claude won't go away by itself
AI tools append a Co-Authored-By: Claude … trailer to commits, and GitHub's
Insights → Contributors graph counts those co-authors. That graph is a
cached, background-computed view — a force-push (or a flush, or a commit)
on its own doesn't reliably update it, so @claude lingers even after the
history and the REST API are clean.
What actually works is a specific order:
remove Claude → flush (rename the default branch) → push a fresh commit
The flush resets GitHub's cached graph; the following commit triggers a
recompute against the now-clean history. declaude does all three for you (the
refresh commit is chore: refresh GitHub contributors, reusing your latest
commit's author so no new identity appears). It runs even when the history is
already clean, which is exactly what a previously-cleaned repo needs.
Timing matters too. GitHub serves its old commit index for a little while after
a force-push, and flushing against that stale index just rebuilds the graph from
the old history — putting @claude right back. So declaude waits until
GitHub itself reports the history as clean before flushing, then verifies the
rebuilt graph and repeats the flush → refresh if @claude survived. That's why
one run is enough; you don't have to run it twice.
Install
pip install declaude # installs the `declaude` command + git-filter-repo
Want the latest unreleased changes? Install straight from GitHub:
pip install git+https://github.com/ediiloupatty/declaude
# or, from a local clone:
pip install .
pip puts a declaude command on your PATH and pulls in git-filter-repo
automatically — no manual setup. The one prerequisite pip can't install is the
GitHub CLI, used to flush GitHub's Contributors-graph cache:
# Windows (winget):
winget install GitHub.cli
# macOS (Homebrew):
brew install gh
# Linux: https://cli.github.com/manual/installation
Windows note: after
winget install GitHub.cli, open a new terminal before runninggh— the current session won't see it yet.
Then log in:
gh auth login
declaude checks for gh and a valid login up front and tells you exactly what's
missing before it touches anything.
After installing on Windows — how to run it
After pip install declaude, pip may print a warning that the Scripts folder
isn't on your PATH. That's normal and harmless — it only means typing
declaude directly might say "command not found". Just run it like this and it
always works:
python -m declaude OWNER/REPO
That's the whole trick: put python -m in front. For example:
python -m declaude ediiloupatty/my-repo
python -m declaude --help
Prefer the short declaude command? The quickest fix is to let declaude add its
own install directory to your PATH:
python -m declaude path
Then open a new terminal and declaude works on its own. (Works on
macOS/Linux too, where it appends a PATH line to your shell rc file.)
Or install with pipx, which sets up PATH for you:
python -m pip install --user pipx
python -m pipx ensurepath
pipx install declaude
…or run the included install.ps1 from a clone of this repo (it adds the
Scripts folder to your PATH automatically):
powershell -ExecutionPolicy Bypass -File .\install.ps1 -FromPyPI
Then open a new terminal and declaude works on its own.
Usage
Run declaude --help (or python -m declaude --help on Windows) any time to
see the full reference:
usage: declaude [-h] [--version] [-y] [--dry-run] [--no-refresh] [--no-backup]
target
Remove Claude/AI attribution from a GitHub repo (clean history + force-push +
refresh Contributors graph).
positional arguments:
target GitHub URL or OWNER/REPO slug
options:
-h, --help show this help message and exit
--version show program's version number and exit
-y, --yes skip confirmation
--dry-run show the plan only
--no-refresh don't push the empty commit that refreshes the contributors
graph
--no-backup skip the restorable backup bundle before rewriting (not
recommended)
Other: `declaude prevent` turns off Claude Code attribution going forward.
Examples:
declaude ediiloupatty/my-repo # OWNER/REPO slug
declaude https://github.com/ediiloupatty/my-repo # full GitHub URL
declaude my-repo --dry-run # show the plan, change nothing
declaude my-repo -y # skip the confirmation prompt
declaude my-repo --no-refresh # clean + push only, skip the refresh commit
declaude my-repo --no-backup # skip the restorable backup bundle (not recommended)
declaude prevent # turn off Claude Code attribution going forward
declaude --version # print the installed version
The repo is cloned to a temp dir, cleaned, force-pushed, refreshed, then
discarded — you never clone by hand. Before any rewrite, a backup bundle is
written to ~/.declaude-backups/ and is fully restorable:
git -C <repo> fetch ~/.declaude-backups/<name>.bundle '*:*'
Honest caveats
- Claude authorship (rare). If a commit's author is Claude (not just a
co-author),
declaudewarns but does not change it — usegit filter-repo --mailmapto rewrite authorship. - The refresh commit. declaude leaves one
chore: refresh GitHub contributorsempty commit on the default branch (authored as you). It's harmless; drop it later withgit rebaseif you like. Skip the whole refresh with--no-refresh. - Shared repos. The flush renames the default branch and back. Collaborators
with a local clone may see GitHub's "default branch renamed" notice. Use
--no-refreshif that's a problem. - Graph lag. declaude waits for GitHub to rebuild the graph and retries the flush + refresh up to 3 times, but GitHub's cache can still lag. If it ends with "the graph is not confirmed clean", the history is already clean — recheck in Incognito in a few minutes, or just re-run declaude.
- Closed pull requests. GitHub keeps old commits in
refs/pull/N/head, which users can't delete. The Contributors graph is computed from the default branch (clean + refreshed), so@claudeshould still drop; if it persists, only GitHub Support can purge the PR-ref cache.
Commands
| Command | Purpose |
|---|---|
declaude TARGET [-y] [--dry-run] [--no-refresh] [--no-backup] |
Clean history + force-push + refresh contributors graph. TARGET = GitHub URL or OWNER/REPO. |
declaude path |
Add declaude's install (Scripts) directory to your PATH so the bare declaude command works. |
declaude prevent |
Set includeCoAuthoredBy:false in ~/.claude/settings.json. |
declaude --version |
Print the installed version. |
Requirements
- Python 3.8+ and
pip gitgh(GitHub CLI, logged in) — install separately from https://cli.github.comgit-filter-repo— installed automatically as a pip dependency
Windows: works in PowerShell and Windows Terminal (ANSI colors are enabled
automatically; set NO_COLOR=1 to disable). git, gh, and Python must be on
your PATH.
Development
pip install -e ".[dev]" # editable install with test deps
python -m pytest # run the scrubber tests
python -m declaude --help # run without installing the console script
License
MIT © ediiloupatty
Metadata
Release files for declaude 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| declaude-0.2.0.tar.gz | 480.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| declaude-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 497.7 kB
Release files / declaude-0.2.0.tar.gz
| Download URL | declaude-0.2.0.tar.gz |
|---|---|
| Size | 480.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cd963e837c552a4c5bb263ae846f80cd51c828d4c87798f5b676c72b71d0a393
|
|
BLAKE2b-256 checksum How to use checksums |
b37f02f5d1bd741ec71150f82db782f7335575e8e21b17d67801e3057454f127
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Release files / declaude-0.2.0-py3-none-any.whl
| Download URL | declaude-0.2.0-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
562e11d6ea90df59063171625503bb6fcd26e9e058918e32fbd9236e39f94b0d
|
|
BLAKE2b-256 checksum How to use checksums |
a3167b5b1def134fd3214ec5e652dd84f1ebd1b3adc99fd733e839bb47a30fab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|