# pixel2175/merodi architecture

> Architecture diagram of the GitHub repository pixel2175/merodi, 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/pixel2175/merodi
- Repository: https://github.com/pixel2175/merodi

## Overview

Merodi is a Go-based Markdown static-site generator. Its user workflow is to initialize a project, write Markdown pages and templates, then build a draft or release site; it also documents watch, clean, and named-hook commands. The graph includes the parser, configuration, project setup, and major build/plugin stages. Some build and command-dispatch implementation was not sampled, so documented capabilities are shown without guessing their internal call paths.

Main entry points: [`src/main.go`](https://github.com/pixel2175/merodi/blob/main/src/main.go) (Merodi CLI), [`src/init/main.go`](https://github.com/pixel2175/merodi/blob/main/src/init/main.go) (Project initializer), [`src/core/build/compile/compile.go`](https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/compile.go) (Compiler dispatch), [`src/parser/parser.go`](https://github.com/pixel2175/merodi/blob/main/src/parser/parser.go) (Command parser)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI and projects"]
  node_cli["Merodi CLI<br/>[main.go]"]
  node_arguments["Command parser<br/>[parser.go]"]
  node_project["Project discovery<br/>[project.go]"]
  node_config["Project config<br/>[main.go]"]
  node_initializer["Project initializer<br/>[main.go]"]
  node_bootstrap["Starter files<br/>[bootstrap.go]"]
end

subgraph group_build["Site generation"]
  node_build["Build orchestration<br/>[build.go]"]
  node_markdown["Markdown compiler<br/>[markdown.go]"]
  node_attributes["HTML attributes<br/>[attrparser.go]"]
  node_jinja["Jinja templates<br/>[jinja.go]"]
  node_compile["Compiler dispatch<br/>[compile.go]"]
end

subgraph group_plugins["Lua extensions"]
  node_hook["Hook runner<br/>[main.go]"]
  node_lua["Lua runtime<br/>[lua.go]"]
  node_lua_build["Build bindings<br/>[build.go]"]
  node_lua_compile["Compiler bindings<br/>[compile.go]"]
  node_lua_config["Config bindings<br/>[config.go]"]
  node_lua_watch["Watch bindings<br/>[watch.go]"]
  node_lua_hooks["Hook bindings<br/>[hook.go]"]
  node_lua_enable["Markdown extensions<br/>[enable.go]"]
end

subgraph group_runtime["Runtime support"]
  node_core["Command runtime<br/>[core.go]"]
  node_state["Build state<br/>[state.go]"]
  node_clean["Output cleanup<br/>[clean.go]"]
  node_watch["File watcher<br/>[main.go]"]
  node_logs["Logging<br/>[main.go]"]
end

node_author(("Site author"))

node_author -->|"runs commands"| node_cli
node_cli -->|"parses arguments"| node_arguments
node_cli -->|"runs default action"| node_core
node_cli -->|"runs init"| node_initializer
node_arguments -->|"uses mode"| node_config
node_initializer -->|"resolves directory"| node_project
node_initializer -->|"initializes settings"| node_config
node_initializer -->|"creates starter project"| node_bootstrap
node_author -->|"writes Markdown pages"| node_markdown
node_author -->|"styles with templates"| node_jinja
node_author -->|"builds site"| node_build
node_build -.->|"compiles content"| node_compile
node_compile -.->|"parses Markdown"| node_markdown
node_compile -.->|"renders templates"| node_jinja
node_author -->|"watches changes"| node_watch
node_author -->|"cleans output"| node_clean
node_author -->|"runs named hooks"| node_hook
node_author -->|"extends with plugins"| node_lua
node_lua -.->|"registers extensions"| node_lua_enable

click node_cli "https://github.com/pixel2175/merodi/blob/main/src/main.go"
click node_arguments "https://github.com/pixel2175/merodi/blob/main/src/parser/parser.go"
click node_project "https://github.com/pixel2175/merodi/blob/main/src/project/project.go"
click node_config "https://github.com/pixel2175/merodi/blob/main/src/config/main.go"
click node_initializer "https://github.com/pixel2175/merodi/blob/main/src/init/main.go"
click node_bootstrap "https://github.com/pixel2175/merodi/blob/main/src/init/bootstrap.go"
click node_core "https://github.com/pixel2175/merodi/blob/main/src/core/core.go"
click node_build "https://github.com/pixel2175/merodi/blob/main/src/core/build/build.go"
click node_markdown "https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/markdown/markdown.go"
click node_attributes "https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/markdown/attrparser/attrparser.go"
click node_jinja "https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/jinja/jinja.go"
click node_compile "https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/compile.go"
click node_state "https://github.com/pixel2175/merodi/blob/main/src/core/state/state.go"
click node_clean "https://github.com/pixel2175/merodi/blob/main/src/core/clean/clean.go"
click node_watch "https://github.com/pixel2175/merodi/blob/main/src/core/watch/main.go"
click node_hook "https://github.com/pixel2175/merodi/blob/main/src/core/hook/main.go"
click node_lua "https://github.com/pixel2175/merodi/blob/main/src/core/lua/lua.go"
click node_lua_build "https://github.com/pixel2175/merodi/blob/main/src/core/lua/build.go"
click node_lua_compile "https://github.com/pixel2175/merodi/blob/main/src/core/lua/compile.go"
click node_lua_config "https://github.com/pixel2175/merodi/blob/main/src/core/lua/config.go"
click node_lua_watch "https://github.com/pixel2175/merodi/blob/main/src/core/lua/watch.go"
click node_lua_hooks "https://github.com/pixel2175/merodi/blob/main/src/core/lua/hook.go"
click node_lua_enable "https://github.com/pixel2175/merodi/blob/main/src/core/lua/enable.go"
click node_logs "https://github.com/pixel2175/merodi/blob/main/src/utils/log/main.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_cli,node_arguments,node_project,node_config,node_initializer,node_bootstrap toneBlue
class node_build,node_markdown,node_attributes,node_jinja,node_compile toneAmber
class node_hook,node_lua,node_lua_build,node_lua_compile,node_lua_config,node_lua_watch,node_lua_hooks,node_lua_enable toneMint
class node_core,node_state,node_clean,node_watch,node_logs toneRose
class node_author toneIndigo
```

## Components

### CLI and projects

- [Merodi CLI](https://github.com/pixel2175/merodi/blob/main/src/main.go): `src/main.go`
- [Command parser](https://github.com/pixel2175/merodi/blob/main/src/parser/parser.go): `src/parser/parser.go`
- [Project discovery](https://github.com/pixel2175/merodi/blob/main/src/project/project.go): `src/project/project.go`
- [Project config](https://github.com/pixel2175/merodi/blob/main/src/config/main.go): `src/config/main.go`
- [Project initializer](https://github.com/pixel2175/merodi/blob/main/src/init/main.go): `src/init/main.go`
- [Starter files](https://github.com/pixel2175/merodi/blob/main/src/init/bootstrap.go): `src/init/bootstrap.go`

### Site generation

- [Build orchestration](https://github.com/pixel2175/merodi/blob/main/src/core/build/build.go): `src/core/build/build.go`
- [Markdown compiler](https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/markdown/markdown.go): `src/core/build/compile/markdown/markdown.go`
- [HTML attributes](https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/markdown/attrparser/attrparser.go): `src/core/build/compile/markdown/attrparser/attrparser.go`
- [Jinja templates](https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/jinja/jinja.go): `src/core/build/compile/jinja/jinja.go`
- [Compiler dispatch](https://github.com/pixel2175/merodi/blob/main/src/core/build/compile/compile.go): `src/core/build/compile/compile.go`

### Lua extensions

- [Hook runner](https://github.com/pixel2175/merodi/blob/main/src/core/hook/main.go): `src/core/hook/main.go`
- [Lua runtime](https://github.com/pixel2175/merodi/blob/main/src/core/lua/lua.go): `src/core/lua/lua.go`
- [Build bindings](https://github.com/pixel2175/merodi/blob/main/src/core/lua/build.go): `src/core/lua/build.go`
- [Compiler bindings](https://github.com/pixel2175/merodi/blob/main/src/core/lua/compile.go): `src/core/lua/compile.go`
- [Config bindings](https://github.com/pixel2175/merodi/blob/main/src/core/lua/config.go): `src/core/lua/config.go`
- [Watch bindings](https://github.com/pixel2175/merodi/blob/main/src/core/lua/watch.go): `src/core/lua/watch.go`
- [Hook bindings](https://github.com/pixel2175/merodi/blob/main/src/core/lua/hook.go): `src/core/lua/hook.go`
- [Markdown extensions](https://github.com/pixel2175/merodi/blob/main/src/core/lua/enable.go): `src/core/lua/enable.go`

### Runtime support

- [Command runtime](https://github.com/pixel2175/merodi/blob/main/src/core/core.go): `src/core/core.go`
- [Build state](https://github.com/pixel2175/merodi/blob/main/src/core/state/state.go): `src/core/state/state.go`
- [Output cleanup](https://github.com/pixel2175/merodi/blob/main/src/core/clean/clean.go): `src/core/clean/clean.go`
- [File watcher](https://github.com/pixel2175/merodi/blob/main/src/core/watch/main.go): `src/core/watch/main.go`
- [Logging](https://github.com/pixel2175/merodi/blob/main/src/utils/log/main.go): `src/utils/log/main.go`

### Other components

- **Site author**

## Connections

- Site author → Merodi CLI: runs commands (evidence: `README.md`)
- Merodi CLI → Command parser: parses arguments (evidence: `src/main.go`)
- Merodi CLI → Command runtime: runs default action (evidence: `src/main.go`)
- Merodi CLI → Project initializer: runs init (evidence: `src/main.go`)
- Command parser → Project config: uses mode (evidence: `src/parser/parser.go`)
- Project initializer → Project discovery: resolves directory (evidence: `src/init/main.go`)
- Project initializer → Project config: initializes settings (evidence: `src/init/main.go`)
- Project initializer → Starter files: creates starter project (evidence: `src/init/main.go`)
- Site author → Markdown compiler: writes Markdown pages (evidence: `README.md`)
- Site author → Jinja templates: styles with templates (evidence: `README.md`)
- Site author → Build orchestration: builds site (evidence: `README.md`)
- Build orchestration → Compiler dispatch: compiles content
- Compiler dispatch → Markdown compiler: parses Markdown
- Compiler dispatch → Jinja templates: renders templates
- Site author → File watcher: watches changes (evidence: `README.md`)
- Site author → Output cleanup: cleans output
- Site author → Hook runner: runs named hooks
- Site author → Lua runtime: extends with plugins (evidence: `README.md`)
- Lua runtime → Markdown extensions: registers extensions
