# amiantos/writers-guild architecture

> Architecture diagram of the GitHub repository amiantos/writers-guild, 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/amiantos/writers-guild
- Repository: https://github.com/amiantos/writers-guild

## Overview

Writers Guild is a browser-based AI-assisted story-writing application, with character cards, lorebooks, chats, Continuities, and optional multi-user accounts. The primary workflow is to choose characters and story context in the Vue client, submit work through the API, and persist the resulting story. Separate branches cover character and lorebook management, chat, Continuities, the Archivist, and sign-in. The graph uses README capability descriptions and shown import/reference evidence; several route implementations and provider integrations were not sampled, so their internal call paths are omitted.

Main entry points: [`vue_client/src/services/api.js`](https://github.com/amiantos/writers-guild/blob/main/vue_client/src/services/api.js) (API Client), [`server/src/services/sqliteStorage.js`](https://github.com/amiantos/writers-guild/blob/main/server/src/services/sqliteStorage.js) (Library Storage), [`server/src/routes/chats.js`](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/chats.js) (Character Chats), [`server/src/services/provider-factory.js`](https://github.com/amiantos/writers-guild/blob/main/server/src/services/provider-factory.js) (Provider Selection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Vue Client"]
  node_vue["Vue Application<br/>[App.vue]"]
  node_story_ui["Story Editor<br/>[StoryEditor.vue]"]
  node_api_client["API Client<br/>[api.js]"]
end

subgraph group_api["API Features"]
  node_stories["Story Management<br/>[stories.js]"]
  node_characters["Character Library<br/>[characters.js]"]
  node_lorebooks["Lorebooks<br/>[lorebooks.js]"]
  node_chats["Character Chats<br/>[chats.js]"]
  node_continuities["Continuities<br/>[continuities.js]"]
  node_archivist["Archivist<br/>[archivist.js]"]
end

subgraph group_generation["Generation"]
  node_generation_api["Generation API<br/>[stories.js]"]
  node_provider_factory["Provider Selection"]
  node_providers["Model Providers"]
end

subgraph group_identity["Identity and Data"]
  node_auth["Authentication<br/>[auth.js]"]
  node_user_context["User Scoping<br/>[user-context.js]"]
  node_sqlite_storage[("Library Storage<br/>[sqliteStorage.js]")]
  node_database[("Database<br/>[database.js]")]
end

node_reader(("Writer"))

node_reader -->|"uses"| node_vue
node_vue -->|"routes to"| node_story_ui
node_story_ui -.->|"requests API"| node_api_client
node_api_client -.->|"manages stories"| node_stories
node_api_client -.->|"manages characters"| node_characters
node_api_client -.->|"manages lorebooks"| node_lorebooks
node_api_client -.->|"manages chats"| node_chats
node_api_client -.->|"manages continuity"| node_continuities
node_api_client -.->|"signs in"| node_auth
node_chats -->|"selects provider"| node_provider_factory
node_generation_api -.->|"selects provider"| node_provider_factory
node_provider_factory -.->|"dispatches generation"| node_providers
node_chats -->|"stores chats"| node_sqlite_storage
node_chats -.->|"uses continuity"| node_continuities
node_archivist -->|"requests suggestions"| node_provider_factory
node_archivist -->|"reads library"| node_sqlite_storage
node_continuities -->|"stores continuity"| node_sqlite_storage
node_auth -->|"sets request user"| node_user_context
node_user_context -->|"scopes queries"| node_database
node_sqlite_storage -->|"initializes database"| node_database
node_characters -->|"reads library"| node_sqlite_storage

click node_vue "https://github.com/amiantos/writers-guild/blob/main/vue_client/src/App.vue"
click node_story_ui "https://github.com/amiantos/writers-guild/blob/main/vue_client/src/views/StoryEditor.vue"
click node_api_client "https://github.com/amiantos/writers-guild/blob/main/vue_client/src/services/api.js"
click node_stories "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/stories.js"
click node_characters "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/characters.js"
click node_lorebooks "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/lorebooks.js"
click node_chats "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/chats.js"
click node_continuities "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/continuities.js"
click node_archivist "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/archivist.js"
click node_generation_api "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/stories.js"
click node_provider_factory "https://github.com/amiantos/writers-guild/blob/main/server/src/services/provider-factory.js"
click node_providers "https://github.com/amiantos/writers-guild/tree/main/server/src/services/providers"
click node_auth "https://github.com/amiantos/writers-guild/blob/main/server/src/routes/auth.js"
click node_user_context "https://github.com/amiantos/writers-guild/blob/main/server/src/services/user-context.js"
click node_sqlite_storage "https://github.com/amiantos/writers-guild/blob/main/server/src/services/sqliteStorage.js"
click node_database "https://github.com/amiantos/writers-guild/blob/main/server/src/services/database.js"

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_vue,node_story_ui,node_api_client toneBlue
class node_stories,node_characters,node_lorebooks,node_chats,node_continuities,node_archivist toneAmber
class node_generation_api,node_provider_factory,node_providers toneMint
class node_auth,node_user_context,node_sqlite_storage,node_database toneRose
class node_reader toneIndigo
```

## Components

### Vue Client

- [Vue Application](https://github.com/amiantos/writers-guild/blob/main/vue_client/src/App.vue): `vue_client/src/App.vue`
- [Story Editor](https://github.com/amiantos/writers-guild/blob/main/vue_client/src/views/StoryEditor.vue): `vue_client/src/views/StoryEditor.vue`
- [API Client](https://github.com/amiantos/writers-guild/blob/main/vue_client/src/services/api.js): `vue_client/src/services/api.js`

### API Features

- [Story Management](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/stories.js): `server/src/routes/stories.js`
- [Character Library](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/characters.js): `server/src/routes/characters.js`
- [Lorebooks](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/lorebooks.js): `server/src/routes/lorebooks.js`
- [Character Chats](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/chats.js): `server/src/routes/chats.js`
- [Continuities](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/continuities.js): `server/src/routes/continuities.js`
- [Archivist](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/archivist.js): `server/src/routes/archivist.js`

### Generation

- [Generation API](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/stories.js): `server/src/routes/stories.js`
- [Provider Selection](https://github.com/amiantos/writers-guild/blob/main/server/src/services/provider-factory.js): `server/src/services/provider-factory.js`
- [Model Providers](https://github.com/amiantos/writers-guild/tree/main/server/src/services/providers): `server/src/services/providers`

### Identity and Data

- [Authentication](https://github.com/amiantos/writers-guild/blob/main/server/src/routes/auth.js): `server/src/routes/auth.js`
- [User Scoping](https://github.com/amiantos/writers-guild/blob/main/server/src/services/user-context.js): `server/src/services/user-context.js`
- [Library Storage](https://github.com/amiantos/writers-guild/blob/main/server/src/services/sqliteStorage.js): `server/src/services/sqliteStorage.js`
- [Database](https://github.com/amiantos/writers-guild/blob/main/server/src/services/database.js): `server/src/services/database.js`

### Other components

- **Writer**

## Connections

- Writer → Vue Application: uses (evidence: `README.md`)
- Vue Application → Story Editor: routes to
- Story Editor → API Client: requests API
- API Client → Story Management: manages stories (evidence: `README.md`)
- API Client → Character Library: manages characters (evidence: `README.md`)
- API Client → Lorebooks: manages lorebooks (evidence: `README.md`)
- API Client → Character Chats: manages chats (evidence: `README.md`)
- API Client → Continuities: manages continuity (evidence: `README.md`)
- API Client → Authentication: signs in (evidence: `README.md`)
- Character Chats → Provider Selection: selects provider (evidence: `server/src/routes/chats.js`)
- Generation API → Provider Selection: selects provider
- Provider Selection → Model Providers: dispatches generation
- Character Chats → Library Storage: stores chats (evidence: `server/src/routes/chats.js`)
- Character Chats → Continuities: uses continuity
- Archivist → Provider Selection: requests suggestions (evidence: `server/src/routes/archivist.js`)
- Archivist → Library Storage: reads library (evidence: `server/src/routes/archivist.js`)
- Continuities → Library Storage: stores continuity (evidence: `server/src/routes/continuities.js`)
- Authentication → User Scoping: sets request user (evidence: `server/src/routes/auth.js`)
- User Scoping → Database: scopes queries (evidence: `server/src/services/user-context.js`)
- Library Storage → Database: initializes database (evidence: `server/src/services/sqliteStorage.js`)
- Character Library → Library Storage: reads library (evidence: `server/src/routes/characters.js`)
