New · Open source · v1.0

A worldwide
peer-to-peer proxy.

Route your traffic through a global network of peer nodes in every country. Without a centralised proxy provider in the middle.

~/projects · zsh
$ brew install --cask BitpingApp/tap/p2proxy
$ p2proxy --config Config.yaml
$ curl --socks5-hostname localhost:1080 https://ifconfig.me
libp2p under the hood
Self-hosted
Prometheus metrics

Local first, host anywhere.

Everything proxy providers gate behind an API — endpoint selection, pooling, routing — running locally on your machine.

SOCKS5 drop-in

A local SOCKS5 endpoint that works with anything that speaks the protocol — curl, requests, Playwright, Puppeteer, browsers, even full WireGuard chains.

Programmable routing

Filter peers by minimum bandwidth, ISO country code, or a specific libp2p peer ID. Configure as many endpoints as you need in a single Config.yaml.

Connection pooling

Warm libp2p streams stay open between requests. SOCKS5 handshakes don't pay the dial cost twice — typical request setup is sub-100ms.

Multi-endpoint

Run a US pool, a JP pool and a high-bandwidth pool from a single Config.yaml. Each listener gets its own peer filter and pool settings.

Self-hosted control

p2proxy runs on your machine. Bitping provides the peer network — your routing logic, your config, your hardware, no centralised middleman.

Open source

PolyForm Shield 1.0. Read the source on GitHub, audit the binary, build from source. No black box between your traffic and the wire.

How it works

Four hops from your client to the open internet. None of them through a centralised proxy provider.

Step 1

Local SOCKS5

Your client opens a SOCKS5 connection to p2proxy on localhost. Anything that speaks SOCKS5 works — no SDK, no library, no rewrite.

Step 2

Peer match

p2proxy authenticates with the Bitping network using your API key and selects a peer matching your filter — country, minimum bandwidth, or specific peer ID.

Step 3

libp2p stream

A warm libp2p stream to the chosen peer carries the request. Direct peer-to-peer where possible, relay-fallback when not. Pool keeps streams hot between requests.

Step 4

Egress

The peer forwards your traffic to the destination from its own IP. Response flows back through the same stream. The destination sees the peer; you see the response.

See p2proxy while it's running.

Live peer connections, throughput, and per-server sessions — all from a terminal. Click around: Tab cycles tabs, L toggles the logs overlay.

p2proxy · ratatui
P2PROXY SYSTEM
─ CONNECTION STATUS ─
STATUS: Connected
LOCAL ID: 12D3KooWS9Fec5GrWaWysJ8HFmgNmZvcsHdxuXQYr95ngAigbSKV
RELAY ID: 12D3KooWCpfF6P6NuDgXx8WUKJ2YfXdsY7euMiT8U1x53KkvBwro
ACTIVE SESSIONS
0
CONNECTED PEERS
2
TOTAL UPLOAD
0 B
TOTAL DOWNLOAD
0 B
─ SYSTEM BANDWIDTH (LAST 30 SECONDS) ─
1.0 Mbps 0.5 0 -30s -15s now Seconds ago Upload Mbps Download Mbps
─ P2PROXY COMMAND INTERFACE ─
[Tab] Switch Tabs [L] Toggle Logs [E] Export Logs [↑/↓] Navigate [↵] Expand [Q] Quit

p2proxy vs. commercial proxy providers

A different shape of product. Built for engineers who want to own the routing layer, not rent it.

p2proxyTraditional proxy provider
Architecture Peer-to-peer over libp2pAPI gateway → opaque peer pool
Control plane Local app you ownVendor API
Source Open source (PolyForm Shield)Closed source
Peer filtering Country / bandwidth / peer IDCountry / session sticky (typical)
Connection pooling Warm streams, sub-100ms setupPer-request gateway lookup
Integration Local SOCKS5 socketHTTPS API or upstream URL
Observability Prometheus metrics, live TUIVendor dashboard

What it looks like to use.

Three common shapes — browser automation, scraping, multi-geo testing — and the code that wires them up.

Browser automation
.ts

Playwright

import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: { server: "socks5://localhost:1080" },
});
const page = await browser.newPage();
await page.goto("https://example.com");
Web scraping
.py

Python · requests

import requests

proxies = {
  "http":  "socks5h://localhost:1080",
  "https": "socks5h://localhost:1080",
}
r = requests.get("https://ifconfig.me", proxies=proxies)
print(r.text)  # peer IP, not yours
Multi-geo testing
.yaml

Config.yaml

port: 45445
servers:
  - protocol: Socks5
    port: 1080
    country: US
    min_bandwidth: 50Mbps
  - protocol: Socks5
    port: 1081
    country: JP
  - protocol: Socks5
    port: 1082
    min_bandwidth: 200Mbps
Install in 30 seconds

Install p2proxy.

One command on macOS or Linux. A Bitping API key. A peer routing your first request before your terminal scrolls.

brew install --cask BitpingApp/tap/p2proxy
Coming soon

Want the hosted version?

Bitping Hosted Proxy is coming soon — your own SOCKS5 endpoint at you.bitping.com:1080, managed in the dashboard alongside your other tools. WireGuard, HTTPS and OpenVPN coming after.