# zeon-studio/nextplate architecture

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

- Interactive diagram: https://gitdiagram.com/zeon-studio/nextplate
- Repository: https://github.com/zeon-studio/nextplate

## Overview

1. This is a content-driven Next.js 16 app using the App Router. The repository is structured like a starter for a marketing/blog site rather than an API service or backend-heavy app. Static pages, content collections, and taxonomy pages are the primary architectural units.

2. The main entry boundary is `src/app`, which contains route segments for homepage, about, contact, blog, authors, categories, tags, and a fallback `not-found` page. Dynamic routes such as `[single]` and paginated blog routes indicate that most pages are generated from content files rather than hand-authored React state.

3. Content is stored in `src/content` as Markdown/MDX-style documents, grouped by domain: homepage, about, blog posts, authors, contact, reusable pages, and section snippets like testimonials and call-to-action blocks. This content layer is the source of truth for site text, post metadata, and taxonomy relationships.

4. `src/lib/contentParser.ts` and `src/lib/taxonomyParser.ts` are the key data-ingestion boundaries. They likely transform markdown content into typed objects the route pages can consume, and they feed list/detail views for posts, authors, tags, and categories. Supporting utilities under `src/lib/utils` handle sorting, filtering, reading time, date formatting, text conversion, and “similar items” recommendations.

5. The blog subsystem is the richest part of the app. It includes listing pages, single-post pages, pagination, similar-post logic, social sharing, comments via Disqus, and post sidebar/layout chrome. Taxonomy pages for tags and categories are built from the same content graph, so the architecture is centered on one content model projected into multiple views.

6. The author subsystem is separate but parallel to blog content. Author profiles live in `src/content/authors`, with list and detail routes under `src/app/authors`. Components such as `AuthorCard` and related taxonomy utilities suggest authors are first-class entities, not just metadata on posts.

7. Reusable page composition lives in `src/layouts`. This layer provides shared UI shells and content blocks like `Header`, `Footer`, `PageHeader`, `Breadcrumbs`, `SEO meta`, testimonials, call-to-action blocks, and shortcodes such as tabs, accordion, notices, buttons, and embedded video/youtube. This is the main presentation boundary between route pages and reusable view primitives.

8. Client-side interactivity is isolated into hooks and interactive components. Hooks such as `useLoadMore`, `useMounted`, `useOs`, `useTooltip`, and `useWindow` support hydration-safe UI behavior, search, theme toggling, and responsive interactions. That suggests a deliberate split between server-rendered content pages and small client-only widgets.

9. Styling is handled by Tailwind CSS v4 plus layered CSS files in `src/styles`, including base, components, navigation, search, utilities, and a generated theme stylesheet. Theme and config JSON files under `src/config` drive site-wide behavior such as menus, social links, and theme settings, so visual identity is partly data-driven rather than hardcoded.

10. The repo has a CMS/editing and content-management boundary via Sitepins. The `.sitepins` config and schema files, plus the `public/sitepins-manifest.json` asset, indicate Git-backed editing for markdown content and site configuration without a custom admin app. That keeps content authoring outside the React runtime while still versioning changes in Git.

11. Deployment and build tooling are optimized for static output. `netlify.toml`, the Dockerfile, `next-sitemap.config.js`, and generated sitemap/robots assets show a static/SEO-focused publishing pipeline. The README also describes post-build generation of `llms.txt`, `llms-full.txt`, and per-page markdown exports, which is an additional build-time documentation/data product layered on top of the site.

12. Overall, the architecture is: content and config files feed parsers; parsers feed App Router pages; pages render through shared layouts and shortcode components; client-only hooks add interactivity; build tooling emits SEO, sitemap, and LLM-friendly artifacts. The main diagram should show a clear separation between content sources, presentation/layout components, and build-time generators.

Main entry points: [`src/layouts`](https://github.com/zeon-studio/nextplate/tree/main/src/layouts) (Layouts), [`src/lib/contentParser.ts`](https://github.com/zeon-studio/nextplate/blob/main/src/lib/contentParser.ts) (Content parser), [`src/lib/taxonomyParser.ts`](https://github.com/zeon-studio/nextplate/blob/main/src/lib/taxonomyParser.ts) (Taxonomy parser), [`src/content`](https://github.com/zeon-studio/nextplate/tree/main/src/content) (Content source)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sources["Content & config"]
  node_content_parser[("Content parser<br/>md/mdx parser<br/>[contentParser.ts]")]
  node_taxonomy_parser[("Taxonomy parser<br/>[taxonomyParser.ts]")]
  node_content_files[("Content source<br/>markdown content")]
  node_site_config[("Site config<br/>json settings")]
end

subgraph group_presentation["App & UI"]
  node_app_shell["App shell<br/>next app router<br/>[layout.tsx]"]
  node_home_route["Home<br/>route page<br/>[page.tsx]"]
  node_static_routes["Static pages<br/>route pages<br/>[page.tsx]"]
  node_regular_page["Regular page<br/>catch-all route<br/>[page.tsx]"]
  node_blog_index["Blog list<br/>route page<br/>[page.tsx]"]
  node_blog_post["Post detail<br/>route page<br/>[page.tsx]"]
  node_blog_pagination["Blog pages<br/>paged route<br/>[page.tsx]"]
  node_authors_list["Authors<br/>taxonomy list<br/>[page.tsx]"]
  node_author_detail["Author profile<br/>taxonomy detail<br/>[page.tsx]"]
  node_categories_pages["Categories<br/>taxonomy pages<br/>[page.tsx]"]
  node_tags_pages["Tags<br/>taxonomy pages<br/>[page.tsx]"]
  node_shared_layouts["Layouts<br/>ui shell"]
  node_post_ui["Post UI<br/>blog chrome"]
  node_shortcodes["Shortcodes<br/>mdx components"]
  node_hooks(("Client hooks<br/>react hooks"))
  node_styles["Styles<br/>tailwind css"]
end

subgraph group_build["Build & publishing"]
  node_sitepins["Sitepins CMS<br/>git-backed editing<br/>[config.json]"]
  node_generators["Generators<br/>build scripts<br/>[llmsGenerator.mjs]"]
  node_publish_outputs["Publish artifacts<br/>static outputs<br/>[sitemap.xml]"]
end

node_sitepins -->|"edit content"| node_content_files
node_site_config -->|"configure"| node_app_shell
node_content_files -->|"ingest"| node_content_parser
node_content_files -->|"ingest"| node_taxonomy_parser
node_content_parser -->|"feed"| node_home_route
node_content_parser -->|"feed"| node_static_routes
node_content_parser -->|"feed"| node_regular_page
node_content_parser -->|"feed"| node_blog_index
node_content_parser -->|"feed"| node_blog_post
node_content_parser -->|"feed"| node_blog_pagination
node_taxonomy_parser -->|"feed"| node_authors_list
node_taxonomy_parser -->|"feed"| node_author_detail
node_taxonomy_parser -->|"feed"| node_categories_pages
node_taxonomy_parser -->|"feed"| node_tags_pages
node_home_route -->|"render via"| node_shared_layouts
node_static_routes -->|"render via"| node_shared_layouts
node_blog_index -->|"render via"| node_post_ui
node_blog_post -->|"render via"| node_post_ui
node_authors_list -->|"render via"| node_shared_layouts
node_author_detail -->|"render via"| node_shared_layouts
node_categories_pages -->|"render via"| node_shared_layouts
node_tags_pages -->|"render via"| node_shared_layouts
node_shared_layouts -->|"compose"| node_shortcodes
node_shared_layouts -->|"hydrate"| node_hooks
node_post_ui -->|"hydrate"| node_hooks
node_shared_layouts -->|"style"| node_styles
node_generators -->|"emit"| node_publish_outputs

click node_app_shell "https://github.com/zeon-studio/nextplate/blob/main/src/app/layout.tsx"
click node_home_route "https://github.com/zeon-studio/nextplate/blob/main/src/app/page.tsx"
click node_static_routes "https://github.com/zeon-studio/nextplate/blob/main/src/app/about/page.tsx"
click node_regular_page "https://github.com/zeon-studio/nextplate/blob/main/src/app/[regular]/page.tsx"
click node_blog_index "https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/page.tsx"
click node_blog_post "https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/[single]/page.tsx"
click node_blog_pagination "https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/page/[page]/page.tsx"
click node_authors_list "https://github.com/zeon-studio/nextplate/blob/main/src/app/authors/page.tsx"
click node_author_detail "https://github.com/zeon-studio/nextplate/blob/main/src/app/authors/[single]/page.tsx"
click node_categories_pages "https://github.com/zeon-studio/nextplate/blob/main/src/app/categories/page.tsx"
click node_tags_pages "https://github.com/zeon-studio/nextplate/blob/main/src/app/tags/page.tsx"
click node_content_parser "https://github.com/zeon-studio/nextplate/blob/main/src/lib/contentParser.ts"
click node_taxonomy_parser "https://github.com/zeon-studio/nextplate/blob/main/src/lib/taxonomyParser.ts"
click node_content_files "https://github.com/zeon-studio/nextplate/tree/main/src/content"
click node_site_config "https://github.com/zeon-studio/nextplate/tree/main/src/config"
click node_sitepins "https://github.com/zeon-studio/nextplate/blob/main/.sitepins/config.json"
click node_shared_layouts "https://github.com/zeon-studio/nextplate/tree/main/src/layouts"
click node_post_ui "https://github.com/zeon-studio/nextplate/tree/main/src/layouts/components"
click node_shortcodes "https://github.com/zeon-studio/nextplate/tree/main/src/layouts/shortcodes"
click node_hooks "https://github.com/zeon-studio/nextplate/tree/main/src/hooks"
click node_styles "https://github.com/zeon-studio/nextplate/tree/main/src/styles"
click node_generators "https://github.com/zeon-studio/nextplate/blob/main/scripts/llmsGenerator.mjs"
click node_publish_outputs "https://github.com/zeon-studio/nextplate/blob/main/public/sitemap.xml"

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_content_parser,node_taxonomy_parser,node_content_files,node_site_config toneBlue
class node_app_shell,node_home_route,node_static_routes,node_regular_page,node_blog_index,node_blog_post,node_blog_pagination,node_authors_list,node_author_detail,node_categories_pages,node_tags_pages,node_shared_layouts,node_post_ui,node_shortcodes,node_hooks,node_styles toneAmber
class node_sitepins,node_generators,node_publish_outputs toneMint
```

## Components

### Content & config

Content, taxonomy, and site settings that drive the app

- [Content parser](https://github.com/zeon-studio/nextplate/blob/main/src/lib/contentParser.ts): md/mdx parser · Transforms content documents into typed page data · `src/lib/contentParser.ts`
- [Taxonomy parser](https://github.com/zeon-studio/nextplate/blob/main/src/lib/taxonomyParser.ts): taxonomy parser · Builds tag, category, and author relationships · `src/lib/taxonomyParser.ts`
- [Content source](https://github.com/zeon-studio/nextplate/tree/main/src/content): markdown content · Homepage, blog, author, and page documents · `src/content`
- [Site config](https://github.com/zeon-studio/nextplate/tree/main/src/config): json settings · Menus, social links, and theme settings · `src/config`

### App & UI

Next.js routes, shared layouts, and interactive view components

- [App shell](https://github.com/zeon-studio/nextplate/blob/main/src/app/layout.tsx): next app router · Root layout and route boundary for the site · `src/app/layout.tsx`
- [Home](https://github.com/zeon-studio/nextplate/blob/main/src/app/page.tsx): route page · Homepage entry rendered from content · `src/app/page.tsx`
- [Static pages](https://github.com/zeon-studio/nextplate/blob/main/src/app/about/page.tsx): route pages · About, contact, and reusable page routes · `src/app/about/page.tsx`
- [Regular page](https://github.com/zeon-studio/nextplate/blob/main/src/app/[regular]/page.tsx): catch-all route · Generic single-page content route · `src/app/[regular]/page.tsx`
- [Blog list](https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/page.tsx): route page · Blog listing and archive entry · `src/app/blog/page.tsx`
- [Post detail](https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/[single]/page.tsx): route page · Single blog post view · `src/app/blog/[single]/page.tsx`
- [Blog pages](https://github.com/zeon-studio/nextplate/blob/main/src/app/blog/page/[page]/page.tsx): paged route · Paginated blog listing routes · `src/app/blog/page/[page]/page.tsx`
- [Authors](https://github.com/zeon-studio/nextplate/blob/main/src/app/authors/page.tsx): taxonomy list · Author listing page · `src/app/authors/page.tsx`
- [Author profile](https://github.com/zeon-studio/nextplate/blob/main/src/app/authors/[single]/page.tsx): taxonomy detail · Single author page · `src/app/authors/[single]/page.tsx`
- [Categories](https://github.com/zeon-studio/nextplate/blob/main/src/app/categories/page.tsx): taxonomy pages · Category listing and detail routes · `src/app/categories/page.tsx`
- [Tags](https://github.com/zeon-studio/nextplate/blob/main/src/app/tags/page.tsx): taxonomy pages · Tag listing and detail routes · `src/app/tags/page.tsx`
- [Layouts](https://github.com/zeon-studio/nextplate/tree/main/src/layouts): ui shell · Header, footer, headers, SEO, and page chrome · `src/layouts`
- [Post UI](https://github.com/zeon-studio/nextplate/tree/main/src/layouts/components): blog chrome · Cards, sidebar, share, comments, and pagination · `src/layouts/components`
- [Shortcodes](https://github.com/zeon-studio/nextplate/tree/main/src/layouts/shortcodes): mdx components · Tabs, accordion, notices, buttons, and embeds · `src/layouts/shortcodes`
- [Client hooks](https://github.com/zeon-studio/nextplate/tree/main/src/hooks): react hooks · Hydration-safe interaction helpers · `src/hooks`
- [Styles](https://github.com/zeon-studio/nextplate/tree/main/src/styles): tailwind css · Global layers, navigation, search, and theme styles · `src/styles`

### Build & publishing

Content editing, generation, and deployment artifacts

- [Sitepins CMS](https://github.com/zeon-studio/nextplate/blob/main/.sitepins/config.json): git-backed editing · Content editing schema and manifest boundary · `.sitepins/config.json`
- [Generators](https://github.com/zeon-studio/nextplate/blob/main/scripts/llmsGenerator.mjs): build scripts · Build-time output for themes, LLM docs, and JSON · `scripts/llmsGenerator.mjs`
- [Publish artifacts](https://github.com/zeon-studio/nextplate/blob/main/public/sitemap.xml): static outputs · Sitemap, robots, site manifest, and SEO assets · `public/sitemap.xml`

## Connections

- Sitepins CMS → Content source: edit content · Git-backed editing updates markdown sources
- Site config → App shell: configure · Site settings influence app-wide rendering
- Content source → Content parser: ingest · Markdown content is parsed into typed records
- Content source → Taxonomy parser: ingest · Content drives taxonomy relationships and author data
- Content parser → Home: feed · Homepage reads parsed content data
- Content parser → Static pages: feed · Static content pages consume parsed documents
- Content parser → Regular page: feed · Generic page routes render parsed page content
- Content parser → Blog list: feed · Blog listing is assembled from parsed posts
- Content parser → Post detail: feed · Single posts render parsed article data
- Content parser → Blog pages: feed · Paginated archives slice the parsed post set
- Taxonomy parser → Authors: feed · Author listings come from taxonomy data
- Taxonomy parser → Author profile: feed · Author profile routes resolve from taxonomy data
- Taxonomy parser → Categories: feed · Category views are generated from taxonomy data
- Taxonomy parser → Tags: feed · Tag views are generated from taxonomy data
- Home → Layouts: render via · Pages compose through shared shells and sections
- Static pages → Layouts: render via · Static pages reuse common layout primitives
- Blog list → Post UI: render via · Listing pages use cards, pagination, and search chrome
- Post detail → Post UI: render via · Post pages use sidebar, sharing, and comments chrome
- Authors → Layouts: render via · Author pages use shared presentation layers
- Author profile → Layouts: render via · Author detail pages use shared presentation layers
- Categories → Layouts: render via · Taxonomy pages reuse shared shells
- Tags → Layouts: render via · Taxonomy pages reuse shared shells
- Layouts → Shortcodes: compose · Layouts embed reusable MDX shortcodes
- Layouts → Client hooks: hydrate · Interactive shell pieces depend on client hooks
- Post UI → Client hooks: hydrate · Search, tooltips, and window-aware UI use hooks
- Layouts → Styles: style · Presentation layers are styled by Tailwind and CSS layers
- Generators → Publish artifacts: emit · Build scripts create SEO and documentation artifacts
