# boxcat0/novelcompany architecture

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

- Interactive diagram: https://gitdiagram.com/boxcat0/novelcompany
- Repository: https://github.com/boxcat0/novelcompany

## Overview

NovelCompany is a local-first Electron desktop app for organizing a novel project: users navigate company, works, canon, employee, and settings screens, manage works and episodes, and author structured canon records. The renderer is hosted by Electron and communicates through a preload/IPC boundary; the main process initializes local storage and SQLite, then registers domain handlers. Episode operations coordinate metadata and TXT files, including rollback on failure. The tree shows distinct work, canon, and episode subsystems, but their handler and screen internals were not sampled; those links are therefore limited to visible entry points.

Main entry points: [`src/App.tsx`](https://github.com/boxcat0/novelcompany/blob/main/src/App.tsx) (App Navigation), [`electron/main.cjs`](https://github.com/boxcat0/novelcompany/blob/main/electron/main.cjs) (Electron Main), [`electron/database/database.cjs`](https://github.com/boxcat0/novelcompany/blob/main/electron/database/database.cjs) (Database Access), [`electron/ipc/preload-api.cjs`](https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/preload-api.cjs) (IPC API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_renderer["Renderer UI"]
  node_app["App Navigation<br/>[App.tsx]"]
  node_works_ui["Works Screen<br/>[WorksScreen.tsx]"]
  node_work_ui["Work Management"]
  node_concept_ui["Canon Authoring<br/>[ConceptScreen.tsx]"]
  node_company_ui["Company Screen<br/>[CompanyScreen.tsx]"]
  node_employees_ui["Employees Screen"]
  node_settings_ui["Settings Screen<br/>[SettingsScreen.tsx]"]
end

subgraph group_bridge["Electron Bridge"]
  node_main["Electron Main<br/>[main.cjs]"]
  node_preload["Preload Bridge<br/>[preload.cjs]"]
  node_api["IPC API<br/>[preload-api.cjs]"]
  node_work_handlers["Work Handlers<br/>[work-handlers.cjs]"]
  node_canon_handlers["Canon Handlers<br/>[canon-handlers.cjs]"]
  node_episode_handlers["Episode Handlers"]
end

subgraph group_domain["Domain Services"]
  node_episode_service["Episode Service"]
  node_work_repo["Work Repository"]
  node_episode_repo["Episode Repository"]
  node_canon_records["Canon Records"]
  node_canon_definitions["Canon Definitions"]
end

subgraph group_persistence["Local Persistence"]
  node_database["Database Access<br/>[database.cjs]"]
  node_sqlite[("SQLite Database")]
  node_episode_storage["Episode Storage"]
  node_episode_files[("Episode TXT Files")]
end

node_user(("User"))

node_user -->|"navigates"| node_app
node_app -->|"renders"| node_works_ui
node_app -->|"renders"| node_work_ui
node_app -->|"renders"| node_concept_ui
node_app -->|"renders"| node_company_ui
node_app -->|"renders"| node_employees_ui
node_app -->|"renders"| node_settings_ui
node_main -->|"initializes"| node_database
node_main -->|"registers"| node_work_handlers
node_main -->|"registers"| node_canon_handlers
node_main -->|"registers"| node_episode_handlers
node_main -->|"creates"| node_episode_storage
node_main -->|"loads"| node_preload
node_preload -->|"exposes"| node_api
node_api -->|"invokes"| node_work_handlers
node_api -->|"invokes"| node_canon_handlers
node_api -->|"invokes"| node_episode_handlers
node_episode_handlers -->|"dispatches"| node_episode_service
node_episode_handlers -->|"reads"| node_episode_repo
node_work_handlers -->|"dispatches"| node_work_repo
node_canon_handlers -->|"dispatches"| node_canon_records
node_canon_records -->|"reads"| node_canon_definitions
node_episode_service -->|"updates metadata"| node_episode_repo
node_episode_service -->|"stages file changes"| node_episode_storage
node_work_repo -->|"queries"| node_database
node_episode_repo -->|"queries"| node_database
node_canon_records -->|"queries"| node_database
node_canon_definitions -->|"queries"| node_database
node_database -->|"reads and writes"| node_sqlite
node_episode_storage -->|"reads and writes"| node_episode_files

click node_app "https://github.com/boxcat0/novelcompany/blob/main/src/App.tsx"
click node_works_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/WorksScreen.tsx"
click node_work_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/WorkManagementScreen.tsx"
click node_concept_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/ConceptScreen.tsx"
click node_company_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/CompanyScreen.tsx"
click node_employees_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/EmployeesScreen.tsx"
click node_settings_ui "https://github.com/boxcat0/novelcompany/blob/main/src/screens/SettingsScreen.tsx"
click node_main "https://github.com/boxcat0/novelcompany/blob/main/electron/main.cjs"
click node_preload "https://github.com/boxcat0/novelcompany/blob/main/electron/preload.cjs"
click node_api "https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/preload-api.cjs"
click node_work_handlers "https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/work-handlers.cjs"
click node_canon_handlers "https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/canon-handlers.cjs"
click node_episode_handlers "https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/episode-handlers.cjs"
click node_episode_service "https://github.com/boxcat0/novelcompany/blob/main/electron/episode-service.cjs"
click node_work_repo "https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/work-repository.cjs"
click node_episode_repo "https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/episode-repository.cjs"
click node_canon_records "https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/canon-record-repository.cjs"
click node_canon_definitions "https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/canon-definition-repository.cjs"
click node_database "https://github.com/boxcat0/novelcompany/blob/main/electron/database/database.cjs"
click node_episode_storage "https://github.com/boxcat0/novelcompany/blob/main/electron/storage/local-episode-storage.cjs"

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_app,node_works_ui,node_work_ui,node_concept_ui,node_company_ui,node_employees_ui,node_settings_ui,node_user toneBlue
class node_main,node_preload,node_api,node_work_handlers,node_canon_handlers,node_episode_handlers toneAmber
class node_episode_service,node_work_repo,node_episode_repo,node_canon_records,node_canon_definitions toneMint
class node_database,node_sqlite,node_episode_storage,node_episode_files toneRose
```

## Components

### Renderer UI

- [App Navigation](https://github.com/boxcat0/novelcompany/blob/main/src/App.tsx): `src/App.tsx`
- [Works Screen](https://github.com/boxcat0/novelcompany/blob/main/src/screens/WorksScreen.tsx): `src/screens/WorksScreen.tsx`
- [Work Management](https://github.com/boxcat0/novelcompany/blob/main/src/screens/WorkManagementScreen.tsx): `src/screens/WorkManagementScreen.tsx`
- [Canon Authoring](https://github.com/boxcat0/novelcompany/blob/main/src/screens/ConceptScreen.tsx): `src/screens/ConceptScreen.tsx`
- [Company Screen](https://github.com/boxcat0/novelcompany/blob/main/src/screens/CompanyScreen.tsx): `src/screens/CompanyScreen.tsx`
- [Employees Screen](https://github.com/boxcat0/novelcompany/blob/main/src/screens/EmployeesScreen.tsx): `src/screens/EmployeesScreen.tsx`
- [Settings Screen](https://github.com/boxcat0/novelcompany/blob/main/src/screens/SettingsScreen.tsx): `src/screens/SettingsScreen.tsx`

### Electron Bridge

- [Electron Main](https://github.com/boxcat0/novelcompany/blob/main/electron/main.cjs): `electron/main.cjs`
- [Preload Bridge](https://github.com/boxcat0/novelcompany/blob/main/electron/preload.cjs): `electron/preload.cjs`
- [IPC API](https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/preload-api.cjs): `electron/ipc/preload-api.cjs`
- [Work Handlers](https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/work-handlers.cjs): `electron/ipc/work-handlers.cjs`
- [Canon Handlers](https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/canon-handlers.cjs): `electron/ipc/canon-handlers.cjs`
- [Episode Handlers](https://github.com/boxcat0/novelcompany/blob/main/electron/ipc/episode-handlers.cjs): `electron/ipc/episode-handlers.cjs`

### Domain Services

- [Episode Service](https://github.com/boxcat0/novelcompany/blob/main/electron/episode-service.cjs): `electron/episode-service.cjs`
- [Work Repository](https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/work-repository.cjs): `electron/database/repositories/work-repository.cjs`
- [Episode Repository](https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/episode-repository.cjs): `electron/database/repositories/episode-repository.cjs`
- [Canon Records](https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/canon-record-repository.cjs): `electron/database/repositories/canon-record-repository.cjs`
- [Canon Definitions](https://github.com/boxcat0/novelcompany/blob/main/electron/database/repositories/canon-definition-repository.cjs): `electron/database/repositories/canon-definition-repository.cjs`

### Local Persistence

- [Database Access](https://github.com/boxcat0/novelcompany/blob/main/electron/database/database.cjs): `electron/database/database.cjs`
- **SQLite Database**
- [Episode Storage](https://github.com/boxcat0/novelcompany/blob/main/electron/storage/local-episode-storage.cjs): `electron/storage/local-episode-storage.cjs`
- **Episode TXT Files**

### Other components

- **User**

## Connections

- User → App Navigation: navigates
- App Navigation → Works Screen: renders
- App Navigation → Work Management: renders
- App Navigation → Canon Authoring: renders
- App Navigation → Company Screen: renders
- App Navigation → Employees Screen: renders
- App Navigation → Settings Screen: renders
- Electron Main → Database Access: initializes
- Electron Main → Work Handlers: registers
- Electron Main → Canon Handlers: registers
- Electron Main → Episode Handlers: registers
- Electron Main → Episode Storage: creates
- Electron Main → Preload Bridge: loads
- Preload Bridge → IPC API: exposes
- IPC API → Work Handlers: invokes
- IPC API → Canon Handlers: invokes
- IPC API → Episode Handlers: invokes
- Episode Handlers → Episode Service: dispatches
- Episode Handlers → Episode Repository: reads
- Work Handlers → Work Repository: dispatches
- Canon Handlers → Canon Records: dispatches
- Canon Records → Canon Definitions: reads
- Episode Service → Episode Repository: updates metadata
- Episode Service → Episode Storage: stages file changes
- Work Repository → Database Access: queries
- Episode Repository → Database Access: queries
- Canon Records → Database Access: queries
- Canon Definitions → Database Access: queries
- Database Access → SQLite Database: reads and writes
- Episode Storage → Episode TXT Files: reads and writes
