# analissiberpurwakarta/blog architecture

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

- Interactive diagram: https://gitdiagram.com/analissiberpurwakarta/blog
- Repository: https://github.com/analissiberpurwakarta/blog

## Overview

This is a Flask-backed cybersecurity technical blog, with Markdown posts as its content source and a static-site export path. Readers browse the home page, post details, tags, archives, or search; post details convert Markdown to sanitized HTML before rendering. The loader supplies post metadata and archive filtering, while templates produce pages. The sampled source confirms the export script renders Flask routes into files and copies static assets. Template wiring for browser search and other unsampled details is not asserted.

Main entry points: [`app.py`](https://github.com/analissiberpurwakarta/blog/blob/main/app.py) (Flask routes), [`build.py`](https://github.com/analissiberpurwakarta/blog/blob/main/build.py) (Static site exporter), [`utils/loader.py`](https://github.com/analissiberpurwakarta/blog/blob/main/utils/loader.py) (Post and archive loader), [`templates`](https://github.com/analissiberpurwakarta/blog/tree/main/templates) (Page templates)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_flask["Flask routes<br/>[app.py]"]
  node_templates["Page templates"]
  node_browser["Browser interactions"]
end

subgraph group_content["Content processing"]
  node_posts["Markdown posts"]
  node_loader["Post and archive loader<br/>[loader.py]"]
  node_parser["Markdown sanitizer<br/>[parser.py]"]
end

subgraph group_publishing["Static publishing"]
  node_builder["Static site exporter<br/>[build.py]"]
  node_staticfiles["Static assets"]
  node_output["Generated site"]
end

node_reader(("Reader"))

node_reader -->|"requests pages"| node_flask
node_flask -->|"loads content"| node_loader
node_loader -->|"reads Markdown"| node_posts
node_flask -->|"converts post"| node_parser
node_flask -->|"renders pages"| node_templates
node_templates -->|"returns HTML"| node_reader
node_builder -->|"requests routes"| node_flask
node_builder -->|"loads export data"| node_loader
node_builder -->|"copies assets"| node_staticfiles
node_builder -->|"writes pages"| node_output

click node_flask "https://github.com/analissiberpurwakarta/blog/blob/main/app.py"
click node_templates "https://github.com/analissiberpurwakarta/blog/tree/main/templates"
click node_browser "https://github.com/analissiberpurwakarta/blog/tree/main/static/js"
click node_posts "https://github.com/analissiberpurwakarta/blog/tree/main/posts"
click node_loader "https://github.com/analissiberpurwakarta/blog/blob/main/utils/loader.py"
click node_parser "https://github.com/analissiberpurwakarta/blog/blob/main/utils/parser.py"
click node_builder "https://github.com/analissiberpurwakarta/blog/blob/main/build.py"
click node_staticfiles "https://github.com/analissiberpurwakarta/blog/tree/main/static"
click node_output "https://github.com/analissiberpurwakarta/blog/tree/main/output"

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_flask,node_templates,node_browser toneBlue
class node_posts,node_loader,node_parser toneAmber
class node_builder,node_staticfiles,node_output toneMint
class node_reader toneIndigo
```

## Components

### Web experience

- [Flask routes](https://github.com/analissiberpurwakarta/blog/blob/main/app.py): `app.py`
- [Page templates](https://github.com/analissiberpurwakarta/blog/tree/main/templates): `templates`
- [Browser interactions](https://github.com/analissiberpurwakarta/blog/tree/main/static/js): `static/js`

### Content processing

- [Markdown posts](https://github.com/analissiberpurwakarta/blog/tree/main/posts): `posts`
- [Post and archive loader](https://github.com/analissiberpurwakarta/blog/blob/main/utils/loader.py): `utils/loader.py`
- [Markdown sanitizer](https://github.com/analissiberpurwakarta/blog/blob/main/utils/parser.py): `utils/parser.py`

### Static publishing

- [Static site exporter](https://github.com/analissiberpurwakarta/blog/blob/main/build.py): `build.py`
- [Static assets](https://github.com/analissiberpurwakarta/blog/tree/main/static): `static`
- [Generated site](https://github.com/analissiberpurwakarta/blog/tree/main/output): `output`

### Other components

- **Reader**

## Connections

- Reader → Flask routes: requests pages
- Flask routes → Post and archive loader: loads content
- Post and archive loader → Markdown posts: reads Markdown
- Flask routes → Markdown sanitizer: converts post
- Flask routes → Page templates: renders pages
- Page templates → Reader: returns HTML
- Static site exporter → Flask routes: requests routes
- Static site exporter → Post and archive loader: loads export data
- Static site exporter → Static assets: copies assets
- Static site exporter → Generated site: writes pages
