Replace dual message-channel + RPC setup with a single registerPluginProtocol path, unified sdk.channels (register/request/event/broadcast), RPC keepalive (__p2ns.ping/pong), and core request lifecycle on RPC open. Update global.profile and example.plugin, admin Plugin RPC stats, docs, and test:plugin-rpc. Breaking: upgrade all peers together; no legacy adapters.
P2NS: Peer-to-Peer Decentralized DNS System
P2NS (Peer-to-Peer Name System) is a firewall-resistant P2P DNS resolution system independent of centralized DNS infrastructure. Using UDP hole-punching via Holesail, it enables connectivity across NAT, CGNAT, and restricted networks (4G/5G, Starlink).
Built with Node.js, integrating Corestore, Hyperswarm, Autopass, and Holesail for decentralized storage, peer discovery, secure invitations, and dynamic tunneling.
Example Peer-to-Peer domain: https://cert.decode (globally avalible to all peers)
Local Example Plugin site with Peer-to-Peer access via the P2NS SDK.
⚠️ Disclaimer
P2NS is a mixture of real development and vibe coding. Caution should be used when using and testing this software. The software may contain experimental features, incomplete implementations, or unexpected behavior. Use at your own risk and always test thoroughly in non-production environments.
Table of Contents
- Features
- Quick Start
- Architecture Overview
- Adding Domains
- Admin Interface
- DNS Resolution
- Proxying and Tunneling
- Certificate Authority
- Environment Variables
- Troubleshooting
- Security Considerations
- Additional Documentation
Features
- Decentralized DNS - Resolves domains via P2P, independent of ICANN
- NAT Traversal - UDP hole-punching via Holesail
- Hybrid DNS - Falls back to public DNS for non-P2P domains
- HTTP/HTTPS Proxy - With WebSocket support and auto HTTP→HTTPS redirect
- TLS Certificates - Auto-generated root CA and per-domain certs
- Consensus Voting - Resolves domain claim conflicts across peers
- Plugin System - Extensible with custom plugins
- Web Admin - Real-time management at
https://p2ns.admin - Peer Directory - Browse domains at
https://peer.directory - Service Subscriptions - Auto-subscribe to services from other domains
- Backup/Recovery - Automatic backups with rotation and restore
- Health Monitoring - Liveness/readiness probes, diagnostics, metrics
Quick Start
Prerequisites
- Node.js 18+
- macOS or Linux (Windows planned)
npm install -g holesailfor hash generation
Installation
git clone https://git.ssh.surf/snxraven/p2ns.git
cd p2ns
npm install
Running
# Master node (initializes network)
sudo node p2ns.js --master
# Joiner node (connects via invites)
sudo node p2ns.js
# Fresh start (clears storage)
sudo node p2ns.js --clean [--master]
The system binds to UDP 53 (DNS), TCP 443 (HTTPS), and TCP 80 (HTTP redirect).
Access the admin interface at https://p2ns.admin (trust the root CA in your browser).
Architecture Overview
┌─────────────────────────────────────────────────────────────┐
│ P2NS Core │
├─────────────┬─────────────┬─────────────┬──────────────────┤
│ Corestore │ Hyperswarm │ Autopass │ Holesail │
│ (Storage) │ (Peers) │ (Invites) │ (Tunneling) │
├─────────────┴─────────────┴─────────────┴──────────────────┤
│ DNS Server (UDP 53) │
├─────────────────────────────────────────────────────────────┤
│ HTTPS Proxy (443) / HTTP Redirect (80) │
├─────────────────────────────────────────────────────────────┤
│ Virtual Interfaces │
│ (lo0/lo IP aliases) │
├─────────────────────────────────────────────────────────────┤
│ Plugin System │
│ (peer.directory, p2ns.admin, custom) │
└─────────────────────────────────────────────────────────────┘
Key components:
- DNS (
dns.js) - P2P/public/local DNS resolution on port 53 - Proxy (
*_proxy.js) - HTTPS routing with SNI, WebSocket support - Holesail (
holesail.js) - Persistent tunnels for P2P domains - Virtual Interfaces (
virtual_interfaces.js) - IP aliases for domains - Certificates (
certificate_authority.js) - Root CA and domain certs - Plugins (
plugin-handler.js) - Extensible internal domains
Adding Domains
-
Generate a Holesail hash:
holesail --live 80 --public # Output: Connection hash: hs://<hash> -
Add via Admin Interface (recommended): Use the "Domains" tab at
https://p2ns.admin -
Add via JSON: Edit
cache/domains.json:[{"domain": "example.tld", "hash": "hs://<hash>", "ssl": false}]
Domains sync across peers via Autopass with consensus-based conflict resolution. See docs/CONSENSUS.md for details.
Admin Interface
Access https://p2ns.admin for real-time management:
| Tab | Features |
|---|---|
| Domains | Add/remove domains, view consensus status |
| Host | Holesail servers/clients, service subscriptions |
| Local DNS | Custom DNS records, conflict selector |
| Entries | Autopass ledger (claims/votes) |
| Peers | Connected peers, blocking, metrics |
| Certificates | Generate/regenerate domain certs, manage CA |
| Interfaces | Domain-to-IP mappings |
| Backups | Create/restore backups |
| Diagnostics | DNS lookup, ping, traceroute, connection tests |
| Stats | Real-time metrics, health status |
| Logs | Live system logs |
| Settings | Environment config, subnet management |
| Plugins | Start/stop plugins, view logs, configure settings |
DNS Resolution
P2NS provides hybrid DNS resolution:
| Type | Behavior |
|---|---|
| P2P Domains | Resolve to local IPs, start Holesail tunnels |
| Public Domains | Forward to public DNS (default: 1.1.1.1) |
| Local DNS | Serve from cache/local_dns.json |
| Internal Domains | Map to 127.0.0.1 (plugins) |
| Conflicting | Managed via DNS Conflict Selector in admin |
Test with: dig @127.0.0.1 example.tld
DNS Conflict Selector
For domains with both P2P and public records, use the "Local DNS" tab to toggle between P2P and Public resolution. Preferences are persisted in cache/selector_cache.json.
Proxying and Tunneling
- HTTPS Proxy (443) - Routes to Holesail tunnels or public IPs
- HTTP Redirect (80) - Redirects to HTTPS
- TLS/SNI - Per-domain certificate selection
- WebSocket - Full upgrade support
- Holesail Clients - Lazy start, timeout after 5 min (configurable)
- Holesail Servers - Persistent, managed via admin
Service Subscriptions
Subscribe to services published by other domains. See docs/SUBSCRIPTIONS.md for details.
Certificate Authority
P2NS generates a root CA (certs/ca.cert.pem) and per-domain certificates with SANs.
Auto-Installation
The CA is automatically installed on macOS (Keychain) and Linux (/usr/local/share/ca-certificates).
Manual Installation
If auto-install fails, see docs/CERTIFICATES.md for manual installation instructions for:
- macOS (Keychain Access or command line)
- Linux (system certificates)
- Windows (certutil)
- Browser-specific (Firefox, Chrome)
Environment Variables
Configure via .env (copy from default.env):
Core Settings
| Variable | Default | Description |
|---|---|---|
STORAGE_DIR |
./my-storage |
Corestore data directory |
CERTS_DIR |
./certs |
Certificate storage |
LOG_LEVEL |
0 |
0=DEBUG, 1=INFO, 2=WARN, 3=ERROR |
TOPIC_SEED |
p2ns-dns |
Hyperswarm topic seed |
File Paths
| Variable | Default |
|---|---|
DOMAINS_FILE |
./cache/domains.json |
LOCAL_DNS_FILE |
./cache/local_dns.json |
HOLESAIL_SERVERS_FILE |
./cache/holesail_servers.json |
HOLESAIL_CLIENTS_FILE |
./cache/holesail_clients.json |
SELECTOR_CACHE_FILE |
./cache/selector_cache.json |
SUBSCRIPTIONS_FILE |
./cache/subscriptions.json |
PEER_HISTORY_FILE |
./cache/peer_history.json |
PEER_METRICS_FILE |
./cache/peer_metrics.json |
Network Settings
| Variable | Default | Description |
|---|---|---|
DNS_PORT |
53 |
DNS server port |
HTTPS_PORT |
443 |
HTTPS proxy port |
HTTP_PORT |
80 |
HTTP redirect port |
INTERNAL_PORT |
8080 |
Holesail client port |
PUBLIC_DNS_SERVER |
1.1.1.1 |
Fallback DNS (comma-separated for failover) |
Feature Toggles
| Variable | Default | Description |
|---|---|---|
DISABLE_DNS_SERVER |
false |
Disable DNS server |
DISABLE_PROXY_SERVER |
false |
Disable proxy servers |
DISABLE_VIRTUAL_INTERFACES |
false |
Disable virtual interfaces |
ALLOW_ANY_WRITER_INVITES |
true |
Allow joiners to issue invites |
FULL_PERSISTENCE |
false |
Keep Holesail connections indefinitely |
Consensus Settings
| Variable | Default | Description |
|---|---|---|
CONSENSUS_QUORUM_THRESHOLD |
0.5 |
Percentage of peers required (0.0-1.0) |
CONSENSUS_MIN_VOTES |
2 |
Minimum votes required |
CONSENSUS_TIE_BREAKER |
timestamp |
timestamp, claimant_age, or lexicographic |
Subnet Configuration
| Variable | Default | Description |
|---|---|---|
SUBNETS |
Single 192.168.3.x | JSON array of subnet configs |
SUBNET_NAME |
lo0/lo |
Network interface for virtual IPs |
Example multi-subnet config:
[{"base":"192.168.3.0","cidr":24,"startIndex":2,"name":"Primary"}]
Backup & Metrics
| Variable | Default | Description |
|---|---|---|
BACKUP_DIR |
./backups |
Backup storage |
BACKUP_RETENTION |
25 |
Backups to keep |
BACKUP_INTERVAL |
720 |
Auto-backup interval (minutes) |
METRICS_RETENTION_MS |
60 |
Metrics retention (minutes) |
RESOURCE_VALIDATION_INTERVAL |
5 |
Cleanup interval (minutes) |
Master Node Settings
| Variable | Default | Description |
|---|---|---|
MASTER_RECONNECT_INTERVAL |
5 |
Reconnection base interval (seconds) |
MASTER_MAX_RECONNECT_ATTEMPTS |
10 |
Max reconnection attempts |
MASTER_PROACTIVE_INVITE_DELAY |
500 |
Delay before sending invite (ms) |
Troubleshooting
| Issue | Solution |
|---|---|
| Port conflicts | Check with lsof -i :53, use DISABLE_DNS_SERVER=true |
| CA not trusted | Import certs/ca.cert.pem manually (see docs/CERTIFICATES.md) |
| Holesail failures | Test with holesail --live 80 --public |
| DNS errors | Check logs, verify peer connections |
| Interface issues | Requires sudo, check with ifconfig lo0 |
| Ping not working (macOS) | Disable "Stealth Mode" in Firewall settings |
| Sync issues | Use --clean to reset storage |
Security Considerations
- P2P Exposure - Join trusted networks only
- CA Security - Protect
./certs(enables local MITM) - Consensus - Monitor for claim disputes
- Sudo - Run in isolated environments
- Dependencies - Audit for vulnerabilities
Additional Documentation
- Full Documentation - Comprehensive reference with all details
- Plugin System - Creating and managing plugins
- Plugin SDK - API reference for plugins
- REST API - Complete API documentation
- Consensus - Domain voting and resolution
- HyperDB - Database operations
- Plugin Channels - P2P communication
- Hyperdrive - Distributed file system
- Proxy Server - Standalone proxy configuration


