Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 36 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,47 @@ permissions:

jobs:
publish-tauri:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- platform: windows-latest
args: ""
- platform: macos-latest
args: "--target aarch64-apple-darwin"
- platform: macos-latest
args: "--target x86_64-apple-darwin"
- platform: ubuntu-22.04
args: ""

runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4

- name: Install Linux dependencies
if: matrix.platform == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libssl-dev

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

- uses: swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"
key: ${{ matrix.platform }}-${{ matrix.args }}

- run: npm ci

Expand All @@ -34,19 +61,22 @@ jobs:
tagName: ${{ github.ref_name }}
releaseName: "EnvTunnel ${{ github.ref_name }}"
releaseBody: |
Windows installers for EnvTunnel.
EnvTunnel installers for Windows, macOS, and Linux.

- **NSIS setup** recommended
- **MSI** — enterprise / IT
- **EnvTunnel.exe** — portable, no install
- **Windows:** NSIS setup (recommended), MSI, portable `.exe`
- **macOS:** `.dmg` for Apple Silicon and Intel
- **Linux:** AppImage and `.deb`
releaseDraft: false
prerelease: false
args: ${{ matrix.args }}

- name: Upload portable exe
- name: Upload portable Windows exe
if: matrix.platform == 'windows-latest'
shell: pwsh
run: Copy-Item src-tauri/target/release/envtunnel.exe EnvTunnel.exe

- uses: softprops/action-gh-release@v2
if: matrix.platform == 'windows-latest'
with:
tag_name: ${{ github.ref_name }}
files: EnvTunnel.exe
Expand Down
41 changes: 24 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

## 🔥 What is it?

**EnvTunnel** is a Windows desktop application built with [Tauri](https://tauri.app/) + React + TypeScript. It sits in your system tray, silently monitors popular development ports, and the moment it detects an active server it generates a large QR code using your real local network IP (e.g. `192.168.1.15`).
**EnvTunnel** is a desktop application built with [Tauri](https://tauri.app/) + React + TypeScript. It sits in your system tray, silently monitors popular development ports, and the moment it detects an active server it generates a large QR code using your real local network IP (e.g. `192.168.1.15`).

No cloud. No accounts. No internet required. 100% offline.
Windows, macOS, and Linux. No cloud. No accounts. No internet required. 100% offline.

## 🎯 Who is it for?

Expand All @@ -26,14 +26,16 @@ No cloud. No accounts. No internet required. 100% offline.
| 🔍 **Auto-scan** | Checks 16+ popular dev ports every 3 seconds |
| 📱 **QR Codes** | Big, scannable QR generated instantly for any active port |
| 🧠 **Framework Detection** | Recognizes Vite, Next.js, Astro, Angular, Nuxt, Gatsby, Django, Flask, Laravel, Rails, Express |
| 🔔 **Toast Notifications** | Get notified when a new dev server comes online |
| 🔔 **Notifications** | In-app toast plus a native OS notification when a new server comes online (works from the tray) |
| ⚡ **Live Reload Indicator** | Orange pulse shows which port just became active |
| 🌐 **Interface picker** | Click the IP to switch Wi-Fi / Ethernet / VPN if the QR used the wrong adapter |
| ➕ **Custom Ports** | Add any port manually (e.g. `6969`) |
| 🔗 **Custom Paths** | Append `/admin`, `?debug=true` or any path to the QR URL |
| 📋 **Copy URL** | One-click copy of the full address to clipboard |
| 💾 **Save QR** | Export QR code as PNG image |
| 🌍 **Open in browser** | Open the same URL on this PC to sanity-check it |
| 🖥️ **System Tray** | Minimizes to tray. Click to restore, right-click to quit |
| 🚀 **Autostart** | Optional launch with Windows |
| 🚀 **Autostart** | Optional launch on login |

## 📡 Supported Ports (Default)

Expand Down Expand Up @@ -66,19 +68,21 @@ You can also **add any custom port** via the in-app input.
<a id="installation"></a>
## 🚀 Installation

### For Users (Just want the .exe)
### For Users

1. Download the Windows installer from [Releases](../../releases)
2. Run the installer
3. Launch EnvTunnel from Start Menu or Desktop
1. Download the installer for your OS from [Releases](../../releases)
2. Run it (Windows setup/MSI, macOS `.dmg`, Linux AppImage/`.deb`)
3. Launch EnvTunnel from the Start Menu, Applications, or your desktop

### For Developers (Build from source)

**Prerequisites:**

- [Node.js](https://nodejs.org/) 18+
- [Rust](https://rustup.rs/) 1.77+
- Windows with Visual Studio Build Tools (for `legacy_stdio_definitions.lib`)
- Windows: Visual Studio Build Tools (for `legacy_stdio_definitions.lib`)
- macOS: Xcode Command Line Tools
- Linux: WebKitGTK 4.1 and related Tauri system packages

**Build steps:**

Expand All @@ -93,8 +97,10 @@ npm install
# Build frontend + Tauri (production)
npm run tauri build

# The .exe will be at:
# src-tauri/target/release/envtunnel.exe
# The binary will be at:
# src-tauri/target/release/envtunnel.exe (Windows)
# src-tauri/target/release/envtunnel (macOS / Linux)
# plus installers under src-tauri/target/release/bundle/
```

> **Note for Windows builders:** If you get `LNK1181: cannot open input file legacy_stdio_definitions.lib`, add this to your `LIB` environment variable:
Expand Down Expand Up @@ -135,6 +141,8 @@ Open your camera app and scan the QR code. Your phone browser opens the local UR

- **Custom Path**: Type `/admin` in the Custom section to generate `http://192.168.1.15:3000/admin`
- **Save QR**: Click "SAVE QR" to download the code as a PNG
- **Open**: Click "OPEN" to load the same URL in your desktop browser
- **Pick IP**: Click the IP if the QR used a VPN/WSL adapter instead of Wi-Fi
- **Tray Mode**: Clicking **X** minimizes to system tray. Right-click the tray icon to fully quit.

## 🛠️ Tech Stack
Expand Down Expand Up @@ -168,6 +176,10 @@ EnvTunnel is a **local-first** desktop app. It works completely offline:
- Keeps the app running in the background
- Prevents accidental close (hides instead)

## 🗺️ Roadmap

Planned work lives in [ROADMAP.md](ROADMAP.md): process names, extra default ports, pin a port, HTTPS QR, `--host` copy, path presets, optional tunnels, global hotkey.

## 🤝 Contributing

Contributions are welcome! This is an open-source project meant to help developers.
Expand All @@ -180,12 +192,7 @@ Contributions are welcome! This is an open-source project meant to help develope

### Ideas for contributions

- Add more framework detection patterns
- Support for macOS / Linux builds
- Dark/Light theme toggle
- ngrok / Cloudflare Tunnel integration
- Network device scanner
- QR code style customization
See [ROADMAP.md](ROADMAP.md). Small, focused PRs are preferred.

## 📄 License

Expand Down
29 changes: 29 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Roadmap

Ideas that are **not** in the current release. PRs welcome.

## Next up

- **Process that owns the port** — show `node.exe` / `python` / Docker next to `:5173` so a stale process is obvious.
- **More default ports** — Storybook `6006`, Expo/Metro `8081`, Vite preview `4173`, webpack `8888`.
- **Pin a port** — keep the QR locked on one server when several are active.
- **HTTPS in the QR** — emit `https://` for mkcert / `vite --https` instead of always `http://`.
- **`--host` copy command** — on LOCAL ONLY, copy the exact dev-server flag for the detected framework.
- **Path presets** — chips for `/admin`, `/api`, `?debug=true` instead of a single custom path field.
- **Optional public tunnel** — Cloudflare Tunnel or ngrok when the phone is not on the same Wi-Fi. Default stays LAN-only / offline.
- **Global hotkey** — e.g. `Ctrl+Shift+Q` to restore the window from the tray.

## Maybe later

- Network device scanner (out of scope — different product).
- QR visual customization.
- Light theme (the neon brutalist look is the identity).

## Shipped

- Auto-scan + QR with LAN IP
- Framework detection, custom ports/paths, tray, autostart
- LAN IP heuristic (skip VPN/WSL) and **manual interface picker**
- Native OS notification when a new port comes online
- Open the URL in the desktop browser
- Windows / macOS / Linux installers via GitHub Actions
57 changes: 44 additions & 13 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<nav class="nav">
<a href="#features">FEATURES</a>
<a href="#download">DOWNLOAD</a>
<a href="https://github.com/hsr88/envtunnel/blob/main/ROADMAP.md" target="_blank" rel="noopener noreferrer">ROADMAP</a>
<a href="https://github.com/hsr88/envtunnel" target="_blank" rel="noopener noreferrer">GITHUB</a>
</nav>
</div>
Expand All @@ -43,11 +44,11 @@ <h1 class="hero-title">
Scan it. Open it. Done.
</p>
<div class="hero-cta">
<a href="#download" class="btn btn-primary">DOWNLOAD FOR WINDOWS</a>
<a href="#download" class="btn btn-primary">DOWNLOAD</a>
<a href="https://github.com/hsr88/envtunnel" target="_blank" rel="noopener noreferrer" class="btn btn-secondary">VIEW SOURCE</a>
</div>
<div class="hero-meta">
<span>v1.0.1</span>
<span>v1.1.0</span>
<span class="sep">|</span>
<span>TAURI + REACT + RUST</span>
<span class="sep">|</span>
Expand Down Expand Up @@ -86,7 +87,7 @@ <h3>FRAMEWORK DETECTION</h3>
<div class="card">
<div class="card-tag">04</div>
<h3>TOAST ALERTS</h3>
<p>Get notified the moment a new dev server comes online. Never miss when your build finishes and the port goes live.</p>
<p>In-app toast plus a native OS notification when a new server comes online - even if EnvTunnel is in the tray.</p>
</div>
<div class="card">
<div class="card-tag">05</div>
Expand All @@ -96,7 +97,7 @@ <h3>CUSTOM PORTS & PATHS</h3>
<div class="card">
<div class="card-tag">06</div>
<h3>SYSTEM TRAY</h3>
<p>Minimizes to tray on close. Right-click for menu. Optional autostart with Windows. Stays out of your way until needed.</p>
<p>Minimizes to tray on close. Right-click for menu. Optional autostart on login. Windows, macOS, and Linux.</p>
</div>
</div>
</div>
Expand Down Expand Up @@ -132,28 +133,57 @@ <h2 class="section-title">&gt; SUPPORTED PORTS</h2>
<section id="download" class="download">
<div class="container">
<h2 class="section-title">&gt; DOWNLOAD</h2>
<p class="download-desc">Windows 10/11 | 64-bit | No installation required for portable version</p>
<p class="download-desc">Windows, macOS, and Linux. Portable Windows build needs no installer.</p>

<div class="download-os">WINDOWS</div>
<div class="download-grid">
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.0.1/EnvTunnel_1.0.1_x64-setup.exe">
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_x64-setup.exe">
<div class="download-label">INSTALLER</div>
<div class="download-name">EnvTunnel Setup (x64)</div>
<div class="download-meta">v1.0.1 · ~2 MB · Recommended</div>
<div class="download-meta">v1.1.0 · ~2 MB · Recommended</div>
</a>
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.0.1/EnvTunnel_1.0.1_x64_en-US.msi">
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_x64_en-US.msi">
<div class="download-label">MSI</div>
<div class="download-name">EnvTunnel MSI (x64)</div>
<div class="download-meta">v1.0.1 · ~3 MB · Enterprise / IT</div>
<div class="download-meta">v1.1.0 · ~4 MB · Enterprise / IT</div>
</a>
<a class="download-card secondary" href="https://github.com/hsr88/envtunnel/releases/download/v1.0.1/EnvTunnel.exe">
<a class="download-card secondary" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel.exe">
<div class="download-label">PORTABLE</div>
<div class="download-name">EnvTunnel.exe</div>
<div class="download-meta">v1.0.1 · ~10 MB · No install</div>
<div class="download-meta">v1.1.0 · ~11 MB · No install</div>
</a>
</div>

<div class="download-os">MACOS</div>
<div class="download-grid">
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_aarch64.dmg">
<div class="download-label">APPLE SILICON</div>
<div class="download-name">EnvTunnel.dmg (arm64)</div>
<div class="download-meta">v1.1.0 · ~4 MB · M1 / M2 / M3 / M4</div>
</a>
<a class="download-card secondary" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_x64.dmg">
<div class="download-label">INTEL</div>
<div class="download-name">EnvTunnel.dmg (x64)</div>
<div class="download-meta">v1.1.0 · ~4 MB · Intel Macs</div>
</a>
</div>

<div class="download-os">LINUX</div>
<div class="download-grid">
<a class="download-card" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_amd64.deb">
<div class="download-label">DEB</div>
<div class="download-name">EnvTunnel.deb</div>
<div class="download-meta">v1.1.0 · ~5 MB · Debian / Ubuntu</div>
</a>
<a class="download-card secondary" href="https://github.com/hsr88/envtunnel/releases/download/v1.1.0/EnvTunnel_1.1.0_amd64.AppImage">
<div class="download-label">APPIMAGE</div>
<div class="download-name">EnvTunnel.AppImage</div>
<div class="download-meta">v1.1.0 · ~80 MB · Portable</div>
</a>
</div>
<div class="download-note">
Direct downloads from <a href="https://github.com/hsr88/envtunnel/releases/latest" target="_blank" rel="noopener noreferrer">GitHub Releases</a>.
<br>
Looking for macOS or Linux? <a href="https://github.com/hsr88/envtunnel/blob/main/README.md#installation" target="_blank" rel="noopener noreferrer">Build from source</a>.
Prefer source? <a href="https://github.com/hsr88/envtunnel/blob/main/README.md#installation" target="_blank" rel="noopener noreferrer">Build it yourself</a>.
</div>
</div>
</section>
Expand All @@ -167,6 +197,7 @@ <h2 class="section-title">&gt; DOWNLOAD</h2>
</div>
<div class="footer-right">
<a href="https://github.com/hsr88/envtunnel" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="https://github.com/hsr88/envtunnel/blob/main/ROADMAP.md" target="_blank" rel="noopener noreferrer">Roadmap</a>
<a href="https://github.com/hsr88/envtunnel/issues" target="_blank" rel="noopener noreferrer">Issues</a>
<a href="https://github.com/hsr88/envtunnel/releases/latest" target="_blank" rel="noopener noreferrer">Releases</a>
</div>
Expand Down
10 changes: 9 additions & 1 deletion docs/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,15 @@ body {
.download-desc {
font-size: 12px;
color: var(--text-muted);
margin-bottom: 32px;
margin-bottom: 8px;
}

.download-os {
font-size: 11px;
font-weight: 800;
letter-spacing: 0.14em;
color: var(--neon);
margin: 28px 0 12px;
}

.download-grid {
Expand Down
14 changes: 12 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "envtunnel",
"private": true,
"version": "1.0.1",
"version": "1.1.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand All @@ -16,6 +16,7 @@
"@tailwindcss/vite": "^4.3.0",
"@tauri-apps/api": "^2.11.0",
"@tauri-apps/plugin-autostart": "^2.5.1",
"@tauri-apps/plugin-notification": "^2.3.3",
"qrcode.react": "^4.2.0",
"react": "^19.2.6",
"react-dom": "^19.2.6",
Expand Down
Loading
Loading