# kernel-cracker/sakura-print architecture

> Architecture diagram of the GitHub repository kernel-cracker/sakura-print, 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/kernel-cracker/sakura-print
- Repository: https://github.com/kernel-cracker/sakura-print

## Overview

Sakura Print is a Linux-hosted home printing and scanning app, with a browser UI usable on the computer or on the same Wi-Fi. The main workflow is to choose or upload content, configure print options, build a printable document, then send it to a printer; phone printing through IPP is a separate entry path. Other major branches cover scanning and editing, printer setup and driver management, printer care, and print history. The graph uses README-documented product flows and the shown server, editor, driver, and IPP excerpts; many Go route implementations were not sampled, so their internal links are omitted.

Main entry points: [`web/js/01-core.js`](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/01-core.js) (Web app), [`ipp_jobs.go`](https://github.com/kernel-cracker/sakura-print/blob/master/ipp_jobs.go) (IPP print service), [`server.go`](https://github.com/kernel-cracker/sakura-print/blob/master/server.go) (HTTP server), [`pdf_build.go`](https://github.com/kernel-cracker/sakura-print/blob/master/pdf_build.go) (Print document build)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and access"]
  node_webui["Web app<br/>[01-core.js]"]
  node_server["HTTP server<br/>[server.go]"]
  node_sessions["Phone sessions<br/>[api_session.go]"]
end

subgraph group_print["Print workflow"]
  node_documentui["Document printing<br/>[04-print.js]"]
  node_printbuild["Print document build<br/>[pdf_build.go]"]
  node_conversion["File conversion<br/>[convert.go]"]
  node_cups["CUPS printing<br/>[cups.go]"]
  node_ipp["IPP print service<br/>[ipp_jobs.go]"]
  node_ippoptions["IPP printer options<br/>[ipp_options.go]"]
end

subgraph group_devices["Devices and drivers"]
  node_setupui["First-time setup<br/>[07-setup.js]"]
  node_driverui["Driver setup UI<br/>[15-drivers.js]"]
  node_driverplan["Driver selection<br/>[drivers_plan.go]"]
  node_driverinstall["Driver installation<br/>[drivers_run.go]"]
  node_driverpackages["Driver packages<br/>[drivers_pkg.go]"]
  node_driverdiscovery["Device discovery<br/>[drivers_scan.go]"]
end

subgraph group_media["Scan and edit"]
  node_scanui["Scan and copy<br/>[08-scan.js]"]
  node_scannerops["Scanning<br/>[scan.go]"]
  node_editor["Page editor<br/>[06-editor.js]"]
  node_develop["Image processing<br/>[develop.js]"]
end

subgraph group_support["Care and history"]
  node_careui["Printer care<br/>[09-care.js]"]
  node_historyui["Print again<br/>[14-again.js]"]
  node_history[("Print history<br/>[history.go]")]
end

node_person(("Computer user"))
node_phone(("Phone user"))
node_apps(("Other print apps"))
node_printer["Printer"]
node_scanner["Scanner"]

node_person -->|"uses"| node_webui
node_phone -->|"opens over Wi-Fi"| node_webui
node_webui -->|"requests app services"| node_server
node_server -->|"serves app assets"| node_webui
node_phone -->|"logs in with PIN"| node_sessions
node_setupui -->|"configures printer"| node_driverui
node_driverui -->|"requests driver setup"| node_driverplan
node_driverplan -.->|"selects install route"| node_driverinstall
node_driverinstall -.->|"installs packages"| node_driverpackages
node_driverdiscovery -.->|"provides device choices"| node_driverplan
node_webui -->|"opens print flow"| node_documentui
node_documentui -->|"requests print build"| node_printbuild
node_printbuild -.->|"converts input files"| node_conversion
node_printbuild -.->|"submits print job"| node_cups
node_apps -->|"prints via IPP"| node_ipp
node_server -->|"registers print service"| node_ipp
node_ipp -.->|"uses printer options"| node_ippoptions
node_ipp -->|"sends print job"| node_printer
node_cups -->|"prints"| node_printer
node_webui -->|"opens scan flow"| node_scanui
node_scanui -->|"requests scans"| node_scannerops
node_scannerops -->|"scans pages"| node_scanner
node_editor -->|"processes image pixels"| node_develop
node_webui -->|"opens page editor"| node_editor
node_webui -->|"opens printer care"| node_careui
node_webui -->|"opens print again"| node_historyui
node_historyui -.->|"reprints saved jobs"| node_history

click node_webui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/01-core.js"
click node_server "https://github.com/kernel-cracker/sakura-print/blob/master/server.go"
click node_sessions "https://github.com/kernel-cracker/sakura-print/blob/master/api_session.go"
click node_setupui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/07-setup.js"
click node_driverui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/15-drivers.js"
click node_driverplan "https://github.com/kernel-cracker/sakura-print/blob/master/drivers_plan.go"
click node_driverinstall "https://github.com/kernel-cracker/sakura-print/blob/master/drivers_run.go"
click node_driverpackages "https://github.com/kernel-cracker/sakura-print/blob/master/drivers_pkg.go"
click node_driverdiscovery "https://github.com/kernel-cracker/sakura-print/blob/master/drivers_scan.go"
click node_documentui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/04-print.js"
click node_printbuild "https://github.com/kernel-cracker/sakura-print/blob/master/pdf_build.go"
click node_conversion "https://github.com/kernel-cracker/sakura-print/blob/master/convert.go"
click node_cups "https://github.com/kernel-cracker/sakura-print/blob/master/cups.go"
click node_ipp "https://github.com/kernel-cracker/sakura-print/blob/master/ipp_jobs.go"
click node_ippoptions "https://github.com/kernel-cracker/sakura-print/blob/master/ipp_options.go"
click node_scanui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/08-scan.js"
click node_scannerops "https://github.com/kernel-cracker/sakura-print/blob/master/scan.go"
click node_editor "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/06-editor.js"
click node_develop "https://github.com/kernel-cracker/sakura-print/blob/master/web/develop.js"
click node_careui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/09-care.js"
click node_historyui "https://github.com/kernel-cracker/sakura-print/blob/master/web/js/14-again.js"
click node_history "https://github.com/kernel-cracker/sakura-print/blob/master/history.go"

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_webui,node_server,node_sessions,node_person,node_phone toneBlue
class node_documentui,node_printbuild,node_conversion,node_cups,node_ipp,node_ippoptions toneAmber
class node_setupui,node_driverui,node_driverplan,node_driverinstall,node_driverpackages,node_driverdiscovery toneMint
class node_scanui,node_scannerops,node_editor,node_develop toneRose
class node_careui,node_historyui,node_history,node_apps,node_printer,node_scanner toneIndigo
```

## Components

### App and access

- [Web app](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/01-core.js): `web/js/01-core.js`
- [HTTP server](https://github.com/kernel-cracker/sakura-print/blob/master/server.go): `server.go`
- [Phone sessions](https://github.com/kernel-cracker/sakura-print/blob/master/api_session.go): `api_session.go`

### Print workflow

- [Document printing](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/04-print.js): `web/js/04-print.js`
- [Print document build](https://github.com/kernel-cracker/sakura-print/blob/master/pdf_build.go): `pdf_build.go`
- [File conversion](https://github.com/kernel-cracker/sakura-print/blob/master/convert.go): `convert.go`
- [CUPS printing](https://github.com/kernel-cracker/sakura-print/blob/master/cups.go): `cups.go`
- [IPP print service](https://github.com/kernel-cracker/sakura-print/blob/master/ipp_jobs.go): `ipp_jobs.go`
- [IPP printer options](https://github.com/kernel-cracker/sakura-print/blob/master/ipp_options.go): `ipp_options.go`

### Devices and drivers

- [First-time setup](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/07-setup.js): `web/js/07-setup.js`
- [Driver setup UI](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/15-drivers.js): `web/js/15-drivers.js`
- [Driver selection](https://github.com/kernel-cracker/sakura-print/blob/master/drivers_plan.go): `drivers_plan.go`
- [Driver installation](https://github.com/kernel-cracker/sakura-print/blob/master/drivers_run.go): `drivers_run.go`
- [Driver packages](https://github.com/kernel-cracker/sakura-print/blob/master/drivers_pkg.go): `drivers_pkg.go`
- [Device discovery](https://github.com/kernel-cracker/sakura-print/blob/master/drivers_scan.go): `drivers_scan.go`

### Scan and edit

- [Scan and copy](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/08-scan.js): `web/js/08-scan.js`
- [Scanning](https://github.com/kernel-cracker/sakura-print/blob/master/scan.go): `scan.go`
- [Page editor](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/06-editor.js): `web/js/06-editor.js`
- [Image processing](https://github.com/kernel-cracker/sakura-print/blob/master/web/develop.js): `web/develop.js`

### Care and history

- [Printer care](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/09-care.js): `web/js/09-care.js`
- [Print again](https://github.com/kernel-cracker/sakura-print/blob/master/web/js/14-again.js): `web/js/14-again.js`
- [Print history](https://github.com/kernel-cracker/sakura-print/blob/master/history.go): `history.go`

### Other components

- **Computer user**
- **Phone user**
- **Other print apps**
- **Printer**
- **Scanner**

## Connections

- Computer user → Web app: uses (evidence: `README.md`)
- Phone user → Web app: opens over Wi-Fi (evidence: `README.md`)
- Web app → HTTP server: requests app services (evidence: `README.md`)
- HTTP server → Web app: serves app assets (evidence: `server.go`)
- Phone user → Phone sessions: logs in with PIN (evidence: `api_session.go`)
- First-time setup → Driver setup UI: configures printer (evidence: `README.md`)
- Driver setup UI → Driver selection: requests driver setup (evidence: `web/js/15-drivers.js`)
- Driver selection → Driver installation: selects install route
- Driver installation → Driver packages: installs packages
- Device discovery → Driver selection: provides device choices
- Web app → Document printing: opens print flow (evidence: `README.md`)
- Document printing → Print document build: requests print build (evidence: `README.md`)
- Print document build → File conversion: converts input files
- Print document build → CUPS printing: submits print job
- Other print apps → IPP print service: prints via IPP (evidence: `README.md`)
- HTTP server → IPP print service: registers print service (evidence: `server.go`)
- IPP print service → IPP printer options: uses printer options
- IPP print service → Printer: sends print job (evidence: `README.md`)
- CUPS printing → Printer: prints (evidence: `README.md`)
- Web app → Scan and copy: opens scan flow (evidence: `README.md`)
- Scan and copy → Scanning: requests scans (evidence: `README.md`)
- Scanning → Scanner: scans pages (evidence: `README.md`)
- Page editor → Image processing: processes image pixels (evidence: `web/js/06-editor.js`)
- Web app → Page editor: opens page editor (evidence: `README.md`)
- Web app → Printer care: opens printer care (evidence: `README.md`)
- Web app → Print again: opens print again (evidence: `README.md`)
- Print again → Print history: reprints saved jobs
