# nextcloud/text architecture

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

## Overview

Nextcloud Text is a Nextcloud document editor for Markdown and plaintext, with rich-text editing, collaboration, attachments, and workspace support. The typical workflow opens a cloud file or direct-editing session, initializes an editor, synchronizes collaborative changes, and saves Markdown/document state. Routes document session, sharing, workspace, attachment, settings, user, and AI capabilities. The sampled source confirms client save/sync service coordination, session persistence, workspace lookup, and attachment handling; other route targets are represented at their documented paths because their implementations were not sampled.

Main entry points: [`appinfo/routes.php`](https://github.com/nextcloud/text/blob/main/appinfo/routes.php) (API routes), [`js/CollaborativeEditorApp-QGJSr8kx.chunk.mjs`](https://github.com/nextcloud/text/blob/main/js/CollaborativeEditorApp-QGJSr8kx.chunk.mjs) (Collaborative editor), [`lib/Service/SessionService.php`](https://github.com/nextcloud/text/blob/main/lib/Service/SessionService.php) (Session service), [`lib/Controller/SessionController.php`](https://github.com/nextcloud/text/blob/main/lib/Controller/SessionController.php) (Session endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Editor client"]
  node_entry["Editor entry<br/>[main.js]"]
  node_editor["Collaborative editor"]
  node_markdown["Markdown editor"]
  node_viewer["Document viewer<br/>[text-viewer.mjs]"]
  node_savehook["Save coordination<br/>[useSaveService.ts]"]
  node_synchook["Sync coordination<br/>[useSyncService.ts]"]
  node_search["Search plugin<br/>[searchQuery.js]"]
end

subgraph group_server["Nextcloud application"]
  node_routes["API routes<br/>[routes.php]"]
  node_workspace["Workspace API"]
  node_attachment["Attachment API"]
  node_application["App integration<br/>[Application.php]"]
  node_sessionapi["Session endpoints"]
  node_publicapi["Public sessions"]
  node_settings["Settings API"]
  node_users["User API"]
  node_ai["AI tagging<br/>[AiController.php]"]
end

subgraph group_collab["Collaboration state"]
  node_sessionservice["Session service<br/>[SessionService.php]"]
  node_sessionstore[("Session records<br/>[SessionMapper.php]")]
  node_cache[("Token cache")]
end

subgraph group_content["Content features"]
  node_markdowncontent["Markdown content"]
  node_plain["Plain text"]
  node_diff["Content comparison"]
end

node_actor(("User or app"))
node_externalcloud[("Nextcloud files")]
node_collaborators(("Collaborators"))

node_actor -->|"opens editor"| node_entry
node_entry -->|"mounts view"| node_editor
node_actor -.->|"uses editor"| node_markdown
node_actor -.->|"views file"| node_viewer
node_editor -->|"provides sync"| node_synchook
node_editor -->|"provides save"| node_savehook
node_editor -->|"queries text"| node_search
node_savehook -->|"listens events"| node_synchook
node_savehook -->|"saves document"| node_sessionapi
node_synchook -->|"syncs changes"| node_sessionapi
node_editor -->|"loads attachments"| node_attachment
node_editor -.->|"opens workspace"| node_workspace
node_workspace -->|"reads files"| node_externalcloud
node_attachment -->|"reads writes"| node_externalcloud
node_routes -->|"dispatches workspace"| node_workspace
node_routes -->|"dispatches attachments"| node_attachment
node_routes -->|"dispatches sessions"| node_sessionapi
node_routes -->|"dispatches public"| node_publicapi
node_routes -->|"dispatches settings"| node_settings
node_routes -->|"dispatches users"| node_users
node_routes -->|"dispatches tagging"| node_ai
node_sessionapi -->|"manages sessions"| node_sessionservice
node_publicapi -->|"manages sessions"| node_sessionservice
node_sessionservice -->|"reads writes"| node_sessionstore
node_sessionservice -->|"caches tokens"| node_cache
node_collaborators -->|"joins session"| node_publicapi
node_application -.->|"registers events"| node_externalcloud
node_markdown -->|"edits Markdown"| node_markdowncontent
node_viewer -->|"renders text"| node_plain
node_editor -.->|"compares content"| node_diff

click node_entry "https://github.com/nextcloud/text/blob/main/src/main.js"
click node_editor "https://github.com/nextcloud/text/blob/main/js/CollaborativeEditorApp-QGJSr8kx.chunk.mjs"
click node_markdown "https://github.com/nextcloud/text/blob/main/js/MarkdownContentEditorApp-H-Rnf-6U.chunk.mjs"
click node_viewer "https://github.com/nextcloud/text/blob/main/js/text-viewer.mjs"
click node_savehook "https://github.com/nextcloud/text/blob/main/src/composables/useSaveService.ts"
click node_synchook "https://github.com/nextcloud/text/blob/main/src/composables/useSyncService.ts"
click node_search "https://github.com/nextcloud/text/blob/main/src/plugins/searchQuery.js"
click node_routes "https://github.com/nextcloud/text/blob/main/appinfo/routes.php"
click node_workspace "https://github.com/nextcloud/text/blob/main/lib/Controller/WorkspaceController.php"
click node_attachment "https://github.com/nextcloud/text/blob/main/lib/Controller/AttachmentController.php"
click node_application "https://github.com/nextcloud/text/blob/main/lib/AppInfo/Application.php"
click node_sessionapi "https://github.com/nextcloud/text/blob/main/lib/Controller/SessionController.php"
click node_publicapi "https://github.com/nextcloud/text/blob/main/lib/Controller/PublicSessionController.php"
click node_settings "https://github.com/nextcloud/text/blob/main/lib/Controller/SettingsController.php"
click node_users "https://github.com/nextcloud/text/blob/main/lib/Controller/UserApiController.php"
click node_ai "https://github.com/nextcloud/text/blob/main/lib/Controller/AiController.php"
click node_sessionservice "https://github.com/nextcloud/text/blob/main/lib/Service/SessionService.php"
click node_sessionstore "https://github.com/nextcloud/text/blob/main/lib/Db/SessionMapper.php"
click node_markdowncontent "https://github.com/nextcloud/text/blob/main/js/MarkdownContentEditor-sbCy-VvH.chunk.mjs"
click node_plain "https://github.com/nextcloud/text/blob/main/js/PlainTextReader-G7bI_M4x.chunk.mjs"
click node_diff "https://github.com/nextcloud/text/blob/main/js/MarkdownContentComparison-BSLwS6Ll.chunk.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_entry,node_editor,node_markdown,node_viewer,node_savehook,node_synchook,node_search,node_actor toneBlue
class node_routes,node_workspace,node_attachment,node_application,node_sessionapi,node_publicapi,node_settings,node_users,node_ai,node_externalcloud toneAmber
class node_sessionservice,node_sessionstore,node_cache toneMint
class node_markdowncontent,node_plain,node_diff toneRose
class node_collaborators toneIndigo
```

## Components

### Editor client

- [Editor entry](https://github.com/nextcloud/text/blob/main/src/main.js): `src/main.js`
- [Collaborative editor](https://github.com/nextcloud/text/blob/main/js/CollaborativeEditorApp-QGJSr8kx.chunk.mjs): `js/CollaborativeEditorApp-QGJSr8kx.chunk.mjs`
- [Markdown editor](https://github.com/nextcloud/text/blob/main/js/MarkdownContentEditorApp-H-Rnf-6U.chunk.mjs): `js/MarkdownContentEditorApp-H-Rnf-6U.chunk.mjs`
- [Document viewer](https://github.com/nextcloud/text/blob/main/js/text-viewer.mjs): `js/text-viewer.mjs`
- [Save coordination](https://github.com/nextcloud/text/blob/main/src/composables/useSaveService.ts): `src/composables/useSaveService.ts`
- [Sync coordination](https://github.com/nextcloud/text/blob/main/src/composables/useSyncService.ts): `src/composables/useSyncService.ts`
- [Search plugin](https://github.com/nextcloud/text/blob/main/src/plugins/searchQuery.js): `src/plugins/searchQuery.js`

### Nextcloud application

- [API routes](https://github.com/nextcloud/text/blob/main/appinfo/routes.php): `appinfo/routes.php`
- [Workspace API](https://github.com/nextcloud/text/blob/main/lib/Controller/WorkspaceController.php): `lib/Controller/WorkspaceController.php`
- [Attachment API](https://github.com/nextcloud/text/blob/main/lib/Controller/AttachmentController.php): `lib/Controller/AttachmentController.php`
- [App integration](https://github.com/nextcloud/text/blob/main/lib/AppInfo/Application.php): `lib/AppInfo/Application.php`
- [Session endpoints](https://github.com/nextcloud/text/blob/main/lib/Controller/SessionController.php): `lib/Controller/SessionController.php`
- [Public sessions](https://github.com/nextcloud/text/blob/main/lib/Controller/PublicSessionController.php): `lib/Controller/PublicSessionController.php`
- [Settings API](https://github.com/nextcloud/text/blob/main/lib/Controller/SettingsController.php): `lib/Controller/SettingsController.php`
- [User API](https://github.com/nextcloud/text/blob/main/lib/Controller/UserApiController.php): `lib/Controller/UserApiController.php`
- [AI tagging](https://github.com/nextcloud/text/blob/main/lib/Controller/AiController.php): `lib/Controller/AiController.php`

### Collaboration state

- [Session service](https://github.com/nextcloud/text/blob/main/lib/Service/SessionService.php): `lib/Service/SessionService.php`
- [Session records](https://github.com/nextcloud/text/blob/main/lib/Db/SessionMapper.php): `lib/Db/SessionMapper.php`
- **Token cache**

### Content features

- [Markdown content](https://github.com/nextcloud/text/blob/main/js/MarkdownContentEditor-sbCy-VvH.chunk.mjs): `js/MarkdownContentEditor-sbCy-VvH.chunk.mjs`
- [Plain text](https://github.com/nextcloud/text/blob/main/js/PlainTextReader-G7bI_M4x.chunk.mjs): `js/PlainTextReader-G7bI_M4x.chunk.mjs`
- [Content comparison](https://github.com/nextcloud/text/blob/main/js/MarkdownContentComparison-BSLwS6Ll.chunk.mjs): `js/MarkdownContentComparison-BSLwS6Ll.chunk.mjs`

### Other components

- **User or app**
- **Nextcloud files**
- **Collaborators**

## Connections

- User or app → Editor entry: opens editor
- Editor entry → Collaborative editor: mounts view
- User or app → Markdown editor: uses editor
- User or app → Document viewer: views file
- Collaborative editor → Sync coordination: provides sync
- Collaborative editor → Save coordination: provides save
- Collaborative editor → Search plugin: queries text
- Save coordination → Sync coordination: listens events
- Save coordination → Session endpoints: saves document
- Sync coordination → Session endpoints: syncs changes
- Collaborative editor → Attachment API: loads attachments
- Collaborative editor → Workspace API: opens workspace
- Workspace API → Nextcloud files: reads files
- Attachment API → Nextcloud files: reads writes
- API routes → Workspace API: dispatches workspace
- API routes → Attachment API: dispatches attachments
- API routes → Session endpoints: dispatches sessions
- API routes → Public sessions: dispatches public
- API routes → Settings API: dispatches settings
- API routes → User API: dispatches users
- API routes → AI tagging: dispatches tagging
- Session endpoints → Session service: manages sessions
- Public sessions → Session service: manages sessions
- Session service → Session records: reads writes
- Session service → Token cache: caches tokens
- Collaborators → Public sessions: joins session
- App integration → Nextcloud files: registers events
- Markdown editor → Markdown content: edits Markdown
- Document viewer → Plain text: renders text
- Collaborative editor → Content comparison: compares content
