# kaiz-dev/mini-blog architecture

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

- Interactive diagram: https://gitdiagram.com/kaiz-dev/mini-blog
- Repository: https://github.com/kaiz-dev/mini-blog

## Overview

Mini Blog is a full-stack publishing and community platform: a React SPA presents blog, category, contact, and account workflows over a Spring Boot REST API, with STOMP/WebSocket for live comments. Blog discovery supports paginated and cursor-based search; authors manage posts, readers participate in comments, and administrators manage contacts. Backend services apply domain logic and persist through repositories. The README documents PostgreSQL, Redis, and optional WebAuthn; only sampled controller, auth, and live-comment implementations were inspected, so unsampled service wiring is represented conservatively.

Main entry points: [`ui/src/api/client.js`](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/api/client.js) (HTTP API client), [`server/miniblog/src/main/java/com/miniblog/repository`](https://github.com/kaiz-dev/mini-blog/tree/main/server/miniblog/src/main/java/com/miniblog/repository) (JPA repositories), [`ui/src/components/App/index.js`](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/App/index.js) (React application), [`server/miniblog/src/main/java/com/miniblog/controller/BlogController.java`](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/BlogController.java) (Blog endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["React experience"]
  node_spa["React application<br/>[index.js]"]
  node_blog_ui["Blog browsing<br/>[index.jsx]"]
  node_blog_detail_ui["Blog detail<br/>[index.jsx]"]
  node_auth_ui["Sign in and register<br/>[SignInPage.jsx]"]
  node_contact_ui["Contact workflows<br/>[index.jsx]"]
  node_api_client["HTTP API client<br/>[client.js]"]
end

subgraph group_content["Publishing and contacts"]
  node_blog_api["Blog endpoints"]
  node_blog_logic["Blog services"]
  node_category_api["Category endpoints"]
  node_category_logic["Category services"]
  node_contact_api["Contact endpoints"]
  node_contact_logic["Contact services"]
end

subgraph group_identity["Identity and security"]
  node_auth_api["Authentication endpoints"]
  node_auth_logic["Authentication services"]
  node_security["JWT and WebAuthn"]
  node_redis[("Redis blacklist")]
end

subgraph group_realtime["Live comments"]
  node_live_hook["Live comment client<br/>[useLiveComments.js]"]
  node_comment_api["Comment endpoints"]
  node_comment_logic["Comment services"]
  node_ws_config["STOMP WebSocket"]
end

subgraph group_persistence["Backend persistence"]
  node_repositories["JPA repositories"]
  node_postgres[("PostgreSQL")]
end

node_visitor(("Visitor or member"))

node_visitor -->|"uses"| node_spa
node_spa -->|"presents"| node_blog_ui
node_spa -->|"presents"| node_auth_ui
node_spa -->|"presents"| node_contact_ui
node_blog_ui -->|"requests posts"| node_api_client
node_blog_detail_ui -->|"requests detail"| node_api_client
node_auth_ui -->|"requests auth"| node_api_client
node_contact_ui -->|"requests contacts"| node_api_client
node_api_client -->|"sends REST"| node_blog_api
node_api_client -->|"sends REST"| node_auth_api
node_api_client -->|"sends REST"| node_contact_api
node_blog_api -->|"delegates"| node_blog_logic
node_blog_api -->|"lists comments"| node_comment_logic
node_category_api -->|"delegates"| node_category_logic
node_contact_api -->|"delegates"| node_contact_logic
node_auth_api -->|"delegates"| node_auth_logic
node_security -->|"protects"| node_auth_api
node_blog_logic -->|"reads and writes"| node_repositories
node_category_logic -->|"reads and writes"| node_repositories
node_contact_logic -->|"reads and writes"| node_repositories
node_auth_logic -->|"reads and writes"| node_repositories
node_repositories -->|"persists"| node_postgres
node_live_hook -->|"loads comments"| node_api_client
node_live_hook -->|"connects STOMP"| node_ws_config
node_ws_config -->|"dispatches messages"| node_comment_api
node_comment_api -->|"delegates"| node_comment_logic
node_comment_api -->|"broadcasts updates"| node_ws_config
node_comment_logic -->|"reads and writes"| node_repositories
node_auth_logic -.->|"revokes tokens"| node_redis

click node_spa "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/App/index.js"
click node_blog_ui "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/Blog/index.jsx"
click node_blog_detail_ui "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/BlogDetail/index.jsx"
click node_auth_ui "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/pages/SignInPage.jsx"
click node_contact_ui "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/Contact/index.jsx"
click node_api_client "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/api/client.js"
click node_live_hook "https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/hooks/useLiveComments.js"
click node_blog_api "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/BlogController.java"
click node_blog_logic "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/BlogServiceImpl.java"
click node_category_api "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/CategoryController.java"
click node_category_logic "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/CategoryServiceImpl.java"
click node_contact_api "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/ContactController.java"
click node_contact_logic "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/ContactServiceImpl.java"
click node_auth_api "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/AuthController.java"
click node_auth_logic "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/AuthServiceImpl.java"
click node_security "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/config/SecurityConfig.java"
click node_comment_api "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/CommentController.java"
click node_comment_logic "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/CommentServiceImpl.java"
click node_ws_config "https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/config/WebSocketConfig.java"
click node_repositories "https://github.com/kaiz-dev/mini-blog/tree/main/server/miniblog/src/main/java/com/miniblog/repository"

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_spa,node_blog_ui,node_blog_detail_ui,node_auth_ui,node_contact_ui,node_api_client toneBlue
class node_blog_api,node_blog_logic,node_category_api,node_category_logic,node_contact_api,node_contact_logic toneAmber
class node_auth_api,node_auth_logic,node_security,node_redis toneMint
class node_live_hook,node_comment_api,node_comment_logic,node_ws_config toneRose
class node_repositories,node_postgres,node_visitor toneIndigo
```

## Components

### React experience

- [React application](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/App/index.js): `ui/src/components/App/index.js`
- [Blog browsing](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/Blog/index.jsx): `ui/src/components/Blog/index.jsx`
- [Blog detail](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/BlogDetail/index.jsx): `ui/src/components/BlogDetail/index.jsx`
- [Sign in and register](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/pages/SignInPage.jsx): `ui/src/pages/SignInPage.jsx`
- [Contact workflows](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/components/Contact/index.jsx): `ui/src/components/Contact/index.jsx`
- [HTTP API client](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/api/client.js): `ui/src/api/client.js`

### Publishing and contacts

- [Blog endpoints](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/BlogController.java): `server/miniblog/src/main/java/com/miniblog/controller/BlogController.java`
- [Blog services](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/BlogServiceImpl.java): `server/miniblog/src/main/java/com/miniblog/service/impl/BlogServiceImpl.java`
- [Category endpoints](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/CategoryController.java): `server/miniblog/src/main/java/com/miniblog/controller/CategoryController.java`
- [Category services](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/CategoryServiceImpl.java): `server/miniblog/src/main/java/com/miniblog/service/impl/CategoryServiceImpl.java`
- [Contact endpoints](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/ContactController.java): `server/miniblog/src/main/java/com/miniblog/controller/ContactController.java`
- [Contact services](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/ContactServiceImpl.java): `server/miniblog/src/main/java/com/miniblog/service/impl/ContactServiceImpl.java`

### Identity and security

- [Authentication endpoints](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/AuthController.java): `server/miniblog/src/main/java/com/miniblog/controller/AuthController.java`
- [Authentication services](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/AuthServiceImpl.java): `server/miniblog/src/main/java/com/miniblog/service/impl/AuthServiceImpl.java`
- [JWT and WebAuthn](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/config/SecurityConfig.java): `server/miniblog/src/main/java/com/miniblog/config/SecurityConfig.java`
- **Redis blacklist**

### Live comments

- [Live comment client](https://github.com/kaiz-dev/mini-blog/blob/main/ui/src/hooks/useLiveComments.js): `ui/src/hooks/useLiveComments.js`
- [Comment endpoints](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/controller/CommentController.java): `server/miniblog/src/main/java/com/miniblog/controller/CommentController.java`
- [Comment services](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/service/impl/CommentServiceImpl.java): `server/miniblog/src/main/java/com/miniblog/service/impl/CommentServiceImpl.java`
- [STOMP WebSocket](https://github.com/kaiz-dev/mini-blog/blob/main/server/miniblog/src/main/java/com/miniblog/config/WebSocketConfig.java): `server/miniblog/src/main/java/com/miniblog/config/WebSocketConfig.java`

### Backend persistence

- [JPA repositories](https://github.com/kaiz-dev/mini-blog/tree/main/server/miniblog/src/main/java/com/miniblog/repository): `server/miniblog/src/main/java/com/miniblog/repository`
- **PostgreSQL**

### Other components

- **Visitor or member**

## Connections

- Visitor or member → React application: uses
- React application → Blog browsing: presents
- React application → Sign in and register: presents
- React application → Contact workflows: presents
- Blog browsing → HTTP API client: requests posts
- Blog detail → HTTP API client: requests detail
- Sign in and register → HTTP API client: requests auth
- Contact workflows → HTTP API client: requests contacts
- HTTP API client → Blog endpoints: sends REST
- HTTP API client → Authentication endpoints: sends REST
- HTTP API client → Contact endpoints: sends REST
- Blog endpoints → Blog services: delegates
- Blog endpoints → Comment services: lists comments
- Category endpoints → Category services: delegates
- Contact endpoints → Contact services: delegates
- Authentication endpoints → Authentication services: delegates
- JWT and WebAuthn → Authentication endpoints: protects
- Blog services → JPA repositories: reads and writes
- Category services → JPA repositories: reads and writes
- Contact services → JPA repositories: reads and writes
- Authentication services → JPA repositories: reads and writes
- JPA repositories → PostgreSQL: persists
- Live comment client → HTTP API client: loads comments
- Live comment client → STOMP WebSocket: connects STOMP
- STOMP WebSocket → Comment endpoints: dispatches messages
- Comment endpoints → Comment services: delegates
- Comment endpoints → STOMP WebSocket: broadcasts updates
- Comment services → JPA repositories: reads and writes
- Authentication services → Redis blacklist: revokes tokens
