Skip to main content

Overview

GitGost enables truly anonymous pull requests by accepting pushes via the standard Git protocol (git-receive-pack) and automatically creating PRs through a bot account. Your identity is completely anonymized—no trace remains in the commit history.

How It Works

The anonymous PR workflow follows these steps:
  1. Push via Git: You push commits to gitGost using standard Git commands
  2. Fork Creation: gitGost creates/reuses a fork under the @gitgost-anonymous bot account
  3. Commit Anonymization: All commit metadata (author, committer, email) is rewritten to anonymous values
  4. Branch Push: Commits are pushed to a unique branch (e.g., gitgost-a1b2c3d4) in the fork
  5. PR Creation: A pull request is automatically created from the fork to the original repository
  6. Notification: You receive a unique PR hash to track and update your contribution

Endpoint

Git Protocol Endpoints

Authentication

No authentication required. Anonymous contributions are the core feature—no GitHub account, API keys, or credentials needed.

Usage

Setting Up the Remote

Add gitGost as a Git remote to your repository:

Creating Your First Anonymous PR

1

Clone and make changes

2

Add gitGost remote

3

Push to gitGost

4

Receive PR details

Updating an Existing PR

To push additional commits to an existing PR, use the pr-hash push option:
The PR hash is deterministic and based on owner/repo/branch. You’ll receive the same hash for the same branch, enabling updates without storing state.

Response Format

Successful Push

The response follows the Git protocol format using side-band encoding:
  • Band 1: Protocol status messages (unpack ok, ok refs/heads/main)
  • Band 2: Informational messages (progress, success details)
  • Band 3: Error messages (if any)

Success Fields

string
required
The GitHub URL of the created pull request
string
required
Always @gitgost-anonymous - the bot account
string
required
The fork branch name (format: gitgost-{hash})
string
required
8-character deterministic hash for tracking and updates
string
required
Notification topic URL (format: https://ntfy.sh/gitgost-{pr_hash})

PR Metadata

PR Title

PR Body

The PR body includes:
  • Your commit message(s)
  • A disclaimer about anonymous contribution
  • Link to gitGost service
Example:

Commit Anonymization

All commits are rewritten with:
  • Author: Anonymous Contributor <anonymous@gitgost.dev>
  • Committer: gitGost Service <service@gitgost.dev>
  • Commit Date: Preserved from original (optional: can be anonymized)

Notifications

GitGost provides real-time notifications via ntfy.sh without requiring accounts:

Notification Events

  • PR Created: Initial notification when PR is opened
  • PR Updated: Sent when you push updates using the pr-hash
  • PR Comments: Not currently implemented (future feature)
  • PR Status Changes: Not currently implemented (future feature)

Rate Limiting

Rate limits protect against abuse while allowing legitimate use.

Per-IP Limits

number
default:"5"
Maximum PRs per hour per IP address
duration
default:"1h"
Rolling time window for rate limit

Global Burst Detection

GitGost monitors for coordinated abuse:
  • Threshold: 20 pushes from 10+ distinct IPs in 60 seconds
  • Response: Admin notification, optional panic mode activation
  • Recovery: Automatic when activity drops below threshold

Rate Limit Response

When rate limited, you’ll receive:

Error Responses

Invalid Repository

string
Repository name contains invalid characters or path traversal attempts

Fork Creation Failed

string
Target repository doesn’t exist or bot lacks access

Push Too Large

number
default:"104857600"
Maximum push size: 100 MB

Service Suspended (Panic Mode)

string
Admin activated panic mode due to abuse detection
string
Typically 15 minutes, manually controlled by admin

Implementation Details

Fork Management

The bot reuses existing forks when possible:
  1. Check if fork gitgost-anonymous/repo exists
  2. If exists, reuse it; otherwise create new fork
  3. Wait for fork to be ready (forks are async on GitHub)
Source Reference: internal/github/pr.go:430-503

PR Hash Generation

PR hashes are deterministic SHA-256 hashes:
Source Reference: internal/github/pr.go:656-662

Branch Naming

Branches follow the format: gitgost-{pr_hash}
  • Deterministic and unique per repository/branch combination
  • Allows automatic PR updates without state storage
  • Example: gitgost-a1b2c3d4

Security Considerations

Identity Protection

All commit metadata is rewritten. No IP addresses, usernames, or identifying information is logged.

Rate Limiting

Multiple layers of rate limiting prevent abuse while maintaining anonymity.

Abuse Prevention

Burst detection and panic mode protect against coordinated attacks.

Open Source

100% open source and auditable. No hidden tracking or data collection.

Best Practices

Since your commits become the PR body, write clear, descriptive messages:
Store the PR hash in a safe place to enable future updates:
Use ntfy to track your PR without creating accounts:
  • Bookmark the ntfy URL
  • Install ntfy mobile app for push notifications
  • Use RSS reader with ntfy’s RSS endpoint
Avoid rapid successive pushes:
  • Test locally before pushing
  • Squash multiple fixes into single commits
  • Wait between pushes if making frequent contributions

CLI Integration

Bash Alias

~/.bashrc

Git Configuration

Anonymous Issues

Create anonymous issues via REST API

Anonymous Comments

Post anonymous comments on issues and PRs