# ibnnuus/pdf-compressor-cli architecture

> Architecture diagram of the GitHub repository ibnnuus/pdf-compressor-cli, 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/ibnnuus/pdf-compressor-cli
- Repository: https://github.com/ibnnuus/pdf-compressor-cli

## Overview

Mursal PDF Compressor offers two user-facing paths: CLI single/batch jobs and a Flask web application with uploads, downloads, accounts, subscriptions, and administration. Both center on PDF compression, with preset-driven validation, Ghostscript processing, structural optimization, and output reporting. The README documents the compression stages and capabilities; sampled excerpts do not expose all Flask route wiring, so uncertain web-to-service links are omitted.

Main entry points: [`compressor/core/engine.py`](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/engine.py) (Compression engine), [`app.py`](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/app.py) (Flask routes), [`compressor/cli/commands.py`](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/cli/commands.py) (CLI commands), [`main.py`](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/main.py) (CLI entry point)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI"]
  node_main["CLI entry point<br/>[main.py]"]
  node_commands["CLI commands<br/>[commands.py]"]
end

subgraph group_web["Web application"]
  node_web_app["Flask routes<br/>[app.py]"]
  node_web_ui["Upload and results UI<br/>[main.js]"]
  node_templates["Page templates"]
  node_admin_ui["Admin controls<br/>[admin.js]"]
end

subgraph group_compression["Compression pipeline"]
  node_engine["Compression engine<br/>[engine.py]"]
  node_presets["Quality presets<br/>[__init__.py]"]
  node_validator["PDF validation<br/>[validator.py]"]
  node_image["Image recompression"]
  node_ghostscript["Ghostscript runner<br/>[ghostscript.py]"]
  node_optimizer["PDF optimization<br/>[optimizer.py]"]
  node_file_utils["File utilities<br/>[file_utils.py]"]
  node_result["Compression result<br/>[result.py]"]
end

subgraph group_account["Accounts and billing"]
  node_models[("Application records<br/>[models.py]")]
  node_midtrans["Midtrans"]
  node_admin_templates["Admin pages"]
end

node_cli_user(("CLI user"))
node_web_user(("Web user"))
node_gs_external["Ghostscript"]

node_cli_user -->|"runs command"| node_main
node_main -->|"dispatches"| node_commands
node_commands -->|"compresses PDFs"| node_engine
node_commands -->|"lists presets"| node_presets
node_web_user -->|"uploads PDF"| node_web_ui
node_web_ui -->|"posts request"| node_web_app
node_web_app -->|"reads and writes"| node_models
node_web_app -.->|"verifies payment"| node_midtrans
node_web_app -->|"renders pages"| node_templates
node_admin_ui -->|"posts admin actions"| node_web_app
node_web_app -->|"renders admin pages"| node_admin_templates
node_engine -->|"loads settings"| node_presets
node_engine -->|"validates input"| node_validator
node_engine -.->|"optional preprocessing"| node_image
node_engine -->|"runs compression"| node_ghostscript
node_ghostscript -->|"launches process"| node_gs_external
node_engine -->|"optimizes PDF"| node_optimizer
node_engine -->|"reads file sizes"| node_file_utils
node_engine -->|"builds result"| node_result
node_web_app -->|"compresses upload"| node_engine

click node_main "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/main.py"
click node_commands "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/cli/commands.py"
click node_web_app "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/app.py"
click node_web_ui "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/static/js/main.js"
click node_templates "https://github.com/ibnnuus/pdf-compressor-cli/tree/main/templates"
click node_admin_ui "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/static/js/admin.js"
click node_models "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/models.py"
click node_engine "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/engine.py"
click node_presets "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/presets/__init__.py"
click node_validator "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/validator.py"
click node_image "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/image_compressor.py"
click node_ghostscript "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/ghostscript.py"
click node_optimizer "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/optimizer.py"
click node_file_utils "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/file_utils.py"
click node_result "https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/result.py"
click node_admin_templates "https://github.com/ibnnuus/pdf-compressor-cli/tree/main/templates/admin"

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_main,node_commands,node_cli_user,node_web_user toneBlue
class node_web_app,node_web_ui,node_templates,node_admin_ui toneAmber
class node_engine,node_presets,node_validator,node_image,node_ghostscript,node_optimizer,node_file_utils,node_result toneMint
class node_models,node_midtrans,node_admin_templates toneRose
class node_gs_external toneIndigo
```

## Components

### CLI

- [CLI entry point](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/main.py): `main.py`
- [CLI commands](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/cli/commands.py): `compressor/cli/commands.py`

### Web application

- [Flask routes](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/app.py): `app.py`
- [Upload and results UI](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/static/js/main.js): `static/js/main.js`
- [Page templates](https://github.com/ibnnuus/pdf-compressor-cli/tree/main/templates): `templates`
- [Admin controls](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/static/js/admin.js): `static/js/admin.js`

### Compression pipeline

- [Compression engine](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/engine.py): `compressor/core/engine.py`
- [Quality presets](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/presets/__init__.py): `compressor/presets/__init__.py`
- [PDF validation](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/validator.py): `compressor/utils/validator.py`
- [Image recompression](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/image_compressor.py): `compressor/core/image_compressor.py`
- [Ghostscript runner](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/ghostscript.py): `compressor/utils/ghostscript.py`
- [PDF optimization](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/optimizer.py): `compressor/core/optimizer.py`
- [File utilities](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/utils/file_utils.py): `compressor/utils/file_utils.py`
- [Compression result](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/compressor/core/result.py): `compressor/core/result.py`

### Accounts and billing

- [Application records](https://github.com/ibnnuus/pdf-compressor-cli/blob/main/models.py): `models.py`
- **Midtrans**
- [Admin pages](https://github.com/ibnnuus/pdf-compressor-cli/tree/main/templates/admin): `templates/admin`

### Other components

- **CLI user**
- **Web user**
- **Ghostscript**

## Connections

- CLI user → CLI entry point: runs command
- CLI entry point → CLI commands: dispatches
- CLI commands → Compression engine: compresses PDFs
- CLI commands → Quality presets: lists presets
- Web user → Upload and results UI: uploads PDF
- Upload and results UI → Flask routes: posts request
- Flask routes → Application records: reads and writes
- Flask routes → Midtrans: verifies payment
- Flask routes → Page templates: renders pages
- Admin controls → Flask routes: posts admin actions
- Flask routes → Admin pages: renders admin pages
- Compression engine → Quality presets: loads settings
- Compression engine → PDF validation: validates input
- Compression engine → Image recompression: optional preprocessing
- Compression engine → Ghostscript runner: runs compression
- Ghostscript runner → Ghostscript: launches process
- Compression engine → PDF optimization: optimizes PDF
- Compression engine → File utilities: reads file sizes
- Compression engine → Compression result: builds result
- Flask routes → Compression engine: compresses upload
