# samdeupta/careunlimited architecture

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

- Interactive diagram: https://gitdiagram.com/samdeupta/careunlimited
- Repository: https://github.com/samdeupta/careunlimited

## Overview

Care Unlimited is a content-driven static website: an editor changes Markdown pages, shared settings, images, and videos; the build assembles those into pages and a shared site shell. The graph follows the documented page/block model and sampled build, rendering, media, and shell code. Some capabilities—such as individual block renderers—are represented by their source directory because their implementation was not excerpted.

Main entry points: [`build.mjs`](https://github.com/samdeupta/careunlimited/blob/main/build.mjs) (Build entry), [`src/content.mjs`](https://github.com/samdeupta/careunlimited/blob/main/src/content.mjs) (Content loader), [`src/page.mjs`](https://github.com/samdeupta/careunlimited/blob/main/src/page.mjs) (Page assembler), [`src/shell.mjs`](https://github.com/samdeupta/careunlimited/blob/main/src/shell.mjs) (Shared site shell)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_content["Content inputs"]
  node_content_files["Page Markdown"]
  node_asset_files["Images and video"]
  node_content_loader["Content loader<br/>[content.mjs]"]
end

subgraph group_render["Page rendering"]
  node_builder["Build entry<br/>[build.mjs]"]
  node_config["Build configuration<br/>[config.mjs]"]
  node_page_renderer["Page assembler<br/>[page.mjs]"]
  node_block_registry["Block registry<br/>[registry.mjs]"]
  node_block_renderers["Content blocks"]
end

subgraph group_media["Media and blocks"]
  node_markdown["Markdown processor<br/>[markdown.mjs]"]
  node_image_renderer["Image resolver<br/>[images.mjs]"]
  node_video_renderer["Video embeds<br/>[video.mjs]"]
  node_missing_tracker["Missing media tracking<br/>[missing.mjs]"]
end

subgraph group_site["Site output"]
  node_feature_renderer["Interactive features<br/>[features.mjs]"]
  node_shell_renderer["Shared site shell<br/>[shell.mjs]"]
  node_template_renderer["HTML templates<br/>[template.mjs]"]
  node_output_writer["Static output<br/>[output.mjs]"]
  node_build_report["Build report<br/>[report.mjs]"]
end

node_editor(("Content editor"))
node_visitor(("Site visitor"))

node_editor -->|"edits"| node_content_files
node_editor -->|"adds media"| node_asset_files
node_builder -->|"loads"| node_config
node_builder -->|"loads"| node_content_loader
node_builder -->|"renders pages"| node_page_renderer
node_builder -->|"renders shell"| node_shell_renderer
node_builder -->|"writes output"| node_output_writer
node_builder -->|"reports issues"| node_build_report
node_content_loader -->|"reads"| node_content_files
node_page_renderer -->|"loads sections"| node_content_loader
node_page_renderer -->|"dispatches blocks"| node_block_registry
node_page_renderer -->|"renders banners"| node_image_renderer
node_page_renderer -->|"records missing media"| node_missing_tracker
node_block_registry -->|"registers types"| node_block_renderers
node_block_renderers -->|"formats text"| node_markdown
node_markdown -->|"uses site settings"| node_content_loader
node_markdown -->|"renders images"| node_image_renderer
node_markdown -->|"embeds videos"| node_video_renderer
node_video_renderer -->|"checks local video"| node_asset_files
node_video_renderer -->|"renders thumbnails"| node_image_renderer
node_video_renderer -->|"records missing video"| node_missing_tracker
node_image_renderer -->|"checks images"| node_asset_files
node_image_renderer -->|"records missing image"| node_missing_tracker
node_shell_renderer -->|"uses site settings"| node_content_loader
node_shell_renderer -->|"includes features"| node_feature_renderer
node_shell_renderer -->|"renders template"| node_template_renderer
node_output_writer -->|"reads content"| node_content_loader
node_output_writer -->|"uses shell"| node_shell_renderer
node_build_report -->|"reports missing files"| node_missing_tracker
node_output_writer -.->|"publishes site"| node_visitor

click node_content_files "https://github.com/samdeupta/careunlimited/tree/main/content"
click node_asset_files "https://github.com/samdeupta/careunlimited/tree/main/assets"
click node_builder "https://github.com/samdeupta/careunlimited/blob/main/build.mjs"
click node_config "https://github.com/samdeupta/careunlimited/blob/main/src/config.mjs"
click node_content_loader "https://github.com/samdeupta/careunlimited/blob/main/src/content.mjs"
click node_page_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/page.mjs"
click node_block_registry "https://github.com/samdeupta/careunlimited/blob/main/src/components/registry.mjs"
click node_block_renderers "https://github.com/samdeupta/careunlimited/tree/main/src/components"
click node_markdown "https://github.com/samdeupta/careunlimited/blob/main/src/markdown.mjs"
click node_image_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/images.mjs"
click node_video_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/video.mjs"
click node_feature_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/features.mjs"
click node_shell_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/shell.mjs"
click node_template_renderer "https://github.com/samdeupta/careunlimited/blob/main/src/template.mjs"
click node_output_writer "https://github.com/samdeupta/careunlimited/blob/main/src/output.mjs"
click node_missing_tracker "https://github.com/samdeupta/careunlimited/blob/main/src/missing.mjs"
click node_build_report "https://github.com/samdeupta/careunlimited/blob/main/src/report.mjs"

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_files,node_asset_files,node_content_loader toneBlue
class node_builder,node_config,node_page_renderer,node_block_registry,node_block_renderers toneAmber
class node_markdown,node_image_renderer,node_video_renderer,node_missing_tracker toneMint
class node_feature_renderer,node_shell_renderer,node_template_renderer,node_output_writer,node_build_report toneRose
class node_editor,node_visitor toneIndigo
```

## Components

### Content inputs

- [Page Markdown](https://github.com/samdeupta/careunlimited/tree/main/content): `content`
- [Images and video](https://github.com/samdeupta/careunlimited/tree/main/assets): `assets`
- [Content loader](https://github.com/samdeupta/careunlimited/blob/main/src/content.mjs): `src/content.mjs`

### Page rendering

- [Build entry](https://github.com/samdeupta/careunlimited/blob/main/build.mjs): `build.mjs`
- [Build configuration](https://github.com/samdeupta/careunlimited/blob/main/src/config.mjs): `src/config.mjs`
- [Page assembler](https://github.com/samdeupta/careunlimited/blob/main/src/page.mjs): `src/page.mjs`
- [Block registry](https://github.com/samdeupta/careunlimited/blob/main/src/components/registry.mjs): `src/components/registry.mjs`
- [Content blocks](https://github.com/samdeupta/careunlimited/tree/main/src/components): `src/components`

### Media and blocks

- [Markdown processor](https://github.com/samdeupta/careunlimited/blob/main/src/markdown.mjs): `src/markdown.mjs`
- [Image resolver](https://github.com/samdeupta/careunlimited/blob/main/src/images.mjs): `src/images.mjs`
- [Video embeds](https://github.com/samdeupta/careunlimited/blob/main/src/video.mjs): `src/video.mjs`
- [Missing media tracking](https://github.com/samdeupta/careunlimited/blob/main/src/missing.mjs): `src/missing.mjs`

### Site output

- [Interactive features](https://github.com/samdeupta/careunlimited/blob/main/src/features.mjs): `src/features.mjs`
- [Shared site shell](https://github.com/samdeupta/careunlimited/blob/main/src/shell.mjs): `src/shell.mjs`
- [HTML templates](https://github.com/samdeupta/careunlimited/blob/main/src/template.mjs): `src/template.mjs`
- [Static output](https://github.com/samdeupta/careunlimited/blob/main/src/output.mjs): `src/output.mjs`
- [Build report](https://github.com/samdeupta/careunlimited/blob/main/src/report.mjs): `src/report.mjs`

### Other components

- **Content editor**
- **Site visitor**

## Connections

- Content editor → Page Markdown: edits (evidence: `README.md`)
- Content editor → Images and video: adds media (evidence: `README.md`)
- Build entry → Build configuration: loads (evidence: `build.mjs`)
- Build entry → Content loader: loads (evidence: `build.mjs`)
- Build entry → Page assembler: renders pages (evidence: `build.mjs`)
- Build entry → Shared site shell: renders shell (evidence: `build.mjs`)
- Build entry → Static output: writes output (evidence: `build.mjs`)
- Build entry → Build report: reports issues (evidence: `build.mjs`)
- Content loader → Page Markdown: reads (evidence: `src/content.mjs`)
- Page assembler → Content loader: loads sections (evidence: `src/page.mjs`)
- Page assembler → Block registry: dispatches blocks (evidence: `src/page.mjs`)
- Page assembler → Image resolver: renders banners (evidence: `src/page.mjs`)
- Page assembler → Missing media tracking: records missing media (evidence: `src/page.mjs`)
- Block registry → Content blocks: registers types (evidence: `src/components/registry.mjs`)
- Content blocks → Markdown processor: formats text (evidence: `src/components/common.mjs`)
- Markdown processor → Content loader: uses site settings (evidence: `src/markdown.mjs`)
- Markdown processor → Image resolver: renders images (evidence: `src/markdown.mjs`)
- Markdown processor → Video embeds: embeds videos (evidence: `src/markdown.mjs`)
- Video embeds → Images and video: checks local video (evidence: `src/video.mjs`)
- Video embeds → Image resolver: renders thumbnails (evidence: `src/video.mjs`)
- Video embeds → Missing media tracking: records missing video (evidence: `src/video.mjs`)
- Image resolver → Images and video: checks images (evidence: `src/images.mjs`)
- Image resolver → Missing media tracking: records missing image (evidence: `src/images.mjs`)
- Shared site shell → Content loader: uses site settings (evidence: `src/shell.mjs`)
- Shared site shell → Interactive features: includes features (evidence: `src/shell.mjs`)
- Shared site shell → HTML templates: renders template (evidence: `src/shell.mjs`)
- Static output → Content loader: reads content (evidence: `src/output.mjs`)
- Static output → Shared site shell: uses shell (evidence: `src/output.mjs`)
- Build report → Missing media tracking: reports missing files (evidence: `src/report.mjs`)
- Static output → Site visitor: publishes site
