Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,111 @@ git push gost my-feature:main

(Yes, even gitGost eats its own dogfood 👻)

### Going further: hide your IP with torsocks

gitGost strips your name, email, and metadata — but your IP is still visible to the server. If you need a stronger anonymity guarantee, wrap your push with **torsocks**, which routes the connection through the Tor network so the server only sees a Tor exit node IP.

#### Install

```bash
# Debian/Ubuntu
sudo apt install tor torsocks

# Arch
sudo pacman -S tor torsocks

# macOS
brew install tor torsocks
```

#### Start Tor

```bash
sudo systemctl start tor # Linux
brew services start tor # macOS
```

#### Push through Tor

```bash
torsocks git \
-c http.extraHeader="X-Gost-Authorship-Confirmed: 1" \
push gost my-feature:main
```

#### Optional: persistent alias so you never forget

```bash
# Inside your repo
git config http.extraHeader "X-Gost-Authorship-Confirmed: 1"

# In ~/.gitconfig
[alias]
ghost = "!torsocks git"
```

Then simply:

```bash
git ghost push gost my-feature:main
```

#### Verify your IP is masked before pushing

```bash
torsocks curl https://check.torproject.org/api/ip
# → {"IsTor": true, "IP": "185.220.101.x"}
```

> **Heads-up:** Tor is slow. A push that normally takes seconds may take a few minutes. This is expected — Tor routes traffic through three encrypted nodes worldwide. gitGost's 10 MB commit limit is partly sized with this in mind.

### Windows alternatives

`torsocks` is not available on Windows natively. Use one of the following options instead.

#### Option 1: Tor Browser + SOCKS5 proxy (easiest)

```bash
# 1. Download and install Tor Browser
# https://www.torproject.org/download/

# 2. Open it and leave it running (exposes SOCKS5 on 127.0.0.1:9150)

# 3. Configure Git to use it
git config --global http.proxy socks5h://127.0.0.1:9150

# 4. Push normally
git -c http.extraHeader="X-Gost-Authorship-Confirmed: 1" push gost my-branch:main
```

When done, remove the global proxy:

```bash
git config --global --unset http.proxy
```

Or configure it per-repo only (recommended):

```bash
# Inside the repo, not global
git config http.proxy socks5h://127.0.0.1:9150
git config http.extraHeader "X-Gost-Authorship-Confirmed: 1"
```

#### Option 2: WSL2 (Windows Subsystem for Linux)

If you already have WSL2, it works exactly like Linux inside it:

```bash
# Inside WSL2 (Ubuntu/Debian)
sudo apt install tor torsocks
sudo service tor start

torsocks git push gost my-branch:main
```

WSL2 has its own network stack separate from Windows, so anonymity is preserved correctly.

## Made with ❤️ for privacy

Star this repo if you believe developers deserve the right to contribute anonymously.
Expand Down
2 changes: 0 additions & 2 deletions file.txt

This file was deleted.

3 changes: 0 additions & 3 deletions test.txt

This file was deleted.

82 changes: 79 additions & 3 deletions web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,70 @@ <h3>Sometimes you just want to be a ghost</h3>
</div>
</section>

<!-- Tor / IP anonymity section -->
<h2>Push anonymously over Tor</h2>
<p style="color:var(--fg-secondary);margin-bottom:1.25rem;max-width:56rem;">
gitGost strips your name, email, and metadata — but your IP is still visible to the server.
Wrap your push with <strong>torsocks</strong> (Linux/macOS) or configure a SOCKS5 proxy (Windows)
so the server only sees a Tor exit node IP, not yours.
</p>

<div class="terminal-tabs">
<button class="terminal-tab active" data-tor="linux">Linux / macOS</button>
<button class="terminal-tab" data-tor="windows-browser">Windows – Tor Browser</button>
<button class="terminal-tab" data-tor="windows-wsl">Windows – WSL2</button>
</div>

<div class="terminal" id="tor-linux"><div class="terminal-titlebar"><span class="terminal-btn close"></span><span class="terminal-btn min"></span><span class="terminal-btn max"></span></div><div class="terminal-body"><span class="comment"># Install tor + torsocks</span>
<span class="prompt">$</span> sudo apt install tor torsocks <span class="comment"># Debian / Ubuntu</span>
<span class="prompt">$</span> sudo pacman -S tor torsocks <span class="comment"># Arch</span>
<span class="prompt">$</span> brew install tor torsocks <span class="comment"># macOS</span>

<span class="comment"># Start the Tor daemon</span>
<span class="prompt">$</span> sudo systemctl start tor <span class="comment"># Linux</span>
<span class="prompt">$</span> brew services start tor <span class="comment"># macOS</span>

<span class="comment"># Verify your IP is masked</span>
<span class="prompt">$</span> torsocks curl https://check.torproject.org/api/ip
<span class="success">→</span> {"IsTor": <span class="hl">true</span>, "IP": "185.220.101.x"}

<span class="comment"># Push through Tor</span>
<span class="prompt">$</span> torsocks git \
-c http.extraHeader="X-Gost-Authorship-Confirmed: 1" \
push gost my-branch:main
<span class="success">→</span> PR opened as @gitgost-anonymous — server sees Tor exit node, not you</div>
</div>

<div class="terminal" id="tor-windows-browser" style="display:none;"><div class="terminal-titlebar"><span class="terminal-btn close"></span><span class="terminal-btn min"></span><span class="terminal-btn max"></span></div><div class="terminal-body"><span class="comment"># 1. Download and install Tor Browser</span>
<span class="comment"># https://www.torproject.org/download/</span>

<span class="comment"># 2. Open it and leave it running</span>
<span class="comment"># It exposes a SOCKS5 proxy at 127.0.0.1:9150</span>

<span class="comment"># 3. Tell Git to route through that proxy (per-repo recommended)</span>
<span class="prompt">$</span> git config http.proxy socks5h://127.0.0.1:9150
<span class="prompt">$</span> git config http.extraHeader "X-Gost-Authorship-Confirmed: 1"

<span class="comment"># 4. Push normally</span>
<span class="prompt">$</span> git push gost my-branch:main
<span class="success">→</span> PR opened as @gitgost-anonymous — server sees Tor exit node, not you

<span class="comment"># When done, remove the proxy (if set globally)</span>
<span class="prompt">$</span> git config --global --unset http.proxy</div>
</div>

<div class="terminal" id="tor-windows-wsl" style="display:none;"><div class="terminal-titlebar"><span class="terminal-btn close"></span><span class="terminal-btn min"></span><span class="terminal-btn max"></span></div><div class="terminal-body"><span class="comment"># Inside WSL2 (Ubuntu / Debian) — works exactly like Linux</span>
<span class="prompt">$</span> sudo apt install tor torsocks
<span class="prompt">$</span> sudo service tor start

<span class="prompt">$</span> torsocks git \
-c http.extraHeader="X-Gost-Authorship-Confirmed: 1" \
push gost my-branch:main
<span class="success">→</span> PR opened as @gitgost-anonymous

<span class="comment"># WSL2 has its own network stack — anonymity is preserved correctly.</span></div>
</div>

<!-- Anonymous Issues & PR Comments section -->
<section class="issue-section">
<div class="issue-container">
Expand Down Expand Up @@ -1914,10 +1978,10 @@ <h4>Get a dynamic badge</h4>
}
}

// Terminal tab switching
document.querySelectorAll('.terminal-tab').forEach(tab => {
// Terminal tab switching (usage section)
document.querySelectorAll('[data-terminal]').forEach(tab => {
tab.addEventListener('click', () => {
document.querySelectorAll('.terminal-tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('[data-terminal]').forEach(t => t.classList.remove('active'));
tab.classList.add('active');
const target = tab.dataset.terminal;
document.getElementById('terminal-push').style.display = target === 'push' ? '' : 'none';
Expand All @@ -1926,6 +1990,18 @@ <h4>Get a dynamic badge</h4>
});
});

// Tor section tab switching
document.querySelectorAll('[data-tor]').forEach(tab => {
tab.addEventListener('click', () => {
document.querySelectorAll('[data-tor]').forEach(t => t.classList.remove('active'));
tab.classList.add('active');
const target = tab.dataset.tor;
document.getElementById('tor-linux').style.display = target === 'linux' ? '' : 'none';
document.getElementById('tor-windows-browser').style.display = target === 'windows-browser' ? '' : 'none';
document.getElementById('tor-windows-wsl').style.display = target === 'windows-wsl' ? '' : 'none';
});
});

// Load data on init
loadStats();
loadRecentPRs();
Expand Down