A lightweight Windows system tray application for monitoring Mullvad VPN connection status in real-time. Built with Tauri, React, TypeScript, and Tailwind CSS.
Download the latest installer:
- Go to Releases
- Download
Mullvad-Connection-Status_x.x.x_x64-setup.exe - Run the installer
- The app will appear in your system tray automatically
No Node.js or Rust required for the pre-built installer!
Continue reading for full development setup instructions below.
This application provides a visual indicator for your Mullvad VPN connection status when running the VPN on a gateway device. It sits quietly in your system tray, changing colors based on your connection state, and displays detailed connection information when needed.
- System Tray Integration - Unobtrusive tray icon that changes color based on VPN status (green for connected, red for disconnected)
- Custom Title Bar - Modern, draggable window with minimize and close controls that blend with the application design
- Dark Mode Support - Toggle between light and dark themes with persistent preference storage
- Real-time Monitoring - Checks VPN connection status every 15 seconds
- Connection Details - View your current IP address, server location, hostname, and protocol type
- Country Flags - Visual country flag indicators showing which VPN server location you're connected to
- Auto-Start Settings - Built-in UI toggle to enable/disable automatic startup with Windows
- Desktop Notifications - Optional alerts when your VPN connection state changes
- Taskbar Integration - Window appears in the taskbar when open for easy access and management
- Frontend: React 18, TypeScript, Tailwind CSS, shadcn/ui components
- Icons: Lucide React, country-flag-icons, Material Symbols
- Backend: Rust (Tauri v2 framework)
- Build Tools: Vite, npm, Sharp (for icon generation)
- APIs: Mullvad public API (am.i.mullvad.net)
Before you begin, ensure you have the following installed:
Download and Install:
- Visit nodejs.org
- Download the LTS version for Windows
- Run the installer and follow the prompts
- Verify installation:
node --version npm --version
Install using rustup:
- Visit rustup.rs
- Download and run
rustup-init.exe - Follow the installation prompts (use default options)
- Important: Restart your terminal after installation
- Verify installation:
rustc --version cargo --version
Alternative using winget:
winget install Rustlang.RustupThis is critical for Rust compilation on Windows.
Option A: Visual Studio Build Tools (Recommended)
- Download from Visual Studio Downloads
- Scroll to "Tools for Visual Studio"
- Download Build Tools for Visual Studio 2022
- Run the installer
- Select "Desktop development with C++" workload
- Ensure these components are checked:
- MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)
- Windows 11 SDK (or Windows 10 SDK)
- C++ CMake tools for Windows
- Click Install
- Restart your terminal after installation
Option B: Using winget
winget install Microsoft.VisualStudio.2022.BuildTools --override "--wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"Verify installation:
where link.exeThis should show a path like C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\...
Usually pre-installed on Windows 11, but if needed:
- Download from Microsoft Edge WebView2
- Install the Evergreen Standalone Installer
-
Clone or download this repository
git clone <repository-url> cd mullvad-connection-status
-
Install Node.js dependencies
npm install
-
Verify prerequisites (optional but recommended)
node --version # Should show v18.x or higher cargo --version # Should show cargo 1.x.x where link.exe # Should show Visual Studio path
That's it! You're ready to go.
To run the application in development mode with hot-reloading:
npm run tauri devThis will start the Vite dev server and launch the Tauri application window.
To create a production build:
npm run tauri buildThe compiled executable will be located in:
src-tauri/target/release/mullvad-connection-status.exe
An installer will also be generated in:
src-tauri/target/release/bundle/
By default, the application checks VPN status every 15 seconds. To modify this:
- Open
src-tauri/src/main.rs - Find line 84 (approximately)
- Change the duration value:
let mut poll_interval = interval(Duration::from_secs(15)); // Change 15 to your preferred interval
The application includes a built-in auto-start toggle in the Settings page:
- Launch the application
- Click the tray icon to open the status window
- Click the Settings (gear) icon in the top navigation
- Toggle the "Start at Windows boot" switch
- The application will now start automatically when Windows boots
The auto-start feature uses the Windows Registry method (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run) and can be easily toggled on or off from the Settings page.
If you prefer manual setup:
Startup Folder Method:
- Build the application using
npm run tauri build - Navigate to:
src-tauri/target/release/ - Right-click on
mullvad-connection-status.exe→ "Create shortcut" - Press
Win + R, typeshell:startup, press Enter - Move the shortcut into the Startup folder
Registry Method:
- Press
Win + R, typeregedit, press Enter - Navigate to:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run - Create String Value:
- Name:
MullvadConnectionStatus - Value:
"C:\full\path\to\mullvad-connection-status.exe"
- Name:
The application queries Mullvad's public API endpoint (https://am.i.mullvad.net/json) to determine if your internet traffic is routing through a Mullvad VPN server. The API returns information including:
- Whether you're connected to a Mullvad server
- Your current public IP address
- The geographic location of the VPN server
- The server hostname
- The connection protocol (WireGuard or OpenVPN)
This information is displayed in a clean, minimal interface accessible by clicking the tray icon.
- Launch the application
- The tray icon appears in your system tray (bottom-right of taskbar)
- The icon color indicates your status:
- Green = Connected to Mullvad VPN
- Red = Not connected
- Left-click the tray icon to show/hide the status window
- Right-click the tray icon for the menu (Show/Quit options)
When you click the tray icon, a window appears showing:
- Connection status with a visual indicator and country flag
- Your current IP address
- Server location (city and country) with flag icon
- Server hostname
- Connection protocol type
The window features:
- Custom draggable title bar - Click and hold the left side to move the window
- Minimize button - Minimize to taskbar (window remains in taskbar for easy restoration)
- Close button - Hides the window to system tray (application continues running)
- Settings page - Configure auto-start and other preferences
Click the close button or the tray icon again to hide the window. The application continues running in the background.
Problem: Rust compilation fails with "linker link.exe not found"
Solution:
- Install Visual Studio Build Tools (see Prerequisites section above)
- Make sure you selected the "Desktop development with C++" workload
- Restart your terminal after installation
- Verify with
where link.exe- should show Visual Studio path - If still not working, try running from "Developer Command Prompt for VS 2022"
Problem: Rust is not installed or not in PATH
Solution:
- Install Rust from rustup.rs
- Restart your terminal completely (close and reopen)
- Verify with
cargo --version - If still not working, manually add to PATH:
%USERPROFILE%\.cargo\bin
Try these steps in order:
-
Update Rust:
rustup update
-
Clean the build cache:
cd src-tauri cargo clean cd ..
-
Remove node_modules and reinstall:
rm -rf node_modules package-lock.json npm install
-
Try building again:
npm run tauri build
Problem: Application won't launch, missing WebView2
Solution: Download and install WebView2 Runtime from Microsoft.
Problem: Port 1420 already in use
Solution:
- Check if another instance is running (close it)
- Or change the port in
vite.config.ts:server: { port: 1421, // Change to different port }
Problem: No tray icon visible
Solution:
- Check that icon files exist in
src-tauri/icons/(they should be in the repo) - Try rebuilding:
npm run tauri build - On Windows 11, check system tray settings (some icons may be hidden)
Problem: Shows "Disconnected" even when VPN is active
Solution:
- Verify internet connection is working
- Test the API manually: visit
https://am.i.mullvad.net/jsonin browser - Check firewall isn't blocking the application
- Verify you're actually routing through Mullvad (check on gateway)
This is normal. The first Rust build compiles all dependencies and can take 5-10 minutes. Subsequent builds will be much faster (under 1 minute for small changes).
mullvad-connection-status/
├── src/ # React frontend source
│ ├── components/ # React components
│ ├── lib/ # Utility functions
│ ├── App.tsx # Main application component
│ └── main.tsx # Entry point
├── src-tauri/ # Rust backend source
│ ├── src/
│ │ ├── main.rs # Application entry and tray setup
│ │ └── vpn_checker.rs # VPN status API client
│ ├── icons/ # Application icons
│ └── tauri.conf.json # Tauri configuration
├── scripts/ # Build and utility scripts
└── package.json # Node.js dependencies
Contributions are welcome. Please ensure all code follows the existing style and includes appropriate documentation.
MIT License - Copyright (c) 2026 Christian Blank
See LICENSE file for full details.
- Mullvad VPN for providing the public API
- Tauri for the excellent application framework
- shadcn/ui for the beautiful UI components
