# ionic-team/capacitor-barcode-scanner architecture

> Architecture diagram of the GitHub repository ionic-team/capacitor-barcode-scanner, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ionic-team/capacitor-barcode-scanner
- Repository: https://github.com/ionic-team/capacitor-barcode-scanner

## Overview

This repository is a Capacitor barcode-scanning plugin with web, Android, and iOS implementations, plus two Ionic demo apps. The demo workflow configures a scan, invokes the plugin, and displays the returned text and format. The plugin normalizes defaults, dispatches to a platform implementation, and returns a scan result. The web and iOS paths are visible in source; Android’s implementation and some helper behavior were not excerpted, so their internal relationships are omitted.

Main entry points: [`plugin/src/index.ts`](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/index.ts) (Plugin facade), [`plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift`](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift) (iOS scanner), [`example-app/src/pages/Home.tsx`](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app/src/pages/Home.tsx) (Scan controls), [`example-app-spm/src/pages/Home.tsx`](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app-spm/src/pages/Home.tsx) (Scan controls)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_demo["Demo apps"]
  node_demo_app["Ionic demo<br/>[App.tsx]"]
  node_demo_scan["Scan controls<br/>[Home.tsx]"]
  node_spm_app["SPM demo<br/>[App.tsx]"]
  node_spm_scan["Scan controls<br/>[Home.tsx]"]
end

subgraph group_api["Plugin API"]
  node_api_entry["Plugin facade<br/>[index.ts]"]
  node_api_types["Options and results<br/>[definitions.ts]"]
  node_api_utils["Web styling helpers<br/>[utils.ts]"]
end

subgraph group_web["Web scanning"]
  node_web_impl["Web scanner<br/>[web.ts]"]
  node_html5["html5-qrcode"]
end

subgraph group_native["Native scanning"]
  node_android_impl["Android scanner<br/>[OSBarcodePlugin.kt]"]
  node_ios_impl["iOS scanner"]
  node_ios_args["Scan argument decoding"]
  node_ios_errors["iOS scan errors"]
  node_osbarcode["OSBarcodeLib"]
end

node_user(("App user"))

node_user -->|"configures and starts"| node_demo_scan
node_demo_scan -->|"calls scanBarcode"| node_api_entry
node_api_entry -->|"returns scan result"| node_demo_scan
node_user -->|"configures and starts"| node_spm_scan
node_spm_scan -->|"calls scanBarcode"| node_api_entry
node_api_entry -->|"returns scan result"| node_spm_scan
node_demo_app -->|"routes to"| node_demo_scan
node_spm_app -->|"routes to"| node_spm_scan
node_api_entry -->|"uses contract"| node_api_types
node_api_entry -->|"applies web styles"| node_api_utils
node_api_entry -->|"loads web implementation"| node_web_impl
node_web_impl -->|"uses scan contract"| node_api_types
node_web_impl -->|"starts camera scanner"| node_html5
node_api_entry -.->|"dispatches native scan"| node_android_impl
node_api_entry -.->|"dispatches native scan"| node_ios_impl
node_ios_impl -.->|"decodes scan options"| node_ios_args
node_ios_impl -->|"maps scan errors"| node_ios_errors
node_ios_impl -->|"invokes scan manager"| node_osbarcode

click node_demo_app "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app/src/App.tsx"
click node_demo_scan "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app/src/pages/Home.tsx"
click node_spm_app "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app-spm/src/App.tsx"
click node_spm_scan "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app-spm/src/pages/Home.tsx"
click node_api_entry "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/index.ts"
click node_api_types "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/definitions.ts"
click node_api_utils "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/utils.ts"
click node_web_impl "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/web.ts"
click node_android_impl "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/android/src/main/java/com/capacitorjs/barcodescanner/OSBarcodePlugin.kt"
click node_ios_impl "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift"
click node_ios_args "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBARCScanParameters%2BDecodable.swift"
click node_ios_errors "https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBarcodeError.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_demo_app,node_demo_scan,node_spm_app,node_spm_scan,node_user toneBlue
class node_api_entry,node_api_types,node_api_utils toneAmber
class node_web_impl,node_html5 toneMint
class node_android_impl,node_ios_impl,node_ios_args,node_ios_errors,node_osbarcode toneRose
```

## Components

### Demo apps

- [Ionic demo](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app/src/App.tsx): `example-app/src/App.tsx`
- [Scan controls](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app/src/pages/Home.tsx): `example-app/src/pages/Home.tsx`
- [SPM demo](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app-spm/src/App.tsx): `example-app-spm/src/App.tsx`
- [Scan controls](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/example-app-spm/src/pages/Home.tsx): `example-app-spm/src/pages/Home.tsx`

### Plugin API

- [Plugin facade](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/index.ts): `plugin/src/index.ts`
- [Options and results](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/definitions.ts): `plugin/src/definitions.ts`
- [Web styling helpers](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/utils.ts): `plugin/src/utils.ts`

### Web scanning

- [Web scanner](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/src/web.ts): `plugin/src/web.ts`
- **html5-qrcode**

### Native scanning

- [Android scanner](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/android/src/main/java/com/capacitorjs/barcodescanner/OSBarcodePlugin.kt): `plugin/android/src/main/java/com/capacitorjs/barcodescanner/OSBarcodePlugin.kt`
- [iOS scanner](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift): `plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift`
- [Scan argument decoding](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBARCScanParameters%2BDecodable.swift): `plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBARCScanParameters+Decodable.swift`
- [iOS scan errors](https://github.com/ionic-team/capacitor-barcode-scanner/blob/main/plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBarcodeError.swift): `plugin/ios/Sources/CapacitorBarcodeScannerPlugin/OSBarcodeError.swift`
- **OSBarcodeLib**

### Other components

- **App user**

## Connections

- App user → Scan controls: configures and starts (evidence: `example-app/src/pages/Home.tsx`)
- Scan controls → Plugin facade: calls scanBarcode (evidence: `example-app/src/pages/Home.tsx`)
- Plugin facade → Scan controls: returns scan result (evidence: `example-app/src/pages/Home.tsx`)
- App user → Scan controls: configures and starts (evidence: `example-app-spm/src/pages/Home.tsx`)
- Scan controls → Plugin facade: calls scanBarcode (evidence: `example-app-spm/src/pages/Home.tsx`)
- Plugin facade → Scan controls: returns scan result (evidence: `example-app-spm/src/pages/Home.tsx`)
- Ionic demo → Scan controls: routes to (evidence: `example-app/src/App.tsx`)
- SPM demo → Scan controls: routes to (evidence: `example-app-spm/src/App.tsx`)
- Plugin facade → Options and results: uses contract (evidence: `plugin/src/index.ts`)
- Plugin facade → Web styling helpers: applies web styles (evidence: `plugin/src/index.ts`)
- Plugin facade → Web scanner: loads web implementation (evidence: `plugin/src/index.ts`)
- Web scanner → Options and results: uses scan contract (evidence: `plugin/src/web.ts`)
- Web scanner → html5-qrcode: starts camera scanner (evidence: `plugin/src/web.ts`)
- Plugin facade → Android scanner: dispatches native scan
- Plugin facade → iOS scanner: dispatches native scan
- iOS scanner → Scan argument decoding: decodes scan options
- iOS scanner → iOS scan errors: maps scan errors (evidence: `plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift`)
- iOS scanner → OSBarcodeLib: invokes scan manager (evidence: `plugin/ios/Sources/CapacitorBarcodeScannerPlugin/CapacitorBarcodeScannerPlugin.swift`)
