A modern VPN-like desktop and web app for connecting to the El Tor network - a privacy-focused network (Tor fork) that allows users to share bandwidth, as relays, or consume bandwidth as clients. Built-in payment capabilities using Lightning.
- Node.js 20+ with pnpm
- Rust 1.70+
- eltord project at
~/code/eltord/ - setup env vars
- tauri https://v2.tauri.app/start/prerequisites/
./scripts/download-eltord.sh./scripts/download-arti.sh
npm run web
# Frontend runs on `http://localhost:5173` (with vite proxy to backend at /api)
# Backend API on `http://localhost:5174`npm run tauriThis project supports dual deployment modes:
- π₯οΈ Desktop App: Native Tauri application with system tray integration
- π Web App: Browser-based application with standalone Rust backend
βββββββββββββββββββ βββββββββββββββββββ
β React Frontend β β Rust Backend β
β β β β
β β’ UI Components βββββΊβ β’ Tor Control β
β β’ State Mgmt β β β’ eltord mgmt β
β β’ Routing β β β’ Process Ctrl β
βββββββββββββββββββ βββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Web App β β Tauri App β
β (HTTP APIs) β β (IPC Calls) β
βββββββββββββββ βββββββββββββββ
eltor-app/
βββ frontend/ # React Frontend (Vite + Tauri)
β βββ src/
β β βββ components/ # UI Components
β β βββ services/ # API abstraction layer
β β βββ utils/ # Platform detection
β β βββ hooks/ # Custom React hooks
β βββ src-tauri/ # Tauri desktop app
β βββ package.json
βββ backend/ # Standalone Rust server
β βββ src/
β β βββ main.rs # HTTP API server
β βββ Cargo.toml
βββ README.md
# Quick start
npm i
npm run tauri # quick start to run the tauri app with rust invoke backend
npm run web # quick start to run web frontend with rust rest backend
# Frontend
cd frontend
pnpm dev:web # Web development mode
pnpm dev:tauri # Desktop development mode
pnpm build:web # Bundle prod dist web
pnpm build:tauri # Bundle tauri app
# Backend
cd backend
cargo build # Build debug
cargo build --release # Build release target
cargo run # Start HTTP server. Alternative command ./run.sh
# Docker
cd frontend && pnpm build:web && ../
npm run docker # to run locally
# package - remember to increment the version in package.json and backend/cargo.toml and frontend/src-tauri/cargo.yaml
npm run docker:build:arm
npm run docker:build:amd
npm run docker:push
npm run docker:manifestCopy .env.example to .env and configure:
cp .env.example .env
# Edit .env with your configurationKey Environment Variables:
BIND_ADDRESS="127.0.0.1"
BACKEND_PORT="5174"
APP_ELTOR_USE_PHOENIXD_EMBEDDED="false"
APP_ELTOR_LN_IMPLEMENTATION="cln"
APP_ELTOR_LN_CONFIG="type=cln url=https://YOURURL:PORT rune=YOUR_RUNE default=true"
APP_ELTOR_LN_BOLT12="lno***"
APP_ELTOR_USER_DIR="$PWD"
APP_ELTOR_ELTORRC_PATH="$PWD/backend/bin/data"
# Tor Control Passwords (for authentication to Tor control ports)
APP_ELTOR_TOR_CONTROL_PASSWORD="password1234_" # Client mode password
APP_ELTOR_TOR_RELAY_CONTROL_PASSWORD="password1234_" # Relay mode password
ACCEPT_INVALID_CERTS=true
Outputs platform-specific installers:
- Linux:
.deb - Mac:
.dmg - Windows:
.exe
Right now builds works locally on each platform, Windows, Linux and Mac.
cd frontend
pnpm i
pnpm run deb
# this outputs to ./frontend/src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/deb
# to install on linux
sudo apt install ./eltor_0.1.0_amd64.deb
# uninstall
sudo apt purge eltor
# *troubleshooting - if you installed vscode or terminal using snap you might run into issues, just run the commands in the native os terminal# run on a mac arm (M)
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin
cd frontend
pnpm i
pnpm run dmg
# this outputs to ./frontend/src-tauri/target/release/bundle/dmg/eltor_0.0.19_universal.dmg
# to compile just arm
pnpm run dmg:arm
# to compile just intel x86
pnpm run dmg:intelcd frontend
pnpm i
pnpm run win- create a folder in .release/0.0.19
- add each dmg/deb to the folder
- create a release
# 1. Create and push a tag
git tag v0.0.19
git push origin v0.0.19
# 2. Create a GitHub release via CLI (if you have gh installed)
gh release create v0.0.19 \
--title "Release v0.0.19" \
--notes "Release notes here" \
--latest \
.release/0.0.19/*
# Or create annotated tag with message
git push origin v0.0.19
gh release edit v0.0.19 --latest
- Make sure update the
eltor-websiteproject the latest version to point downloads to
TODO: this does not fully work yet
Arm builds on Github is super slow, instead of using Github actions, you can use "act" https://nektosact.com/ to locally build arm64 based images. This allows you to build locally on a Mac M-series and still push artifacts to Github.
- Install Prereqs
docker buildx create --name mybuilder --driver docker-container --use
docker buildx inspect --bootstrap
docker run --privileged --rm tonistiigi/binfmt --install all
# if you use orbstack and get errors you might need to turn off (or on?) rosetta
orb config set rosetta false
brew install act
docker info | grep Architecture- Create ./secrets
GITHUB_TOKEN=ghp_yourtokenhere
DOCKER_USERNAME=yourdockerusername
DOCKER_PASSWORD=dckr_pat_yourtokenhere- Run a actions build locally
npm run actions:build:linux:arm
# or
ACT=true act workflow_dispatch --secret-file .secrets -j build-linux-arm64 -P self-hosted=skip --bind- Tor Network Control: Connect/disconnect from Tor
- Eltord Process Management: Start/stop eltord client processes
- Dual Mode Support: Web browser OR native desktop app
- System Tray Integration: (Desktop mode only)
- Real-time Status Updates: Process monitoring and notifications
The app automatically detects whether it's running in web or desktop mode and uses the appropriate API layer:
- Desktop: Direct IPC calls to embedded Rust backend
- Web: HTTP requests to standalone Rust server
Community App Store https://github.com/el-tor/eltor-store
MIT License

