# otfried/ipe architecture

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

- Interactive diagram: https://gitdiagram.com/otfried/ipe
- Repository: https://github.com/otfried/ipe

## Overview

Ipe is an extensible drawing editor for creating figures and producing PDF for LaTeX or standalone use. Its principal workflow is authoring and editing a page of drawing objects, rendering it in the editor, and exporting or presenting the result. The repository also provides web and VS Code entry points, Lua/ipelet extensibility, PDF viewing, and conversion utilities. The graph reflects the documented product and sampled call sites; several native UI and export connections are based on module responsibilities rather than inspected wiring.

Main entry points: [`src/ipelib/ipedoc.cpp`](https://github.com/otfried/ipe/blob/master/src/ipelib/ipedoc.cpp) (Document model), [`src/ipelib/ipepage.cpp`](https://github.com/otfried/ipe/blob/master/src/ipelib/ipepage.cpp) (Pages and layers), [`src/ipe-web/src/ipe/ipeui.ts`](https://github.com/otfried/ipe/blob/master/src/ipe-web/src/ipe/ipeui.ts) (Web UI), [`src/ipecanvas/ipecanvas.cpp`](https://github.com/otfried/ipe/blob/master/src/ipecanvas/ipecanvas.cpp) (Canvas)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_editor["Editing experience"]
  node_native["Native app<br/>[main_qt.cpp]"]
  node_appui["Editor UI<br/>[appui.cpp]"]
  node_tools["Editing tools<br/>[tools.cpp]"]
  node_canvas["Canvas<br/>[ipecanvas.cpp]"]
end

subgraph group_model["Drawing and files"]
  node_document["Document model<br/>[ipedoc.cpp]"]
  node_pages["Pages and layers<br/>[ipepage.cpp]"]
  node_objects["Drawing objects<br/>[ipeobject.cpp]"]
  node_styles["Styles and attributes<br/>[ipestyle.cpp]"]
  node_ipefile["Ipe XML files<br/>[ipexml.cpp]"]
  node_pdfparse["PDF parser<br/>[ipepdfparser.cpp]"]
end

subgraph group_render["Rendering and output"]
  node_painter["Cairo painter"]
  node_pdfout["PDF writer<br/>[ipepdfwriter.cpp]"]
  node_latex["LaTeX rendering<br/>[ipelatex.cpp]"]
  node_presenter["PDF presenter<br/>[ipepresenter.cpp]"]
end

subgraph group_extensions["Extensions and clients"]
  node_web["Web edition<br/>[main.ts]"]
  node_webui["Web UI<br/>[ipeui.ts]"]
  node_vscode["VS Code extension<br/>[extension.ts]"]
  node_lua["Lua bindings<br/>[ipelib.cpp]"]
  node_ipelets["Ipelets<br/>[uilua.cpp]"]
  node_converter["Format converter<br/>[ipetoipe.cpp]"]
end

node_user(("Artist"))
node_pdflatex(("Pdflatex"))

node_user -->|"edits figures"| node_native
node_user -->|"opens editor"| node_web
node_user -->|"opens files"| node_vscode
node_native -->|"starts UI"| node_appui
node_appui -->|"dispatches edits"| node_tools
node_tools -->|"edits document"| node_document
node_document -->|"manages pages"| node_pages
node_pages -->|"holds objects"| node_objects
node_canvas -->|"draws objects"| node_painter
node_canvas -->|"renders page"| node_pages
node_document -->|"loads and saves"| node_ipefile
node_pdfparse -->|"provides PDF data"| node_presenter
node_document -->|"writes PDF"| node_pdfout
node_latex -.->|"renders text"| node_pdflatex
node_web -->|"creates UI"| node_webui
node_webui -->|"starts editor"| node_document
node_vscode -->|"hosts editor"| node_webui
node_lua -->|"binds objects"| node_objects
node_ipelets -->|"uses bindings"| node_lua
node_converter -->|"converts files"| node_ipefile

click node_native "https://github.com/otfried/ipe/blob/master/src/ipe/main_qt.cpp"
click node_appui "https://github.com/otfried/ipe/blob/master/src/ipe/appui.cpp"
click node_tools "https://github.com/otfried/ipe/blob/master/src/ipe/tools.cpp"
click node_canvas "https://github.com/otfried/ipe/blob/master/src/ipecanvas/ipecanvas.cpp"
click node_document "https://github.com/otfried/ipe/blob/master/src/ipelib/ipedoc.cpp"
click node_pages "https://github.com/otfried/ipe/blob/master/src/ipelib/ipepage.cpp"
click node_objects "https://github.com/otfried/ipe/blob/master/src/ipelib/ipeobject.cpp"
click node_styles "https://github.com/otfried/ipe/blob/master/src/ipelib/ipestyle.cpp"
click node_ipefile "https://github.com/otfried/ipe/blob/master/src/ipelib/ipexml.cpp"
click node_pdfparse "https://github.com/otfried/ipe/blob/master/src/ipelib/ipepdfparser.cpp"
click node_painter "https://github.com/otfried/ipe/blob/master/src/ipecairo/ipecairopainter.cpp"
click node_pdfout "https://github.com/otfried/ipe/blob/master/src/ipelib/ipepdfwriter.cpp"
click node_latex "https://github.com/otfried/ipe/blob/master/src/ipelib/ipelatex.cpp"
click node_presenter "https://github.com/otfried/ipe/blob/master/src/ipepresenter/ipepresenter.cpp"
click node_web "https://github.com/otfried/ipe/blob/master/src/ipe-web/src/main.ts"
click node_webui "https://github.com/otfried/ipe/blob/master/src/ipe-web/src/ipe/ipeui.ts"
click node_vscode "https://github.com/otfried/ipe/blob/master/src/ipe-vscode/src/extension.ts"
click node_lua "https://github.com/otfried/ipe/blob/master/src/ipelua/ipelib.cpp"
click node_ipelets "https://github.com/otfried/ipe/blob/master/src/ipe/uilua.cpp"
click node_converter "https://github.com/otfried/ipe/blob/master/src/ipetoipe/ipetoipe.cpp"

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_native,node_appui,node_tools,node_canvas toneBlue
class node_document,node_pages,node_objects,node_styles,node_ipefile,node_pdfparse toneAmber
class node_painter,node_pdfout,node_latex,node_presenter toneMint
class node_web,node_webui,node_vscode,node_lua,node_ipelets,node_converter toneRose
class node_user,node_pdflatex toneIndigo
```

## Components

### Editing experience

- [Native app](https://github.com/otfried/ipe/blob/master/src/ipe/main_qt.cpp): `src/ipe/main_qt.cpp`
- [Editor UI](https://github.com/otfried/ipe/blob/master/src/ipe/appui.cpp): `src/ipe/appui.cpp`
- [Editing tools](https://github.com/otfried/ipe/blob/master/src/ipe/tools.cpp): `src/ipe/tools.cpp`
- [Canvas](https://github.com/otfried/ipe/blob/master/src/ipecanvas/ipecanvas.cpp): `src/ipecanvas/ipecanvas.cpp`

### Drawing and files

- [Document model](https://github.com/otfried/ipe/blob/master/src/ipelib/ipedoc.cpp): `src/ipelib/ipedoc.cpp`
- [Pages and layers](https://github.com/otfried/ipe/blob/master/src/ipelib/ipepage.cpp): `src/ipelib/ipepage.cpp`
- [Drawing objects](https://github.com/otfried/ipe/blob/master/src/ipelib/ipeobject.cpp): `src/ipelib/ipeobject.cpp`
- [Styles and attributes](https://github.com/otfried/ipe/blob/master/src/ipelib/ipestyle.cpp): `src/ipelib/ipestyle.cpp`
- [Ipe XML files](https://github.com/otfried/ipe/blob/master/src/ipelib/ipexml.cpp): `src/ipelib/ipexml.cpp`
- [PDF parser](https://github.com/otfried/ipe/blob/master/src/ipelib/ipepdfparser.cpp): `src/ipelib/ipepdfparser.cpp`

### Rendering and output

- [Cairo painter](https://github.com/otfried/ipe/blob/master/src/ipecairo/ipecairopainter.cpp): `src/ipecairo/ipecairopainter.cpp`
- [PDF writer](https://github.com/otfried/ipe/blob/master/src/ipelib/ipepdfwriter.cpp): `src/ipelib/ipepdfwriter.cpp`
- [LaTeX rendering](https://github.com/otfried/ipe/blob/master/src/ipelib/ipelatex.cpp): `src/ipelib/ipelatex.cpp`
- [PDF presenter](https://github.com/otfried/ipe/blob/master/src/ipepresenter/ipepresenter.cpp): `src/ipepresenter/ipepresenter.cpp`

### Extensions and clients

- [Web edition](https://github.com/otfried/ipe/blob/master/src/ipe-web/src/main.ts): `src/ipe-web/src/main.ts`
- [Web UI](https://github.com/otfried/ipe/blob/master/src/ipe-web/src/ipe/ipeui.ts): `src/ipe-web/src/ipe/ipeui.ts`
- [VS Code extension](https://github.com/otfried/ipe/blob/master/src/ipe-vscode/src/extension.ts): `src/ipe-vscode/src/extension.ts`
- [Lua bindings](https://github.com/otfried/ipe/blob/master/src/ipelua/ipelib.cpp): `src/ipelua/ipelib.cpp`
- [Ipelets](https://github.com/otfried/ipe/blob/master/src/ipe/uilua.cpp): `src/ipe/uilua.cpp`
- [Format converter](https://github.com/otfried/ipe/blob/master/src/ipetoipe/ipetoipe.cpp): `src/ipetoipe/ipetoipe.cpp`

### Other components

- **Artist**
- **Pdflatex**

## Connections

- Artist → Native app: edits figures
- Artist → Web edition: opens editor
- Artist → VS Code extension: opens files
- Native app → Editor UI: starts UI
- Editor UI → Editing tools: dispatches edits
- Editing tools → Document model: edits document
- Document model → Pages and layers: manages pages
- Pages and layers → Drawing objects: holds objects
- Canvas → Cairo painter: draws objects
- Canvas → Pages and layers: renders page
- Document model → Ipe XML files: loads and saves
- PDF parser → PDF presenter: provides PDF data
- Document model → PDF writer: writes PDF
- LaTeX rendering → Pdflatex: renders text
- Web edition → Web UI: creates UI
- Web UI → Document model: starts editor
- VS Code extension → Web UI: hosts editor
- Lua bindings → Drawing objects: binds objects
- Ipelets → Lua bindings: uses bindings
- Format converter → Ipe XML files: converts files
