# toosynxed/comiclang architecture

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

- Interactive diagram: https://gitdiagram.com/toosynxed/comiclang
- Repository: https://github.com/toosynxed/comiclang

## Overview

ComicLang is a macOS on-device manga/comic translator. The main flow is selecting a screen region, capturing it, recognizing text and layout, preparing regions, translating, and displaying horizontal English chips. AppModel owns both one-shot and repeated live refreshes, including pause/resume and settings-driven layout options. The sampled sources support the main service calls and overlay rendering; several AppModel sections and other implementation details were omitted, so no further internal wiring is inferred.

Main entry points: [`ComicLang/AppModel.swift`](https://github.com/toosynxed/comiclang/blob/main/ComicLang/AppModel.swift) (Workflow coordinator), [`ComicLang/UI/MenuBarView.swift`](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/MenuBarView.swift) (Menu and settings), [`ComicLang/ComicLangApp.swift`](https://github.com/toosynxed/comiclang/blob/main/ComicLang/ComicLangApp.swift) (App entry), [`ComicLang/UI/RegionSelector.swift`](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/RegionSelector.swift) (Region selection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interaction["App interaction"]
  node_app["App entry<br/>[ComicLangApp.swift]"]
  node_menu["Menu and settings<br/>[MenuBarView.swift]"]
  node_model["Workflow coordinator<br/>[AppModel.swift]"]
  node_selector["Region selection"]
end

subgraph group_processing["Translation pipeline"]
  node_capture["Screen capture"]
  node_ocr["Text recognition<br/>[OCRService.swift]"]
  node_layout["Region layout<br/>[RegionLayout.swift]"]
  node_bubble["Bubble detection"]
  node_translate["On-device translation"]
  node_models["Translation data models<br/>[Models.swift]"]
end

subgraph group_overlay["Overlay display"]
  node_controller["Overlay controller"]
  node_chips["Translation chips"]
end

subgraph group_platform["Apple frameworks"]
  node_screenkit["ScreenCaptureKit"]
  node_vision["Apple Vision"]
  node_appletranslation["Apple Translation"]
end

node_user(("User"))

node_user -->|"chooses action"| node_menu
node_app -->|"presents"| node_menu
node_app -->|"creates"| node_model
node_menu -->|"starts or configures"| node_model
node_model -->|"requests region"| node_selector
node_selector -->|"returns selection"| node_model
node_model -->|"captures region"| node_capture
node_capture -->|"requests screenshot"| node_screenkit
node_model -->|"recognizes image"| node_ocr
node_ocr -->|"performs recognition"| node_vision
node_model -->|"prepares regions"| node_layout
node_layout -->|"expands to bubble"| node_bubble
node_model -->|"translates text"| node_translate
node_translate -->|"translates on device"| node_appletranslation
node_model -->|"updates overlay"| node_controller
node_controller -->|"renders lines"| node_chips

click node_app "https://github.com/toosynxed/comiclang/blob/main/ComicLang/ComicLangApp.swift"
click node_menu "https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/MenuBarView.swift"
click node_model "https://github.com/toosynxed/comiclang/blob/main/ComicLang/AppModel.swift"
click node_selector "https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/RegionSelector.swift"
click node_capture "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/ScreenCaptureService.swift"
click node_ocr "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/OCRService.swift"
click node_layout "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/RegionLayout.swift"
click node_bubble "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/SpeechBubbleDetector.swift"
click node_translate "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/TranslationService.swift"
click node_models "https://github.com/toosynxed/comiclang/blob/main/ComicLang/Models.swift"
click node_controller "https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/OverlayWindowController.swift"
click node_chips "https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/TranslationChipsView.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_app,node_menu,node_model,node_selector,node_user toneBlue
class node_capture,node_ocr,node_layout,node_bubble,node_translate,node_models toneAmber
class node_controller,node_chips toneMint
class node_screenkit,node_vision,node_appletranslation toneRose
```

## Components

### App interaction

- [App entry](https://github.com/toosynxed/comiclang/blob/main/ComicLang/ComicLangApp.swift): `ComicLang/ComicLangApp.swift`
- [Menu and settings](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/MenuBarView.swift): `ComicLang/UI/MenuBarView.swift`
- [Workflow coordinator](https://github.com/toosynxed/comiclang/blob/main/ComicLang/AppModel.swift): `ComicLang/AppModel.swift`
- [Region selection](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/RegionSelector.swift): `ComicLang/UI/RegionSelector.swift`

### Translation pipeline

- [Screen capture](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/ScreenCaptureService.swift): `ComicLang/Services/ScreenCaptureService.swift`
- [Text recognition](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/OCRService.swift): `ComicLang/Services/OCRService.swift`
- [Region layout](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/RegionLayout.swift): `ComicLang/Services/RegionLayout.swift`
- [Bubble detection](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/SpeechBubbleDetector.swift): `ComicLang/Services/SpeechBubbleDetector.swift`
- [On-device translation](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Services/TranslationService.swift): `ComicLang/Services/TranslationService.swift`
- [Translation data models](https://github.com/toosynxed/comiclang/blob/main/ComicLang/Models.swift): `ComicLang/Models.swift`

### Overlay display

- [Overlay controller](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/OverlayWindowController.swift): `ComicLang/UI/OverlayWindowController.swift`
- [Translation chips](https://github.com/toosynxed/comiclang/blob/main/ComicLang/UI/TranslationChipsView.swift): `ComicLang/UI/TranslationChipsView.swift`

### Apple frameworks

- **ScreenCaptureKit**
- **Apple Vision**
- **Apple Translation**

### Other components

- **User**

## Connections

- User → Menu and settings: chooses action
- App entry → Menu and settings: presents
- App entry → Workflow coordinator: creates
- Menu and settings → Workflow coordinator: starts or configures
- Workflow coordinator → Region selection: requests region
- Region selection → Workflow coordinator: returns selection
- Workflow coordinator → Screen capture: captures region
- Screen capture → ScreenCaptureKit: requests screenshot
- Workflow coordinator → Text recognition: recognizes image
- Text recognition → Apple Vision: performs recognition
- Workflow coordinator → Region layout: prepares regions
- Region layout → Bubble detection: expands to bubble
- Workflow coordinator → On-device translation: translates text
- On-device translation → Apple Translation: translates on device
- Workflow coordinator → Overlay controller: updates overlay
- Overlay controller → Translation chips: renders lines
