# deckgo/deckdeckgo architecture

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

## Overview

DeckDeckGo is a web presentation editor and developer kit, with a separate remote-control app and cloud-backed services. The main user flow is creating and editing a deck in Studio, then presenting or sharing it; documented capabilities also include polls, templates, media integrations, offline work, GitHub publishing, and Figma import. The tree and excerpts support some internal provider and remote-control relationships; several feature branches are documented in the README but their implementation wiring was not sampled, so those links are marked unverified.

Main entry points: [`providers/sync/src/providers/storage.provider.ts`](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/storage.provider.ts) (Storage provider), [`providers/sync/src/services/admin.service.ts`](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/services/admin.service.ts) (Sync services), [`backend/src/app.js`](https://github.com/deckgo/deckdeckgo/blob/main/backend/src/app.js) (Realtime backend), [`studio/src/app/app-root.tsx`](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/app-root.tsx) (Studio editor)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_apps["User applications"]
  node_studio["Studio editor<br/>[app-root.tsx]"]
  node_remoteapp["Remote control app<br/>[app-root.tsx]"]
end

subgraph group_editing["Editing runtime"]
  node_deckedit["Deck editor"]
  node_docedit["Document editor<br/>[app-doc-editor.tsx]"]
  node_plugins["Editor plugins<br/>[code.plugin.ts]"]
  node_paragraphs["Paragraph parsing"]
end

subgraph group_sync["Data and sync"]
  node_syncsvc["Sync services<br/>[admin.service.ts]"]
  node_deckprovider["Deck provider<br/>[deck.provider.ts]"]
  node_docprovider["Document provider<br/>[doc.provider.ts]"]
  node_publishprovider["Publish provider"]
  node_storageprovider["Storage provider"]
  node_authstore["Authentication state<br/>[auth.store.ts]"]
  node_deckstore["Deck state<br/>[deck.store.ts]"]
  node_docstore["Document state<br/>[doc.store.ts]"]
  node_envstore["Environment state<br/>[env.store.ts]"]
  node_storebase["Store base<br/>[store.ts]"]
  node_providerselect["Provider selection<br/>[providers.utils.ts]"]
end

subgraph group_cloud["Cloud services"]
  node_firebase[("Firebase storage")]
  node_offline[("Offline storage")]
  node_backend["Realtime backend<br/>[app.js]"]
  node_pollsocket["Poll sockets<br/>[socket-io-poll.js]"]
  node_remotesocket["Remote sockets"]
end

subgraph group_presentation["Presentation features"]
  node_remotecomm["Remote communication"]
  node_remotecontroller["Deck remote handler<br/>[controller.ts]"]
  node_polls["Live polls<br/>[poll.service.ts]"]
  node_templates["Slide templates"]
  node_media["Media integrations"]
  node_github["GitHub publishing<br/>[publish-github.ts]"]
  node_offlinework["Offline presentation<br/>[editor.provider.ts]"]
end

node_author(("Presenter or author"))

node_author -->|"creates decks"| node_studio
node_studio -.->|"edits decks"| node_deckedit
node_deckedit -.->|"uses plugins"| node_plugins
node_docedit -.->|"parses content"| node_paragraphs
node_syncsvc -->|"loads and deletes"| node_deckprovider
node_syncsvc -->|"loads and deletes"| node_docprovider
node_syncsvc -->|"updates landing"| node_publishprovider
node_syncsvc -->|"deletes files"| node_storageprovider
node_storageprovider -->|"reads identity"| node_authstore
node_storageprovider -->|"checks mode"| node_envstore
node_storageprovider -->|"selects cloud provider"| node_providerselect
node_storageprovider -->|"reads offline files"| node_offline
node_providerselect -.->|"resolves provider"| node_firebase
node_authstore -->|"extends"| node_storebase
node_envstore -->|"extends"| node_storebase
node_author -->|"controls presentation"| node_remoteapp
node_remoteapp -->|"sends remote commands"| node_remotecomm
node_remotecontroller -.->|"accepts remote events"| node_author
node_backend -->|"loads socket handler"| node_pollsocket
node_backend -->|"loads socket handler"| node_remotesocket
node_author -->|"runs live polls"| node_polls
node_author -->|"creates responsive slides"| node_templates
node_author -->|"searches media"| node_media
node_author -->|"publishes source"| node_github
node_author -->|"works offline"| node_offlinework

click node_studio "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/app-root.tsx"
click node_deckedit "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/editors/app-deck-editor/app-deck-editor.tsx"
click node_docedit "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/editors/app-doc-editor/app-doc-editor.tsx"
click node_plugins "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/plugins/code.plugin.ts"
click node_paragraphs "https://github.com/deckgo/deckdeckgo/blob/main/webcomponents/studio/src/utils/parse-elements.utils.tsx"
click node_syncsvc "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/services/admin.service.ts"
click node_deckprovider "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/deck.provider.ts"
click node_docprovider "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/doc.provider.ts"
click node_publishprovider "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/publish.provider.ts"
click node_storageprovider "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/storage.provider.ts"
click node_authstore "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/auth.store.ts"
click node_deckstore "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/deck.store.ts"
click node_docstore "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/doc.store.ts"
click node_envstore "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/env.store.ts"
click node_storebase "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/store.ts"
click node_providerselect "https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/utils/providers.utils.ts"
click node_firebase "https://github.com/deckgo/deckdeckgo/blob/main/providers/firebase/src/providers/storage/storage.firebase.ts"
click node_offline "https://github.com/deckgo/deckdeckgo/blob/main/providers/offline/src/providers/storage.offline.provider.ts"
click node_backend "https://github.com/deckgo/deckdeckgo/blob/main/backend/src/app.js"
click node_pollsocket "https://github.com/deckgo/deckdeckgo/blob/main/backend/src/socket-io-poll.js"
click node_remotesocket "https://github.com/deckgo/deckdeckgo/blob/main/backend/src/socket-io-remote.js"
click node_remoteapp "https://github.com/deckgo/deckdeckgo/blob/main/remote/src/app/app-root.tsx"
click node_remotecomm "https://github.com/deckgo/deckdeckgo/blob/main/remote/src/app/services/communication/communication.service.tsx"
click node_remotecontroller "https://github.com/deckgo/deckdeckgo/blob/main/utils/kit/src/remote/controller.ts"
click node_polls "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/services/poll/poll.service.ts"
click node_templates "https://github.com/deckgo/deckdeckgo/blob/main/templates/chart/src/components/slide/deckdeckgo-slide-chart.tsx"
click node_media "https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/providers/unsplash/unsplash.provider.ts"
click node_github "https://github.com/deckgo/deckdeckgo/blob/main/cloud/functions/src/watch/publish/github/publish-github.ts"
click node_offlinework "https://github.com/deckgo/deckdeckgo/blob/main/providers/offline/src/providers/editor.provider.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_studio,node_remoteapp toneBlue
class node_deckedit,node_docedit,node_plugins,node_paragraphs toneAmber
class node_syncsvc,node_deckprovider,node_docprovider,node_publishprovider,node_storageprovider,node_authstore,node_deckstore,node_docstore,node_envstore,node_storebase,node_providerselect toneMint
class node_firebase,node_offline,node_backend,node_pollsocket,node_remotesocket toneRose
class node_remotecomm,node_remotecontroller,node_polls,node_templates,node_media,node_github,node_offlinework,node_author toneIndigo
```

## Components

### User applications

- [Studio editor](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/app-root.tsx): `studio/src/app/app-root.tsx`
- [Remote control app](https://github.com/deckgo/deckdeckgo/blob/main/remote/src/app/app-root.tsx): `remote/src/app/app-root.tsx`

### Editing runtime

- [Deck editor](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/editors/app-deck-editor/app-deck-editor.tsx): `studio/src/app/editors/app-deck-editor/app-deck-editor.tsx`
- [Document editor](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/editors/app-doc-editor/app-doc-editor.tsx): `studio/src/app/editors/app-doc-editor/app-doc-editor.tsx`
- [Editor plugins](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/plugins/code.plugin.ts): `studio/src/app/plugins/code.plugin.ts`
- [Paragraph parsing](https://github.com/deckgo/deckdeckgo/blob/main/webcomponents/studio/src/utils/parse-elements.utils.tsx): `webcomponents/studio/src/utils/parse-elements.utils.tsx`

### Data and sync

- [Sync services](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/services/admin.service.ts): `providers/sync/src/services/admin.service.ts`
- [Deck provider](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/deck.provider.ts): `providers/sync/src/providers/deck.provider.ts`
- [Document provider](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/doc.provider.ts): `providers/sync/src/providers/doc.provider.ts`
- [Publish provider](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/publish.provider.ts): `providers/sync/src/providers/publish.provider.ts`
- [Storage provider](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/providers/storage.provider.ts): `providers/sync/src/providers/storage.provider.ts`
- [Authentication state](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/auth.store.ts): `providers/sync/src/stores/auth.store.ts`
- [Deck state](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/deck.store.ts): `providers/sync/src/stores/deck.store.ts`
- [Document state](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/doc.store.ts): `providers/sync/src/stores/doc.store.ts`
- [Environment state](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/env.store.ts): `providers/sync/src/stores/env.store.ts`
- [Store base](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/stores/store.ts): `providers/sync/src/stores/store.ts`
- [Provider selection](https://github.com/deckgo/deckdeckgo/blob/main/providers/sync/src/utils/providers.utils.ts): `providers/sync/src/utils/providers.utils.ts`

### Cloud services

- [Firebase storage](https://github.com/deckgo/deckdeckgo/blob/main/providers/firebase/src/providers/storage/storage.firebase.ts): `providers/firebase/src/providers/storage/storage.firebase.ts`
- [Offline storage](https://github.com/deckgo/deckdeckgo/blob/main/providers/offline/src/providers/storage.offline.provider.ts): `providers/offline/src/providers/storage.offline.provider.ts`
- [Realtime backend](https://github.com/deckgo/deckdeckgo/blob/main/backend/src/app.js): `backend/src/app.js`
- [Poll sockets](https://github.com/deckgo/deckdeckgo/blob/main/backend/src/socket-io-poll.js): `backend/src/socket-io-poll.js`
- [Remote sockets](https://github.com/deckgo/deckdeckgo/blob/main/backend/src/socket-io-remote.js): `backend/src/socket-io-remote.js`

### Presentation features

- [Remote communication](https://github.com/deckgo/deckdeckgo/blob/main/remote/src/app/services/communication/communication.service.tsx): `remote/src/app/services/communication/communication.service.tsx`
- [Deck remote handler](https://github.com/deckgo/deckdeckgo/blob/main/utils/kit/src/remote/controller.ts): `utils/kit/src/remote/controller.ts`
- [Live polls](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/services/poll/poll.service.ts): `studio/src/app/services/poll/poll.service.ts`
- [Slide templates](https://github.com/deckgo/deckdeckgo/blob/main/templates/chart/src/components/slide/deckdeckgo-slide-chart.tsx): `templates/chart/src/components/slide/deckdeckgo-slide-chart.tsx`
- [Media integrations](https://github.com/deckgo/deckdeckgo/blob/main/studio/src/app/providers/unsplash/unsplash.provider.ts): `studio/src/app/providers/unsplash/unsplash.provider.ts`
- [GitHub publishing](https://github.com/deckgo/deckdeckgo/blob/main/cloud/functions/src/watch/publish/github/publish-github.ts): `cloud/functions/src/watch/publish/github/publish-github.ts`
- [Offline presentation](https://github.com/deckgo/deckdeckgo/blob/main/providers/offline/src/providers/editor.provider.ts): `providers/offline/src/providers/editor.provider.ts`

### Other components

- **Presenter or author**

## Connections

- Presenter or author → Studio editor: creates decks (evidence: `README.md`)
- Studio editor → Deck editor: edits decks
- Deck editor → Editor plugins: uses plugins
- Document editor → Paragraph parsing: parses content
- Sync services → Deck provider: loads and deletes (evidence: `providers/sync/src/services/admin.service.ts`)
- Sync services → Document provider: loads and deletes (evidence: `providers/sync/src/services/admin.service.ts`)
- Sync services → Publish provider: updates landing (evidence: `providers/sync/src/services/admin.service.ts`)
- Sync services → Storage provider: deletes files (evidence: `providers/sync/src/services/admin.service.ts`)
- Storage provider → Authentication state: reads identity (evidence: `providers/sync/src/providers/storage.provider.ts`)
- Storage provider → Environment state: checks mode (evidence: `providers/sync/src/providers/storage.provider.ts`)
- Storage provider → Provider selection: selects cloud provider (evidence: `providers/sync/src/providers/storage.provider.ts`)
- Storage provider → Offline storage: reads offline files (evidence: `providers/sync/src/providers/storage.provider.ts`)
- Provider selection → Firebase storage: resolves provider
- Authentication state → Store base: extends (evidence: `providers/sync/src/stores/auth.store.ts`)
- Environment state → Store base: extends (evidence: `providers/sync/src/stores/env.store.ts`)
- Presenter or author → Remote control app: controls presentation (evidence: `README.md`)
- Remote control app → Remote communication: sends remote commands (evidence: `remote/src/app/services/communication/communication.service.tsx`)
- Deck remote handler → Presenter or author: accepts remote events
- Realtime backend → Poll sockets: loads socket handler (evidence: `backend/src/app.js`)
- Realtime backend → Remote sockets: loads socket handler (evidence: `backend/src/app.js`)
- Presenter or author → Live polls: runs live polls (evidence: `README.md`)
- Presenter or author → Slide templates: creates responsive slides (evidence: `README.md`)
- Presenter or author → Media integrations: searches media (evidence: `README.md`)
- Presenter or author → GitHub publishing: publishes source (evidence: `README.md`)
- Presenter or author → Offline presentation: works offline (evidence: `README.md`)
