# mateusrodcosta/bign-handheld-thumbnailer architecture

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

- Interactive diagram: https://gitdiagram.com/mateusrodcosta/bign-handheld-thumbnailer
- Repository: https://github.com/mateusrodcosta/bign-handheld-thumbnailer

## Overview

This is a Freedesktop-compatible Nintendo DS/3DS ROM and homebrew thumbnailer. Its main workflow parses thumbnailer arguments, identifies the input MIME type, extracts a console-specific icon, optionally resizes it, and writes PNG output. The graph preserves the documented DS, SMDH, 3DSX, CIA, CXI, and CCI routes. Some wiring is based on the README and module tree where implementation excerpts were not provided; uncertain details are omitted.

Main entry points: [`src/main.rs`](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/main.rs) (CLI workflow), [`src/n3ds.rs`](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds.rs) (3DS format routing), [`src/n3ds/structures/cxi.rs`](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cxi.rs) (CXI ExeFS extraction), [`src/n3ds/structures.rs`](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures.rs) (SMDH icon extraction)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Thumbnailer entry"]
  node_main["CLI workflow<br/>[main.rs]"]
  node_args["Argument parsing<br/>[args.rs]"]
  node_mime["MIME detection<br/>[utils.rs]"]
end

subgraph group_ds["Nintendo DS"]
  node_nds["NDS banner extraction<br/>[nds.rs]"]
  node_ndsdata["NDS icon structures<br/>[structures.rs]"]
end

subgraph group_n3ds["Nintendo 3DS"]
  node_cia["CIA extraction<br/>[cia.rs]"]
  node_cci["CCI partition lookup<br/>[cci.rs]"]
  node_cxi["CXI ExeFS extraction<br/>[cxi.rs]"]
  node_smdh["SMDH icon extraction<br/>[structures.rs]"]
  node_n3dsformats["3DS format routing<br/>[n3ds.rs]"]
end

subgraph group_render["Icon rendering"]
  node_colors["Pixel color conversion<br/>[rgb888.rs]"]
  node_image["Resize and PNG output<br/>[main.rs]"]
end

node_desktop(("Thumbnail service"))
node_input["ROM or metadata file"]
node_output["Thumbnail file"]

node_desktop -->|"invokes"| node_main
node_main -->|"parses arguments"| node_args
node_main -->|"detects MIME"| node_mime
node_main -->|"opens file"| node_input
node_main -->|"dispatches NDS"| node_nds
node_main -->|"dispatches 3DS"| node_n3dsformats
node_nds -->|"builds icon"| node_ndsdata
node_nds -->|"converts palette"| node_colors
node_n3dsformats -->|"parses SMDH"| node_smdh
node_n3dsformats -->|"parses CIA"| node_cia
node_n3dsformats -->|"parses CCI"| node_cci
node_n3dsformats -->|"parses CXI"| node_cxi
node_cia -->|"reads metadata icon"| node_smdh
node_cia -->|"falls back to CXI"| node_cxi
node_cci -->|"reads partition"| node_cxi
node_cxi -->|"reads ExeFS icon"| node_smdh
node_smdh -->|"converts pixels"| node_colors
node_main -->|"resizes and saves"| node_image
node_image -->|"writes PNG"| node_output

click node_main "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/main.rs"
click node_args "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/args.rs"
click node_mime "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/utils.rs"
click node_nds "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/nds.rs"
click node_ndsdata "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/nds/structures.rs"
click node_cia "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cia.rs"
click node_cci "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cci.rs"
click node_cxi "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cxi.rs"
click node_smdh "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures.rs"
click node_n3dsformats "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds.rs"
click node_colors "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/utils/rgb888.rs"
click node_image "https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/main.rs"

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_args,node_mime toneBlue
class node_nds,node_ndsdata toneAmber
class node_cia,node_cci,node_cxi,node_smdh,node_n3dsformats toneMint
class node_colors,node_image toneRose
class node_desktop,node_input,node_output toneIndigo
```

## Components

### Thumbnailer entry

- [CLI workflow](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/main.rs): `src/main.rs`
- [Argument parsing](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/args.rs): `src/args.rs`
- [MIME detection](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/utils.rs): `src/utils.rs`

### Nintendo DS

- [NDS banner extraction](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/nds.rs): `src/nds.rs`
- [NDS icon structures](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/nds/structures.rs): `src/nds/structures.rs`

### Nintendo 3DS

- [CIA extraction](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cia.rs): `src/n3ds/structures/cia.rs`
- [CCI partition lookup](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cci.rs): `src/n3ds/structures/cci.rs`
- [CXI ExeFS extraction](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures/cxi.rs): `src/n3ds/structures/cxi.rs`
- [SMDH icon extraction](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds/structures.rs): `src/n3ds/structures.rs`
- [3DS format routing](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/n3ds.rs): `src/n3ds.rs`

### Icon rendering

- [Pixel color conversion](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/utils/rgb888.rs): `src/utils/rgb888.rs`
- [Resize and PNG output](https://github.com/mateusrodcosta/bign-handheld-thumbnailer/blob/dev/src/main.rs): `src/main.rs`

### Other components

- **Thumbnail service**
- **ROM or metadata file**
- **Thumbnail file**

## Connections

- Thumbnail service → CLI workflow: invokes
- CLI workflow → Argument parsing: parses arguments
- CLI workflow → MIME detection: detects MIME
- CLI workflow → ROM or metadata file: opens file
- CLI workflow → NDS banner extraction: dispatches NDS
- CLI workflow → 3DS format routing: dispatches 3DS
- NDS banner extraction → NDS icon structures: builds icon
- NDS banner extraction → Pixel color conversion: converts palette
- 3DS format routing → SMDH icon extraction: parses SMDH
- 3DS format routing → CIA extraction: parses CIA
- 3DS format routing → CCI partition lookup: parses CCI
- 3DS format routing → CXI ExeFS extraction: parses CXI
- CIA extraction → SMDH icon extraction: reads metadata icon
- CIA extraction → CXI ExeFS extraction: falls back to CXI
- CCI partition lookup → CXI ExeFS extraction: reads partition
- CXI ExeFS extraction → SMDH icon extraction: reads ExeFS icon
- SMDH icon extraction → Pixel color conversion: converts pixels
- CLI workflow → Resize and PNG output: resizes and saves
- Resize and PNG output → Thumbnail file: writes PNG
