A secure application launcher that exposes web apps only as Tor hidden services.
No TCP ports. No IP exposure. Pure Tor connectivity via Arti (Rust Tor implementation).
./eddi-serverThis will:
- Build binaries (first time only)
- Bootstrap to Tor network
- Launch a Tor v3 onion service
- Start the Flask demo app
- Display your
.onionaddress
Note: First start takes 30-60 seconds to bootstrap to Tor.
In another terminal:
./eddi-connectThis pure Tor client will:
- Auto-detect your server's onion address
- Connect through Tor network (no proxies)
- Fetch the web page
Or connect to any URL via Tor:
# Tor hidden services (.onion)
./eddi-connect http://example.onion:80
./eddi-connect example.onion/status
# Regular websites (via Tor anonymously)
./eddi-connect https://check.torproject.org
./eddi-connect http://httpbin.org/ip- Pure Tor - Uses Arti (Rust Tor implementation), not proxy servers
- No IP Exposure - Never uses IP-based protocols
- Unix Domain Sockets - Secure inter-process communication
- Zero TCP Ports - No network ports exposed on your system
- Process Isolation - Managed child processes
./build.shBuilds:
- Rust binaries (eddi, tor-check, tor-http-client)
- Python virtual environment
- Flask demo dependencies
./scripts/run-tests.shRuns comprehensive test suite with detailed logging.
./scripts/run-tor-check.sh
# or
cargo run --bin tor-checkDiagnostic tool that verifies:
- DNS resolution
- Tor network bootstrap
- Hidden service connections
- Network isolation
Connect to any URL via Tor directly:
# Tor hidden services
cargo run --release --bin tor-http-client http://example.onion:80
# Regular websites (anonymized via Tor)
cargo run --release --bin tor-http-client https://check.torproject.org# Enable debug logging
RUST_LOG=debug ./eddi-server
# Enable trace logging
RUST_LOG=trace cargo run --bin tor-checkeddi/
├── eddi-server # Launch Tor hidden service (main command)
├── eddi-connect # Connect to any URL via Tor (.onion + clearnet)
├── eddi-cleanup # Clean up processes/locks/sockets
├── build.sh # Build all binaries + setup environment
├── src/
│ ├── main.rs # Main EDDI application
│ ├── process.rs # Process management
│ └── bin/ # Additional binaries
│ ├── tor-check.rs # Tor diagnostics tool
│ └── tor-http-client.rs # Pure Arti HTTP client
├── scripts/ # Development utilities
│ ├── run-tests.sh # Test runner with logging
│ └── run-tor-check.sh # Diagnostics runner with logging
├── docs/ # Documentation
└── test-apps/ # Demo applications
└── flask-demo/ # TorPaste - Flask pastebin demo
If you see State already locked or Another process is managing the directory:
Quick Fix:
# Option 1: Use force mode (kills old processes automatically)
./eddi-server --force
# Option 2: Use the cleanup tool (interactive)
./eddi-cleanupWhat's happening:
- Another eddi instance is still running, or
- A previous instance crashed and left lock files behind
Manual cleanup:
# 1. Find and kill running processes
pgrep -f eddi
kill <PID>
# 2. Remove Arti lock files
find ~/.local/share/arti -name "state.lock" -delete
# 3. Clean up sockets
rm -f /tmp/eddi*.sockIf you see "failed to resolve" errors:
# Check DNS configuration
cat /etc/resolv.conf
# Add DNS servers if empty
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.confIf Tor takes too long to bootstrap:
- Check network connectivity
- Verify DNS is working
- Check firewall allows outbound connections
- Try with debug logging:
RUST_LOG=debug ./eddi-server
If Flask demo fails:
# Rebuild Python environment
cd test-apps/flask-demo
rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt- TESTING.md - Testing guide
- DEPLOYMENT.md - Deployment guide
- SECURITY.md - Security documentation
- GEMINI.md - Original project plan
- Rust - Install from rustup.rs
- Python 3 - For Flask demo app
- Network Access - To connect to Tor directory authorities
Not licensed