Already know your VPS ports, firewall rules, and deployment drill? Jump to the Power User Lane. No need to sit through the "what is this thing" part.
V-Swift keeps the job simple: bring your own VPS, enter the SSH details, and let the app connect to the server, install the runtime, configure VLESS-Reality or Hysteria2, and save the generated node information locally. Fewer copy-pasted shell commands, fewer easy mistakes.
| Goal | Start here |
|---|---|
| I am new and just want a working node | Beginner Lane |
| I want to know what I need first | What You Need |
| I want to download the app | Install V-Swift |
| I want deployment steps | Deploy Your First Node |
| Deployment worked but connection failed | Common Snags |
| I want ports, builds, releases, and internals | Power User Lane |
If your goal is "I have a VPS and I want a working node", start here.
V-Swift is not a proxy client. It is closer to a VPS setup assistant.
| Stage | What V-Swift does |
|---|---|
| Before deployment | Connects to your VPS over SSH |
| During deployment | Installs components and configures VLESS-Reality or Hysteria2 |
| After deployment | Saves node information, generates links, and provides a control panel |
After deployment, import the generated link into a client such as v2rayN, NekoBox, Clash, or Mihomo. V-Swift does not route traffic on your computer; it prepares the server side.
Before downloading anything, make sure you have:
| Requirement | Notes |
|---|---|
| VPS | A server you are allowed to manage |
| Server IP | Used for SSH connection |
| SSH login | Username plus password, or username plus private key |
| SSH port | Usually 22, unless you changed it |
| Client app | v2rayN, NekoBox, Clash, Mihomo, or another compatible client |
If your VPS comes from a cloud provider, open the required ports in that provider's dashboard. V-Swift can handle some basic firewall rules inside Linux, but it cannot edit AWS, Alibaba Cloud, Tencent Cloud, Vultr, DigitalOcean, or other provider security groups for you.
Download the latest build from the Releases page.
| Platform | Asset | What to do |
|---|---|---|
| macOS Apple Silicon | V-Swift_*_aarch64.dmg |
Open the DMG and drag V-Swift into Applications |
| Windows x86_64 | V-Swift_*_x64-setup.exe or V-Swift_*_x64_en-US.msi |
Run the installer |
| Debian / Ubuntu | V-Swift_*_amd64.deb |
sudo dpkg -i V-Swift_*.deb |
| RPM-based Linux | V-Swift-*-1.x86_64.rpm |
Install with your package manager |
| Other Linux distributions | V-Swift_*_amd64.AppImage |
Mark it executable and run it |
New releases currently do not include macOS Intel builds.
If macOS blocks the app because it is not notarized, open System Settings > Privacy & Security and allow it manually. You can also remove the quarantine flag:
xattr -cr /Applications/V-Swift.appFollow the steps in order:
| Step | Action | Notes |
|---|---|---|
| 1 | Open V-Swift | Go to the main screen |
| 2 | Create a new node | Start a new VPS deployment |
| 3 | Enter SSH details | VPS address, port, username, password or private key |
| 4 | Choose a protocol | If unsure, start with VLESS-Reality |
| 5 | Start deployment | Wait for the progress log to finish |
| 6 | Copy the subscription link | Find it on the node detail page |
| 7 | Import into your client | v2rayN, NekoBox, Clash, Mihomo, or another compatible client |
Choose Hysteria2 only after confirming that the UDP port is open. Otherwise you may hit the classic "deployment succeeded, connection failed" situation.
V-Swift is not just a one-shot installer.
| Feature | Use it for |
|---|---|
| Node list | View saved nodes |
| Node detail | Copy subscription links again |
| VPS control panel | Check whether the service is alive |
| Service controls | Restart or stop the deployed service |
| Logs | Read recent service logs |
| Uninstall | Remove services deployed by V-Swift |
| Problem | Check first |
|---|---|
| SSH cannot connect | IP, port, username, password or private key; provider firewall for SSH |
| Deployment succeeded, but the client cannot connect | The selected node port is probably blocked by the provider security group |
| Which port should I choose? | Try TCP 443 for VLESS-Reality if free; choose and open a UDP port for Hysteria2 |
| Can V-Swift buy or create a VPS for me? | No. Bring your own server and account |
| Can V-Swift replace v2rayN, Clash, NekoBox, or Mihomo? | No. V-Swift handles the server side; your client app handles daily traffic |
This section is for people who already know their way around VPS deployment and want to see what the app actually changes.
| Topic | Section |
|---|---|
| What the project owns | Scope |
| Server requirements | Server Requirements |
| Cloud security groups | Cloud Firewall Checklist |
| Repository layout | Repository Layout |
| Local development | Build From Source |
| Release flow | Release And Updater |
| Credential and script risks | Security And Privacy |
V-Swift handles server-side deployment and local node management:
- deploys VLESS-Reality through Xray-core;
- deploys Hysteria2 through QUIC/TLS;
- connects to VPS hosts over SSH;
- stores SSH credentials through the OS credential store;
- streams deployment progress from Rust to React through Tauri events;
- stores node metadata and subscription links locally;
- installs a VPS-side Clash/Mihomo subscription service;
- provides a control panel for system status, service operations, and logs;
- uninstalls remote protocol services deployed by the app.
It does not route local traffic, provision cloud servers, or manage provider-level firewalls.
| Item | Requirement |
|---|---|
| OS | Debian 11+ or Ubuntu 20.04+ recommended |
| Privilege | root, or a user with passwordless sudo |
| Service manager | systemd |
| VLESS-Reality | TCP, commonly 443 when available |
| Hysteria2 | UDP, and the selected port must be reachable |
| Managed subscription | TCP 18080 by default |
Check existing firewall rules before deploying to a production machine.
V-Swift can configure basic firewall rules inside Linux. Provider security groups are separate and must be checked manually.
Before deployment:
- Keep the SSH port open, usually
TCP 22or your custom SSH port. - For VLESS-Reality, allow the selected TCP node port.
- For Hysteria2, allow the selected UDP node port.
- If managed subscriptions are enabled, allow
TCP 18080. - Use
0.0.0.0/0only when broad IPv4 access is acceptable; add::/0if IPv6 access is needed. - If you restrict access to your own public IP, remember that home and mobile IPs can change.
When deployment succeeds but connectivity fails, inspect the port number, TCP/UDP choice, security group binding, instance region, and provider firewall policy before changing the app.
.
├── .github/workflows/ # Release workflow
├── src/ # React frontend
│ ├── components/ # Reusable UI components
│ │ └── control/ # VPS control-panel UI components
│ ├── ipc/ # Tauri IPC types and wrappers
│ └── pages/ # Node list, creation wizard, detail, and control-panel views
├── src-tauri/
│ ├── scripts/ # VPS-side deployment and uninstall scripts
│ └── src/ # Rust backend
│ ├── control/ # SSH pool, system monitor, service control, and log retrieval
│ ├── credentials/ # OS credential-store integration
│ ├── deploy/ # Protocol deployment orchestration
│ ├── ssh/ # SSH client wrapper
│ ├── storage/ # Local node storage
│ └── subscription/ # Subscription URI generation
└── README.zh-CN.md # Simplified Chinese documentation
| Layer | Technology |
|---|---|
| Desktop framework | Tauri 2 |
| Frontend | React 18, TypeScript, Vite, Tailwind CSS |
| Backend | Rust, Tokio, russh |
| Storage | rusqlite and OS credential stores |
| Protocols | Xray-core VLESS-Reality and Hysteria2 |
| CI / Release | GitHub Actions and tauri-apps/tauri-action |
Prerequisites:
- Node.js 22 or newer
- Rust stable toolchain
- Tauri 2 system dependencies for your platform
Run the app in development mode:
npm install
npm run tauri:devFor frontend-only work you can skip Tauri and run it in a browser:
npm run devBackend calls then resolve against the fixtures in src/ipc/devMock.ts, so every page and the whole deployment flow stay reachable. That mock layer is only active in development outside Tauri and never reaches a production build.
Build a production bundle:
npm run tauri:buildBuild outputs are written under src-tauri/target/release/bundle/.
Before committing, make sure these pass — CI runs the same commands:
npm run buildcd src-tauri && cargo fmt --all -- --check && cargo clippy --all-targets -- -D warnings && cargo testV-Swift uses the official Tauri updater plugin. The app checks GitHub Releases on startup, and users can also trigger Check for updates from the node list page.
Release flow:
| Step | Action |
|---|---|
| 1 | Bump the version in package.json and src-tauri/Cargo.toml, then refresh both lockfiles (npm install --package-lock-only and cargo check) |
| 2 | Add a CHANGELOG.md entry for the release |
| 3 | Create and push a tag such as v0.4.0 |
| 4 | Wait for GitHub Actions to build installers, updater archives, signatures, and latest.json |
Required repository secrets:
| Secret | Purpose |
|---|---|
TAURI_SIGNING_PRIVATE_KEY |
Tauri updater private key; local backup is stored at ~/.tauri/v-swift-updater.key, never commit it |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD |
Private-key password; leave unset if the key was generated without a password |
If the private key is lost, existing clients cannot verify future updater packages. Users will need to reinstall a new build manually.
- SSH credentials are not committed to the repository and are not stored in plaintext project files.
- Runtime credentials are stored through the OS credential store.
- Node metadata is stored locally and may include parameters needed to rebuild subscription links.
- Treat the local app data directory as sensitive.
- Deployment scripts may run privileged commands on the target VPS.
- Read
src-tauri/scripts/before using the app on servers you care about.
This project is provided for educational, research, and authorized administration purposes only. Do not use it for unauthorized access, network abuse, evasion of lawful controls, distribution of illegal content, or any activity prohibited by your jurisdiction or service provider.
By downloading, building, or running this project, you are responsible for how you use it and for any consequences of operating servers deployed with it.
The source code is licensed under the MIT License. The license grants rights to the source code only and does not authorize or endorse any particular deployment or network usage.