# iivn1026/rhinelabuiblogv architecture

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

- Interactive diagram: https://gitdiagram.com/iivn1026/rhinelabuiblogv
- Repository: https://github.com/iivn1026/rhinelabuiblogv

## Overview

RhineLabUI is a self-hosted blog whose main workflow is visitor or account login, browsing a five-column 3D archive, opening a record, and reading its Markdown or viewing its gallery/model. Administrators also maintain records, photos, and accounts; users can keep database-backed favorites. The graph reflects README capabilities and sampled entry points, but several frontend-to-API details are not shown in the excerpts, so uncertain call paths are omitted.

Main entry points: [`src/main.ts`](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/main.ts) (UI orchestrator), [`server/app.mjs`](https://github.com/iivn1026/rhinelabuiblogv/blob/main/server/app.mjs) (HTTP application), [`src/scene.ts`](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/scene.ts) (3D archive), [`src/article-reader.ts`](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/article-reader.ts) (Article reader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Archive experience"]
  node_main["UI orchestrator<br/>[main.ts]"]
  node_data["Archive data<br/>[data.ts]"]
  node_scene["3D archive<br/>[scene.ts]"]
  node_loop["Archive navigation<br/>[archive-loop.ts]"]
end

subgraph group_reading["Reading and media"]
  node_reader["Article reader<br/>[article-reader.ts]"]
  node_markdown["Markdown rendering<br/>[markdown.ts]"]
  node_decryption["Glass reveal"]
  node_model["Model viewer<br/>[model-viewer.ts]"]
  node_photo["Photo display<br/>[photo-panel.ts]"]
  node_upload["Photo upload<br/>[photo-upload.ts]"]
end

subgraph group_identity["Accounts and access"]
  node_access["Login and sessions<br/>[access.ts]"]
  node_accounts["Account management"]
end

subgraph group_backend["Service and persistence"]
  node_app["HTTP application<br/>[app.mjs]"]
  node_store["Store and validation<br/>[store.mjs]"]
  node_sqlite[("SQLite database")]
end

subgraph group_preferences["Playback and display"]
  node_audio["Sound and music<br/>[audio.ts]"]
  node_quality["Render quality<br/>[render-quality.ts]"]
  node_appearance["Appearance settings<br/>[appearance.ts]"]
end

node_visitor(("Visitor or user"))
node_admin(("Administrator"))

node_visitor -->|"uses"| node_main
node_admin -->|"maintains content"| node_main
node_main -->|"controls archive"| node_scene
node_scene -->|"reads records"| node_data
node_scene -->|"maps visible cells"| node_loop
node_main -->|"opens records"| node_reader
node_reader -->|"renders body"| node_markdown
node_main -->|"reveals document"| node_decryption
node_main -->|"opens model"| node_model
node_scene -->|"builds photo panel"| node_photo
node_main -->|"handles photo edits"| node_upload
node_main -->|"starts sign-in"| node_access
node_main -->|"manages accounts"| node_accounts
node_main -->|"requests API"| node_app
node_upload -->|"submits photos"| node_app
node_access -->|"authenticates"| node_app
node_accounts -->|"requests account changes"| node_app
node_app -->|"validates and queries"| node_store
node_store -->|"reads and writes"| node_sqlite
node_main -->|"plays cues"| node_audio
node_main -->|"sets rendering"| node_quality
node_main -->|"loads preferences"| node_appearance

click node_main "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/main.ts"
click node_data "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/data.ts"
click node_scene "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/scene.ts"
click node_loop "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/archive-loop.ts"
click node_reader "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/article-reader.ts"
click node_markdown "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/markdown.ts"
click node_decryption "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/document-decryption.ts"
click node_model "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/model-viewer.ts"
click node_photo "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/photo-panel.ts"
click node_upload "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/photo-upload.ts"
click node_access "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/access.ts"
click node_accounts "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/account-management.ts"
click node_app "https://github.com/iivn1026/rhinelabuiblogv/blob/main/server/app.mjs"
click node_store "https://github.com/iivn1026/rhinelabuiblogv/blob/main/server/store.mjs"
click node_audio "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/audio.ts"
click node_quality "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/render-quality.ts"
click node_appearance "https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/appearance.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_main,node_data,node_scene,node_loop,node_visitor toneBlue
class node_reader,node_markdown,node_decryption,node_model,node_photo,node_upload toneAmber
class node_access,node_accounts toneMint
class node_app,node_store,node_sqlite toneRose
class node_audio,node_quality,node_appearance,node_admin toneIndigo
```

## Components

### Archive experience

- [UI orchestrator](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/main.ts): `src/main.ts`
- [Archive data](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/data.ts): `src/data.ts`
- [3D archive](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/scene.ts): `src/scene.ts`
- [Archive navigation](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/archive-loop.ts): `src/archive-loop.ts`

### Reading and media

- [Article reader](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/article-reader.ts): `src/article-reader.ts`
- [Markdown rendering](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/markdown.ts): `src/markdown.ts`
- [Glass reveal](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/document-decryption.ts): `src/document-decryption.ts`
- [Model viewer](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/model-viewer.ts): `src/model-viewer.ts`
- [Photo display](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/photo-panel.ts): `src/photo-panel.ts`
- [Photo upload](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/photo-upload.ts): `src/photo-upload.ts`

### Accounts and access

- [Login and sessions](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/access.ts): `src/access.ts`
- [Account management](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/account-management.ts): `src/account-management.ts`

### Service and persistence

- [HTTP application](https://github.com/iivn1026/rhinelabuiblogv/blob/main/server/app.mjs): `server/app.mjs`
- [Store and validation](https://github.com/iivn1026/rhinelabuiblogv/blob/main/server/store.mjs): `server/store.mjs`
- **SQLite database**

### Playback and display

- [Sound and music](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/audio.ts): `src/audio.ts`
- [Render quality](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/render-quality.ts): `src/render-quality.ts`
- [Appearance settings](https://github.com/iivn1026/rhinelabuiblogv/blob/main/src/appearance.ts): `src/appearance.ts`

### Other components

- **Visitor or user**
- **Administrator**

## Connections

- Visitor or user → UI orchestrator: uses
- Administrator → UI orchestrator: maintains content
- UI orchestrator → 3D archive: controls archive
- 3D archive → Archive data: reads records
- 3D archive → Archive navigation: maps visible cells
- UI orchestrator → Article reader: opens records
- Article reader → Markdown rendering: renders body
- UI orchestrator → Glass reveal: reveals document
- UI orchestrator → Model viewer: opens model
- 3D archive → Photo display: builds photo panel
- UI orchestrator → Photo upload: handles photo edits
- UI orchestrator → Login and sessions: starts sign-in
- UI orchestrator → Account management: manages accounts
- UI orchestrator → HTTP application: requests API
- Photo upload → HTTP application: submits photos
- Login and sessions → HTTP application: authenticates
- Account management → HTTP application: requests account changes
- HTTP application → Store and validation: validates and queries
- Store and validation → SQLite database: reads and writes
- UI orchestrator → Sound and music: plays cues
- UI orchestrator → Render quality: sets rendering
- UI orchestrator → Appearance settings: loads preferences
