Mullvadvpn App
The Mullvad VPN client app for desktop and mobile
Install / Use
npx skills add mullvad/mullvadvpn-appInstalls into whichever agent you are using.
README
Mullvad VPN desktop and mobile app
Welcome to the Mullvad VPN client app source code repository. This is the VPN client software for the Mullvad VPN service. For more information about the service, please visit our website, mullvad.net (Also accessible via Tor on our onion service).
This repository contains all the source code for the
desktop and mobile versions of the app. For desktop this includes the system service/daemon
(mullvad-daemon), a graphical user interface (GUI) and a command
line interface (CLI). The Android app uses the same backing system service for the
tunnel and security but has a dedicated frontend in android/. iOS consists of a
completely standalone implementation that resides in ios/.
Releases
There are built and signed releases for macOS, Windows, Linux and Android available on our website and on GitHub. The Android app is also available on Google Play and F-Droid and the iOS version on App Store.
You can find our code signing keys as well as instructions for how to cryptographically verify your download on [Mullvad's Open Source page].
Platform/OS support
See Supported Platforms for details on which operating systems, versions and architectures are supported, and which ones are covered by our automated test suite.
Features
Here is a table containing the features of the app across platforms. This is intended to reflect the current state of the latest code in git, not necessarily any existing release.
| | Windows | Linux | macOS | Android | iOS | |-----------------------------------------|:-------:|:-----:|:-----:|:-------:|:---:| | WireGuard | ✓ | ✓ | ✓ | ✓ | ✓ | | Quantum-resistant tunnels | ✓ | ✓ | ✓ | ✓ | ✓ | | DAITA | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard multihop | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over TCP | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over Shadowsocks | ✓ | ✓ | ✓ | ✓ | ✓ | | WireGuard over QUIC | ✓ | ✓ | ✓ | ✓ | ✓ | | Lightweight WireGuard Obfuscation (LWO) | ✓ | ✓ | ✓ | ✓ | ✓ | | Split tunneling | ✓ | ✓ | ✓ | ✓ | | | Custom DNS server | ✓ | ✓ | ✓ | ✓ | ✓ | | Content blockers (Ads etc) | ✓ | ✓ | ✓ | ✓ | ✓ | | Optional local network access | ✓ | ✓ | ✓ | ✓ | ✓* | | Externally audited | ✓ | ✓ | ✓ | ✓ | ✓ |
* The local network is always accessible on iOS with the current implementation
User security, privacy and anonymity
This app is a privacy preserving VPN client. As such it goes to great lengths to stop traffic leaks. And basically all settings default to the more secure/private option. The user has to explicitly allow more loose rules if desired. See the dedicated security document for details on what the app blocks and allows, as well as how it does it.
Secure development
Since the security of the users of the app is a top priority, by extension the security of the development and release process also becomes a top priority. This is something we work actively on.
Git signatures
All merge commits to the main branch must be PGP (gpg) signed in git. This signs off the entire feature branch. The individual commits in the feature branch do not need to be signed, unless they change one or more of the files deemed extra important.
The list of files requiring signatures to every commit that change them is defined in the
verify-locked-down-signatures
workflow.
Audits, pentests and external security reviews
This app is audited by external security experts and penetration testers every second year. We also carry out feature specific audits for certain security critical features and changes.
The results of these audits are always made public in their unredacted original form, for full transparency towards the users. See the audits readme for this.
Moreover, we welcome any individual to review the security of this app and submit any found issue to us. See SECURITY.md for more.
Checking out the code
This repository contains submodules needed for building the app. However, some of those submodules also have further submodules that are quite large and not needed to build the app. So unless you want the source code for all submodules you should avoid a recursive clone of the repository. Instead clone the repository normally and then get one level of submodules:
git clone https://github.com/mullvad/mullvadvpn-app.git
cd mullvadvpn-app
git submodule update --init
We sign every merge commit to the main branch as well as our release tags.
If you would like to verify your checkout, you can find our developer keys on
[Mullvad's Open Source page].
Binaries submodule
This repository has a git submodule at dist-assets/binaries. This submodule contains binaries and
build scripts for third party code we need to bundle with the app, such as Wintun.
This submodule conforms to the same integrity/security standards as this repository. Every merge commit should be signed. And this main repository should only ever point to a signed merge commit of the binaries submodule.
See the binaries submodule's README for more details about that repository.
Building the app
See the build instructions for help building the app on desktop platforms.
For building the Android app, see the instructions for Android.
For building the iOS app, see the instructions for iOS.
Releasing the app
See this for instructions on how to make a new release.
Environment variables used by the service
-
TALPID_FIREWALL_DEBUG- Helps debugging the firewall. Does different things depending on platform:- Linux: Set to
"1"to add packet counters to all firewall rules. - macOS: Makes rules log the packets they match to the
pflog0interface.- Set to
"all"to add logging to all rules. - Set to
"pass"to add logging to rules allowing packets. - Set to
"drop"to add logging to rules blocking packets.
- Set to
- Linux: Set to
-
TALPID_FIREWALL_DONT_SET_SRC_VALID_MARK- Set this variable to1to stop the daemon from setting thenet.ipv4.conf.all.src_valid_markkernel parameter to1on Linux when a tunnel is established. The kernel config parameter is set by default, because otherwise strict reverse path filtering may prevent relay traffic from reaching the daemon. Ifrp_filteris set to1on the interface that will be receiving relay traffic, andsrc_valid_markis not set to1, the daemon will not be able to receive relay traffic. -
TALPID_FIREWALL_DONT_SET_ARP_IGNORE- Set this variable to1to stop the daemon from setting thenet.ipv4.conf.all.arp_ignorekernel parameter to2on Linux when a tunnel is established. The kernel config parameter is set by default, because otherwise an attacker who can send ARP requests to the device running Mullvad can figure out the in-tunnel IP. -
TALPID_DNS_MODULE- Allows changing the method that will be used for DNS configuration. By default this is automatically detected, but you can set it to one of the options below to choose a specific method.-
Linux
"static-file": change the/etc/resolv.conffile directly"resolvconf": use theresolvconfprogram"systemd": use systemd'sresolvedservice through DBus"network-manager": useNetworkManagerservice through DBus
-
Windows
iphlpapi: use the IP helper APInetsh: use thenetshprogramtcpip: set TCP/IP parameters in the registry
-
-
TALPID_DISABLE_LOCAL_DNS_RESOLVER- Set this variable to1to disable the local DNS resolver (macOS only). -
TALPID_NEVER_FILTER_AAAA_QUERIES- Set this variable to1to never ignore DNS AAAA queries (macOS only). -
TALPID_FORCE_USERSPACE_WIREGUARD- Forces the daemon to use the userspace implementation of WireGuard. -
TALPID_DISABLE_OFFLINE_MONITOR- Forces the daemon to always assume the host is online. -
TALPID_CGROUP2_FS- On Linux, forces the daemon to look for the cgroup2 filesystem at the specified path, instead of/sys/fs/cgroup. The cgroup2 used for split tunneling will be created in this directory. -
TALPID_NET_CLS_MOUNT_DIR- On Linux, forces the daemon to mount thenet_clscontroller in the specified directory if it isn't mounted already. This will only have an effect on older systems where cgroup v1 is used for split tunneling. -
MULLVAD_MANAGEMENT_SOCKET_GROUP- On Linux and macOS, this restricts access to the management interface UDS socket to users in the specified grou
Related Skills
clawhub
385.5kSearch ClawHub for skills when a requested capability is not already available; install, verify, update, uninstall, publish, or sync skills.
coding-agent
385.5kDelegate coding work to Codex, Claude Code, or OpenCode as background workers; not simple edits or read-only code lookup.
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
taskflow
385.5kCoordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.
