Skip to main content
This guide covers how to build the Bitwarden Desktop application for different platforms.

Prerequisites

  • Node.js (version specified in .nvmrc)
  • Rust toolchain (for native modules)
  • Platform-specific tools:
    • Windows: Visual Studio Build Tools
    • macOS: Xcode Command Line Tools
    • Linux: Build essentials, depending on your distribution

Build Commands

Development Build

Build all components (main, renderer, and preload) in development mode:
This runs three builds concurrently:
  • Main process: npm run build:main:dev
  • Renderer process: npm run build:renderer:dev
  • Preload script: npm run build:preload:dev

Production Build

Build all components in production mode:
This is equivalent to:

Individual Component Builds

Main Process

Renderer Process (Angular)

Preload Script

Native Module Build

Build the Rust native modules:
The native modules are located in desktop_native/ and built using N-API.

Platform-Specific Builds

Windows

Standard Build

Build for all Windows architectures (x64, ARM64, ia32):
This combines:
  1. npm run build - Build all TypeScript/Angular code
  2. npm run pack:win - Package with electron-builder
Or for CI environments:

Beta Channel

Uses electron-builder.beta.json configuration.
Windows builds create multiple installer formats: NSIS installer, portable executable, and Microsoft Store package.

macOS

Standard Build (Universal Binary)

Build for both Intel and Apple Silicon:
This creates a universal binary that runs natively on both architectures.

With macOS Autofill Extension

This:
  1. Builds the autofill provider: ./desktop_native/autofill_provider/build.sh
  2. Creates the macOS extension: npm run build:macos-extension:mac
  3. Packages the app: electron-builder --mac --universal

Mac App Store (MAS)

Mac App Store builds require:
  • Valid Apple Developer account
  • Provisioning profiles
  • Proper entitlements configuration
  • Code signing certificates
The MAS build process differs from standard macOS builds due to sandboxing requirements.

Publishing to Mac App Store

This builds the app and uploads it using xcrun altool:

Linux

Standard Build (x64)

This creates:
  • Snap package (with polkit policy)
  • AppImage
  • tar.gz archive
  • Unpacked directory with resources

ARM64 Build

Flatpak

Development flatpak:
Production flatpak:
The Linux build process includes special handling for:
  • Snap packages: Adds polkit policy to meta/polkit/
  • Flatpak: Uses manifest from resources/com.bitwarden.desktop.devel.yaml
  • Desktop files and icons for proper integration

Running the App

Development Mode

Production Mode

This sets:
  • ELECTRON_IS_DEV=0
  • ELECTRON_NO_UPDATER=1
  • Runs from ./build directory

Publishing

Publish builds to distribution servers:
Publishing commands use electron-builder with -p always flag, which uploads to configured publish targets. Ensure proper credentials are configured before running these commands.

Build Configuration

Webpack Configuration

The app uses webpack with three separate configurations:

Environment Variables

  • NODE_ENV: production or development
  • ELECTRON_IS_DEV: 0 or 1
  • ELECTRON_NO_UPDATER: Disable auto-updater
  • BITWARDEN_APPDATA_DIR: Custom app data directory
  • PORTABLE_EXECUTABLE_DIR: Windows portable mode

macOS Extension Build Variants

The macOS autofill extension can be built for different targets:
Each runs ./desktop_native/autofill_provider/build.sh with the appropriate target parameter.

Cleaning Build Artifacts

Removes the ./dist directory containing packaged builds.

Post-Install

After npm install, the app automatically rebuilds native modules:
This ensures native modules are compiled for the correct Electron version.

Testing Builds

Directory Output (No Packaging)

Creates an unpacked build in ./dist without creating installers. Useful for testing.

Distribution Build

Builds and creates unpacked directory (combines build + pack:dir).