# bryanheby/mant architecture

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

## Overview

ManT is a local-first documentation catalog, reader, and query engine. Users and automation discover or select Markdown and native manual documents; loading and parsing produce a shared structured document model, which supports outlines, excerpts, explanations, search, and cross-document queries. The CLI and MCP expose structured results, while the TUI supports interactive reading and navigation. The README documents these product capabilities; sampled source confirms request execution, CLI adaptation, and MCP service calls, but does not show every subsystem’s internal wiring.

Main entry points: [`crates/mant-loader/src/loading.rs`](https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/loading.rs) (Document loading), [`crates/mant-engine/src/query.rs`](https://github.com/bryanheby/mant/blob/main/crates/mant-engine/src/query.rs) (Request engine), [`crates/mant-ir/src/document.rs`](https://github.com/bryanheby/mant/blob/main/crates/mant-ir/src/document.rs) (Normalized document), [`crates/mant/src/mcp/service.rs`](https://github.com/bryanheby/mant/blob/main/crates/mant/src/mcp/service.rs) (MCP service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sources["Sources and parsing"]
  node_catalog["Document catalog<br/>[catalog.rs]"]
  node_sources["Registered sources<br/>[lib.rs]"]
  node_loader["Document loading<br/>[loading.rs]"]
  node_manuals["Manual paths<br/>[manual_paths.rs]"]
  node_markdown["Markdown parser<br/>[mod.rs]"]
  node_roff["Roff parser<br/>[parser.rs]"]
end

subgraph group_model["Document model"]
  node_codec["Document codec<br/>[lib.rs]"]
  node_ir["Normalized document<br/>[document.rs]"]
end

subgraph group_queries["Query engine"]
  node_engine["Request engine<br/>[query.rs]"]
  node_query["Document queries<br/>[lib.rs]"]
  node_scope["Scope queries<br/>[scope_query.rs]"]
end

subgraph group_interfaces["User interfaces"]
  node_entry["Executable entry<br/>[main.rs]"]
  node_cli["CLI query<br/>[query.rs]"]
  node_application["Application requests<br/>[application.rs]"]
  node_host["Host services<br/>[host.rs]"]
  node_tui["Interactive reader<br/>[mod.rs]"]
  node_mcp["MCP service<br/>[service.rs]"]
  node_ui_model["TUI presentation<br/>[mod.rs]"]
end

subgraph group_contracts["Protocol and rendering"]
  node_protocol["Typed API contracts<br/>[lib.rs]"]
  node_render["Output rendering<br/>[lib.rs]"]
end

node_reader(("Reader"))
node_automation(("Scripts and agents"))

node_reader -->|"runs"| node_entry
node_automation -->|"requests"| node_cli
node_automation -->|"requests"| node_mcp
node_entry -->|"dispatches"| node_cli
node_cli -->|"submits"| node_application
node_application -->|"queries"| node_host
node_host -->|"executes"| node_engine
node_cli -->|"formats"| node_render
node_reader -->|"navigates"| node_tui
node_tui -->|"opens documents"| node_application
node_tui -->|"presents"| node_ui_model
node_mcp -->|"executes"| node_engine
node_mcp -->|"discovers"| node_catalog
node_mcp -->|"accepts requests"| node_protocol
node_catalog -->|"scans"| node_sources
node_loader -->|"resolves"| node_catalog
node_loader -->|"locates"| node_manuals
node_loader -->|"parses"| node_markdown
node_loader -->|"parses"| node_roff
node_markdown -->|"encodes"| node_codec
node_roff -->|"renders"| node_codec
node_codec -->|"normalizes"| node_ir
node_engine -->|"loads"| node_loader
node_engine -->|"projects"| node_query
node_engine -->|"queries scope"| node_scope
node_query -->|"reads"| node_ir
node_scope -->|"queries snapshots"| node_ir
node_render -->|"renders"| node_ir
node_protocol -->|"defines contracts"| node_ir

click node_entry "https://github.com/bryanheby/mant/blob/main/crates/mant/src/main.rs"
click node_cli "https://github.com/bryanheby/mant/blob/main/crates/mant/src/cli/query.rs"
click node_application "https://github.com/bryanheby/mant/blob/main/crates/mant/src/application.rs"
click node_host "https://github.com/bryanheby/mant/blob/main/crates/mant/src/host.rs"
click node_tui "https://github.com/bryanheby/mant/blob/main/crates/mant-ui/src/app/mod.rs"
click node_mcp "https://github.com/bryanheby/mant/blob/main/crates/mant/src/mcp/service.rs"
click node_catalog "https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/catalog.rs"
click node_sources "https://github.com/bryanheby/mant/blob/main/crates/mant-sources/src/lib.rs"
click node_loader "https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/loading.rs"
click node_manuals "https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/manual_paths.rs"
click node_markdown "https://github.com/bryanheby/mant/blob/main/crates/mant-codec/src/markdown/mod.rs"
click node_roff "https://github.com/bryanheby/mant/blob/main/crates/libmandoc-rs/src/parser.rs"
click node_codec "https://github.com/bryanheby/mant/blob/main/crates/mant-codec/src/lib.rs"
click node_ir "https://github.com/bryanheby/mant/blob/main/crates/mant-ir/src/document.rs"
click node_engine "https://github.com/bryanheby/mant/blob/main/crates/mant-engine/src/query.rs"
click node_query "https://github.com/bryanheby/mant/blob/main/crates/mant-query/src/lib.rs"
click node_scope "https://github.com/bryanheby/mant/blob/main/crates/mant-query/src/scope_query.rs"
click node_protocol "https://github.com/bryanheby/mant/blob/main/crates/mant-protocol/src/lib.rs"
click node_render "https://github.com/bryanheby/mant/blob/main/crates/mant-render/src/lib.rs"
click node_ui_model "https://github.com/bryanheby/mant/blob/main/crates/mant-ui/src/document/mod.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_catalog,node_sources,node_loader,node_manuals,node_markdown,node_roff toneBlue
class node_codec,node_ir toneAmber
class node_engine,node_query,node_scope toneMint
class node_entry,node_cli,node_application,node_host,node_tui,node_mcp,node_ui_model toneRose
class node_protocol,node_render,node_reader,node_automation toneIndigo
```

## Components

### Sources and parsing

- [Document catalog](https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/catalog.rs): `crates/mant-loader/src/catalog.rs`
- [Registered sources](https://github.com/bryanheby/mant/blob/main/crates/mant-sources/src/lib.rs): `crates/mant-sources/src/lib.rs`
- [Document loading](https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/loading.rs): `crates/mant-loader/src/loading.rs`
- [Manual paths](https://github.com/bryanheby/mant/blob/main/crates/mant-loader/src/manual_paths.rs): `crates/mant-loader/src/manual_paths.rs`
- [Markdown parser](https://github.com/bryanheby/mant/blob/main/crates/mant-codec/src/markdown/mod.rs): `crates/mant-codec/src/markdown/mod.rs`
- [Roff parser](https://github.com/bryanheby/mant/blob/main/crates/libmandoc-rs/src/parser.rs): `crates/libmandoc-rs/src/parser.rs`

### Document model

- [Document codec](https://github.com/bryanheby/mant/blob/main/crates/mant-codec/src/lib.rs): `crates/mant-codec/src/lib.rs`
- [Normalized document](https://github.com/bryanheby/mant/blob/main/crates/mant-ir/src/document.rs): `crates/mant-ir/src/document.rs`

### Query engine

- [Request engine](https://github.com/bryanheby/mant/blob/main/crates/mant-engine/src/query.rs): `crates/mant-engine/src/query.rs`
- [Document queries](https://github.com/bryanheby/mant/blob/main/crates/mant-query/src/lib.rs): `crates/mant-query/src/lib.rs`
- [Scope queries](https://github.com/bryanheby/mant/blob/main/crates/mant-query/src/scope_query.rs): `crates/mant-query/src/scope_query.rs`

### User interfaces

- [Executable entry](https://github.com/bryanheby/mant/blob/main/crates/mant/src/main.rs): `crates/mant/src/main.rs`
- [CLI query](https://github.com/bryanheby/mant/blob/main/crates/mant/src/cli/query.rs): `crates/mant/src/cli/query.rs`
- [Application requests](https://github.com/bryanheby/mant/blob/main/crates/mant/src/application.rs): `crates/mant/src/application.rs`
- [Host services](https://github.com/bryanheby/mant/blob/main/crates/mant/src/host.rs): `crates/mant/src/host.rs`
- [Interactive reader](https://github.com/bryanheby/mant/blob/main/crates/mant-ui/src/app/mod.rs): `crates/mant-ui/src/app/mod.rs`
- [MCP service](https://github.com/bryanheby/mant/blob/main/crates/mant/src/mcp/service.rs): `crates/mant/src/mcp/service.rs`
- [TUI presentation](https://github.com/bryanheby/mant/blob/main/crates/mant-ui/src/document/mod.rs): `crates/mant-ui/src/document/mod.rs`

### Protocol and rendering

- [Typed API contracts](https://github.com/bryanheby/mant/blob/main/crates/mant-protocol/src/lib.rs): `crates/mant-protocol/src/lib.rs`
- [Output rendering](https://github.com/bryanheby/mant/blob/main/crates/mant-render/src/lib.rs): `crates/mant-render/src/lib.rs`

### Other components

- **Reader**
- **Scripts and agents**

## Connections

- Reader → Executable entry: runs
- Scripts and agents → CLI query: requests
- Scripts and agents → MCP service: requests
- Executable entry → CLI query: dispatches
- CLI query → Application requests: submits
- Application requests → Host services: queries
- Host services → Request engine: executes
- CLI query → Output rendering: formats
- Reader → Interactive reader: navigates
- Interactive reader → Application requests: opens documents
- Interactive reader → TUI presentation: presents
- MCP service → Request engine: executes
- MCP service → Document catalog: discovers
- MCP service → Typed API contracts: accepts requests
- Document catalog → Registered sources: scans
- Document loading → Document catalog: resolves
- Document loading → Manual paths: locates
- Document loading → Markdown parser: parses
- Document loading → Roff parser: parses
- Markdown parser → Document codec: encodes
- Roff parser → Document codec: renders
- Document codec → Normalized document: normalizes
- Request engine → Document loading: loads
- Request engine → Document queries: projects
- Request engine → Scope queries: queries scope
- Document queries → Normalized document: reads
- Scope queries → Normalized document: queries snapshots
- Output rendering → Normalized document: renders
- Typed API contracts → Normalized document: defines contracts
