# jul-sh/iosevka-charon architecture

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

- Interactive diagram: https://gitdiagram.com/jul-sh/iosevka-charon
- Repository: https://github.com/jul-sh/iosevka-charon

## Overview

Iosevka Charon is a font-family project and build pipeline, producing Charon/Charon Mono, Caleuche derivatives, and webfont/release packages. The main workflow builds glyphs and OpenType data from font parameters, converts and cleans them into TTFs, then applies Google Fonts-oriented post-processing and packages outputs. README documents the broader script flow; source excerpts show the internal font-build orchestration. Some script and auxiliary subsystem links are therefore documented rather than verified at call level.

Main entry points: [`sources/iosevka/packages/font/src/build-font/index.mjs`](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/build-font/index.mjs) (Font build), [`scripts/iosevka_build.py`](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/iosevka_build.py) (Build driver), [`scripts/fix_fonts.py`](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/fix_fonts.py) (Font post-processing), [`sources/iosevka/packages/geometry/src/index.mjs`](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/index.mjs) (Geometry engine)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_font_core["Font construction"]
  node_builder["Build driver<br/>[iosevka_build.py]"]
  node_parameters["Font parameters<br/>[index.mjs]"]
  node_font_build["Font build<br/>[index.mjs]"]
  node_glyphs["Glyph generation"]
  node_otl["OpenType layout"]
  node_glyph_cleanup["Glyph cleanup<br/>[gc.mjs]"]
  node_otd_convert["Font conversion<br/>[glyphs.mjs]"]
  node_naming["Font naming<br/>[index.mjs]"]
end

subgraph group_font_geometry["Glyph geometry"]
  node_font_geometry["Geometry engine<br/>[index.mjs]"]
  node_spiro_outline["Spiro outlines"]
  node_curve_utils["Curve utilities<br/>[curve-util.mjs]"]
end

subgraph group_font_delivery["Font delivery"]
  node_postprocess["Font post-processing<br/>[fix_fonts.py]"]
  node_autokern["Autokerning<br/>[autokern.py]"]
  node_caleuche_var["Caleuche variable"]
  node_webfonts["Webfont generation"]
  node_release["Release packaging<br/>[package_release.py]"]
  node_font_files["Font outputs"]
end

node_engineer(("Font builder"))

node_engineer -->|"starts build"| node_builder
node_builder -.->|"configures"| node_parameters
node_builder -->|"builds fonts"| node_font_build
node_font_build -->|"builds glyphs"| node_glyphs
node_font_build -->|"builds layout"| node_otl
node_font_build -->|"initializes"| node_font_geometry
node_font_geometry -->|"converts spiro"| node_spiro_outline
node_spiro_outline -->|"uses curves"| node_curve_utils
node_font_build -->|"cleans glyphs"| node_glyph_cleanup
node_font_build -->|"converts font"| node_otd_convert
node_font_build -->|"assigns names"| node_naming
node_font_build -->|"emits TTF"| node_font_files
node_font_files -->|"post-processes"| node_postprocess
node_postprocess -->|"invokes"| node_autokern
node_postprocess -->|"writes fonts"| node_font_files
node_font_files -->|"derives variable"| node_caleuche_var
node_font_files -->|"generates webfonts"| node_webfonts
node_font_files -.->|"packages release"| node_release

click node_builder "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/iosevka_build.py"
click node_parameters "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/param/src/index.mjs"
click node_font_build "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/build-font/index.mjs"
click node_glyphs "https://github.com/jul-sh/iosevka-charon/tree/main/sources/iosevka/packages/font-glyphs"
click node_otl "https://github.com/jul-sh/iosevka-charon/tree/main/sources/iosevka/packages/font-otl"
click node_glyph_cleanup "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/cleanup/gc.mjs"
click node_otd_convert "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/otd-conv/glyphs.mjs"
click node_naming "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/naming/index.mjs"
click node_font_geometry "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/index.mjs"
click node_spiro_outline "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/spiro-to-outline.mjs"
click node_curve_utils "https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/curve-util.mjs"
click node_postprocess "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/fix_fonts.py"
click node_autokern "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/autokern.py"
click node_caleuche_var "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/caleuche_variable.py"
click node_webfonts "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/generate_webfonts.py"
click node_release "https://github.com/jul-sh/iosevka-charon/blob/main/scripts/package_release.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_builder,node_parameters,node_font_build,node_glyphs,node_otl,node_glyph_cleanup,node_otd_convert,node_naming toneBlue
class node_font_geometry,node_spiro_outline,node_curve_utils toneAmber
class node_postprocess,node_autokern,node_caleuche_var,node_webfonts,node_release,node_font_files toneMint
class node_engineer toneIndigo
```

## Components

### Font construction

- [Build driver](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/iosevka_build.py): `scripts/iosevka_build.py`
- [Font parameters](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/param/src/index.mjs): `sources/iosevka/packages/param/src/index.mjs`
- [Font build](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/build-font/index.mjs): `sources/iosevka/packages/font/src/build-font/index.mjs`
- [Glyph generation](https://github.com/jul-sh/iosevka-charon/tree/main/sources/iosevka/packages/font-glyphs): `sources/iosevka/packages/font-glyphs`
- [OpenType layout](https://github.com/jul-sh/iosevka-charon/tree/main/sources/iosevka/packages/font-otl): `sources/iosevka/packages/font-otl`
- [Glyph cleanup](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/cleanup/gc.mjs): `sources/iosevka/packages/font/src/cleanup/gc.mjs`
- [Font conversion](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/otd-conv/glyphs.mjs): `sources/iosevka/packages/font/src/otd-conv/glyphs.mjs`
- [Font naming](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/font/src/naming/index.mjs): `sources/iosevka/packages/font/src/naming/index.mjs`

### Glyph geometry

- [Geometry engine](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/index.mjs): `sources/iosevka/packages/geometry/src/index.mjs`
- [Spiro outlines](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/spiro-to-outline.mjs): `sources/iosevka/packages/geometry/src/spiro-to-outline.mjs`
- [Curve utilities](https://github.com/jul-sh/iosevka-charon/blob/main/sources/iosevka/packages/geometry/src/curve-util.mjs): `sources/iosevka/packages/geometry/src/curve-util.mjs`

### Font delivery

- [Font post-processing](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/fix_fonts.py): `scripts/fix_fonts.py`
- [Autokerning](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/autokern.py): `scripts/autokern.py`
- [Caleuche variable](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/caleuche_variable.py): `scripts/caleuche_variable.py`
- [Webfont generation](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/generate_webfonts.py): `scripts/generate_webfonts.py`
- [Release packaging](https://github.com/jul-sh/iosevka-charon/blob/main/scripts/package_release.py): `scripts/package_release.py`
- **Font outputs**

### Other components

- **Font builder**

## Connections

- Font builder → Build driver: starts build (evidence: `README.md`)
- Build driver → Font parameters: configures
- Build driver → Font build: builds fonts (evidence: `README.md`)
- Font build → Glyph generation: builds glyphs (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font build → OpenType layout: builds layout (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font build → Geometry engine: initializes (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Geometry engine → Spiro outlines: converts spiro (evidence: `sources/iosevka/packages/geometry/src/index.mjs`)
- Spiro outlines → Curve utilities: uses curves (evidence: `sources/iosevka/packages/geometry/src/spiro-to-outline.mjs`)
- Font build → Glyph cleanup: cleans glyphs (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font build → Font conversion: converts font (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font build → Font naming: assigns names (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font build → Font outputs: emits TTF (evidence: `sources/iosevka/packages/font/src/build-font/index.mjs`)
- Font outputs → Font post-processing: post-processes (evidence: `README.md`)
- Font post-processing → Autokerning: invokes (evidence: `scripts/fix_fonts.py`)
- Font post-processing → Font outputs: writes fonts (evidence: `README.md`)
- Font outputs → Caleuche variable: derives variable (evidence: `README.md`)
- Font outputs → Webfont generation: generates webfonts (evidence: `README.md`)
- Font outputs → Release packaging: packages release
