Remove Claude/AI attribution from a GitHub repo: clean history, force-push, and refresh the Contributors graph.
Project description
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.
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.
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. Even after the flush + refresh push, the Contributors graph can take a few minutes to update. Recheck in Incognito.
- 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file declaude-0.1.2.tar.gz.
File metadata
- Download URL: declaude-0.1.2.tar.gz
- Upload date:
- Size: 478.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3826bc0c8761d25c57298532f9f6bf9d971db08b6e3dfc282c4281befa492cc6
|
|
| MD5 |
6a2ed659b0f80e5befb1a04350e7790a
|
|
| BLAKE2b-256 |
8c47760ccf9163438d3d94b416e2ba86d8991f21a1c3eaccdcdedabc1de606c6
|
File details
Details for the file declaude-0.1.2-py3-none-any.whl.
File metadata
- Download URL: declaude-0.1.2-py3-none-any.whl
- Upload date:
- Size: 15.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17a28cb4e14310ba098df12946974118755dcb4acd8d0f7a3c18021cdeb13903
|
|
| MD5 |
ff4277b1f5d5868264dcacc15ac48078
|
|
| BLAKE2b-256 |
5e5feb032ba744817a5641be47428fe1f540fb3ab3607940d6565110d93c7779
|