Skip to main content

Architecture

The Bitwarden Clients repository is an Nx-powered monorepo that provides a unified development experience across four client applications while maximizing code reuse through shared libraries.

Monorepo structure

The repository follows a clear separation between applications and shared code:

Applications directory

Each application in apps/ is a standalone project with its own build configuration:

Shared libraries

The libs/ directory contains 35+ shared libraries organized by domain:
Platform-agnostic business logic:
  • @bitwarden/common - Core business logic, models, and services
  • @bitwarden/platform - Platform abstractions (storage, crypto, messaging)
  • @bitwarden/vault - Vault management and cipher operations
  • @bitwarden/auth - Authentication and identity
  • @bitwarden/state - State management and persistence

Nx workspace

The repository uses Nx for build orchestration and caching:

Configuration

nx.json

Build targets

Nx automatically discovers and caches build targets:
  • build - Compile TypeScript and bundle applications
  • test - Run Jest unit tests
  • lint - Run ESLint checks

Dependency graph

Nx tracks dependencies between libraries and applications:

TypeScript path mapping

The repository uses TypeScript path aliases to import shared libraries:
tsconfig.base.json

Usage in applications

Application architecture patterns

Browser extension

Architecture: Multi-context extension (service worker, popup, content scripts)
Key abstraction: BrowserApi wraps all browser extension APIs for cross-browser compatibility.

Desktop application

Architecture: Electron multi-process (main + renderer)
Key pattern: IPC communication between main and renderer processes.

Web vault

Architecture: Standard Angular SPA
Key feature: Multi-tenant organization support with role-based permissions.

CLI

Architecture: Node.js command-line application
Key pattern: Structured JSON output for scripting with --response flag.

Dependency injection

All applications use dependency injection for service management:

Service container pattern

Angular services

Angular apps use standard Angular DI:

State management

The repository uses a custom state management system:

Build system

Each application has dedicated build scripts:

Workspace features

npm workspaces

The repository uses npm workspaces for dependency management:
package.json
Benefits:
  • Single node_modules at root
  • Shared dependencies across all packages
  • Faster installs with hoisting

Shared configuration

Common configuration files apply to all apps:
  • tsconfig.base.json - TypeScript settings and path mappings
  • eslint.config.mjs - Code style and quality rules
  • jest.config.js - Test framework configuration
  • .prettierrc.json - Code formatting rules

Commercial features

The bitwarden_license/ directory contains commercial/enterprise features:
These are built separately and merged during production builds.

Next steps

Installation

Set up the repository locally

Building

Build and run applications

Contributing

Learn the development workflow

Requirements

Review system requirements