19 KiB
Windows Tauri Proxy Client Implementation Plan
Intent: Build a separate Windows desktop proxy management app using Tauri 2, React, TypeScript, and Rust. The app manages three independent components: Control App, Proxyfier Layer, and optional Local sing-box.
Current Behavior: The repo contains a gateway/client Node + React web application and planning documents for a Windows mode inside that app. A newer product/technology brief now targets a standalone Windows desktop utility instead of extending the existing web control panel.
Expected Outcome: A compact Windows desktop utility lets the user configure app-level proxy routing through external SOCKS5/HTTP targets first, then optionally install and use local sing-box. The app remains useful when sing-box is absent.
Target-Perspective Output: A Windows user opens the desktop app, sees Overview, Profiles, Targets, Components, and Logs, adds Discord or another process/folder/exe profile, selects an external proxy target, applies changes to the proxyfier layer, and sees component status plus recent activity. Later, installing Local sing-box adds a local target without changing the profile model.
Truth Owner: Source configuration lives in the Tauri app's Rust domain model and JSON files under C:\ProgramData\VpnProxy. Generated ProxiFyre and sing-box configs are derived artifacts. Privileged install/service operations are owned by explicit helper/installer flows, not by React UI state.
Contract Boundary: React UI calls typed Tauri commands. Tauri Rust backend validates and persists profiles/targets/components. Proxy routing is behind a ProxyRouterAdapter boundary, with ProxiFyre as the first adapter. Privileged operations go through explicit helper/install commands returning structured JSON.
Cutover: Supersede the prior Node APP_MODE=windows implementation direction. Keep existing gateway/client code intact. New Windows work lives under a separate Tauri app slice.
Displaced Path: The old plan to add Windows mode into src/server/src/web is demoted to historical context. Do not add a third app mode to the current Node server for this product.
Value Density: The smallest high-value slice is the desktop app MVP with external SOCKS5 target + ProxiFyre profile apply. Local sing-box is optional and comes after the proxyfier MVP is proven.
Evidence Gate: Evidence must include target-perspective app proof: built Tauri app or dev window screenshot/state, generated proxyfier config artifact, mocked or real helper response, and manual Windows checklist when privileged components are involved.
Acceptance Evidence: Automated tests pass for Rust/TypeScript domain logic, app build succeeds, the MVP can create a profile and generate/apply ProxiFyre config against an external target, and Windows manual evidence proves independent component behavior.
Evidence Lane: Record command output, app screenshots/state payloads, generated configs, and manual verification in docs/goals/windows-modular-client/EVIDENCE.md.
Kill Criteria: No Windows implementation inside current Node gateway/client server; no mandatory sing-box dependency; no generated config as source truth; no hidden installation during profile apply; no direct UI parsing of raw PowerShell/stdout.
Architecture Slice: New standalone Tauri app under apps/windows-client, plus docs updates that point from older Windows plans to this plan.
Plan Review Gate: Requires PRE review before implementation execution.
Source Brief
Product and technology source brief:
docs/windows-client-product-tech-brief.md
This plan turns that brief into an execution-ready implementation sequence.
Outcome Contract
Plan title: Windows Tauri Proxy Client
Intent: Build a native-feeling Windows utility that manages app-level proxy routing while keeping Control App, Proxyfier Layer, and Local sing-box separately installable and operable.
Current behavior:
- Existing runtime code is a Node HTTP server and Vite/React web UI for gateway and Mac-style client modes.
- Earlier Windows docs describe adding Windows mode to that existing app.
- The selected direction is now Tauri 2 + React/TypeScript + Rust as a separate Windows desktop app.
Expected outcome:
apps/windows-clientcontains a Tauri 2 app.- The app has Overview, Profiles, Targets, Components, and Logs surfaces.
- Profiles store process/folder/exe source items.
- Targets store external proxy endpoints and optional local sing-box.
- ProxiFyre is the first proxy router adapter.
- Local sing-box is optional and never required for external target profiles.
Target-perspective output:
- User can install/run only the Control App.
- User can see Proxyfier and Local sing-box as separate components.
- User can add an external SOCKS5 target.
- User can add a Discord process profile.
- User can apply the profile to generated ProxiFyre config.
- User sees activity confirming whether apply succeeded or why it was blocked.
Truth owner:
- Rust core domain crate owns normalized models and validation.
- JSON source files under
C:\ProgramData\VpnProxy\configown persisted profiles/targets/component preferences. ProxyRouterAdapterowns conversion from source models to proxy-router generated config.SingBoxAdapterowns generated local sing-box config and service contract.- React UI owns only transient UI state.
Contract boundary:
- UI -> Tauri commands with typed request/response DTOs.
- Tauri commands -> Rust core services.
- Core services -> adapter traits.
- Adapter traits -> helper/install/service commands when privileged operations are needed.
- Helper/install commands return structured JSON, never unstructured text for app logic.
Cutover:
- Add superseded notes to old Windows Node-mode docs.
- Keep
docs/windows-client-product-tech-brief.mdas product brief. - Make this
PLAN.mdthe execution plan. - Do not implement Windows by adding
APP_MODE=windowsto the current Node server.
Displaced path:
- Displace old "Windows mode in current web app" implementation.
- Displace "full install vs ProxiFyre-only" as dominant architecture; those become recipes composed from separate components.
Value density:
- MVP must prove app-level routing with external proxy target and ProxiFyre before local sing-box work expands scope.
Evidence gate:
- Tests and build are not enough.
- Capture app-visible state and generated config.
- Capture Windows manual evidence for service/helper actions when those tasks execute.
Acceptance evidence:
cargo testor equivalent Rust tests for domain/adapters.- frontend typecheck/test/build for React.
- Tauri dev/build command result.
- Screenshot or state dump showing Windows app surfaces.
- Generated ProxiFyre config from a sample profile.
- Manual Windows checklist when privileged components are present.
Non-goals:
- No Electron.
- No extension of the current Node gateway/client UI for Windows MVP.
- No global Windows system proxy changes.
- No transparent routing without a proxy router.
- No mandatory local sing-box.
- No direct coupling of UI to ProxiFyre-specific config shape.
Risk if wrong:
- If built inside the current Node app, the product will inherit gateway/client assumptions and conflict with the selected Tauri direction.
- If ProxiFyre is not behind an adapter, licensing or engine changes will force UI/data rewrites.
- If privileged work is hidden behind apply, users lose control and failures become hard to diagnose.
Architecture Slice
Files/directories to create:
apps/windows-client/package.jsonapps/windows-client/vite.config.tsapps/windows-client/tsconfig.jsonapps/windows-client/src/main.tsxapps/windows-client/src/app/App.tsxapps/windows-client/src/app/routes.tsxapps/windows-client/src/api/tauriCommands.tsapps/windows-client/src/domain/types.tsapps/windows-client/src/features/overview/*apps/windows-client/src/features/profiles/*apps/windows-client/src/features/targets/*apps/windows-client/src/features/components/*apps/windows-client/src/features/logs/*apps/windows-client/src/styles/*apps/windows-client/src-tauri/Cargo.tomlapps/windows-client/src-tauri/tauri.conf.jsonapps/windows-client/src-tauri/capabilities/default.jsonapps/windows-client/src-tauri/src/main.rsapps/windows-client/src-tauri/src/commands.rsapps/windows-client/src-tauri/src/models.rsapps/windows-client/src-tauri/src/storage.rsapps/windows-client/src-tauri/src/activity.rsapps/windows-client/src-tauri/src/adapters/proxy_router.rsapps/windows-client/src-tauri/src/adapters/proxifyre.rsapps/windows-client/src-tauri/src/adapters/singbox.rsapps/windows-client/src-tauri/src/helper.rsapps/windows-client/src-tauri/tests/*apps/windows-client/scripts/install-control-app.ps1apps/windows-client/scripts/install-proxyfier.ps1apps/windows-client/scripts/install-singbox.ps1
Files to modify:
README.mddocs/roadmap.mddocs/superpowers/specs/2026-05-21-windows-client-design.mddocs/superpowers/plans/2026-05-21-windows-client.mddocs/goals/windows-modular-client/GOAL.mddocs/goals/windows-modular-client/EVIDENCE.md
Files to avoid:
src/server/*except if a later explicit migration asks for shared code extraction.src/web/*for Windows MVP.- Docker, entrypoint, and compose files.
- macOS installer.
Source of truth:
C:\ProgramData\VpnProxy\config\profiles.jsonC:\ProgramData\VpnProxy\config\targets.jsonC:\ProgramData\VpnProxy\config\components.jsonC:\ProgramData\VpnProxy\state\activity.json
Derived artifacts:
C:\ProgramData\VpnProxy\generated\proxifyre-app-config.jsonC:\ProgramData\VpnProxy\generated\sing-box-config.json- ProxiFyre runtime config copied/backed up by helper/apply operation.
Read path:
- React UI calls Tauri commands.
- Tauri commands read JSON source via Rust storage service.
- Component status combines source preferences, filesystem checks, service checks, and helper responses.
Write path:
- React UI sends typed mutations.
- Rust validates with domain models.
- Rust writes source JSON atomically with backups.
- Apply generates derived config and invokes adapter/helper.
Integration points:
- ProxiFyre adapter emits
app-config.jsoncompatible output. - Local sing-box adapter emits
sing-boxJSON config and validates viasing-box checkwhen binary exists. - Tauri sidecar/helper permissions are declared explicitly.
- Installer scripts may be launched or displayed explicitly, never silently during apply.
Migration/cutover:
- Older Windows docs point to this plan and source brief.
- Existing Node app remains gateway/client only.
- If shared subscription parsing is needed later, extract it intentionally into a shared package rather than importing server internals.
Acceptance evidence gate:
- MVP evidence must show external-target flow works without local sing-box.
- Optional sing-box evidence must show the same profile model can switch targets after installing sing-box.
Task Board
Task 1: Supersede Old Windows Node Plan
Owner: main agent
Input:
docs/windows-client-product-tech-brief.md- old Windows docs/plans
Files allowed:
docs/superpowers/specs/2026-05-21-windows-client-design.mddocs/superpowers/plans/2026-05-21-windows-client.mddocs/roadmap.mdREADME.md
Files forbidden:
- Runtime source files.
Output:
- Old Windows documents clearly point to this Tauri plan and no longer read as implementation authority.
Evidence:
rg -n "Tauri|superseded|windows-client-product-tech-brief|apps/windows-client" README.md docs
Depends on: none
Parallel safe: yes
Task 2: Scaffold Tauri App Shell
Owner: main agent
Input:
- Tauri 2 app structure
- Product brief UI surfaces
Files allowed:
apps/windows-client/package.jsonapps/windows-client/vite.config.tsapps/windows-client/tsconfig.jsonapps/windows-client/index.htmlapps/windows-client/src/*apps/windows-client/src-tauri/*
Files forbidden:
- Current root
src/server/* - Current root
src/web/*
Output:
- Tauri app starts with empty shell and five navigation surfaces.
- No business logic yet.
Evidence:
cd apps/windows-client && npm install && npm run buildcd apps/windows-client/src-tauri && cargo testif Rust tests exist
Depends on: Task 1
Parallel safe: no
Task 3: Define Domain Models And Validation
Owner: main agent
Input:
- Profile/Target/Component models from brief
Files allowed:
apps/windows-client/src-tauri/src/models.rsapps/windows-client/src-tauri/src/validation.rsapps/windows-client/src/domain/types.tsapps/windows-client/src-tauri/tests/domain_tests.rs
Files forbidden:
- Adapter/helper code except trait references.
Output:
- Typed Rust models for
Profile,ProfileItem,Target,ComponentStatus,ActivityEntry. - TypeScript DTOs mirror Rust command responses.
- Validation rejects malformed ports/protocols but allows missing local sing-box.
Evidence:
- Rust tests showing process/folder/exe normalization and external target validation.
Depends on: Task 2
Parallel safe: no
Task 4: Implement JSON Storage And Activity Log
Owner: main agent
Input:
- Domain models from Task 3
Files allowed:
apps/windows-client/src-tauri/src/storage.rsapps/windows-client/src-tauri/src/activity.rsapps/windows-client/src-tauri/tests/storage_tests.rs
Files forbidden:
- UI screens except command wiring stubs.
Output:
- Atomic JSON read/write for profiles, targets, components, and activity.
- Backups before overwriting source files.
- Config root defaults to
C:\ProgramData\VpnProxy, with test override.
Evidence:
- Tests prove roundtrip, invalid JSON fallback behavior, backup creation, activity cap/sort.
Depends on: Task 3
Parallel safe: no
Task 5: Add Proxy Router Adapter Boundary And ProxiFyre Adapter
Owner: main agent
Input:
- Domain models and storage
Files allowed:
apps/windows-client/src-tauri/src/adapters/proxy_router.rsapps/windows-client/src-tauri/src/adapters/proxifyre.rsapps/windows-client/src-tauri/tests/proxifyre_adapter_tests.rs
Files forbidden:
- Direct UI coupling to ProxiFyre config fields.
Output:
ProxyRouterAdaptertrait.ProxiFyreAdaptergenerates config from enabled profiles and targets.- External target flow does not require sing-box.
Evidence:
- Test generates ProxiFyre config for Discord + external SOCKS5 target.
- Test blocks local-singbox target only when target requires missing component.
Depends on: Task 4
Parallel safe: no
Task 6: Add Tauri Commands
Owner: main agent
Input:
- Storage and adapter services
Files allowed:
apps/windows-client/src-tauri/src/commands.rsapps/windows-client/src-tauri/src/main.rsapps/windows-client/src/api/tauriCommands.tsapps/windows-client/src-tauri/tests/command_tests.rs
Files forbidden:
- Full UI implementation beyond command call wrappers.
Output:
- Commands for status, profiles, targets, components, scan/resolve preview, apply, logs.
- Commands return structured responses only.
Evidence:
- Command tests or integration tests prove apply generates derived config and records activity using a mock adapter/helper.
Depends on: Task 5
Parallel safe: no
Task 7: Build MVP UI
Owner: main agent
Input:
- Tauri command API
- Product brief layout
Files allowed:
apps/windows-client/src/app/*apps/windows-client/src/features/overview/*apps/windows-client/src/features/profiles/*apps/windows-client/src/features/targets/*apps/windows-client/src/features/components/*apps/windows-client/src/features/logs/*apps/windows-client/src/styles/*
Files forbidden:
- Rust adapter behavior except fixing DTO mismatches.
Output:
- Compact utility UI with Overview, Profiles, Targets, Components, Logs.
- User can create/edit profile, external target, and trigger apply.
- Missing sing-box is shown as valid optional state.
Evidence:
npm run build- Screenshot or browser/app state showing missing sing-box and usable external target flow.
Depends on: Task 6
Parallel safe: no
Task 8: Implement Helper And Explicit Installer Boundary
Owner: main agent
Input:
- Component model
- Security model from brief
Files allowed:
apps/windows-client/src-tauri/src/helper.rsapps/windows-client/src-tauri/capabilities/default.jsonapps/windows-client/scripts/install-control-app.ps1apps/windows-client/scripts/install-proxyfier.ps1apps/windows-client/scripts/install-singbox.ps1apps/windows-client/src-tauri/tests/helper_tests.rs
Files forbidden:
- Hidden installer invocation inside profile apply.
Output:
- Helper command abstraction for status/service/apply.
- Installer scripts are explicit and idempotent.
- Tauri sidecar/shell permissions are narrow and documented.
Evidence:
- Helper tests with mock command runner.
- PowerShell parser checks for installer scripts.
- Capability file shows limited sidecar permissions.
Depends on: Task 6
Parallel safe: partly, after command DTOs are stable
Task 9: Add Optional Local Sing-Box Adapter
Owner: main agent
Input:
- sing-box target model
- service/helper boundary
Files allowed:
apps/windows-client/src-tauri/src/adapters/singbox.rsapps/windows-client/src-tauri/tests/singbox_adapter_tests.rsapps/windows-client/src/features/components/*apps/windows-client/src/features/targets/*
Files forbidden:
- Making sing-box mandatory for external targets.
Output:
- Generate local sing-box config.
- Validate via
sing-box checkwhen binary exists. - Local target appears only when installed/configured or as an explicit install prompt.
Evidence:
- Tests show external target apply works without sing-box.
- Tests show local-singbox target requires installed/running component.
Depends on: Tasks 5 and 8
Parallel safe: no
Task 10: Package, Verify, And Record Evidence
Owner: main agent
Input:
- Completed MVP implementation
Files allowed:
apps/windows-client/*README.mddocs/roadmap.mddocs/goals/windows-modular-client/EVIDENCE.md
Files forbidden:
- Unrelated app code.
Output:
- Build/test commands documented.
- README explains separate Control App, Proxyfier, and Local sing-box install flows.
- Evidence file captures automated and target-perspective proof.
Evidence:
npm run build- Rust tests
- Tauri build/dev proof
- generated ProxiFyre config summary
- UI screenshot/state
- Windows manual checklist, or clearly mark
implemented but unprovenfor Windows-only service behavior if not run on a Windows host.
Depends on: all previous tasks
Parallel safe: no
Manual Windows Verification Checklist
- Install/run only Control App.
- Verify Proxyfier and Local sing-box show missing as separate components.
- Add external SOCKS5 target.
- Add Discord process profile.
- Apply profile; verify generated ProxiFyre config and activity entry.
- Install Proxyfier separately; verify status changes.
- Apply profile to real Proxyfier service.
- Install Local sing-box separately.
- Import subscription or config, select outbound, and start Local sing-box.
- Switch existing profile from external target to Local sing-box and apply.
- Stop/restart Proxyfier and Local sing-box separately.
- Copy diagnostics and verify secrets are redacted.