# dikaardnt/ada-lah-pokoknya architecture

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

- Interactive diagram: https://gitdiagram.com/dikaardnt/ada-lah-pokoknya
- Repository: https://github.com/dikaardnt/ada-lah-pokoknya

## Overview

ocrdoc is a CLI application for converting scanned images into reconstructed Markdown and selectable-text DOCX/PDF. The principal workflow is CLI → pipeline: scan and order images, optionally preprocess them, perform local or hosted vision OCR, reconstruct page Markdown with configured skills, assemble pages, then export with optional watermarks. The pipeline also tracks stage state for resume behavior. The README documents capabilities beyond the sampled excerpts; those branches are included where the tree supports them, while uncertain internal wiring is omitted.

Main entry points: [`src/ocr_reconstructor/pipeline.py`](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/pipeline.py) (Pipeline coordinator), [`src/ocr_reconstructor/ai/registry.py`](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/registry.py) (Provider registry), [`src/ocr_reconstructor/cli.py`](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/cli.py) (Command interface), [`src/ocr_reconstructor/imaging/scanner.py`](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/scanner.py) (Image scanner)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Entry and orchestration"]
  node_cli["Command interface<br/>[cli.py]"]
  node_pipeline["Pipeline coordinator<br/>[pipeline.py]"]
end

subgraph group_image_ocr["Image and OCR"]
  node_scanner["Image scanner<br/>[scanner.py]"]
  node_ordering["Image ordering<br/>[ordering.py]"]
  node_preprocessing["Image preprocessing<br/>[preprocessing.py]"]
  node_ocr_factory["OCR engine factory<br/>[factory.py]"]
  node_paddle["PaddleOCR engine<br/>[paddleocr.py]"]
  node_vision["Vision OCR engine<br/>[vision.py]"]
end

subgraph group_ai_skills["AI and skills"]
  node_reconstruction["Reconstruction service<br/>[reconstruction.py]"]
  node_provider_registry["Provider registry<br/>[registry.py]"]
  node_openai_provider["OpenAI provider<br/>[openai.py]"]
  node_compatible_provider["Compatible provider"]
  node_passthrough["Passthrough provider<br/>[passthrough.py]"]
  node_skill_registry["Skill registry<br/>[registry.py]"]
  node_skill_loader["Skill loader<br/>[loader.py]"]
end

subgraph group_documents["Document output"]
  node_assembler["Document assembler<br/>[assembler.py]"]
  node_markdown["Markdown handling<br/>[markdown.py]"]
  node_docx_export["DOCX export<br/>[docx.py]"]
  node_pdf_export["PDF export<br/>[pdf.py]"]
  node_watermark["Watermark rendering<br/>[watermark.py]"]
end

subgraph group_state["Configuration and state"]
  node_config["App configuration<br/>[config.py]"]
  node_manifest[("Run manifest<br/>[manifest.py]")]
end

node_user(("CLI user"))
node_input_images["Scanned images"]
node_paddle_service{{"PaddleOCR runtime"}}
node_ai_service{{"AI endpoint"}}
node_workspace[("Workspace artifacts")]

node_user -->|"runs commands"| node_cli
node_cli -->|"loads settings"| node_config
node_cli -->|"starts stages"| node_pipeline
node_pipeline -->|"scans input"| node_scanner
node_scanner -->|"reads images"| node_input_images
node_scanner -->|"orders paths"| node_ordering
node_pipeline -.->|"optionally preprocesses"| node_preprocessing
node_pipeline -->|"creates engine"| node_ocr_factory
node_ocr_factory -->|"selects engine"| node_paddle
node_ocr_factory -->|"selects engine"| node_vision
node_paddle -->|"runs recognition"| node_paddle_service
node_pipeline -->|"reconstructs pages"| node_reconstruction
node_pipeline -->|"creates provider"| node_provider_registry
node_provider_registry -->|"selects provider"| node_openai_provider
node_provider_registry -->|"selects provider"| node_compatible_provider
node_provider_registry -->|"selects provider"| node_passthrough
node_reconstruction -->|"sends completion"| node_ai_service
node_openai_provider -->|"sends request"| node_ai_service
node_compatible_provider -->|"sends request"| node_ai_service
node_pipeline -->|"resolves skills"| node_skill_registry
node_skill_registry -->|"loads skill"| node_skill_loader
node_pipeline -->|"assembles pages"| node_assembler
node_assembler -->|"parses Markdown"| node_markdown
node_pipeline -->|"exports DOCX"| node_docx_export
node_pipeline -->|"exports PDF"| node_pdf_export
node_docx_export -->|"renders Markdown"| node_markdown
node_pdf_export -->|"renders Markdown"| node_markdown
node_docx_export -.->|"adds watermark"| node_watermark
node_pdf_export -.->|"adds watermark"| node_watermark
node_pipeline -->|"tracks stage state"| node_manifest
node_pipeline -->|"reads and writes artifacts"| node_workspace

click node_cli "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/cli.py"
click node_pipeline "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/pipeline.py"
click node_scanner "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/scanner.py"
click node_ordering "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/ordering.py"
click node_preprocessing "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/preprocessing.py"
click node_ocr_factory "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/factory.py"
click node_paddle "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/paddleocr.py"
click node_vision "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/vision.py"
click node_reconstruction "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/reconstruction.py"
click node_provider_registry "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/registry.py"
click node_openai_provider "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/openai.py"
click node_compatible_provider "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/openai_compatible.py"
click node_passthrough "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/passthrough.py"
click node_skill_registry "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/skills/registry.py"
click node_skill_loader "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/skills/loader.py"
click node_assembler "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/assembler.py"
click node_markdown "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/markdown.py"
click node_docx_export "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/docx.py"
click node_pdf_export "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/pdf.py"
click node_watermark "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/watermark.py"
click node_config "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/config.py"
click node_manifest "https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/core/manifest.py"

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_cli,node_pipeline,node_user toneBlue
class node_scanner,node_ordering,node_preprocessing,node_ocr_factory,node_paddle,node_vision,node_workspace toneAmber
class node_reconstruction,node_provider_registry,node_openai_provider,node_compatible_provider,node_passthrough,node_skill_registry,node_skill_loader toneMint
class node_assembler,node_markdown,node_docx_export,node_pdf_export,node_watermark toneRose
class node_config,node_manifest,node_input_images,node_paddle_service,node_ai_service toneIndigo
```

## Components

### Entry and orchestration

- [Command interface](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/cli.py): `src/ocr_reconstructor/cli.py`
- [Pipeline coordinator](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/pipeline.py): `src/ocr_reconstructor/pipeline.py`

### Image and OCR

- [Image scanner](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/scanner.py): `src/ocr_reconstructor/imaging/scanner.py`
- [Image ordering](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/ordering.py): `src/ocr_reconstructor/imaging/ordering.py`
- [Image preprocessing](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/imaging/preprocessing.py): `src/ocr_reconstructor/imaging/preprocessing.py`
- [OCR engine factory](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/factory.py): `src/ocr_reconstructor/ocr/factory.py`
- [PaddleOCR engine](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/paddleocr.py): `src/ocr_reconstructor/ocr/paddleocr.py`
- [Vision OCR engine](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ocr/vision.py): `src/ocr_reconstructor/ocr/vision.py`

### AI and skills

- [Reconstruction service](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/reconstruction.py): `src/ocr_reconstructor/ai/reconstruction.py`
- [Provider registry](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/registry.py): `src/ocr_reconstructor/ai/registry.py`
- [OpenAI provider](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/openai.py): `src/ocr_reconstructor/ai/providers/openai.py`
- [Compatible provider](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/openai_compatible.py): `src/ocr_reconstructor/ai/providers/openai_compatible.py`
- [Passthrough provider](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/ai/providers/passthrough.py): `src/ocr_reconstructor/ai/providers/passthrough.py`
- [Skill registry](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/skills/registry.py): `src/ocr_reconstructor/skills/registry.py`
- [Skill loader](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/skills/loader.py): `src/ocr_reconstructor/skills/loader.py`

### Document output

- [Document assembler](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/assembler.py): `src/ocr_reconstructor/documents/assembler.py`
- [Markdown handling](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/markdown.py): `src/ocr_reconstructor/documents/markdown.py`
- [DOCX export](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/docx.py): `src/ocr_reconstructor/documents/docx.py`
- [PDF export](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/pdf.py): `src/ocr_reconstructor/documents/pdf.py`
- [Watermark rendering](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/documents/watermark.py): `src/ocr_reconstructor/documents/watermark.py`

### Configuration and state

- [App configuration](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/config.py): `src/ocr_reconstructor/config.py`
- [Run manifest](https://github.com/dikaardnt/ada-lah-pokoknya/blob/master/src/ocr_reconstructor/core/manifest.py): `src/ocr_reconstructor/core/manifest.py`

### Other components

- **CLI user**
- **Scanned images**
- **PaddleOCR runtime**
- **AI endpoint**
- **Workspace artifacts**

## Connections

- CLI user → Command interface: runs commands
- Command interface → App configuration: loads settings
- Command interface → Pipeline coordinator: starts stages
- Pipeline coordinator → Image scanner: scans input
- Image scanner → Scanned images: reads images
- Image scanner → Image ordering: orders paths
- Pipeline coordinator → Image preprocessing: optionally preprocesses
- Pipeline coordinator → OCR engine factory: creates engine
- OCR engine factory → PaddleOCR engine: selects engine
- OCR engine factory → Vision OCR engine: selects engine
- PaddleOCR engine → PaddleOCR runtime: runs recognition
- Pipeline coordinator → Reconstruction service: reconstructs pages
- Pipeline coordinator → Provider registry: creates provider
- Provider registry → OpenAI provider: selects provider
- Provider registry → Compatible provider: selects provider
- Provider registry → Passthrough provider: selects provider
- Reconstruction service → AI endpoint: sends completion
- OpenAI provider → AI endpoint: sends request
- Compatible provider → AI endpoint: sends request
- Pipeline coordinator → Skill registry: resolves skills
- Skill registry → Skill loader: loads skill
- Pipeline coordinator → Document assembler: assembles pages
- Document assembler → Markdown handling: parses Markdown
- Pipeline coordinator → DOCX export: exports DOCX
- Pipeline coordinator → PDF export: exports PDF
- DOCX export → Markdown handling: renders Markdown
- PDF export → Markdown handling: renders Markdown
- DOCX export → Watermark rendering: adds watermark
- PDF export → Watermark rendering: adds watermark
- Pipeline coordinator → Run manifest: tracks stage state
- Pipeline coordinator → Workspace artifacts: reads and writes artifacts
