# mitsuhiko/minijinja architecture

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

- Interactive diagram: https://gitdiagram.com/mitsuhiko/minijinja
- Repository: https://github.com/mitsuhiko/minijinja

## Overview

MiniJinja is a Jinja-compatible template engine, with Rust as its core implementation and a separate native Go implementation. The main workflow is to supply templates and context to an environment, resolve a named template, compile its syntax, evaluate it with runtime values, and produce rendered output. The repository also provides expression evaluation, extensions, reload and embedding utilities, a CLI, and language bindings. Edges reflect the documented Rust API and sampled source; several CLI, binding, and core internals are represented by their tree paths, but their unsampled call wiring is not expanded.

Main entry points: [`minijinja/src/environment.rs`](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/environment.rs) (Environment), [`minijinja/src/vm/mod.rs`](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/vm/mod.rs) (Evaluator), [`minijinja/src/compiler/mod.rs`](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/mod.rs) (Compiler), [`minijinja-go/minijinja.go`](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/minijinja.go) (Go template engine)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_core["Rust engine"]
  node_env["Environment<br/>[environment.rs]"]
  node_loader["Template loading<br/>[loader.rs]"]
  node_compiler["Compiler<br/>[mod.rs]"]
  node_lexer["Lexer<br/>[lexer.rs]"]
  node_parser["Parser<br/>[parser.rs]"]
  node_codegen["Code generation<br/>[codegen.rs]"]
  node_template["Template<br/>[template.rs]"]
  node_vm["Evaluator<br/>[mod.rs]"]
  node_context["Runtime context<br/>[context.rs]"]
  node_value["Values and objects<br/>[mod.rs]"]
  node_filters["Filters and functions<br/>[filters.rs]"]
  node_output["Rendered output<br/>[output.rs]"]
  node_errors["Errors<br/>[error.rs]"]
  node_expression["Expression evaluation<br/>[expression.rs]"]
end

subgraph group_extras["Engine utilities"]
  node_contrib["Extra utilities<br/>[lib.rs]"]
  node_autoreload["Auto reloader<br/>[lib.rs]"]
  node_embed["Embedded templates<br/>[lib.rs]"]
end

subgraph group_interfaces["Language interfaces"]
  node_cli["CLI<br/>[main.rs]"]
  node_js["JavaScript WASM<br/>[lib.rs]"]
  node_python["Python binding<br/>[lib.rs]"]
  node_c["C binding<br/>[lib.rs]"]
end

subgraph group_go["Go engine"]
  node_go["Go template engine<br/>[minijinja.go]"]
  node_go_lexer["Go lexer<br/>[lexer.go]"]
  node_go_parser["Go parser<br/>[parser.go]"]
  node_go_values["Go values<br/>[value.go]"]
end

node_user(("Application"))

node_user -->|"supplies templates"| node_env
node_env -->|"loads templates"| node_loader
node_env -->|"gets template"| node_template
node_template -->|"compiles source"| node_compiler
node_compiler -->|"tokenizes source"| node_lexer
node_compiler -->|"parses tokens"| node_parser
node_compiler -->|"generates instructions"| node_codegen
node_template -->|"renders template"| node_vm
node_vm -->|"resolves context"| node_context
node_context -->|"reads values"| node_value
node_vm -->|"invokes functions"| node_filters
node_vm -->|"writes output"| node_output
node_vm -->|"reports failures"| node_errors
node_user -->|"evaluates expression"| node_expression
node_expression -->|"evaluates instructions"| node_vm
node_user -->|"registers utilities"| node_contrib
node_contrib -->|"adds filters"| node_env
node_user -->|"acquires environment"| node_autoreload
node_autoreload -->|"creates environment"| node_env
node_user -->|"loads bundle"| node_embed
node_embed -->|"adds templates"| node_env
node_user -->|"renders via CLI"| node_cli
node_cli -.->|"uses engine"| node_env
node_user -->|"calls binding"| node_js
node_js -->|"wraps engine"| node_env
node_user -->|"calls binding"| node_python
node_python -.->|"wraps engine"| node_env
node_user -->|"calls binding"| node_c
node_c -.->|"wraps engine"| node_env
node_user -->|"renders template"| node_go
node_go -->|"tokenizes source"| node_go_lexer
node_go -->|"parses templates"| node_go_parser
node_go -->|"uses values"| node_go_values

click node_env "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/environment.rs"
click node_loader "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/loader.rs"
click node_compiler "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/mod.rs"
click node_lexer "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/lexer.rs"
click node_parser "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/parser.rs"
click node_codegen "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/codegen.rs"
click node_template "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/template.rs"
click node_vm "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/vm/mod.rs"
click node_context "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/vm/context.rs"
click node_value "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/value/mod.rs"
click node_filters "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/filters.rs"
click node_output "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/output.rs"
click node_errors "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/error.rs"
click node_expression "https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/expression.rs"
click node_contrib "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-contrib/src/lib.rs"
click node_autoreload "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-autoreload/src/lib.rs"
click node_embed "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-embed/src/lib.rs"
click node_cli "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-cli/src/main.rs"
click node_js "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-js/src/lib.rs"
click node_python "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-py/src/lib.rs"
click node_c "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-cabi/src/lib.rs"
click node_go "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/minijinja.go"
click node_go_lexer "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/internal/lexer/lexer.go"
click node_go_parser "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/internal/parser/parser.go"
click node_go_values "https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/value/value.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_env,node_loader,node_compiler,node_lexer,node_parser,node_codegen,node_template,node_vm,node_context,node_value,node_filters,node_output,node_errors,node_expression toneBlue
class node_contrib,node_autoreload,node_embed toneAmber
class node_cli,node_js,node_python,node_c toneMint
class node_go,node_go_lexer,node_go_parser,node_go_values toneRose
class node_user toneIndigo
```

## Components

### Rust engine

- [Environment](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/environment.rs): `minijinja/src/environment.rs`
- [Template loading](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/loader.rs): `minijinja/src/loader.rs`
- [Compiler](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/mod.rs): `minijinja/src/compiler/mod.rs`
- [Lexer](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/lexer.rs): `minijinja/src/compiler/lexer.rs`
- [Parser](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/parser.rs): `minijinja/src/compiler/parser.rs`
- [Code generation](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/compiler/codegen.rs): `minijinja/src/compiler/codegen.rs`
- [Template](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/template.rs): `minijinja/src/template.rs`
- [Evaluator](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/vm/mod.rs): `minijinja/src/vm/mod.rs`
- [Runtime context](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/vm/context.rs): `minijinja/src/vm/context.rs`
- [Values and objects](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/value/mod.rs): `minijinja/src/value/mod.rs`
- [Filters and functions](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/filters.rs): `minijinja/src/filters.rs`
- [Rendered output](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/output.rs): `minijinja/src/output.rs`
- [Errors](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/error.rs): `minijinja/src/error.rs`
- [Expression evaluation](https://github.com/mitsuhiko/minijinja/blob/main/minijinja/src/expression.rs): `minijinja/src/expression.rs`

### Engine utilities

- [Extra utilities](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-contrib/src/lib.rs): `minijinja-contrib/src/lib.rs`
- [Auto reloader](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-autoreload/src/lib.rs): `minijinja-autoreload/src/lib.rs`
- [Embedded templates](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-embed/src/lib.rs): `minijinja-embed/src/lib.rs`

### Language interfaces

- [CLI](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-cli/src/main.rs): `minijinja-cli/src/main.rs`
- [JavaScript WASM](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-js/src/lib.rs): `minijinja-js/src/lib.rs`
- [Python binding](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-py/src/lib.rs): `minijinja-py/src/lib.rs`
- [C binding](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-cabi/src/lib.rs): `minijinja-cabi/src/lib.rs`

### Go engine

- [Go template engine](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/minijinja.go): `minijinja-go/minijinja.go`
- [Go lexer](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/internal/lexer/lexer.go): `minijinja-go/internal/lexer/lexer.go`
- [Go parser](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/internal/parser/parser.go): `minijinja-go/internal/parser/parser.go`
- [Go values](https://github.com/mitsuhiko/minijinja/blob/main/minijinja-go/value/value.go): `minijinja-go/value/value.go`

### Other components

- **Application**

## Connections

- Application → Environment: supplies templates
- Environment → Template loading: loads templates
- Environment → Template: gets template
- Template → Compiler: compiles source
- Compiler → Lexer: tokenizes source
- Compiler → Parser: parses tokens
- Compiler → Code generation: generates instructions
- Template → Evaluator: renders template
- Evaluator → Runtime context: resolves context
- Runtime context → Values and objects: reads values
- Evaluator → Filters and functions: invokes functions
- Evaluator → Rendered output: writes output
- Evaluator → Errors: reports failures
- Application → Expression evaluation: evaluates expression
- Expression evaluation → Evaluator: evaluates instructions
- Application → Extra utilities: registers utilities
- Extra utilities → Environment: adds filters
- Application → Auto reloader: acquires environment
- Auto reloader → Environment: creates environment
- Application → Embedded templates: loads bundle
- Embedded templates → Environment: adds templates
- Application → CLI: renders via CLI
- CLI → Environment: uses engine
- Application → JavaScript WASM: calls binding
- JavaScript WASM → Environment: wraps engine
- Application → Python binding: calls binding
- Python binding → Environment: wraps engine
- Application → C binding: calls binding
- C binding → Environment: wraps engine
- Application → Go template engine: renders template
- Go template engine → Go lexer: tokenizes source
- Go template engine → Go parser: parses templates
- Go template engine → Go values: uses values
