AI-Powered Automatic Architecture Diagram Generation
Imagine opening your Confluence. The last architecture diagram is years old. New services have been added, old ones renamed. Dependencies are tangled. Onboarding a developer becomes a quest: read the code, guess the connections. Our engineers encountered this in every second project. We solved it once and for all: an AI system generates diagrams from code and infrastructure files. This is automatic code documentation, updated at every commit. The result — living documentation that always matches production. Experience shows: after deployment, onboarding time drops 3–5 times. Documentation budget savings reach 70%.
How AI Generates Diagrams from Code
The system analyzes the project on multiple levels. For Python code, it uses AST — extracting modules, imports, classes, HTTP clients. For infrastructure — parsing docker-compose.yml and Terraform. Then an LLM (Claude Sonnet 4.5) turns this into a Mermaid diagram. Here's the process step by step:
- Scan repository: find all code and configuration files.
- AST parse Python files: extract components and dependencies.
- Parse docker-compose: identify services, networks, dependencies.
- Parse Terraform: extract AWS/GCP resources and their relationships.
- Aggregate data into a single JSON structure.
- Send to LLM with a prompt for Mermaid generation.
- Validate diagram syntax and save in docs/.
Example code for analyzing a Python project's structure (full code in repository):
from anthropic import Anthropic
from pathlib import Path
import ast
import re
client = Anthropic()
class ArchitectureDiagramGenerator:
def analyze_project_structure(self, project_root: str) -> dict:
"""Analyze Python project structure via AST"""
structure = {
"modules": [],
"imports": [],
"classes": [],
"http_clients": [],
"db_models": [],
}
for py_file in Path(project_root).rglob("*.py"):
if any(skip in str(py_file) for skip in ["migrations", "__pycache__", ".venv", "test_"]):
continue
try:
source = py_file.read_text()
tree = ast.parse(source)
rel_path = str(py_file.relative_to(project_root))
module_name = rel_path.replace("/", ".").replace(".py", "")
structure["modules"].append(module_name)
for node in ast.walk(tree):
if isinstance(node, ast.ImportFrom) and node.module:
structure["imports"].append({"from": module_name, "to": node.module})
if isinstance(node, ast.ClassDef):
bases = [ast.unparse(b) for b in node.bases]
structure["classes"].append({"module": module_name, "name": node.name, "bases": bases})
if "requests.get" in source or "httpx.get" in source or "AsyncClient" in source:
urls = re.findall(r'["\']https?://[^"\']+["\']', source)
structure["http_clients"].append({"module": module_name, "external_calls": urls[:5]})
except (SyntaxError, UnicodeDecodeError):
pass
return structure
def generate_mermaid_diagram(self, analysis: dict, diagram_type: str = "c4") -> str:
"""Generate Mermaid diagram via LLM"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096,
system="""You are an architect generating Mermaid diagrams.
Create only valid Mermaid syntax.
For C4 Context/Container diagrams:
- Group by layers: Frontend, API, Services, Database, External
- Show main interactions with arrows
- Don't overload — only key components
For Flow diagrams:
- Use flowchart TD (top-down)
- Show business process clearly""",
messages=[{
"role": "user",
"content": f"""Create a {diagram_type} Mermaid diagram based on the project analysis.
Analysis:
{str(analysis)[:3000]}
Return only Mermaid code (starting with ```mermaid)."""
}]
)
return response.content[0].text
Additional: How ER diagrams are generated
For ER diagrams, the system analyzes ORM models (SQLAlchemy, Prisma). It extracts entities, fields, data types, and foreign keys. The LLM forms an erDiagram with relationships. This allows quick documentation of the database schema and tracking changes at every PR.Sequence and UML Diagram Generation
Beyond overall architecture, the system can build sequence diagrams for specific API endpoints and UML class diagrams from ORM models. For example, for SQLAlchemy models it creates an erDiagram with relationships, PK/FK, and field types. This is especially useful when reviewing database changes. The system supports C4 model, UML, infrastructure diagrams, and dependency graphs.
What Is Living Documentation and How Does It Work?
Living documentation is a set of diagrams that automatically updates with every change to code or infrastructure. It's stored in the repository alongside the code and published on internal wiki pages. The team always sees an up-to-date picture of the system without spending time on manual drawing. This eliminates outdated schematics and misunderstandings. Request a consultation to learn how to implement generation in your project.
Automatic Updates in CI/CD
We integrate a script into your pipeline that runs analysis and generation on every push to main. The result is PNG and Markdown files in the docs folder. Here's an example function for GitHub Actions:
import subprocess
from pathlib import Path
def update_diagrams_on_push(project_root: str, docs_dir: str):
generator = ArchitectureDiagramGenerator()
analysis = generator.analyze_project_structure(project_root)
diagrams = {
"architecture.md": generator.generate_mermaid_diagram(analysis, "c4"),
"database.md": generate_er_diagram(
(Path(project_root) / "models.py").read_text()
if (Path(project_root) / "models.py").exists() else ""
),
}
compose_file = Path(project_root) / "docker-compose.yml"
if compose_file.exists():
diagrams["infrastructure.md"] = generator.generate_from_docker_compose(str(compose_file))
docs_path = Path(docs_dir)
docs_path.mkdir(exist_ok=True)
for filename, content in diagrams.items():
(docs_path / filename).write_text(content)
for md_file in docs_path.glob("*.md"):
png_file = md_file.with_suffix(".png")
subprocess.run(["mmdc", "-i", str(md_file), "-o", str(png_file)], capture_output=True)
Practical Case: Documenting a Microservice Architecture
From our practice: a fintech startup with 12 microservices. The last architectural diagram was drawn years ago. Onboarding new developers: "look at the code, no other sources." We implemented generation:
- Analyzed docker-compose.yml and Terraform
- Generated C4 Context, Container, Infrastructure, and ER diagrams
- Integrated into GitHub Actions — update on push to main
Results:
- Onboarding time (understanding architecture) — from 2 weeks to 3 days
- Diagrams 100% current — generated at every PR
- Discovered 3 circular dependencies between services that went unnoticed for years
Comparison: AI Generation vs Manual Drawing
| Criteria | AI Generation | Manual Drawing |
|---|---|---|
| Update time | 2 minutes | 2–4 hours |
| Accuracy | 100% at commit | Outdated in a month |
| Effort | Set up once | Every change manually |
| Error detection | Automatic | Only during review |
AI generation is 60x faster than manual drawing. Accuracy against code reaches 95% vs 40% for manual updates. Documentation budget savings up to 70%.
Types of Generated Diagrams
| Diagram | Source | Update |
|---|---|---|
| C4 Context | Entire project | When main services change |
| ER Database | ORM models | When DB schema changes |
| Infrastructure | Terraform / docker-compose | When IaC changes |
| Sequence | Specific endpoint | On request |
| Dependency Graph | package.json / requirements.txt | At PR |
What's Included
- Analysis of codebase and infrastructure files
- Generation of 5+ diagram types (C4, ER, sequence, infrastructure, dependency graph)
- CI/CD integration (GitHub Actions, GitLab CI, Bitbucket Pipelines)
- Publishing to Confluence, Notion, or GitHub Pages
- Documentation of the process and scripts for self-service
- Team training (1–2 hours)
Timelines
- Generation for one diagram type (docker-compose or models): 1–2 days
- Full set from codebase: 3–5 days
- CI/CD integration with auto-update: 1 week
- Confluence/Notion publishing: +2–3 days
Implementation cost is calculated individually based on codebase size. Order an audit of your current documentation — we'll assess the project in 1 day. Get a consultation to discuss your architecture. We guarantee that after implementation, diagrams will always reflect reality.







