Skip to content

VPN-like client to connect to El Tor and remote wallets. UI for running relays and creating hidden services.

Notifications You must be signed in to change notification settings

el-tor/eltor-app

Repository files navigation

El Tor App

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.

πŸš€ Quick Start

Prerequisites

🌐 Web Mode

npm run web
# Frontend runs on `http://localhost:5173` (with vite proxy to backend at /api)
# Backend API on `http://localhost:5174`

Open http://localhost:5173

πŸ–₯️ Desktop Mode

npm run tauri

🌐 Architecture

This 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) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

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

πŸ› οΈ Development

Available Scripts

# 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:manifest

Environment Setup

Copy .env.example to .env and configure:

cp .env.example .env
# Edit .env with your configuration

Key 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

πŸ“¦ Release El Tor VPN

Outputs platform-specific installers:

  • Linux: .deb
  • Mac: .dmg
  • Windows: .exe

Tauri Build

Right now builds works locally on each platform, Windows, Linux and Mac.

Linux

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

Mac

# 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:intel

Windows (not working yet)

cd frontend 
pnpm i
pnpm run win

Github Release:

  1. create a folder in .release/0.0.19
  2. add each dmg/deb to the folder
  3. 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
  1. Make sure update the eltor-website project the latest version to point downloads to

Github Actions

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.

  1. 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
  1. Create ./secrets
GITHUB_TOKEN=ghp_yourtokenhere
DOCKER_USERNAME=yourdockerusername
DOCKER_PASSWORD=dckr_pat_yourtokenhere
  1. 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

πŸ”§ Features

Core Functionality

  • 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

Platform Detection

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

Umbrel

Community App Store https://github.com/el-tor/eltor-store

πŸ–ΌοΈ Screenshots

Home Screen
Network Flow

πŸ“œ License

MIT License

About

VPN-like client to connect to El Tor and remote wallets. UI for running relays and creating hidden services.

Resources

Stars

Watchers

Forks

Packages

No packages published