Skip to main content

Quick Start

For the fastest development setup:
  1. Clone the repository with submodules:
  2. Install Rust and setup for your platform:
  3. Install Node.js/npm via Volta and build dependencies:
  4. Start developing!

Detailed Setup by Platform

Linux Development

Ubuntu/Debian

Fedora/RHEL

Nix Devshell

The recommended approach on Linux:

macOS Development

Important: The default macOS bash (3.2.5) is too old. Make sure to use bash 4.0+ installed via Homebrew.

iOS Development Setup

Additional iOS requirements:
Edit the .xcconfig files to add your Apple Developer Team ID and provisioning profile names.

Windows Development

Prerequisites Installation

  1. Install Visual Studio 2022
  2. Install Git for Windows
    • Download from git-scm.com
    • This provides Git Bash and Unix utilities
  3. Install Rust
  4. Install Zig
  5. Install Volta
  6. Install Go
    • Download installer from golang.org
    • Run installer
  7. Install Protobuf

Setup in Git Bash

Android Development

This is the easiest and most reliable method:

Manual Setup on Linux

Development Workflow

Running the Daemon

Linux/macOS:
Windows:
macOS specific:

Running the Desktop GUI

With the daemon running, start the Electron app:
The GUI will automatically reload when you change JavaScript/TypeScript files.

Running the CLI

Common Development Commands

Rust:
Desktop/Electron:
Android:

Environment Variables

Development-Specific Variables

See the full list of environment variables in the README.

Editor/IDE Setup

VS Code

Recommended extensions:
  • rust-analyzer
  • ESLint
  • Prettier
  • TypeScript and JavaScript Language Features

IntelliJ/Android Studio

For Android development, open the android/ directory as a project.

Xcode

For iOS development, open ios/MullvadVPN.xcodeproj.

Git Workflow

Post-Checkout Hook

Automatically update Rust toolchain when version changes:

Submodule Updates

When pulling changes that update submodules:

Commit Signing

All merge commits to main must be GPG signed. Individual commits in feature branches don’t require signing unless they modify security-critical files.

Troubleshooting

”command not found” errors

Ensure all tools are in your PATH:

Rust toolchain issues

Node/npm version issues

Permission denied when running daemon

The daemon must run as root/SYSTEM:
  • Linux/macOS: Use sudo
  • Windows: Use PsExec to get SYSTEM shell

Submodule not found

Build fails with “protoc: not found”

Install protobuf compiler and ensure it’s in PATH:

Android build fails on ARM64 Linux

Follow the 2-stage build process described in the Building guide - build proto files on x64 first.

macOS: bash version too old

Next Steps