Skip to main content
payback records only repositories your allow list covers, and setup’s default covers public GitHub repositories only. Nothing outside a git repository with a GitHub origin is ever recorded. The list is ~/.payback/allow, one line per entry. You never need to edit it by hand: payback allow sets everything, and payback on / payback off change the repository you’re in.

The policy

Exclusions always win over everything else on the list. A .payback-ignore file at a repository’s root excludes it just like a ! line, and protects everyone who clones that repository. Repositories are matched on the origin remote, so a git worktree or a second clone counts as the same repository. A fork is its own repository: you/flask and pallets/flask are different entries.

The visibility check

Under public, the hook doesn’t know whether a repository is public; it records the turn locally and marks it “decide at upload”. Before anything leaves your machine, the uploader asks our server whether the repository is public on GitHub. Public: the turn is uploaded. Private, or unknown: the turn is deleted from your machine and never sent, and payback status counts it as kept off because the repository isn’t public. The answer is cached in ~/.payback/repo_visibility.json (public for 24 hours, private for 7 days), so after the first turn in a private repository the hook skips it without recording anything. The server keeps its own cache, so a popular repository is looked up on GitHub once for everyone. Your machine never calls the GitHub API.

The command

payback allow with no arguments prints the policy, the named repositories, the exclusions, and what that means for the repository you’re in. Every change prints the resulting status on one line.
New public clones are covered without running setup again.
See also What is never recorded and the payback allow reference.