Three steps from setup to users launching apps — on infrastructure you own and control.
Install the AppTunnel server binary on your own infrastructure — a Windows Server, Linux VM, or cloud instance. You own and operate it entirely. AppTunnel never has access to your environment or your data.
The server exposes a web admin UI where you configure tenants, applications, tunnels, and users. Once running, it contacts the AppTunnel.io license server once every 24 hours to validate your license — that's the only outbound connection we require.
Server Architecture
flowchart TD
Admin("🖥️ Admin Browser") -->|"HTTPS :8443"| Server
subgraph Your[" Your Infrastructure "]
Server["AppTunnel\nServer"]
DB[("SQLite")]
Server --- DB
end
Server -.->|"License check\nonce per 24h"| License("AppTunnel.io")
Server <-->|"WebSocket :8765\nTunnels + Control"| Trays("Tray Clients")
classDef at fill:#064e3b,stroke:#34d399,color:#d1fae5
classDef ext fill:#27272a,stroke:#52525b,color:#a1a1aa
classDef db fill:#1c1917,stroke:#52525b,color:#a1a1aa
class Server at
class Admin,License,Trays ext
class DB db
From the admin panel, generate a single pre-configured .exe for your tenant. It has your server address and tenant config already embedded. Send it to users however you want — email, shared drive, intranet.
Users run it, sign in once, and immediately see their assigned applications. All permitted tunnels connect automatically in the background. No setup wizard, no config files, no IT involvement.
User Onboarding Flow
flowchart LR
EXE("Single .exe\npre-configured") --> Login("Sign In")
Login --> Catalog("App catalog\nloads")
Login --> Tunnels("Tunnels\nauto-connect")
Catalog --> Ready("Apps ready\nto launch ✓")
Tunnels --> Ready
classDef at fill:#064e3b,stroke:#34d399,color:#d1fae5
classDef step fill:#27272a,stroke:#52525b,color:#d4d4d8
class Ready at
class EXE,Login,Catalog,Tunnels step
The user clicks their app in the tray. AppTunnel checks whether it's installed and current, downloads only changed files if an update is needed, runs any required install actions (COM registration, MSI execution, INI configuration), then launches the executable.
Meanwhile, the always-on tunnel is already running. The application connects to localhost:1433 (or whichever port you configured) exactly as it always has — completely unaware it's talking through an encrypted tunnel to a database on the other side of the internet.
Tunnel Connection Flow
flowchart LR
App("Legacy App\nVB6 · Delphi\n(unmodified)") -->|"localhost:PORT\nno changes"| Tray("AppTunnel\nTray")
Tray -->|"Encrypted\nWebSocket"| Server("AppTunnel\nServer\nyour infra")
Server -->|"TCP/UDP\ndirect"| Backend("SQL Server\nor any backend")
classDef at fill:#064e3b,stroke:#34d399,color:#d1fae5
classDef ext fill:#27272a,stroke:#52525b,color:#d4d4d8
class Tray,Server at
class App,Backend ext
The app connects to localhost. AppTunnel handles the rest.
Self-hosted, on your infrastructure. Up and running in under an hour.