# pazvanti/chronicle architecture

> Architecture diagram of the GitHub repository pazvanti/chronicle, 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/pazvanti/chronicle
- Repository: https://github.com/pazvanti/chronicle
- Video tour (about a minute): https://gitdiagram.com/pazvanti/chronicle/video

## Overview

Chronicle is a local-first novel-authoring and publishing studio. Writers open or create a project, draft and organize chapters, enrich it with annotations and planning/worldbuilding tools, then export publication files or retain a project archive. The graph includes major README capabilities and the sampled app shell, services, and settings; unsampled subsystem links are omitted where implementation ownership cannot be verified.

Main entry points: [`src/components/Export/ExportModal.tsx`](https://github.com/pazvanti/chronicle/blob/main/src/components/Export/ExportModal.tsx) (Export Controls), [`src/App.tsx`](https://github.com/pazvanti/chronicle/blob/main/src/App.tsx) (App Shell), [`src/components/Cloud/CloudFileBrowserModal.tsx`](https://github.com/pazvanti/chronicle/blob/main/src/components/Cloud/CloudFileBrowserModal.tsx) (Cloud Controls), [`src/context/TtsContext.tsx`](https://github.com/pazvanti/chronicle/blob/main/src/context/TtsContext.tsx) (Audio Context)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_authoring["Writing Workspace"]
  node_editor["Chapter Editor"]
  node_binder["Chapter Binder<br/>[ChapterList.tsx]"]
  node_reader["Reader View<br/>[ReaderView.tsx]"]
  node_comments["Author Comments"]
  node_snapshots["Story Snapshots<br/>[SnapshotsModal.tsx]"]
  node_snapshot_diff["Snapshot Diff"]
end

subgraph group_story["Story Development"]
  node_timeline["Narrative Timeline<br/>[TimelineStudio.tsx]"]
  node_characters["Character Codex"]
  node_locations["Location Codex<br/>[LocationStudio.tsx]"]
  node_presence["Cast Presence"]
end

subgraph group_publishing["Publishing"]
  node_cover["Cover Designer<br/>[CoverStudio.tsx]"]
  node_toc["Contents Manager<br/>[TocManager.tsx]"]
  node_export_ui["Export Controls<br/>[ExportModal.tsx]"]
  node_epub_export["EPUB Exporter<br/>[epubExporter.ts]"]
  node_pdf_export["Print PDF Typesetter"]
  node_shunn_export["Shunn Exporter"]
  node_project_format["Project Archive<br/>[projectFormat.ts]"]
end

subgraph group_runtime["App Runtime"]
  node_app["App Shell<br/>[App.tsx]"]
  node_epub_context["Project Context<br/>[EpubContext.tsx]"]
  node_project_types["Project Model<br/>[project.ts]"]
  node_settings[("App Settings<br/>[settingsStorage.ts]")]
end

subgraph group_integrations["Storage and Audio"]
  node_webdav_ui["Cloud Controls"]
  node_webdav_config[("WebDAV Config<br/>[webdavStorage.ts]")]
  node_webdav_client["WebDAV Client<br/>[webdavClient.ts]"]
  node_webdav_server[("Self-hosted WebDAV")]
  node_tts_context["Audio Context<br/>[TtsContext.tsx]"]
  node_tts_engine["Kokoro TTS Engine<br/>[qwenTtsEngine.ts]"]
  node_audio_player["Audio Player<br/>[AudioPlayerBar.tsx]"]
end

node_writer(("Writer"))

node_writer -->|"uses"| node_app
node_app -->|"provides context"| node_epub_context
node_epub_context -->|"models project"| node_project_types
node_app -->|"renders workspace"| node_editor
node_writer -->|"drafts chapters"| node_editor
node_writer -->|"organizes chapters"| node_binder
node_writer -->|"reads manuscript"| node_reader
node_writer -->|"annotates passages"| node_comments
node_writer -->|"reviews revisions"| node_snapshots
node_snapshots -->|"compares snapshots"| node_snapshot_diff
node_writer -->|"plots story"| node_timeline
node_writer -->|"builds dossiers"| node_characters
node_writer -->|"documents settings"| node_locations
node_writer -->|"analyzes cast"| node_presence
node_writer -->|"designs cover"| node_cover
node_writer -->|"edits contents"| node_toc
node_writer -->|"requests export"| node_export_ui
node_export_ui -->|"exports EPUB"| node_epub_export
node_export_ui -->|"typesets PDF"| node_pdf_export
node_export_ui -->|"formats manuscript"| node_shunn_export
node_export_ui -->|"packages project"| node_project_format
node_writer -->|"customizes app"| node_settings
node_writer -.->|"manages sync"| node_webdav_ui
node_webdav_ui -.->|"loads and saves"| node_webdav_config
node_webdav_ui -.->|"transfers files"| node_webdav_client
node_webdav_client -.->|"syncs remotely"| node_webdav_server
node_writer -->|"proofreads aloud"| node_tts_context
node_tts_context -->|"generates speech"| node_tts_engine
node_tts_context -->|"plays audio"| node_audio_player

click node_app "https://github.com/pazvanti/chronicle/blob/main/src/App.tsx"
click node_epub_context "https://github.com/pazvanti/chronicle/blob/main/src/context/EpubContext.tsx"
click node_project_types "https://github.com/pazvanti/chronicle/blob/main/src/types/project.ts"
click node_editor "https://github.com/pazvanti/chronicle/blob/main/src/components/Editor/EditorContainer.tsx"
click node_binder "https://github.com/pazvanti/chronicle/blob/main/src/components/Sidebar/ChapterList.tsx"
click node_reader "https://github.com/pazvanti/chronicle/blob/main/src/components/Reader/ReaderView.tsx"
click node_comments "https://github.com/pazvanti/chronicle/blob/main/src/components/Comments/CommentsSidebar.tsx"
click node_snapshots "https://github.com/pazvanti/chronicle/blob/main/src/components/Snapshots/SnapshotsModal.tsx"
click node_snapshot_diff "https://github.com/pazvanti/chronicle/blob/main/src/services/diff/snapshotDiffService.ts"
click node_timeline "https://github.com/pazvanti/chronicle/blob/main/src/components/Timeline/TimelineStudio.tsx"
click node_characters "https://github.com/pazvanti/chronicle/blob/main/src/components/Characters/CharacterStudio.tsx"
click node_locations "https://github.com/pazvanti/chronicle/blob/main/src/components/Locations/LocationStudio.tsx"
click node_presence "https://github.com/pazvanti/chronicle/blob/main/src/services/analysis/presenceAnalysisService.ts"
click node_cover "https://github.com/pazvanti/chronicle/blob/main/src/components/Cover/CoverStudio.tsx"
click node_toc "https://github.com/pazvanti/chronicle/blob/main/src/components/Toc/TocManager.tsx"
click node_export_ui "https://github.com/pazvanti/chronicle/blob/main/src/components/Export/ExportModal.tsx"
click node_epub_export "https://github.com/pazvanti/chronicle/blob/main/src/services/epub/epubExporter.ts"
click node_pdf_export "https://github.com/pazvanti/chronicle/blob/main/src/services/epub/pdfBookTypesetter.ts"
click node_shunn_export "https://github.com/pazvanti/chronicle/blob/main/src/services/epub/shunnManuscriptExporter.ts"
click node_project_format "https://github.com/pazvanti/chronicle/blob/main/src/services/epub/projectFormat.ts"
click node_settings "https://github.com/pazvanti/chronicle/blob/main/src/services/epub/settingsStorage.ts"
click node_webdav_ui "https://github.com/pazvanti/chronicle/blob/main/src/components/Cloud/CloudFileBrowserModal.tsx"
click node_webdav_config "https://github.com/pazvanti/chronicle/blob/main/src/services/cloud/webdavStorage.ts"
click node_webdav_client "https://github.com/pazvanti/chronicle/blob/main/src/services/cloud/webdavClient.ts"
click node_tts_context "https://github.com/pazvanti/chronicle/blob/main/src/context/TtsContext.tsx"
click node_tts_engine "https://github.com/pazvanti/chronicle/blob/main/src/services/tts/qwenTtsEngine.ts"
click node_audio_player "https://github.com/pazvanti/chronicle/blob/main/src/components/TTS/AudioPlayerBar.tsx"

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_editor,node_binder,node_reader,node_comments,node_snapshots,node_snapshot_diff toneBlue
class node_timeline,node_characters,node_locations,node_presence toneAmber
class node_cover,node_toc,node_export_ui,node_epub_export,node_pdf_export,node_shunn_export,node_project_format toneMint
class node_app,node_epub_context,node_project_types,node_settings toneRose
class node_webdav_ui,node_webdav_config,node_webdav_client,node_webdav_server,node_tts_context,node_tts_engine,node_audio_player,node_writer toneIndigo
```

## Components

### Writing Workspace

- [Chapter Editor](https://github.com/pazvanti/chronicle/blob/main/src/components/Editor/EditorContainer.tsx): `src/components/Editor/EditorContainer.tsx`
- [Chapter Binder](https://github.com/pazvanti/chronicle/blob/main/src/components/Sidebar/ChapterList.tsx): `src/components/Sidebar/ChapterList.tsx`
- [Reader View](https://github.com/pazvanti/chronicle/blob/main/src/components/Reader/ReaderView.tsx): `src/components/Reader/ReaderView.tsx`
- [Author Comments](https://github.com/pazvanti/chronicle/blob/main/src/components/Comments/CommentsSidebar.tsx): `src/components/Comments/CommentsSidebar.tsx`
- [Story Snapshots](https://github.com/pazvanti/chronicle/blob/main/src/components/Snapshots/SnapshotsModal.tsx): `src/components/Snapshots/SnapshotsModal.tsx`
- [Snapshot Diff](https://github.com/pazvanti/chronicle/blob/main/src/services/diff/snapshotDiffService.ts): `src/services/diff/snapshotDiffService.ts`

### Story Development

- [Narrative Timeline](https://github.com/pazvanti/chronicle/blob/main/src/components/Timeline/TimelineStudio.tsx): `src/components/Timeline/TimelineStudio.tsx`
- [Character Codex](https://github.com/pazvanti/chronicle/blob/main/src/components/Characters/CharacterStudio.tsx): `src/components/Characters/CharacterStudio.tsx`
- [Location Codex](https://github.com/pazvanti/chronicle/blob/main/src/components/Locations/LocationStudio.tsx): `src/components/Locations/LocationStudio.tsx`
- [Cast Presence](https://github.com/pazvanti/chronicle/blob/main/src/services/analysis/presenceAnalysisService.ts): `src/services/analysis/presenceAnalysisService.ts`

### Publishing

- [Cover Designer](https://github.com/pazvanti/chronicle/blob/main/src/components/Cover/CoverStudio.tsx): `src/components/Cover/CoverStudio.tsx`
- [Contents Manager](https://github.com/pazvanti/chronicle/blob/main/src/components/Toc/TocManager.tsx): `src/components/Toc/TocManager.tsx`
- [Export Controls](https://github.com/pazvanti/chronicle/blob/main/src/components/Export/ExportModal.tsx): `src/components/Export/ExportModal.tsx`
- [EPUB Exporter](https://github.com/pazvanti/chronicle/blob/main/src/services/epub/epubExporter.ts): `src/services/epub/epubExporter.ts`
- [Print PDF Typesetter](https://github.com/pazvanti/chronicle/blob/main/src/services/epub/pdfBookTypesetter.ts): `src/services/epub/pdfBookTypesetter.ts`
- [Shunn Exporter](https://github.com/pazvanti/chronicle/blob/main/src/services/epub/shunnManuscriptExporter.ts): `src/services/epub/shunnManuscriptExporter.ts`
- [Project Archive](https://github.com/pazvanti/chronicle/blob/main/src/services/epub/projectFormat.ts): `src/services/epub/projectFormat.ts`

### App Runtime

- [App Shell](https://github.com/pazvanti/chronicle/blob/main/src/App.tsx): `src/App.tsx`
- [Project Context](https://github.com/pazvanti/chronicle/blob/main/src/context/EpubContext.tsx): `src/context/EpubContext.tsx`
- [Project Model](https://github.com/pazvanti/chronicle/blob/main/src/types/project.ts): `src/types/project.ts`
- [App Settings](https://github.com/pazvanti/chronicle/blob/main/src/services/epub/settingsStorage.ts): `src/services/epub/settingsStorage.ts`

### Storage and Audio

- [Cloud Controls](https://github.com/pazvanti/chronicle/blob/main/src/components/Cloud/CloudFileBrowserModal.tsx): `src/components/Cloud/CloudFileBrowserModal.tsx`
- [WebDAV Config](https://github.com/pazvanti/chronicle/blob/main/src/services/cloud/webdavStorage.ts): `src/services/cloud/webdavStorage.ts`
- [WebDAV Client](https://github.com/pazvanti/chronicle/blob/main/src/services/cloud/webdavClient.ts): `src/services/cloud/webdavClient.ts`
- **Self-hosted WebDAV**
- [Audio Context](https://github.com/pazvanti/chronicle/blob/main/src/context/TtsContext.tsx): `src/context/TtsContext.tsx`
- [Kokoro TTS Engine](https://github.com/pazvanti/chronicle/blob/main/src/services/tts/qwenTtsEngine.ts): `src/services/tts/qwenTtsEngine.ts`
- [Audio Player](https://github.com/pazvanti/chronicle/blob/main/src/components/TTS/AudioPlayerBar.tsx): `src/components/TTS/AudioPlayerBar.tsx`

### Other components

- **Writer**

## Connections

- Writer → App Shell: uses
- App Shell → Project Context: provides context
- Project Context → Project Model: models project
- App Shell → Chapter Editor: renders workspace
- Writer → Chapter Editor: drafts chapters
- Writer → Chapter Binder: organizes chapters
- Writer → Reader View: reads manuscript
- Writer → Author Comments: annotates passages
- Writer → Story Snapshots: reviews revisions
- Story Snapshots → Snapshot Diff: compares snapshots
- Writer → Narrative Timeline: plots story
- Writer → Character Codex: builds dossiers
- Writer → Location Codex: documents settings
- Writer → Cast Presence: analyzes cast
- Writer → Cover Designer: designs cover
- Writer → Contents Manager: edits contents
- Writer → Export Controls: requests export
- Export Controls → EPUB Exporter: exports EPUB
- Export Controls → Print PDF Typesetter: typesets PDF
- Export Controls → Shunn Exporter: formats manuscript
- Export Controls → Project Archive: packages project
- Writer → App Settings: customizes app
- Writer → Cloud Controls: manages sync
- Cloud Controls → WebDAV Config: loads and saves
- Cloud Controls → WebDAV Client: transfers files
- WebDAV Client → Self-hosted WebDAV: syncs remotely
- Writer → Audio Context: proofreads aloud
- Audio Context → Kokoro TTS Engine: generates speech
- Audio Context → Audio Player: plays audio
