# hammadqaiser/esp32-cam-text-and-handwriting-reader architecture

> Architecture diagram of the GitHub repository hammadqaiser/esp32-cam-text-and-handwriting-reader, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hammadqaiser/esp32-cam-text-and-handwriting-reader
- Repository: https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader

## Overview

This repository combines an ESP32 camera/streaming firmware area with a Capacitor text-reader app. The apparent user journey is viewing camera imagery in the app and recognizing text, but the sampled excerpts do not show the JavaScript camera-to-OCR flow, so that connection is left unverified. The graph preserves the camera server, RTSP, camera API, and native OCR capabilities visible in the tree and excerpts. Edges are limited to relationships shown in excerpts or the source index; unsampled wiring is not inferred.

Main entry points: [`esp32-text-app/src/main.js`](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/src/main.js) (Reader app UI), [`Text Recognition/lib/esp32cam-main/src/esp32cam.cpp`](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/esp32cam.cpp) (Camera API), [`Text Recognition/lib/Camera Configuration/app_httpd.cpp`](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/app_httpd.cpp) (Camera HTTP server), [`esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java`](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java) (Android OCR plugin)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_firmware["Camera firmware"]
  node_http_server["Camera HTTP server<br/>[app_httpd.cpp]"]
  node_camera_page["Camera page assets<br/>[camera_index.h]"]
  node_rtsp_session["RTSP session<br/>[CRtspSession.cpp]"]
  node_streamer["Frame streamer<br/>[CStreamer.cpp]"]
  node_jpeg_samples["JPEG samples<br/>[JPEGSamples.cpp]"]
  node_ov2640["OV2640 driver<br/>[OV2640.cpp]"]
  node_firmware_main["Firmware entry<br/>[main.cpp]"]
end

subgraph group_camera_lib["Camera library"]
  node_camera_api["Camera API<br/>[esp32cam.cpp]"]
  node_camera_config["Camera configuration<br/>[config.cpp]"]
  node_frame["Captured frame<br/>[frame.cpp]"]
  node_resolution["Resolution handling<br/>[resolution.cpp]"]
  node_mjpeg["MJPEG control<br/>[mjpeg.cpp]"]
  node_async_web["Async web responses"]
end

subgraph group_mobile_ui["Mobile app"]
  node_app_ui["Reader app UI<br/>[main.js]"]
  node_android_host["Android host<br/>[MainActivity.java]"]
  node_ios_host["iOS host"]
end

subgraph group_native_ocr["Native OCR"]
  node_android_ocr["Android OCR plugin"]
  node_ios_ocr["iOS OCR plugin"]
end

subgraph group_ocr_runtime["OCR runtime"]
  node_tesseract["Tesseract assets<br/>[tesseract-core.js]"]
end

node_user(("App user"))
node_esp32_camera(("ESP32 camera"))
node_mlkit["ML Kit OCR"]

node_rtsp_session -->|"streams frames"| node_streamer
node_http_server -->|"serves assets"| node_camera_page
node_camera_api -->|"uses configuration"| node_camera_config
node_camera_api -->|"captures frames"| node_frame
node_camera_api -->|"supports MJPEG"| node_mjpeg
node_async_web -->|"sends captured frame"| node_frame
node_async_web -->|"controls stream"| node_mjpeg
node_android_host -->|"registers plugin"| node_android_ocr
node_android_ocr -->|"recognizes text"| node_mlkit
node_user -.->|"uses"| node_app_ui
node_app_ui -.->|"requests camera image"| node_http_server
node_app_ui -.->|"may use OCR runtime"| node_tesseract
node_app_ui -.->|"may invoke native OCR"| node_android_ocr
node_esp32_camera -.->|"provides camera service"| node_http_server

click node_http_server "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/app_httpd.cpp"
click node_camera_page "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/camera_index.h"
click node_rtsp_session "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/CRtspSession.cpp"
click node_streamer "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/CStreamer.cpp"
click node_jpeg_samples "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/JPEGSamples.cpp"
click node_ov2640 "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/OV2640.cpp"
click node_firmware_main "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/src/main.cpp"
click node_camera_api "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/esp32cam.cpp"
click node_camera_config "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/config.cpp"
click node_frame "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/frame.cpp"
click node_resolution "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/resolution.cpp"
click node_mjpeg "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/mjpeg.cpp"
click node_async_web "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/esp32cam-asyncweb.h"
click node_app_ui "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/src/main.js"
click node_android_host "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/android/app/src/main/java/com/esp32/textreader/MainActivity.java"
click node_ios_host "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/ios/App/App/SceneDelegate.swift"
click node_android_ocr "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java"
click node_ios_ocr "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/ios/App/App/NativeOcrPlugin.swift"
click node_tesseract "https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/public/tesseract/tesseract-core.js"

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_http_server,node_camera_page,node_rtsp_session,node_streamer,node_jpeg_samples,node_ov2640,node_firmware_main,node_user toneBlue
class node_camera_api,node_camera_config,node_frame,node_resolution,node_mjpeg,node_async_web toneAmber
class node_app_ui,node_android_host,node_ios_host toneMint
class node_android_ocr,node_ios_ocr toneRose
class node_tesseract,node_esp32_camera,node_mlkit toneIndigo
```

## Components

### Camera firmware

- [Camera HTTP server](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/app_httpd.cpp): `Text Recognition/lib/Camera Configuration/app_httpd.cpp`
- [Camera page assets](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/camera_index.h): `Text Recognition/lib/Camera Configuration/camera_index.h`
- [RTSP session](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/CRtspSession.cpp): `Text Recognition/lib/Camera Configuration/CRtspSession.cpp`
- [Frame streamer](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/CStreamer.cpp): `Text Recognition/lib/Camera Configuration/CStreamer.cpp`
- [JPEG samples](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/JPEGSamples.cpp): `Text Recognition/lib/Camera Configuration/JPEGSamples.cpp`
- [OV2640 driver](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/Camera%20Configuration/OV2640.cpp): `Text Recognition/lib/Camera Configuration/OV2640.cpp`
- [Firmware entry](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/src/main.cpp): `Text Recognition/src/main.cpp`

### Camera library

- [Camera API](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/esp32cam.cpp): `Text Recognition/lib/esp32cam-main/src/esp32cam.cpp`
- [Camera configuration](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/config.cpp): `Text Recognition/lib/esp32cam-main/src/internal/config.cpp`
- [Captured frame](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/frame.cpp): `Text Recognition/lib/esp32cam-main/src/internal/frame.cpp`
- [Resolution handling](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/resolution.cpp): `Text Recognition/lib/esp32cam-main/src/internal/resolution.cpp`
- [MJPEG control](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/internal/mjpeg.cpp): `Text Recognition/lib/esp32cam-main/src/internal/mjpeg.cpp`
- [Async web responses](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/Text%20Recognition/lib/esp32cam-main/src/esp32cam-asyncweb.h): `Text Recognition/lib/esp32cam-main/src/esp32cam-asyncweb.h`

### Mobile app

- [Reader app UI](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/src/main.js): `esp32-text-app/src/main.js`
- [Android host](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/android/app/src/main/java/com/esp32/textreader/MainActivity.java): `esp32-text-app/android/app/src/main/java/com/esp32/textreader/MainActivity.java`
- [iOS host](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/ios/App/App/SceneDelegate.swift): `esp32-text-app/ios/App/App/SceneDelegate.swift`

### Native OCR

- [Android OCR plugin](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java): `esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java`
- [iOS OCR plugin](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/ios/App/App/NativeOcrPlugin.swift): `esp32-text-app/ios/App/App/NativeOcrPlugin.swift`

### OCR runtime

- [Tesseract assets](https://github.com/hammadqaiser/esp32-cam-text-and-handwriting-reader/blob/main/esp32-text-app/public/tesseract/tesseract-core.js): `esp32-text-app/public/tesseract/tesseract-core.js`

### Other components

- **App user**
- **ESP32 camera**
- **ML Kit OCR**

## Connections

- RTSP session → Frame streamer: streams frames (evidence: `Text Recognition/lib/Camera Configuration/CRtspSession.cpp`)
- Camera HTTP server → Camera page assets: serves assets (evidence: `Text Recognition/lib/Camera Configuration/app_httpd.cpp`)
- Camera API → Camera configuration: uses configuration (evidence: `Text Recognition/lib/esp32cam-main/src/esp32cam.cpp`)
- Camera API → Captured frame: captures frames
- Camera API → MJPEG control: supports MJPEG
- Async web responses → Captured frame: sends captured frame (evidence: `Text Recognition/lib/esp32cam-main/src/esp32cam-asyncweb.h`)
- Async web responses → MJPEG control: controls stream (evidence: `Text Recognition/lib/esp32cam-main/src/esp32cam-asyncweb.h`)
- Android host → Android OCR plugin: registers plugin (evidence: `esp32-text-app/android/app/src/main/java/com/esp32/textreader/MainActivity.java`)
- Android OCR plugin → ML Kit OCR: recognizes text (evidence: `esp32-text-app/android/app/src/main/java/com/esp32/textreader/NativeOcrPlugin.java`)
- App user → Reader app UI: uses
- Reader app UI → Camera HTTP server: requests camera image
- Reader app UI → Tesseract assets: may use OCR runtime
- Reader app UI → Android OCR plugin: may invoke native OCR
- ESP32 camera → Camera HTTP server: provides camera service
