# haritsrhn/ornament-project architecture

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

- Interactive diagram: https://gitdiagram.com/haritsrhn/ornament-project
- Repository: https://github.com/haritsrhn/ornament-project

## Overview

Ornament Sourcing Agent is a monorepo for a public artisan/product site and an admin CMS, backed by a Fastify API. The intended content workflow is CMS management and publishing, followed by public catalog, journal, and site reads; public inquiries and comments are separate submission stages. The README says the frontend currently uses static data and local interaction state, so no frontend-to-API runtime connection is shown. Backend edges reflect sampled route calls and documented API capabilities; some module internals were not sampled.

Main entry points: [`frontend/lib/data.ts`](https://github.com/haritsrhn/ornament-project/blob/main/frontend/lib/data.ts) (Static content), [`packages/shared/src/index.ts`](https://github.com/haritsrhn/ornament-project/blob/main/packages/shared/src/index.ts) (API contracts), [`backend/src/modules/public/routes.ts`](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/routes.ts) (Public API routes), [`backend/src/modules/admin/products/routes.ts`](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/products/routes.ts) (Product management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Public site"]
  node_site_ui["Public pages<br/>[page.tsx]"]
  node_catalog_ui["Catalog browsing<br/>[CatalogBrowser.tsx]"]
  node_journal_ui["Journal browsing<br/>[JournalBrowser.tsx]"]
  node_contact_ui["Contact form<br/>[InquiryForm.tsx]"]
  node_static_data["Static content<br/>[data.ts]"]
end

subgraph group_cms["Admin CMS"]
  node_admin_ui["Admin screens<br/>[page.tsx]"]
  node_product_admin["Product management<br/>[routes.ts]"]
  node_article_admin["Article management<br/>[routes.ts]"]
  node_artisan_admin["Artisan management<br/>[routes.ts]"]
  node_taxonomy_admin["Taxonomy management<br/>[routes.ts]"]
  node_media_admin["Media management<br/>[routes.ts]"]
  node_users_invites["Users and invites<br/>[routes.ts]"]
end

subgraph group_api["Backend API"]
  node_auth_api["Authentication<br/>[routes.ts]"]
  node_public_api["Public API routes<br/>[routes.ts]"]
  node_products_api["Product catalog API<br/>[routes.ts]"]
  node_articles_api["Journal API<br/>[routes.ts]"]
  node_site_api["Site content API<br/>[routes.ts]"]
  node_inquiries_api["Inquiry submission<br/>[routes.ts]"]
  node_comments_api["Public comments<br/>[routes.ts]"]
end

subgraph group_state["Contracts and state"]
  node_shared["API contracts<br/>[index.ts]"]
  node_db[("PostgreSQL data")]
  node_prisma["Prisma integration<br/>[prisma.ts]"]
  node_r2[("Object storage")]
  node_email["Email service"]
end

node_visitor(("Site visitor"))
node_admin(("CMS administrator"))

node_visitor -->|"views"| node_site_ui
node_site_ui -->|"reads"| node_static_data
node_visitor -->|"browses"| node_catalog_ui
node_catalog_ui -->|"reads"| node_static_data
node_visitor -->|"browses"| node_journal_ui
node_journal_ui -->|"reads"| node_static_data
node_visitor -->|"submits"| node_contact_ui
node_contact_ui -->|"uses"| node_static_data
node_admin -->|"manages"| node_admin_ui
node_admin_ui -->|"reads and updates"| node_static_data
node_admin -->|"authenticates"| node_auth_api
node_auth_api -->|"reads and writes"| node_db
node_auth_api -->|"accepts invite"| node_users_invites
node_users_invites -->|"reads and writes"| node_db
node_users_invites -.->|"sends invite"| node_email
node_admin -->|"manages products"| node_product_admin
node_product_admin -->|"reads and writes"| node_db
node_product_admin -->|"uses SKU taxonomy"| node_taxonomy_admin
node_admin -->|"manages articles"| node_article_admin
node_article_admin -->|"reads and writes"| node_db
node_admin -->|"manages artisans"| node_artisan_admin
node_artisan_admin -->|"reads and writes"| node_db
node_admin -->|"manages taxonomy"| node_taxonomy_admin
node_taxonomy_admin -->|"reads and writes"| node_db
node_admin -->|"manages media"| node_media_admin
node_media_admin -->|"reads and writes"| node_db
node_media_admin -.->|"stores media"| node_r2
node_visitor -->|"requests content"| node_public_api
node_public_api -->|"dispatches routes"| node_products_api
node_public_api -->|"dispatches routes"| node_articles_api
node_public_api -->|"dispatches routes"| node_site_api
node_products_api -->|"reads published products"| node_db
node_articles_api -->|"reads published articles"| node_db
node_site_api -->|"reads site content"| node_db
node_visitor -->|"submits inquiry"| node_inquiries_api
node_inquiries_api -->|"writes inquiry"| node_db
node_visitor -->|"submits comment"| node_comments_api
node_comments_api -->|"reads and writes"| node_db
node_shared -->|"defines contracts"| node_products_api
node_shared -->|"defines contracts"| node_articles_api
node_shared -->|"defines contracts"| node_site_ui
node_shared -->|"defines contracts"| node_admin_ui
node_prisma -->|"connects"| node_db

click node_site_ui "https://github.com/haritsrhn/ornament-project/blob/main/frontend/app/(site)/page.tsx"
click node_catalog_ui "https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/CatalogBrowser.tsx"
click node_journal_ui "https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/JournalBrowser.tsx"
click node_contact_ui "https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/InquiryForm.tsx"
click node_static_data "https://github.com/haritsrhn/ornament-project/blob/main/frontend/lib/data.ts"
click node_admin_ui "https://github.com/haritsrhn/ornament-project/blob/main/frontend/app/admin/page.tsx"
click node_product_admin "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/products/routes.ts"
click node_article_admin "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/articles/routes.ts"
click node_artisan_admin "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/artisans/routes.ts"
click node_taxonomy_admin "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/taxonomy/routes.ts"
click node_media_admin "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/media/routes.ts"
click node_users_invites "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/invites/routes.ts"
click node_auth_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/auth/routes.ts"
click node_public_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/routes.ts"
click node_products_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/products/routes.ts"
click node_articles_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/articles/routes.ts"
click node_site_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/site/routes.ts"
click node_inquiries_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/inquiries/routes.ts"
click node_comments_api "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/comments/routes.ts"
click node_shared "https://github.com/haritsrhn/ornament-project/blob/main/packages/shared/src/index.ts"
click node_prisma "https://github.com/haritsrhn/ornament-project/blob/main/backend/src/plugins/prisma.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_site_ui,node_catalog_ui,node_journal_ui,node_contact_ui,node_static_data toneBlue
class node_admin_ui,node_product_admin,node_article_admin,node_artisan_admin,node_taxonomy_admin,node_media_admin,node_users_invites toneAmber
class node_auth_api,node_public_api,node_products_api,node_articles_api,node_site_api,node_inquiries_api,node_comments_api toneMint
class node_shared,node_db,node_prisma,node_r2,node_email toneRose
class node_visitor,node_admin toneIndigo
```

## Components

### Public site

- [Public pages](https://github.com/haritsrhn/ornament-project/blob/main/frontend/app/(site)/page.tsx): `frontend/app/(site)/page.tsx`
- [Catalog browsing](https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/CatalogBrowser.tsx): `frontend/components/site/CatalogBrowser.tsx`
- [Journal browsing](https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/JournalBrowser.tsx): `frontend/components/site/JournalBrowser.tsx`
- [Contact form](https://github.com/haritsrhn/ornament-project/blob/main/frontend/components/site/InquiryForm.tsx): `frontend/components/site/InquiryForm.tsx`
- [Static content](https://github.com/haritsrhn/ornament-project/blob/main/frontend/lib/data.ts): `frontend/lib/data.ts`

### Admin CMS

- [Admin screens](https://github.com/haritsrhn/ornament-project/blob/main/frontend/app/admin/page.tsx): `frontend/app/admin/page.tsx`
- [Product management](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/products/routes.ts): `backend/src/modules/admin/products/routes.ts`
- [Article management](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/articles/routes.ts): `backend/src/modules/admin/articles/routes.ts`
- [Artisan management](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/artisans/routes.ts): `backend/src/modules/admin/artisans/routes.ts`
- [Taxonomy management](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/taxonomy/routes.ts): `backend/src/modules/admin/taxonomy/routes.ts`
- [Media management](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/admin/media/routes.ts): `backend/src/modules/admin/media/routes.ts`
- [Users and invites](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/invites/routes.ts): `backend/src/modules/invites/routes.ts`

### Backend API

- [Authentication](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/auth/routes.ts): `backend/src/modules/auth/routes.ts`
- [Public API routes](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/routes.ts): `backend/src/modules/public/routes.ts`
- [Product catalog API](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/products/routes.ts): `backend/src/modules/public/products/routes.ts`
- [Journal API](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/articles/routes.ts): `backend/src/modules/public/articles/routes.ts`
- [Site content API](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/site/routes.ts): `backend/src/modules/public/site/routes.ts`
- [Inquiry submission](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/inquiries/routes.ts): `backend/src/modules/public/inquiries/routes.ts`
- [Public comments](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/modules/public/comments/routes.ts): `backend/src/modules/public/comments/routes.ts`

### Contracts and state

- [API contracts](https://github.com/haritsrhn/ornament-project/blob/main/packages/shared/src/index.ts): `packages/shared/src/index.ts`
- **PostgreSQL data**
- [Prisma integration](https://github.com/haritsrhn/ornament-project/blob/main/backend/src/plugins/prisma.ts): `backend/src/plugins/prisma.ts`
- **Object storage**
- **Email service**

### Other components

- **Site visitor**
- **CMS administrator**

## Connections

- Site visitor → Public pages: views
- Public pages → Static content: reads
- Site visitor → Catalog browsing: browses
- Catalog browsing → Static content: reads
- Site visitor → Journal browsing: browses
- Journal browsing → Static content: reads
- Site visitor → Contact form: submits
- Contact form → Static content: uses
- CMS administrator → Admin screens: manages
- Admin screens → Static content: reads and updates
- CMS administrator → Authentication: authenticates
- Authentication → PostgreSQL data: reads and writes
- Authentication → Users and invites: accepts invite
- Users and invites → PostgreSQL data: reads and writes
- Users and invites → Email service: sends invite
- CMS administrator → Product management: manages products
- Product management → PostgreSQL data: reads and writes
- Product management → Taxonomy management: uses SKU taxonomy
- CMS administrator → Article management: manages articles
- Article management → PostgreSQL data: reads and writes
- CMS administrator → Artisan management: manages artisans
- Artisan management → PostgreSQL data: reads and writes
- CMS administrator → Taxonomy management: manages taxonomy
- Taxonomy management → PostgreSQL data: reads and writes
- CMS administrator → Media management: manages media
- Media management → PostgreSQL data: reads and writes
- Media management → Object storage: stores media
- Site visitor → Public API routes: requests content
- Public API routes → Product catalog API: dispatches routes
- Public API routes → Journal API: dispatches routes
- Public API routes → Site content API: dispatches routes
- Product catalog API → PostgreSQL data: reads published products
- Journal API → PostgreSQL data: reads published articles
- Site content API → PostgreSQL data: reads site content
- Site visitor → Inquiry submission: submits inquiry
- Inquiry submission → PostgreSQL data: writes inquiry
- Site visitor → Public comments: submits comment
- Public comments → PostgreSQL data: reads and writes
- API contracts → Product catalog API: defines contracts
- API contracts → Journal API: defines contracts
- API contracts → Public pages: defines contracts
- API contracts → Admin screens: defines contracts
- Prisma integration → PostgreSQL data: connects
