Files
harbor-net/apps/windows-client

VPN Proxy Windows Client

Standalone Windows desktop utility for app-level proxy routing. This app is separate from the current Docker gateway/client runtime and must not be wired through APP_MODE=windows.

Components

  • Control App: Tauri 2 + React/TypeScript UI and Rust command layer.
  • Proxyfier Layer: ProxiFyre adapter for per-application routing.
  • Local sing-box: optional local runtime, used only by targets that explicitly require singbox.

External SOCKS5 targets are the MVP path and do not require Local sing-box.

Source And Generated Files

Source configuration is owned by Rust domain models and JSON files under:

C:\ProgramData\VpnProxy\config\profiles.json
C:\ProgramData\VpnProxy\config\targets.json
C:\ProgramData\VpnProxy\config\components.json
C:\ProgramData\VpnProxy\state\activity.json

Generated artifacts are derived and can be recreated:

C:\ProgramData\VpnProxy\generated\proxifyre-app-config.json
C:\ProgramData\VpnProxy\generated\sing-box-config.json

Development

cd apps/windows-client
npm install
npm run build

Run the browser preview shell:

npm run dev -- --host 127.0.0.1

Run Tauri checks when the native Windows toolchain is installed:

npm run tauri -- info
npm run tauri -- dev
npm run tauri -- build

Run Rust tests when Rust/Cargo are installed:

cd apps/windows-client/src-tauri
cargo test

Native Tauri build requires WebView2, Rust via rustup, and Visual Studio Build Tools with MSVC and Windows SDK components.

Explicit Installer Boundaries

Installer scripts are explicit per component and return structured JSON in -PlanOnly mode:

& .\scripts\install-control-app.ps1 -PlanOnly
& .\scripts\install-proxyfier.ps1 -PlanOnly
& .\scripts\install-singbox.ps1 -PlanOnly

Installers must be launched intentionally by the user or by a future narrow helper permission. Profile apply must not silently install Control App, Proxyfier, or Local sing-box.

Existing Proxyfier Detection

The app detects an already installed Proxyfier layer before showing component status or applying profiles. Detection checks:

  • uninstall registry entries for ProxiFyre and Proxifier;
  • common install folders such as C:\Tools\ProxiFyre, %ProgramFiles%\ProxiFyre, and %ProgramFiles%\Proxifier;
  • running ProxiFyre / Proxifier processes and the ProxiFyreService service.

For portable installs, set an override before launching the app:

$env:VPN_PROXY_PROXIFYRE_ROOT = 'D:\Tools\ProxiFyre'
npm run tauri -- dev

ProxiFyre installs are compatible with the current generated app-config.json apply path. Plain Proxifier installs are detected and shown, but automatic profile apply is not enabled for them yet because they use a different profile format.

MVP Verification Flow

  1. Start the Control App or browser preview.
  2. Confirm Components shows Control App, Proxyfier Layer, and optional Local sing-box separately.
  3. Add or keep an external SOCKS5 target.
  4. Add a process/folder/exe profile such as Discord.
  5. Apply profiles and verify generated ProxiFyre config plus activity entry.
  6. Install Proxyfier separately before applying to a real service.
  7. Install and start Local sing-box only when using a local target.

Task evidence is recorded in docs/goals/windows-modular-client/EVIDENCE.md.