Skip to main content

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 running gh — 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), declaude warns but does not change it — use git filter-repo --mailmap to rewrite authorship.
  • The refresh commit. declaude leaves one chore: refresh GitHub contributors empty commit on the default branch (authored as you). It's harmless; drop it later with git rebase if 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-refresh if 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 @claude should 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
  • git
  • gh (GitHub CLI, logged in) — install separately from https://cli.github.com
  • git-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)

Source distribution for declaude 0.2.0
File Size Uploaded
declaude-0.2.0.tar.gz 480.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for declaude 0.2.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

0.2.1

2 release files

This release

0.2.0 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page