1"use strict";(globalThis.webpackChunk_bitwarden_contributing_docs=globalThis.webpackChunk_bitwarden_contributing_docs||[]).push([[1567],{55226(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"getting_started":[{"type":"link","href":"/","label":"Overview","docId":"index","unlisted":false},{"type":"link","href":"/getting-started/tools/","label":"Tools","docId":"getting-started/tools/index","unlisted":false},{"type":"category","label":"Server","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/server/guide","label":"Setup Guide","docId":"getting-started/server/guide","unlisted":false},{"type":"link","href":"/getting-started/server/advanced-setup","label":"Advanced Server Setup","customProps":{"access":"bitwarden"},"docId":"getting-started/server/advanced-setup","unlisted":false},{"type":"category","label":"Databases","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/server/database/mssql/","label":"MSSQL","docId":"getting-started/server/database/mssql/index","unlisted":false},{"type":"link","href":"/getting-started/server/database/ef/","label":"Entity Framework","docId":"getting-started/server/database/ef/index","unlisted":false}]},{"type":"link","href":"/getting-started/server/events","label":"Event Logging","docId":"getting-started/server/events","unlisted":false},{"type":"link","href":"/getting-started/server/tunnel","label":"Ingress Tunnels","customProps":{"access":"bitwarden"},"docId":"getting-started/server/tunnel","unlisted":false},{"type":"link","href":"/getting-started/server/scim","label":"SCIM","customProps":{"access":"bitwarden"},"docId":"getting-started/server/scim","unlisted":false},{"type":"link","href":"/getting-started/server/self-hosted/","label":"Self-Hosted","customProps":{"access":"bitwarden"},"docId":"getting-started/server/self-hosted/index","unlisted":false},{"type":"link","href":"/getting-started/server/portal","label":"System Management Portal","docId":"getting-started/server/portal","unlisted":false},{"type":"link","href":"/getting-started/server/sso/","label":"Single Sign-On (SSO)","customProps":{"access":"bitwarden"},"docId":"getting-started/server/sso/index","unlisted":false},{"type":"link","href":"/getting-started/server/troubleshooting","label":"Troubleshooting","docId":"getting-started/server/troubleshooting","unlisted":false},{"type":"link","href":"/getting-started/server/secrets/","label":"User Secrets","customProps":{"access":"bitwarden"},"docId":"getting-started/server/secrets/index","unlisted":false},{"type":"link","href":"/getting-started/server/public-api","label":"Public API","docId":"getting-started/server/public-api","unlisted":false}]},{"type":"category","label":"Web clients","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Web Vault","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/clients/web-vault/webauthn","label":"WebAuthn","docId":"getting-started/clients/web-vault/webauthn","unlisted":false}],"href":"/getting-started/clients/web-vault/"},{"type":"category","label":"Browser","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/clients/browser/biometric","label":"Biometric Unlock","docId":"getting-started/clients/browser/biometric","unlisted":false},{"type":"link","href":"/getting-started/clients/browser/ff-private","label":"Firefox Private Mode","docId":"getting-started/clients/browser/ff-private","unlisted":false}],"href":"/getting-started/clients/browser/"},{"type":"category","label":"Desktop","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Desktop Native","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/clients/desktop/desktop-native/logging","label":"Logging","docId":"getting-started/clients/desktop/desktop-native/logging","unlisted":false}],"href":"/getting-started/clients/desktop/desktop-native/"},{"type":"link","href":"/getting-started/clients/desktop/mac/","label":"Mac App Store Dev","customProps":{"access":"bitwarden"},"docId":"getting-started/clients/desktop/mac/index","unlisted":false},{"type":"link","href":"/getting-started/clients/desktop/microsoft-store","label":"Microsoft Store","customProps":{"access":"bitwarden"},"docId":"getting-started/clients/desktop/microsoft-store","unlisted":false},{"type":"link","href":"/getting-started/clients/desktop/native-messaging-test-runner","label":"Native Messaging Test Runner","docId":"getting-started/clients/desktop/native-messaging-test-runner","unlisted":false},{"type":"link","href":"/getting-started/clients/desktop/update","label":"Update testing","docId":"getting-started/clients/desktop/update","unlisted":false}],"href":"/getting-started/clients/desktop/"},{"type":"link","href":"/getting-started/clients/cli/","label":"CLI","docId":"getting-started/clients/cli/index","unlisted":false},{"type":"link","href":"/getting-started/clients/debugging","label":"Debugging with VS Code","docId":"getting-started/clients/debugging","unlisted":false},{"type":"link","href":"/getting-started/clients/troubleshooting","label":"Troubleshooting","docId":"getting-started/clients/troubleshooting","unlisted":false}],"href":"/getting-started/clients/"},{"type":"category","label":"Mobile","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Android","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/mobile/android/f-droid/","label":"F-Droid","docId":"getting-started/mobile/android/f-droid/index","unlisted":false}],"href":"/getting-started/mobile/android/"},{"type":"link","href":"/getting-started/mobile/ios/","label":"iOS","docId":"getting-started/mobile/ios/index","unlisted":false}],"href":"/getting-started/mobile/"},{"type":"category","label":"SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/sdk/internal/","label":"Internal SDK","docId":"getting-started/sdk/internal/index","unlisted":false},{"type":"category","label":"Secrets Manager","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Integrations","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/sdk/secrets-manager/integrations/kubernetes","label":"Kubernetes","docId":"getting-started/sdk/secrets-manager/integrations/kubernetes","unlisted":false}]}],"href":"/getting-started/sdk/secrets-manager/"}
1],"href":"/getting-started/sdk/"},{"type":"category","label":"Business apps","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Directory Connector","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/getting-started/business/directory-connector/jumpcloud","label":"JumpCloud","docId":"getting-started/business/directory-connector/jumpcloud","unlisted":false},{"type":"link","href":"/getting-started/business/directory-connector/open-ldap","label":"OpenLDAP Docker server","docId":"getting-started/business/directory-connector/open-ldap","unlisted":false}],"href":"/getting-started/business/directory-connector/"},{"type":"link","href":"/getting-started/business/key-connector","label":"Key Connector","docId":"getting-started/business/key-connector","unlisted":false},{"type":"link","href":"/getting-started/business/splunk-app","label":"Splunk app","docId":"getting-started/business/splunk-app","unlisted":false}]}],"contributing":[{"type":"link","href":"/contributing/","label":"Contributing","docId":"contributing/index","unlisted":false},{"type":"category","label":"Code Style","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/code-style/android-kotlin","label":"Android & Kotlin","docId":"contributing/code-style/android-kotlin","unlisted":false},{"type":"link","href":"/contributing/code-style/csharp","label":"C#","docId":"contributing/code-style/csharp","unlisted":false},{"type":"link","href":"/contributing/code-style/rust","label":"Rust","docId":"contributing/code-style/rust","unlisted":false},{"type":"link","href":"/contributing/code-style/sql","label":"T-SQL","docId":"contributing/code-style/sql","unlisted":false},{"type":"link","href":"/contributing/code-style/swift","label":"Swift","docId":"contributing/code-style/swift","unlisted":false},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/code-style/web/angular-migration-guide","label":"Angular Modernization Guide","docId":"contributing/code-style/web/angular-migration-guide","unlisted":false},{"type":"link","href":"/contributing/code-style/web/angular","label":"Angular","docId":"contributing/code-style/web/angular","unlisted":false},{"type":"link","href":"/contributing/code-style/web/html","label":"HTML","docId":"contributing/code-style/web/html","unlisted":false},{"type":"link","href":"/contributing/code-style/web/tailwind","label":"Tailwind","docId":"contributing/code-style/web/tailwind","unlisted":false},{"type":"link","href":"/contributing/code-style/web/typescript","label":"TypeScript","docId":"contributing/code-style/web/typescript","unlisted":false}],"href":"/contributing/code-style/web/"}],"href":"/contributing/code-style/"},{"type":"category","label":"Database Migrations","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/database-migrations/mssql","label":"MSSQL","docId":"contributing/database-migrations/mssql","unlisted":false},{"type":"link","href":"/contributing/database-migrations/ef","label":"Entity Framework","docId":"contributing/database-migrations/ef","unlisted":false},{"type":"link","href":"/contributing/database-migrations/edd","label":"Evolutionary database design","docId":"contributing/database-migrations/edd","unlisted":false}]},{"type":"category","label":"Documentation","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/documentation/component-documentation","label":"Component documentation","docId":"contributing/documentation/component-documentation","unlisted":false},{"type":"link","href":"/contributing/documentation/diagrams","label":"Diagram standard","docId":"contributing/documentation/diagrams","unlisted":false},{"type":"link","href":"/contributing/documentation/reverse-routing-table","label":"Reverse routing table","docId":"contributing/documentation/reverse-routing-table","unlisted":false},{"type":"link","href":"/contributing/documentation/runbook-template","label":"Runbook template","customProps":{"access":"bitwarden"},"docId":"contributing/documentation/runbook-template","unlisted":false}],"href":"/contributing/documentation/"},{"type":"link","href":"/contributing/commit-signing","label":"Commit signing","docId":"contributing/commit-signing","unlisted":false},{"type":"category","label":"Pull Requests","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/pull-requests/branching","label":"Branching","customProps":{"access":"bitwarden"},"docId":"contributing/pull-requests/branching","unlisted":false},{"type":"link","href":"/contributing/pull-requests/code-review","label":"Code Review","customProps":{"access":"bitwarden"},"docId":"contributing/pull-requests/code-review","unlisted":false},{"type":"link","href":"/contributing/pull-requests/chromatic","label":"UI Review - Chromatic","customProps":{"access":"bitwarden"},"docId":"contributing/pull-requests/chromatic","unlisted":false},{"type":"link","href":"/contributing/pull-requests/community-pr-process","label":"Contribution Review Process","customProps":{"access":"community"},"docId":"contributing/pull-requests/community-pr-process","unlisted":false}],"href":"/contributing/pull-requests/"},{"type":"link","href":"/contributing/accessibility/","label":"Accessibility","docId":"contributing/accessibility/accessibility","unlisted":false},{"type":"category","label":"AI","collapsible":true,"collapsed":true,"customProps":{"access":"bitwarden"},"items":[{"type":"link","href":"/contributing/ai/component-placement","label":"Component placement","customProps":{"access":"bitwarden"},"docId":"contributing/ai/component-placement","unlisted":false}],"href":"/contributing/ai/"},{"type":"link","href":"/contributing/dependencies/","label":"Dependency Management","customProps":{"access":"bitwarden"},"docId":"contributing/dependencies/index","unlisted":false},{"type":"link","href":"/contributing/feature-flags","label":"Feature Flags","customProps":{"access":"bitwarden"},"docId":"contributing/feature-flags","unlisted":false},{"type":"category","label":"Logging","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/logging/rust","label":"Rust","docId":"contributing/logging/rust","unlisted":false}],"href":"/contributing/logging/"},{"type":"link","href":"/contributing/template-repository","label":"Template Repository","customProps":{"access":"bitwarden"},"docId":"contributing/template-repository","unlisted":false},{"type":"category","label":"Testing","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/testing/database/","label":"Database Integration Testing","docId":"contributing/testing/database/index","unlisted":false},{"type":"link","href":"/contributing/testing/load","label":"Load Tests","customProps":{"access":"bitwarden"},"docId":"contributing/testing/load","unlisted":false},{"type":"category","label":"Unit Tests","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/contributing/testing/unit/naming-conventions","label":"\u200bNaming Conventions","docId":"contributing/testing/unit/naming-conventions","unlisted":false},{"type":"link","href":"/contributing/testing/unit/structure","label":"Test Structure","docId":"contributing/testing/unit/structure","unlisted":false}]}]},{"type":"link","href":"/contributing/user-secrets","label":"Modifying User Secrets","docId":"contributing/user-secrets","unlisted":false}],"architecture":[{"type":"link","href":"/architecture/","label":"Architecture","docId":"architecture/index","unlisted":false},{"type":"category","label":"ADRs","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/adr/reactive-forms","label":"0001 - Angular Reactive Forms","docId":"architecture/adr/reactive-forms","unlisted":false},{"type":"link","href":"/architecture/adr/public-module-npm-packages","label":"0002 - Public API for modules","docId":"architecture/adr/public-module-npm-packages","unlisted":false},{"type":"link","href":"/architecture/adr/observable-data-services","label":"0003 - Adopt Observable Data Services for Angular","docId":"architecture/adr/observable-data-services","unlisted":false},{"type":"link","href":"/architecture/adr/refactor-state-service","label":"0004 - Refactor State Service","docId":"architecture/adr/refactor-state-service","unlisted":false},{"type":"link","href":"/architecture/adr/refactor-api-service","label":"0005 - Refactor Api Service","docId":"architecture/adr/refactor-api-service","unlisted":false},{"type":"link","href":"/architecture/adr/clients-use-jest-mocks","label":"0006 - Clients: Use Jest Mocks","docId":"architecture/adr/clients-use-jest-mocks","unlisted":false},{"type":"link","href":"/architecture/adr/manifest-v3-browser-memory-caching","label":"0007 - Manifest V3 sync Observables","docId":"architecture/adr/manifest-v3-browser-memory-caching","unlisted":false},{"type":"link","href":"/architecture/adr/server-CQRS-pattern","label":"0008 - Server: Adopt CQS","docId":"architecture/adr/server-CQRS-pattern","unlisted":false},{"type":"link","href":"/architecture/adr/angular-composition-over-inheritance","label":"0009 - Composition over inheritance","docId":"architecture/adr/angular-composition-over-inheritance","unlisted":false},{"type":"link","href":"/architecture/adr/angular-ngmodules","label":"0010 - Angular Modules","docId":"architecture/adr/angular-ngmodules","unlisted":false},{"type":"link","href":"/architecture/adr/angular-folder-structure","label":"0011 - Angular folder structure","docId":"architecture/adr/angular-folder-structure","unlisted":false},{"type":"link","href":"/architecture/adr/angular-filename-convention","label":"0012 - Angular filename convention","docId":"architecture/adr/angular-filename-convention","unlisted":false},{"type":"link","href":"/architecture/adr/deprecate-global-request-response-models","label":"0013 - Deprecate global request/response models","docId":"architecture/adr/deprecate-global-request-response-models","unlisted":false},{"type":"link","href":"/architecture/adr/typescript-strict","label":"0014 - Adopt Typescript Strict flag","docId":"architecture/adr/typescript-strict","unlisted":false},{"type":"link","href":"/architecture/adr/short-lived-browser-services","label":"0015 - Short Lived Browser Services","docId":"architecture/adr/short-lived-browser-services","unlisted":false},{"type":"link","href":"/architecture/adr/decryption-in-views","label":"0016 - Move Decryption and Encryption to Views","docId":"architecture/adr/decryption-in-views","unlisted":false},{"type":"link","href":"/architecture/adr/watchOS-use-swift","label":"0017 - Use Swift to build watchOS app","docId":"architecture/adr/watchOS-use-swift","unlisted":false},{"type":"link","href":"/architecture/adr/feature-management","label":"0018 - Feature management","docId":"architecture/adr/feature-management","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-web-push","label":"0019 - Adoption of Web Push","docId":"architecture/adr/adopt-web-push","unlisted":false},{"type":"link","href":"/architecture/adr/observability-with-opentelemetry","label":"0020
1- Observability with OpenTelemetry","docId":"architecture/adr/observability-with-opentelemetry","unlisted":false},{"type":"link","href":"/architecture/adr/standard-output-logging","label":"0021 - Logging to Standard Output","docId":"architecture/adr/standard-output-logging","unlisted":false},{"type":"link","href":"/architecture/adr/server-authorization","label":"0022 - Authorization","docId":"architecture/adr/server-authorization","unlisted":false},{"type":"link","href":"/architecture/adr/integration-identifiers","label":"0023 - Identifying Integrated Clients","docId":"architecture/adr/integration-identifiers","unlisted":false},{"type":"link","href":"/architecture/adr/csharp-nullable-reference-types","label":"0024 - Adopt .NET Nullable Reference Types","docId":"architecture/adr/csharp-nullable-reference-types","unlisted":false},{"type":"link","href":"/architecture/adr/ts-deprecate-enums","label":"0025 - Deprecate TypeScript Enum Types","docId":"architecture/adr/ts-deprecate-enums","unlisted":false},{"type":"link","href":"/architecture/adr/dotnet-dependency-injection-enhancements","label":"0026 - Adopt TryAdd Dependency Injection Overloads","docId":"architecture/adr/dotnet-dependency-injection-enhancements","unlisted":false},{"type":"link","href":"/architecture/adr/angular-i18n-migration","label":"0027 - Improved Localization","docId":"architecture/adr/angular-i18n-migration","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-fusion-cache","label":"0028 - Adopt FusionCache","docId":"architecture/adr/adopt-fusion-cache","unlisted":false},{"type":"link","href":"/architecture/adr/angular-signals","label":"0029 - Adopt Angular Signals for Component State","docId":"architecture/adr/angular-signals","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-pnpm","label":"0030 - Adopt pnpm as the JavaScript package manager","docId":"architecture/adr/adopt-pnpm","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-minimal-apis","label":"0031 - Adopt Minimal APIs","docId":"architecture/adr/adopt-minimal-apis","unlisted":false},{"type":"link","href":"/architecture/adr/break-up-core","label":"0032 - Break up the Core project","docId":"architecture/adr/break-up-core","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-mermaid-diagram-standard","label":"0033 - Adopt Mermaid diagram standard","docId":"architecture/adr/adopt-mermaid-diagram-standard","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-engineering-documentation-standard","label":"0034 - Adopt engineering documentation standard","docId":"architecture/adr/adopt-engineering-documentation-standard","unlisted":false},{"type":"link","href":"/architecture/adr/service-oriented-architecture","label":"0035 - Service-oriented architecture","docId":"architecture/adr/service-oriented-architecture","unlisted":false},{"type":"link","href":"/architecture/adr/service-to-service-api-standards","label":"0036 - Service-to-service API standards","docId":"architecture/adr/service-to-service-api-standards","unlisted":false},{"type":"link","href":"/architecture/adr/ratchet-restricted-dependencies","label":"0037 - Ratchet restricted dependencies","docId":"architecture/adr/ratchet-restricted-dependencies","unlisted":false},{"type":"link","href":"/architecture/adr/adopt-ai-component-taxonomy","label":"0038 - Adopt a placement taxonomy for AI components","docId":"architecture/adr/adopt-ai-component-taxonomy","unlisted":false}],"href":"/architecture/adr/"},{"type":"category","label":"Mobile Clients Architecture","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/mobile-clients/android/","label":"Android","docId":"architecture/mobile-clients/android/index","unlisted":false},{"type":"category","label":"iOS","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/mobile-clients/ios/push-notification-troubleshooting","label":"Push Notification Troubleshooting Tips","docId":"architecture/mobile-clients/ios/push-notification-troubleshooting","unlisted":false}],"href":"/architecture/mobile-clients/ios/"}]},{"type":"category","label":"SDK Architecture","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/sdk/adding-functionality","label":"Adding new functionality","docId":"architecture/sdk/adding-functionality","unlisted":false},{"type":"link","href":"/architecture/sdk/crate-structure","label":"Crate structure","docId":"architecture/sdk/crate-structure","unlisted":false},{"type":"link","href":"/architecture/sdk/client-patterns","label":"Client patterns","docId":"architecture/sdk/client-patterns","unlisted":false},{"type":"link","href":"/architecture/sdk/data-models","label":"Data models","docId":"architecture/sdk/data-models","unlisted":false},{"type":"link","href":"/architecture/sdk/language-bindings","label":"Language bindings","docId":"architecture/sdk/language-bindings","unlisted":false},{"type":"link","href":"/architecture/sdk/dependencies","label":"Dependencies","docId":"architecture/sdk/dependencies","unlisted":false},{"type":"link","href":"/architecture/sdk/versioning","label":"Versioning and breaking changes","docId":"architecture/sdk/versioning","unlisted":false},{"type":"link","href":"/architecture/sdk/secrets-manager","label":"Secrets Manager SDK","docId":"architecture/sdk/secrets-manager","unlisted":false},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/sdk/web/interoperability","label":"Interoperability","docId":"architecture/sdk/web/interoperability","unlisted":false}],"href":"/architecture/sdk/web/"}],"href":"/architecture/sdk/"},{"type":"category","label":"Web Clients Architecture","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/clients/overview","label":"Overview","docId":"architecture/clients/overview","unlisted":false},{"type":"link","href":"/architecture/clients/data-model","label":"Data Model","docId":"architecture/clients/data-model","unlisted":false},{"type":"category","label":"Presentation","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/clients/presentation/angular","label":"Angular","docId":"architecture/clients/presentation/angular","unlisted":false},{"type":"link","href":"/architecture/clients/presentation/cli","label":"CLI","docId":"architecture/clients/presentation/cli","unlisted":false}]},{"type":"link","href":"/architecture/clients/dependency-injection","label":"Dependency Injection","docId":"architecture/clients/dependency-injection","unlisted":false},{"type":"category","label":"Services","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/clients/services/vision","label":"Vision","docId":"architecture/clients/services/vision","unlisted":false},{"type":"link","href":"/architecture/clients/services/implementation","label":"Implementation","docId":"architecture/clients/services/implementation","unlisted":false}]}],"href":"/architecture/clients/"},{"type":"category","label":"Server Architecture","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/server/command-query-separation","label":"Command Query Separation (CQS)","docId":"architecture/server/command-query-separation","unlisted":false},{"type":"link","href":"/architecture/server/model-separation-of-concerns","label":"Model separation of concerns","docId":"architecture/server/model-separation-of-concerns","unlisted":false}],"href":"/architecture/server/"},{"type":"category","label":"Cryptography","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/cryptography/crypto-guide","label":"Cryptography Guide","docId":"architecture/cryptography/crypto-guide","unlisted":false}],"href":"/architecture/cryptography/"},{"type":"category","label":"Deep Dives","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Authentication","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/authentication/two-factor-auth","label":"Two-Factor Authentication","docId":"architecture/deep-dives/authentication/two-factor-auth","unlisted":false}],"href":"/architecture/deep-dives/authentication/"},{"type":"link","href":"/architecture/deep-dives/authorization","label":"Authorization","docId":"architecture/deep-dives/authorization","unlisted":false},{"type":"category","label":"Browser Autofill","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/autofill/collecting-page-details","label":"Collecting Page Details","docId":"architecture/deep-dives/autofill/collecting-page-details","unlisted":false},{"type":"link","href":"/architecture/deep-dives/autofill/generating-fill-scripts","label":"Generating and Executing Fill Scripts","docId":"architecture/deep-dives/autofill/generating-fill-scripts","unlisted":false},{"type":"link","href":"/architecture/deep-dives/autofill/form-submission-detection","label":"Form Submission Detection","docId":"architecture/deep-dives/autofill/form-submission-detection","unlisted":false},{"type":"link","href":"/architecture/deep-dives/autofill/shadow-dom","label":"Shadow DOM","docId":"architecture/deep-dives/autofill/shadow-dom","unlisted":false},{"type":"link","href":"/architecture/deep-dives/autofill/autofill-menu","label":"Inline Autofill Menu","docId":"architecture/deep-dives/autofill/autofill-menu","unlisted":false}],"href":"/architecture/deep-dives/autofill/"},{"type":"link","href":"/architecture/deep-dives/database-replicas","label":"Read-Only Database Replicas","docId":"architecture/deep-dives/database-replicas","unlisted":false},{"type":"link","href":"/architecture/deep-dives/event-logs/","label":"Event Logs","docId":"architecture/deep-dives/event-logs/index","unlisted":false},{"type":"link","href":"/architecture/deep-dives/ipc","label":"Inter-Process Communication (IPC)","docId":"architecture/deep-dives/ipc","unlisted":false},{"type":"link","href":"/architecture/deep-dives/lock-states","label":"Lock states","docId":"architecture/deep-dives/lock-states","unlisted":false},{"type":"link","href":"/architecture/deep-dives/memory-hardening","label":"Memory Hardening","docId":"architecture/deep-dives/memory-hardening","unlisted":false},{"type":"category","label":"FIDO2 and Passkeys","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/passkeys/credentials","label":"Credentials","docId":"architecture/deep-dives/passkeys/credentials","unlisted":false},{"type":"link","href":"/architecture/deep-dives/passkeys/operations","label":"Operations","docId":"architecture/deep-dives/passkeys/operations","unlisted":false},{"type":"link","href":"/architecture/deep-dives/passkeys/naming-convention","label":"Naming convention","docId":"architecture/deep-dives/passkeys/naming-convention","unlisted":false},{"type":"category","label":"Implementations","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Provider","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/passkeys/implementations/provider/browser-extension","label":"Browser extension","docId":"architecture/deep-dives/passkeys/implementations/provider/browser-extension","unlisted":false}],"href":"/architecture/deep-dives/passkeys/implementations/provider/"},{"type":"category","label":"Relying Party","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/passkeys/implementations/relying-party/prf","label":"Passkeys for decryption","docId":"architecture/deep-dives/passkeys/implementations/relying-party/prf","unlisted":false}],"href":"/architecture/deep-dives/passkeys/implementations/relying-party/"}],"href":"/architecture/deep-dives/passkeys/implementations/"},{"type":"link","href":"/architecture/deep-dives/passkeys/glossary","label":"Glossary","docId":"architecture/deep-dives/passkeys/glossary","unlisted":false}],"href":"/architecture/deep-dives/passkeys/"},{"type":"category","label":"Push Notifications","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/deep-dives/push-notifications/mobile","label":"Mobile Push Notifications","docId":"architecture/deep-dives/push-notifications/mobile","unlisted":false},{"type":"link","href":"/architecture/deep-dives/push-notifications/non-mobile","label":"Other Client Push Notifications","docId":"architecture/deep-dives/push-notifications/non-mobile","unlisted":false}],"href":"/architecture/deep-dives/push-notifications/"}],"href":"/architecture/deep-dives/"},{"type":"category","label":"Security","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/security/definitions","label":"Definitions","docId":"architecture/security/definitions","unlisted":false},{"type":"category","label":"Principles","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/architecture/security/principles/servers-are-zero-knowledge","label":"P01 - Servers are zero knowledge","docId":"architecture/security/principles/servers-are-zero-knowledge","unlisted":false},{"type":"link","href":"/architecture/security/principles/locked-vault-is-secure","label":"P02 - A locked vault is secure","docId":"architecture/security/principles/locked-vault-is-secure","unlisted":false},{"type":"link","href":"/architecture/security/principles/limited-security-on-semi-compromised","label":"P03 - Limited security for vaults on
1semi-compromised devices","docId":"architecture/security/principles/limited-security-on-semi-compromised","unlisted":false},{"type":"link","href":"/architecture/security/principles/no-security-on-fully-compromised","label":"P04 - No security on fully compromised systems","docId":"architecture/security/principles/no-security-on-fully-compromised","unlisted":false},{"type":"link","href":"/architecture/security/principles/controlled-access","label":"P05 - Controlled access to vault data","docId":"architecture/security/principles/controlled-access","unlisted":false},{"type":"link","href":"/architecture/security/principles/minimized-impact-of-security-breaches","label":"P06 - Minimized impact of security breaches","docId":"architecture/security/principles/minimized-impact-of-security-breaches","unlisted":false}],"href":"/architecture/security/principles/"},{"type":"link","href":"/architecture/security/requirements","label":"Requirements","docId":"architecture/security/requirements","unlisted":false}],"href":"/architecture/security/"}]},"docs":{"architecture/adr/adopt-ai-component-taxonomy":{"id":"architecture/adr/adopt-ai-component-taxonomy","title":"0038 - Adopt a placement taxonomy for AI components","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-engineering-documentation-standard":{"id":"architecture/adr/adopt-engineering-documentation-standard","title":"0034 - Adopt engineering documentation standard","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-fusion-cache":{"id":"architecture/adr/adopt-fusion-cache","title":"0028 - Adopt FusionCache","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-mermaid-diagram-standard":{"id":"architecture/adr/adopt-mermaid-diagram-standard","title":"0033 - Adopt Mermaid diagram standard","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-minimal-apis":{"id":"architecture/adr/adopt-minimal-apis","title":"0031 - Adopt Minimal APIs","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-pnpm":{"id":"architecture/adr/adopt-pnpm","title":"0030 - Adopt pnpm as the JavaScript package manager","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/adopt-web-push":{"id":"architecture/adr/adopt-web-push","title":"0019 - Adoption of Web Push","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/angular-composition-over-inheritance":{"id":"architecture/adr/angular-composition-over-inheritance","title":"0009 - Composition over inheritance","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/angular-filename-convention":{"id":"architecture/adr/angular-filename-convention","title":"0012 - Angular filename convention","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/angular-folder-structure":{"id":"architecture/adr/angular-folder-structure","title":"0011 - Angular folder structure","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/angular-i18n-migration":{"id":"architecture/adr/angular-i18n-migration","title":"0027 - Improved Localization","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/angular-ngmodules":{"id":"architecture/adr/angular-ngmodules","title":"0010 - Angular Modules","description":"Deprecated as of 2025-11-25: Angular has stabilized Standalone Components and has deprecated","sidebar":"architecture"},"architecture/adr/angular-signals":{"id":"architecture/adr/angular-signals","title":"0029 - Adopt Angular Signals for Component State","description":"Context and Problem Statement","sidebar":"architecture"},"architecture/adr/break-up-core":{"id":"architecture/adr/break-up-core","title":"0032 - Break up the Core project","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/clients-use-jest-mocks":{"id":"architecture/adr/clients-use-jest-mocks","title":"0006 - Clients: Use Jest Mocks","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/csharp-nullable-reference-types":{"id":"architecture/adr/csharp-nullable-reference-types","title":"0024 - Adopt .NET Nullable Reference Types","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/decryption-in-views":{"id":"architecture/adr/decryption-in-views","title":"0016 - Move Decryption and Encryption to Views","description":"Deprecated as of 2025-11-25: Encryption and decryption logic has moved into the SDK.","sidebar":"architecture"},"architecture/adr/deprecate-global-request-response-models":{"id":"architecture/adr/deprecate-global-request-response-models","title":"0013 - Deprecate global request/response models","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/dotnet-dependency-injection-enhancements":{"id":"architecture/adr/dotnet-dependency-injection-enhancements","title":"0026 - Adopt TryAdd Dependency Injection Overloads","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/feature-management":{"id":"architecture/adr/feature-management","title":"0018 - Feature management","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/index":{"id":"architecture/adr/index","title":"ADRs","description":"An Architectural Decision (AD) is a software design choice that addresses a functional or","sidebar":"architecture"},"architecture/adr/integration-identifiers":{"id":"architecture/adr/integration-identifiers","title":"0023 - Identifying Integrated Clients","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/manifest-v3-browser-memory-caching":{"id":"architecture/adr/manifest-v3-browser-memory-caching","title":"0007 - Manifest V3 sync Observables","de
1scription":"Context and problem statement","sidebar":"architecture"},"architecture/adr/observability-with-opentelemetry":{"id":"architecture/adr/observability-with-opentelemetry","title":"0020 - Observability with OpenTelemetry","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/observable-data-services":{"id":"architecture/adr/observable-data-services","title":"0003 - Adopt Observable Data Services for Angular","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/public-module-npm-packages":{"id":"architecture/adr/public-module-npm-packages","title":"0002 - Public API for modules","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/ratchet-restricted-dependencies":{"id":"architecture/adr/ratchet-restricted-dependencies","title":"0037 - Ratchet restricted dependencies","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/reactive-forms":{"id":"architecture/adr/reactive-forms","title":"0001 - Angular Reactive Forms","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/refactor-api-service":{"id":"architecture/adr/refactor-api-service","title":"0005 - Refactor Api Service","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/refactor-state-service":{"id":"architecture/adr/refactor-state-service","title":"0004 - Refactor State Service","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/server-authorization":{"id":"architecture/adr/server-authorization","title":"0022 - Authorization","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/server-CQRS-pattern":{"id":"architecture/adr/server-CQRS-pattern","title":"0008 - Server: Adopt CQS","description":"This ADR originally used \\"CQRS\\" (Command Query Responsibility Segregation) terminology. However, our","sidebar":"architecture"},"architecture/adr/service-oriented-architecture":{"id":"architecture/adr/service-oriented-architecture","title":"0035 - Service-oriented architecture","description":"Notation","sidebar":"architecture"},"architecture/adr/service-to-service-api-standards":{"id":"architecture/adr/service-to-service-api-standards","title":"0036 - Service-to-service API standards","description":"Notation","sidebar":"architecture"},"architecture/adr/short-lived-browser-services":{"id":"architecture/adr/short-lived-browser-services","title":"0015 - Short Lived Browser Services","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/standard-output-logging":{"id":"architecture/adr/standard-output-logging","title":"0021 - Logging to Standard Output","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/ts-deprecate-enums":{"id":"architecture/adr/ts-deprecate-enums","title":"0025 - Deprecate TypeScript Enum Types","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/typescript-strict":{"id":"architecture/adr/typescript-strict","title":"0014 - Adopt Typescript Strict flag","description":"Context and problem statement","sidebar":"architecture"},"architecture/adr/watchOS-use-swift":{"id":"architecture/adr/watchOS-use-swift","title":"0017 - Use Swift to build watchOS app","description":"Context and problem statement","sidebar":"architecture"},"architecture/clients/data-model":{"id":"architecture/clients/data-model","title":"Data Model","description":"This document describes the internal data model used by the different client applications. We use","sidebar":"architecture"},"architecture/clients/dependency-injection":{"id":"architecture/clients/dependency-injection","title":"Dependency Injection","description":"Dependency injection (DI) in our Typescript clients is manually configured across several locations.","sidebar":"architecture"},"architecture/clients/index":{"id":"architecture/clients/index","title":"Web Clients Architecture","description":"The Web based clients, henceforth referenced simply as clients, are the Web Vault, _Browser","sidebar":"architecture"},"architecture/clients/overview":{"id":"architecture/clients/overview","title":"Overview","description":"The Applications are structured using a layered architecture. The layers are:","sidebar":"architecture"},"architecture/clients/presentation/angular":{"id":"architecture/clients/presentation/angular","title":"Angular","description":"See the Angular Code Style Guide for more","sidebar":"architecture"},"architecture/clients/presentation/cli":{"id":"architecture/clients/presentation/cli","title":"CLI","de
1scription":"The CLI has a slightly different architecture than the other clients, which matches it\'s nature. CLI","sidebar":"architecture"},"architecture/clients/services/implementation":{"id":"architecture/clients/services/implementation","title":"Implementation","description":"We have defined our vision for the Bitwarden client-side services. The implementation","sidebar":"architecture"},"architecture/clients/services/vision":{"id":"architecture/clients/services/vision","title":"Vision","description":"Definitions of Terms","sidebar":"architecture"},"architecture/cryptography/crypto-guide":{"id":"architecture/cryptography/crypto-guide","title":"How to use Cryptography in Bitwarden","description":"A guide on using cryptographic APIs within Bitwarden, targeted at non-cryptography software engineers.","sidebar":"architecture"},"architecture/cryptography/index":{"id":"architecture/cryptography/index","title":"Cryptography","description":"The cryptography section contains a high level guide for teams wanting to use cryptography to build","sidebar":"architecture"},"architecture/deep-dives/authentication/index":{"id":"architecture/deep-dives/authentication/index","title":"Authentication","description":"Client login strategies","sidebar":"architecture"},"architecture/deep-dives/authentication/two-factor-auth":{"id":"architecture/deep-dives/authentication/two-factor-auth","title":"Two-Factor Authentication","description":"When a user account requires two-factor authentication (2FA), the normal Bitwarden authentication","sidebar":"architecture"},"architecture/deep-dives/authorization":{"id":"architecture/deep-dives/authorization","title":"Authorization","description":"Authorization logic decides whether a user is permitted to carry out an action.","sidebar":"architecture"},"architecture/deep-dives/autofill/autofill-menu":{"id":"architecture/deep-dives/autofill/autofill-menu","title":"Inline Autofill Menu","description":"The Inline Autofill Menu allows users to access and autofill credentials from their Bitwarden vault","sidebar":"architecture"},"architecture/deep-dives/autofill/collecting-page-details":{"id":"architecture/deep-dives/autofill/collecting-page-details","title":"Collecting Page Details","description":"The first step in the Autofill process is to collect what are referred to as the \\"Page Details\\" in","sidebar":"architecture"},"architecture/deep-dives/autofill/form-submission-detection":{"id":"architecture/deep-dives/autofill/form-submission-detection","title":"Form Submission Detection","description":"Why is Form submission detection important?","sidebar":"architecture"},"architecture/deep-dives/autofill/generating-fill-scripts":{"id":"architecture/deep-dives/autofill/generating-fill-scripts","title":"Generating and Executing Fill Scripts","description":"This documentation assumes you have an understanding of","sidebar":"architecture"},"architecture/deep-dives/autofill/index":{"id":"architecture/deep-dives/autofill/index","title":"Browser Autofill","description":"Core concepts","sidebar":"architecture"},"architecture/deep-dives/autofill/shadow-dom":{"id":"architecture/deep-dives/autofill/shadow-dom","title":"Shadow DOM","description":"Introduction","sidebar":"architecture"},"architecture/deep-dives/database-replicas":{"id":"architecture/deep-dives/database-replicas","title":"Read-Only Database Replicas","description":"Context","sidebar":"architecture"},"architecture/deep-dives/event-logs/index":{"id":"architecture/deep-dives/event-logs/index","title":"Event Logs","description":"Bitwarden event logs are used for Teams and Enterprise organizations to capture timestamped records","sidebar":"architecture"},"architecture/deep-dives/index":{"id":"architecture/deep-dives/index","title":"Deep Dives","description":"Deep dives covers interesting segments of the Bitwarden products. And serves as a good reference","sidebar":"architecture"},"architecture/deep-dives/ipc":{"id":"architecture/deep-dives/ipc","title":"Inter-Process Communication (IPC)","description":"Bitwarden uses IPC to allow communication between and within certain parts of our clients. Examples","sidebar":"architecture"},"architecture/deep-dives/lock-states":{"id":"architecture/deep-dives/lock-states","title":"Lock states","de
1scription":"A Bitwarden client moves between several distinct states over its lifetime, and which secrets are","sidebar":"architecture"},"architecture/deep-dives/memory-hardening":{"id":"architecture/deep-dives/memory-hardening","title":"Memory Hardening","description":"While protecting against user-space memory attacks in the general case is not within the threat","sidebar":"architecture"},"architecture/deep-dives/passkeys/credentials":{"id":"architecture/deep-dives/passkeys/credentials","title":"Credentials","description":"What is a credential?","sidebar":"architecture"},"architecture/deep-dives/passkeys/glossary":{"id":"architecture/deep-dives/passkeys/glossary","title":"Glossary","description":"This page contains some definitions of terms used throughout the passkey documentation. For a more","sidebar":"architecture"},"architecture/deep-dives/passkeys/implementations/index":{"id":"architecture/deep-dives/passkeys/implementations/index","title":"Implementations","description":"Bitwarden uses passkeys to provide users with a secure and convenient alternative to passwords. In","sidebar":"architecture"},"architecture/deep-dives/passkeys/implementations/provider/browser-extension":{"id":"architecture/deep-dives/passkeys/implementations/provider/browser-extension","title":"Browser extension","description":"Bitwarden supports passkeys in all browser by implementing the WebAuthn API. The browser does not","sidebar":"architecture"},"architecture/deep-dives/passkeys/implementations/provider/index":{"id":"architecture/deep-dives/passkeys/implementations/provider/index","title":"Provider","description":"Bitwarden can act as a Passkey Provider to generate and store passkeys for other applications.","sidebar":"architecture"},"architecture/deep-dives/passkeys/implementations/relying-party/index":{"id":"architecture/deep-dives/passkeys/implementations/relying-party/index","title":"Relying Party","description":"Bitwarden can act as a Relying Party (RP) for passkeys. This means that you can log in to Bitwarden","sidebar":"architecture"},"architecture/deep-dives/passkeys/implementations/relying-party/prf":{"id":"architecture/deep-dives/passkeys/implementations/relying-party/prf","title":"Passkeys for decryption","description":"When a user logs into their Bitwarden vault, two related but distinct operations take place -","sidebar":"architecture"},"architecture/deep-dives/passkeys/index":{"id":"architecture/deep-dives/passkeys/index","title":"FIDO2 and Passkeys","description":"For more information on how Bitwarden implements FIDO2, see Implementations.","sidebar":"architecture"},"architecture/deep-dives/passkeys/naming-convention":{"id":"architecture/deep-dives/passkeys/naming-convention","title":"Naming convention","description":"Since Bitwarden will both store passkeys in users\' vaults and support login with passkeys, it is","sidebar":"architecture"},"architecture/deep-dives/passkeys/operations":{"id":"architecture/deep-dives/passkeys/operations","title":"Operations","description":"This document provides an overview of two main operations performed through the WebAuthn API:","sidebar":"architecture"},"architecture/deep-dives/push-notifications/index":{"id":"architecture/deep-dives/push-notifications/index","title":"Push Notifications","description":"Bitwarden uses push notifications to communicate in real-time from the Bitwarden server to its","sidebar":"architecture"},"architecture/deep-dives/push-notifications/mobile":{"id":"architecture/deep-dives/push-notifications/mobile","title":"Mobile Push Notifications","description":"Overview","sidebar":"architecture"},"architecture/deep-dives/push-notifications/non-mobile":{"id":"architecture/deep-dives/push-notifications/non-mobile","title":"Other Client Push Notifications","description":"For non-mobile clients, push notifications are handled with","sidebar":"architecture"},"architecture/index":{"id":"architecture/index","title":"Architecture","description":"In this section we will cover the high level architecture of Bitwarden, how it is structured,","sidebar":"architecture"},"architecture/mobile-clients/android/index":{"id":"architecture/mobile-clients/android/index","title":"Android","de
1scription":"Overview","sidebar":"architecture"},"architecture/mobile-clients/ios/index":{"id":"architecture/mobile-clients/ios/index","title":"iOS","description":"Overview","sidebar":"architecture"},"architecture/mobile-clients/ios/push-notification-troubleshooting":{"id":"architecture/mobile-clients/ios/push-notification-troubleshooting","title":"Push Notification Troubleshooting Tips","description":"Overview","sidebar":"architecture"},"architecture/sdk/adding-functionality":{"id":"architecture/sdk/adding-functionality","title":"Adding new functionality","description":"This guide walks through the steps for adding new functionality to the SDK. For guidance on whether","sidebar":"architecture"},"architecture/sdk/client-patterns":{"id":"architecture/sdk/client-patterns","title":"Client patterns","description":"Clients group the SDK API surface into domain-specific bundles. For a step-by-step walkthrough of","sidebar":"architecture"},"architecture/sdk/crate-structure":{"id":"architecture/sdk/crate-structure","title":"Crate structure","description":"The internal SDK is organized as a mono-repository containing multiple Rust crates, each with a","sidebar":"architecture"},"architecture/sdk/data-models":{"id":"architecture/sdk/data-models","title":"Data models","description":"The SDK is expected to be used in a variety of projects, and to that end it defines a stable public","sidebar":"architecture"},"architecture/sdk/dependencies":{"id":"architecture/sdk/dependencies","title":"Dependencies","description":"The SDK is structured as several standalone crates. Each crate can have their own dependencies and","sidebar":"architecture"},"architecture/sdk/index":{"id":"architecture/sdk/index","title":"SDK Architecture","description":"The Bitwarden SDK is designed for internal use within Bitwarden and provides shared functionality","sidebar":"architecture"},"architecture/sdk/language-bindings":{"id":"architecture/sdk/language-bindings","title":"Language bindings","de
1scription":"The internal SDK supports mobile and web platforms and uses UniFFI and wasm-bindgen to generate","sidebar":"architecture"},"architecture/sdk/secrets-manager":{"id":"architecture/sdk/secrets-manager","title":"Secrets Manager SDK","description":"The Secrets Manager SDK encompasses a sub-set of the","sidebar":"architecture"},"architecture/sdk/versioning":{"id":"architecture/sdk/versioning","title":"Versioning and breaking changes","description":"The SDK strives towards maintaining backward compatibility for a reasonable time. This ensures that","sidebar":"architecture"},"architecture/sdk/web/index":{"id":"architecture/sdk/web/index","title":"Web","description":"The Password Manager SDK supports web-based clients, allowing developers to integrate core password","sidebar":"architecture"},"architecture/sdk/web/interoperability":{"id":"architecture/sdk/web/interoperability","title":"Interoperability","description":"When working with the SDK, one of the key challenges is managing Rust/JavaScript bindings to enable","sidebar":"architecture"},"architecture/security/definitions":{"id":"architecture/security/definitions","title":"Definitions","description":"As a security product features can often be tweaked or adjusted in the name of \\"security\\". This is a","sidebar":"architecture"},"architecture/security/index":{"id":"architecture/security/index","title":"Security","description":"Outlines the foundational approach Bitwarden takes to ensure the safety and integrity of user data.","sidebar":"architecture"},"architecture/security/principles/controlled-access":{"id":"architecture/security/principles/controlled-access","title":"P05 - Controlled access to vault data","description":"Clients must ensure that vault data, whether at rest or in use, is accessible only to authorized","sidebar":"architecture"},"architecture/security/principles/index":{"id":"architecture/security/principles/index","title":"Security principles","description":"Audience: Bitwarden engineers and AI agents building or reviewing behavior that touches vault","sidebar":"architecture"},"architecture/security/principles/limited-security-on-semi-compromised":{"id":"architecture/security/principles/limited-security-on-semi-compromised","title":"P03 - Limited security for vaults on semi-compromised devices","description":"This principle applies only to unlocked vaults. Refer to P02 for details","sidebar":"architecture"},"architecture/security/principles/locked-vault-is-secure":{"id":"architecture/security/principles/locked-vault-is-secure","title":"P02 - A locked vault is secure","description":"Clients must ensure that highly sensitive vault data cannot be accessed in plain text once the vault","sidebar":"architecture"},"architecture/security/principles/minimized-impact-of-security-breaches":{"id":"architecture/security/principles/minimized-impact-of-security-breaches","title":"P06 - Minimized impact of security breaches","description":"Even with robust security measures in place, user error or unforeseen vulnerabilities can lead to","sidebar":"architecture"},"architecture/security/principles/no-security-on-fully-compromised":{"id":"architecture/security/principles/no-security-on-fully-compromised","title":"P04 - No security on fully compromised systems","description":"This principle applies only to unlocked vaults. Refer to P02 for details","sidebar":"architecture"},"architecture/security/principles/servers-are-zero-knowledge":{"id":"architecture/security/principles/servers-are-zero-knowledge","title":"P01 - Servers are zero knowledge","description":"There is no possibility for an attacker or Bitwarden employee to access your unencrypted data by","sidebar":"architecture"},"architecture/security/requirements":{"id":"architecture/security/requirements","title":"Requirements","description":"The requirements in this section are organized hierarchically, with top-level requirements defining","sidebar":"architecture"},"architecture/server/command-query-separation":{"id":"architecture/server/command-query-separation","title":"Command Query Separation (CQS)","description":"Our server architecture uses the C
1ommand Query Separation (CQS) pattern.","sidebar":"architecture"},"architecture/server/index":{"id":"architecture/server/index","title":"Server Architecture","description":"The Bitwarden server follows architectural patterns and conventions designed to maintain clean,","sidebar":"architecture"},"architecture/server/model-separation-of-concerns":{"id":"architecture/server/model-separation-of-concerns","title":"Model separation of concerns","description":"To maintain clean architecture and separation of concerns, API contracts (request/response","sidebar":"architecture"},"contributing/accessibility/accessibility":{"id":"contributing/accessibility/accessibility","title":"Accessibility","description":"Bitwarden strives to comply with WCAG AA requirements.","sidebar":"contributing"},"contributing/ai/component-placement":{"id":"contributing/ai/component-placement","title":"Component placement","description":"Every AI component, whether a skill, agent, command, hook, or prompt, lives in exactly one place. A","sidebar":"contributing"},"contributing/ai/index":{"id":"contributing/ai/index","title":"AI","description":"Background","sidebar":"contributing"},"contributing/code-style/android-kotlin":{"id":"contributing/code-style/android-kotlin","title":"Android & Kotlin","description":"The following outlines the general code style and best practices for Android development. It is","sidebar":"contributing"},"contributing/code-style/csharp":{"id":"contributing/code-style/csharp","title":"C#","description":"35;","sidebar":"contributing"},"contributing/code-style/index":{"id":"contributing/code-style/index","title":"Code Style","description":"This section contains general Code Style guidelines for the Bitwarden codebase. It is recommended to","sidebar":"contributing"},"contributing/code-style/rust":{"id":"contributing/code-style/rust","title":"Rust","description":"We use rustfmt to format our code. This tool is part of the Rust toolchain and will format your","sidebar":"contributing"},"contributing/code-style/sql":{"id":"contributing/code-style/sql","title":"T-SQL","description":"Overview","sidebar":"contributing"},"contributing/code-style/swift":{"id":"contributing/code-style/swift","title":"Swift","description":"We use both SwiftLint and","sidebar":"contributing"},"contributing/code-style/web/angular":{"id":"contributing/code-style/web/angular","title":"Angular","description":"At Bitwarden we use Angular as our client side framework. It\'s recommended to have a basic","sidebar":"contributing"},"contributing/code-style/web/angular-migration-guide":{"id":"contributing/code-style/web/angular-migration-guide","title":"Angular Modernization Guide","description":"Bitwarden desires to update our Angular codebase to leverage modern Angular best practices,","sidebar":"contributing"},"contributing/code-style/web/html":{"id":"contributing/code-style/web/html","title":"HTML","description":"Please ensure each input field and button has a descriptive ID. This will allow QA to more","sidebar":"contributing"},"contributing/code-style/web/index":{"id":"contributing/code-style/web/index","title":"Web","description":"This section covers code style specific to web technologies. While it\'s primarily aimed at the","sidebar":"contributing"},"contributing/code-style/web/tailwind":{"id":"contributing/code-style/web/tailwind","title":"Tailwind","description":"Before starting working with Tailwind we recommend that you get familiar with","sidebar":"contributing"},"contributing/code-style/web/typescript":{"id":"contributing/code-style/web/typescript","title":"TypeScript","description":"We use Prettier and ESLint to automatically format","sidebar":"contributing"},"contributing/commit-signing":{"id":"contributing/commit-signing","title":"Commit signing","description":"It\'s possible to configure git with any name and email, enabling bad actors to spoof commits and","sidebar":"contributing"},"contributing/database-migrations/edd":{"id":"contributing/database-migrations/edd","title":"Evolutionary database design","description":"At Bitwarden we follow Evolutionary Database Design (EDD). EDD describes a process where","sidebar":"contributing"},"contributing/database-migrations/ef":{"id":"contributing/database-migrations/ef","title":"Entity Framework","description":"For instructions on how to apply database migrations, please refer to the","sidebar":"contributing"},"contributing/database-migrations/mssql":{"id":"contributing/database-migrations/mssql","title":"MSSQL","description":"For instructions on how to apply database migrations, please refer to the","sidebar":"contributing"},"contributing/dependencies/index":{"id":"contributing/dependencies/index","title":"Dependency Management","description":"Bitwarden uses Renovate for automating dependency updates. Renovate","sidebar":"contributing"},"contributing/documentation/component-documentation":{"id":"contributing/documentation/component-documentation","title":"Component documentation","description":"Audience: Bitwarden engineers and AI agents writing or consuming in-repo documentation.","sidebar":"contributing"},"contributing/documentation/diagrams":{"id":"contributing/documentation/diagrams","title":"Diagram standard","description":"Audience: Bitwarden engineers, contributors, and AI agents authoring or reading diagrams","sidebar":"contributing"},"contributing/documentation/index":{"id":"contributing/documentation/index","title":"Documentation standard","description":"Audience: Bitwarden engineers who write and maintain technical documentation, and AI agents that","sidebar":"contributing"},"contributing/documentation/reverse-routing-table":{"id":"contributing/documentation/reverse-routing-table","t
1itle":"Reverse routing table","description":"Audience: Bitwarden engineers and AI agents deciding where a document belongs.","sidebar":"contributing"},"contributing/documentation/runbook-template":{"id":"contributing/documentation/runbook-template","title":"Runbook template","description":"Audience: Bitwarden engineers authoring or executing runbooks.","sidebar":"contributing"},"contributing/feature-flags":{"id":"contributing/feature-flags","title":"Feature Flags","description":"Background","sidebar":"contributing"},"contributing/index":{"id":"contributing/index","title":"Contributing","description":"How to contribute","sidebar":"contributing"},"contributing/logging/index":{"id":"contributing/logging/index","title":"Logging","description":"The guidance in this page is programming language agnostic. The language sub-pages provide specifics","sidebar":"contributing"},"contributing/logging/rust":{"id":"contributing/logging/rust","title":"Rust","description":"We have standardized on the tracing crate. It\'s worth","sidebar":"contributing"},"contributing/pull-requests/branching":{"id":"contributing/pull-requests/branching","title":"Branching","description":"Naming convention","sidebar":"contributing"},"contributing/pull-requests/chromatic":{"id":"contributing/pull-requests/chromatic","title":"UI Review - Chromatic","description":"We use a tool called Chromatic to run automated snapshot tests for all Storybook","sidebar":"contributing"},"contributing/pull-requests/code-review":{"id":"contributing/pull-requests/code-review","title":"Code Review","description":"At Bitwarden, we encourage everyone to participate in code reviews. A team will focus primarily on","sidebar":"contributing"},"contributing/pull-requests/community-pr-process":{"id":"contributing/pull-requests/community-pr-process","title":"Contribution Review Process","description":"Congratulations! You\'ve submitted a pull request for changes to the Bitwarden codebase.","sidebar":"contributing"},"contributing/pull-requests/index":{"id":"contributing/pull-requests/index","title":"Pull Requests","description":"This page focuses on authoring and addressing feedback on Pull Requests. For details and","sidebar":"contributing"},"contributing/template-repository":{"id":"contributing/template-repository","title":"Template Repository","description":"Location and usage","sidebar":"contributing"},"contributing/testing/database/index":{"id":"contributing/testing/database/index","title":"Database Integration Testing","description":"Since Bitwarden has multiple database options, automated testing is extremely important to avoid","sidebar":"contributing"},"contributing/testing/load":{"id":"contributing/testing/load","title":"Load Tests","description":"Load tests are available as k6 scripts for executing locally or in the cloud,","sidebar":"contributing"},"contributing/testing/unit/naming-conventions":{"id":"contributing/testing/unit/naming-conventions","title":"\u200bNaming Conventions","description":"This section currently only covers client tests written in Typescript. It is not intended to be used","sidebar":"contributing"},"contributing/testing/unit/structure":{"id":"contributing/testing/unit/structure","title":"Test Structure","description":"This section is still a work in progress.","sidebar":"contributing"},"contributing/user-secrets":{"id":"contributing/user-secrets","title":"Modifying User Secrets","description":"Manually editing user secrets","sidebar":"contributing"},"getting-started/business/directory-connector/index":{"id":"getting-started/business/directory-connector/index","title":"Directory Connector","description":"The Bitwarden Directory Connector is a desktop application used to sync your Bitwarden enterprise","sidebar":"getting_started"},"getting-started/business/directory-connector/jumpcloud":{"id":"getting-started/business/directory-connector/jumpcloud","title":"JumpCloud","description":"JumpCloud provides an LDAP-as-a-service with a free tier that you can use","sidebar":"getting_started"},"getting-started/business/directory-connector/open-ldap":{"id":"getting-started/business/directory-connector/open-ldap","title":"OpenLDAP Docker server","description":"This method uses an OpenLDAP Docker image to run a","sidebar":"getting_started"},"getting-started/business/key-connector":{"id":"getting-started/business/key-connector","title":"Key Connector","description":"If you\'re new to Key Connector, you should read the Help Center documentation first to","sidebar":"getting_started"},"getting-started/business/splunk-app":{"id":"getting-started/business/splunk-app","title":"Splunk app","description":"The Bitwarden Splunk app fetches event log data from the Bitwarden Public API and makes it available","sidebar":"getting_started"},"getting-started/clients/browser/biometric":{"id":"getting-started/clients/browser/biometric","title":"Biometric Unlock","description":"Currently, Biometric unlock is supported on Mobile, Desktop, and Browser","sidebar":"getting_started"},"getting-started/clients/browser/ff-private":{"id":"getting-started/clients/browser/ff-private","title":"Firefox Private Mode","description":"You cannot run add-ons in Firefox Private Mode using the normal side-loading technique. This is","
1sidebar":"getting_started"},"getting-started/clients/browser/index":{"id":"getting-started/clients/browser/index","title":"Browser","description":"Requirements","sidebar":"getting_started"},"getting-started/clients/cli/index":{"id":"getting-started/clients/cli/index","title":"CLI","description":"If you\u2019re not familiar with the CLI client, the Bitwarden Help Center has lots of","sidebar":"getting_started"},"getting-started/clients/debugging":{"id":"getting-started/clients/debugging","title":"Debugging with VS Code","description":"The clients repository ships VS Code launch configurations in its .vscode folder, so you can","sidebar":"getting_started"},"getting-started/clients/desktop/desktop-native/index":{"id":"getting-started/clients/desktop/desktop-native/index","title":"Desktop Native","description":"Desktop Native (DN) is a Rust project that represents all of the native operating system logic used","sidebar":"getting_started"},"getting-started/clients/desktop/desktop-native/logging":{"id":"getting-started/clients/desktop/desktop-native/logging","title":"Logging","description":"This page is an extension of the global and Rust-specific logging guidelines in","sidebar":"getting_started"},"getting-started/clients/desktop/index":{"id":"getting-started/clients/desktop/index","title":"Desktop","description":"Requirements","sidebar":"getting_started"},"getting-started/clients/desktop/mac/index":{"id":"getting-started/clients/desktop/mac/index","title":"Mac App Store Dev","description":"The Mac App Store (MAS) Dev build is only required to test certain features that are exclusive to","sidebar":"getting_started"}
1,"getting-started/clients/desktop/microsoft-store":{"id":"getting-started/clients/desktop/microsoft-store","title":"Microsoft Store","description":"To debug the Microsoft Store application you need to generate a Code Signing certificate which can","sidebar":"getting_started"},"getting-started/clients/desktop/native-messaging-test-runner":{"id":"getting-started/clients/desktop/native-messaging-test-runner","title":"Native Messaging Test Runner","description":"The Native Messaging Test Runner is a Node application for testing the Native Messaging","sidebar":"getting_started"},"getting-started/clients/desktop/update":{"id":"getting-started/clients/desktop/update","title":"Update testing","description":"Sometimes it might be necessary to test the update flow of the desktop application. This document","sidebar":"getting_started"},"getting-started/clients/index":{"id":"getting-started/clients/index","title":"Web clients","description":"This section contains development information for each of the Bitwarden Typescript client","sidebar":"getting_started"},"getting-started/clients/troubleshooting":{"id":"getting-started/clients/troubleshooting","title":"Troubleshooting","description":"Build errors / npm dependency errors","sidebar":"getting_started"},"getting-started/clients/web-vault/index":{"id":"getting-started/clients/web-vault/index","title":"Web Vault","description":"Requirements","sidebar":"getting_started"},"getting-started/clients/web-vault/webauthn":{"id":"getting-started/clients/web-vault/webauthn","title":"WebAuthn","description":"This page contains additional setup instructions if you need to test WebAuthn authentication","sidebar":"getting_started"},"getting-started/mobile/android/f-droid/index":{"id":"getting-started/mobile/android/f-droid/index","title":"F-Droid","description":"Overview","sidebar":"getting_started"},"getting-started/mobile/android/index":{"id":"getting-started/mobile/android/index","title":"Android","description":"Requirements","sidebar":"getting_started"},"getting-started/mobile/index":{"id":"getting-started/mobile/index","title":"Mobile","description":"Android development","sidebar":"getting_started"},"getting-started/mobile/ios/index":{"id":"getting-started/mobile/ios/index","title":"iOS","description":"Requirements","sidebar":"getting_started"},"getting-started/sdk/index":{"id":"getting-started/sdk/index","title":"SDK","description":"Bitwarden provides a public Software Development Kit (SDK) for Secrets Manager and an internal","sidebar":"getting_started"},"getting-started/sdk/internal/index":{"id":"getting-started/sdk/internal/index","title":"Internal SDK","description":"Bitwarden clients rely on a core SDK, built in Rust, for shared functionality between our","sidebar":"getting_started"},"getting-started/sdk/secrets-manager/index":{"id":"getting-started/sdk/secrets-manager/index","title":"Secrets Manager","description":"This section contains development information for the Bitwarden Secrets Manager CLI, language","sidebar":"getting_started"},"getting-started/sdk/secrets-manager/integrations/kubernetes":{"id":"getting-started/sdk/secrets-manager/integrations/kubernetes","title":"Kubernetes","description":"The Bitwarden Secrets Manager Kubernetes Operator (sm-operator) is a tool for teams to integrate","sidebar":"getting_started"},"getting-started/server/advanced-setup":{"id":"getting-started/server/advanced-setup","title":"Advanced Server Setup","description":"Once you have your server up and running, there may be some additional configuration required to","sidebar":"getting_started"},"getting-started/server/database/ef/index":{"id":"getting-started/server/database/ef/index","title":"Entity Framework","description":"Entity Framework support is still in beta and is not suitable for production databases.","sidebar":"getting_started"},"getting-started/server/database/mssql/index":{"id":"getting-started/server/database/mssql/index","title":"MSSQL","description":"Bitwarden primarily stores data in MSSQL (Microsoft SQL Server). The data access layer in the Server","sidebar":"getting_started"},"getting-started/server/events":{"id":"getting-started/server/events","title":"Event Logging","description":"Requirements","sidebar":"getting_started"},"getting-started/server/guide":{"id":"getting-started/server/guide","title":"Setup Guide","description":"This page will show you how to set up a local Bitwarden server for development purposes.","sidebar":"getting_started"},"getting-started/server/portal":{"id":"getting-started/server/portal","title":"System Management Portal","description":"This documentation refers to the deployment of the Admin application in our server repository.","sidebar":"getting_started"},"getting-started/server/public-api":{"id":"getting-started/server/public-api","title":"Public API","description":"The Bitwarden Public API provides organizations a suite of tools for managing members, collections,","sidebar":"getting_started"},"getting-started/server/scim":{"id":"getting-started/server/scim","title":"SCIM","description":"SCIM stands for System for Cross-domain Identity Management, and uses a direct link between the","sidebar":"getting_started"},"getting-started/server/secrets/index":{"id":"getting-started/server/secrets/index","title":"User Secrets","description":"The server repository comes with it\u2019s own dev/secrets.json file for community contributors.","sidebar":"getting_started"},"getting-started/server/self-hosted/index":{"id":"getting-started/server/self-hosted/index","title":"Self-Hosted Guide","description":"This page is only relevant to you if you need to test self-hosted features. It is not required","sidebar":"getting_started"},"getting-started/server/sso/index":{"id":"getting-started/server/sso/index","title":"Single Sign-On (SSO)","description":"Setup and configuration","sidebar":"getting_started"}
1,"getting-started/server/troubleshooting":{"id":"getting-started/server/troubleshooting","title":"Troubleshooting","description":"macOS","sidebar":"getting_started"},"getting-started/server/tunnel":{"id":"getting-started/server/tunnel","title":"Ingress Tunnels","description":"Sometimes it can be beneficial to allow other team members access to your locally running Bitwarden","sidebar":"getting_started"},"getting-started/tools/index":{"id":"getting-started/tools/index","title":"Tools","description":"The tooling recommendations and instructions in this documentation assume that you\u2019re using macOS.","sidebar":"getting_started"},"index":{"id":"index","title":"Overview","description":"Welcome!","sidebar":"getting_started"}}}}')}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.