# mirajg/miraj-blog architecture

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

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

## Overview

Miraj’s Dev Blog is a read-only public blog with a private authoring dashboard. Visitors browse recent, categorized, and individual published posts; the admin logs in, manages drafts and published posts, and changes become visible through page revalidation. The sampled code shows API-to-service-to-MongoDB ownership and login security. Category pages, sitemap/robots, and some admin screens are in the tree but were not sampled, so their internal links are not asserted.

Main entry points: [`src/services/post.service.ts`](https://github.com/mirajg/miraj-blog/blob/main/src/services/post.service.ts) (Post service), [`src/app/api/posts/route.ts`](https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/route.ts) (Post API), [`src/app/api/posts/[id]/route.ts`](https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/%5Bid%5D/route.ts) (Single-post API), [`src/app/(public)/blog/[slug]/page.tsx`](https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/blog/%5Bslug%5D/page.tsx) (Post reader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public blog"]
  node_home["Home feed<br/>[page.tsx]"]
  node_blog_index["Post index<br/>[page.tsx]"]
  node_category_page["Category archive<br/>[page.tsx]"]
  node_post_page["Post reader<br/>[page.tsx]"]
  node_post_views["Blog components"]
  node_seo["SEO metadata<br/>[seo.ts]"]
  node_site_map["Sitemap and robots<br/>[sitemap.ts]"]
end

subgraph group_admin["Admin authoring"]
  node_admin_dashboard["Admin dashboard<br/>[page.tsx]"]
  node_admin_editor["Post editor<br/>[PostForm.tsx]"]
  node_admin_login["Login form<br/>[LoginForm.tsx]"]
  node_post_api["Post API<br/>[route.ts]"]
  node_post_item_api["Single-post API<br/>[route.ts]"]
end

subgraph group_core["Content and data"]
  node_validation["Post validation<br/>[validation.ts]"]
  node_service["Post service<br/>[post.service.ts]"]
  node_post_model["Post model<br/>[Post.ts]"]
  node_database[("MongoDB<br/>[db.ts]")]
  node_revalidate["Page revalidation<br/>[revalidate.ts]"]
end

subgraph group_security["Access and support"]
  node_login_api["Login API<br/>[route.ts]"]
  node_session["Session auth<br/>[auth.ts]"]
  node_rate_limit["Login throttling<br/>[rate-limit.ts]"]
end

node_visitor(("Visitor"))
node_owner(("Blog owner"))

node_visitor -->|"browses"| node_home
node_visitor -->|"browses"| node_blog_index
node_visitor -->|"browses"| node_category_page
node_visitor -->|"reads"| node_post_page
node_home -->|"loads posts"| node_service
node_blog_index -->|"loads posts"| node_service
node_post_page -->|"loads post"| node_service
node_post_page -->|"renders content"| node_post_views
node_post_page -->|"builds metadata"| node_seo
node_service -->|"connects"| node_database
node_service -->|"queries"| node_post_model
node_owner -->|"signs in"| node_admin_login
node_admin_login -.->|"submits credentials"| node_login_api
node_login_api -->|"checks and creates session"| node_session
node_login_api -->|"checks attempts"| node_rate_limit
node_owner -->|"manages posts"| node_admin_dashboard
node_admin_dashboard -->|"requires admin"| node_session
node_admin_dashboard -->|"loads posts"| node_service
node_admin_editor -.->|"submits post"| node_post_api
node_admin_editor -.->|"updates post"| node_post_item_api
node_post_api -->|"checks admin"| node_session
node_post_api -->|"validates input"| node_validation
node_post_api -->|"creates or lists"| node_service
node_post_api -->|"refreshes pages"| node_revalidate
node_post_item_api -->|"checks admin"| node_session
node_post_item_api -->|"validates input"| node_validation
node_post_item_api -->|"updates or deletes"| node_service
node_post_item_api -->|"refreshes pages"| node_revalidate
node_site_map -.->|"serves discovery"| node_visitor

click node_home "https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/page.tsx"
click node_blog_index "https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/blog/page.tsx"
click node_category_page "https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/category/%5Bcategory%5D/page.tsx"
click node_post_page "https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/blog/%5Bslug%5D/page.tsx"
click node_post_views "https://github.com/mirajg/miraj-blog/blob/main/src/components/blog/MarkdownContent.tsx"
click node_seo "https://github.com/mirajg/miraj-blog/blob/main/src/lib/seo.ts"
click node_admin_dashboard "https://github.com/mirajg/miraj-blog/blob/main/src/app/admin/page.tsx"
click node_admin_editor "https://github.com/mirajg/miraj-blog/blob/main/src/components/admin/PostForm.tsx"
click node_admin_login "https://github.com/mirajg/miraj-blog/blob/main/src/components/admin/LoginForm.tsx"
click node_post_api "https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/route.ts"
click node_post_item_api "https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/%5Bid%5D/route.ts"
click node_login_api "https://github.com/mirajg/miraj-blog/blob/main/src/app/api/auth/login/route.ts"
click node_session "https://github.com/mirajg/miraj-blog/blob/main/src/lib/auth.ts"
click node_rate_limit "https://github.com/mirajg/miraj-blog/blob/main/src/lib/rate-limit.ts"
click node_validation "https://github.com/mirajg/miraj-blog/blob/main/src/lib/validation.ts"
click node_service "https://github.com/mirajg/miraj-blog/blob/main/src/services/post.service.ts"
click node_post_model "https://github.com/mirajg/miraj-blog/blob/main/src/models/Post.ts"
click node_database "https://github.com/mirajg/miraj-blog/blob/main/src/lib/db.ts"
click node_revalidate "https://github.com/mirajg/miraj-blog/blob/main/src/lib/revalidate.ts"
click node_site_map "https://github.com/mirajg/miraj-blog/blob/main/src/app/sitemap.ts"

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_home,node_blog_index,node_category_page,node_post_page,node_post_views,node_seo,node_site_map toneBlue
class node_admin_dashboard,node_admin_editor,node_admin_login,node_post_api,node_post_item_api toneAmber
class node_validation,node_service,node_post_model,node_database,node_revalidate toneMint
class node_login_api,node_session,node_rate_limit toneRose
class node_visitor,node_owner toneIndigo
```

## Components

### Public blog

- [Home feed](https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/page.tsx): `src/app/(public)/page.tsx`
- [Post index](https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/blog/page.tsx): `src/app/(public)/blog/page.tsx`
- [Category archive](https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/category/%5Bcategory%5D/page.tsx): `src/app/(public)/category/[category]/page.tsx`
- [Post reader](https://github.com/mirajg/miraj-blog/blob/main/src/app/(public)/blog/%5Bslug%5D/page.tsx): `src/app/(public)/blog/[slug]/page.tsx`
- [Blog components](https://github.com/mirajg/miraj-blog/blob/main/src/components/blog/MarkdownContent.tsx): `src/components/blog/MarkdownContent.tsx`
- [SEO metadata](https://github.com/mirajg/miraj-blog/blob/main/src/lib/seo.ts): `src/lib/seo.ts`
- [Sitemap and robots](https://github.com/mirajg/miraj-blog/blob/main/src/app/sitemap.ts): `src/app/sitemap.ts`

### Admin authoring

- [Admin dashboard](https://github.com/mirajg/miraj-blog/blob/main/src/app/admin/page.tsx): `src/app/admin/page.tsx`
- [Post editor](https://github.com/mirajg/miraj-blog/blob/main/src/components/admin/PostForm.tsx): `src/components/admin/PostForm.tsx`
- [Login form](https://github.com/mirajg/miraj-blog/blob/main/src/components/admin/LoginForm.tsx): `src/components/admin/LoginForm.tsx`
- [Post API](https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/route.ts): `src/app/api/posts/route.ts`
- [Single-post API](https://github.com/mirajg/miraj-blog/blob/main/src/app/api/posts/%5Bid%5D/route.ts): `src/app/api/posts/[id]/route.ts`

### Content and data

- [Post validation](https://github.com/mirajg/miraj-blog/blob/main/src/lib/validation.ts): `src/lib/validation.ts`
- [Post service](https://github.com/mirajg/miraj-blog/blob/main/src/services/post.service.ts): `src/services/post.service.ts`
- [Post model](https://github.com/mirajg/miraj-blog/blob/main/src/models/Post.ts): `src/models/Post.ts`
- [MongoDB](https://github.com/mirajg/miraj-blog/blob/main/src/lib/db.ts): `src/lib/db.ts`
- [Page revalidation](https://github.com/mirajg/miraj-blog/blob/main/src/lib/revalidate.ts): `src/lib/revalidate.ts`

### Access and support

- [Login API](https://github.com/mirajg/miraj-blog/blob/main/src/app/api/auth/login/route.ts): `src/app/api/auth/login/route.ts`
- [Session auth](https://github.com/mirajg/miraj-blog/blob/main/src/lib/auth.ts): `src/lib/auth.ts`
- [Login throttling](https://github.com/mirajg/miraj-blog/blob/main/src/lib/rate-limit.ts): `src/lib/rate-limit.ts`

### Other components

- **Visitor**
- **Blog owner**

## Connections

- Visitor → Home feed: browses (evidence: `README.md`)
- Visitor → Post index: browses (evidence: `README.md`)
- Visitor → Category archive: browses (evidence: `README.md`)
- Visitor → Post reader: reads (evidence: `README.md`)
- Home feed → Post service: loads posts (evidence: `src/app/(public)/page.tsx`)
- Post index → Post service: loads posts (evidence: `src/app/(public)/blog/page.tsx`)
- Post reader → Post service: loads post (evidence: `src/app/(public)/blog/[slug]/page.tsx`)
- Post reader → Blog components: renders content (evidence: `src/app/(public)/blog/[slug]/page.tsx`)
- Post reader → SEO metadata: builds metadata (evidence: `src/app/(public)/blog/[slug]/page.tsx`)
- Post service → MongoDB: connects (evidence: `src/services/post.service.ts`)
- Post service → Post model: queries (evidence: `src/services/post.service.ts`)
- Blog owner → Login form: signs in (evidence: `README.md`)
- Login form → Login API: submits credentials
- Login API → Session auth: checks and creates session (evidence: `src/app/api/auth/login/route.ts`)
- Login API → Login throttling: checks attempts (evidence: `src/app/api/auth/login/route.ts`)
- Blog owner → Admin dashboard: manages posts (evidence: `README.md`)
- Admin dashboard → Session auth: requires admin (evidence: `src/app/admin/page.tsx`)
- Admin dashboard → Post service: loads posts (evidence: `src/app/admin/page.tsx`)
- Post editor → Post API: submits post
- Post editor → Single-post API: updates post
- Post API → Session auth: checks admin (evidence: `src/app/api/posts/route.ts`)
- Post API → Post validation: validates input (evidence: `src/app/api/posts/route.ts`)
- Post API → Post service: creates or lists (evidence: `src/app/api/posts/route.ts`)
- Post API → Page revalidation: refreshes pages (evidence: `src/app/api/posts/route.ts`)
- Single-post API → Session auth: checks admin (evidence: `src/app/api/posts/[id]/route.ts`)
- Single-post API → Post validation: validates input (evidence: `src/app/api/posts/[id]/route.ts`)
- Single-post API → Post service: updates or deletes (evidence: `src/app/api/posts/[id]/route.ts`)
- Single-post API → Page revalidation: refreshes pages (evidence: `src/app/api/posts/[id]/route.ts`)
- Sitemap and robots → Visitor: serves discovery
