# adobe/aepsdk-concierge-ios architecture

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

- Interactive diagram: https://gitdiagram.com/adobe/aepsdk-concierge-ios
- Repository: https://github.com/adobe/aepsdk-concierge-ios

## Overview

AEPBrandConcierge is an iOS extension that embeds Adobe Brand Concierge conversational discovery in host apps. The main workflow begins when the host requests the chat UI through the SDK; Concierge handles the request and presents a chat session. The chat controller coordinates text and speech input, streams conversation results through the chat service, and renders messages and product cards. Supporting branches cover session persistence, URL handling, feedback/data handoff, and theming. Several subsystem paths are based on the file tree and SOURCE INDEX; where runtime wiring was not shown, relationships are omitted rather than inferred.

Main entry points: [`AEPBrandConcierge/Sources/Controllers/ChatController.swift`](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/ChatController.swift) (Chat controller), [`AEPBrandConcierge/Sources/Core/Concierge.swift`](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Core/Concierge.swift) (Concierge API), [`AEPBrandConcierge/Sources/Controllers/SpeechController.swift`](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/SpeechController.swift) (Speech controller), [`AEPBrandConcierge/Sources/Services/ConciergeChatService.swift`](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/ConciergeChatService.swift) (Chat service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sdk["SDK integration"]
  node_concierge["Concierge API<br/>[Concierge.swift]"]
  node_config["Chat configuration"]
  node_chat_session["Chat session"]
end

subgraph group_conversation["Conversation"]
  node_chat_controller["Chat controller"]
  node_input_controller["Input state"]
  node_speech_controller["Speech controller"]
  node_chat_service["Chat service"]
  node_session_manager["Session manager"]
  node_session_store[("Persistent store")]
  node_message_model["Message model<br/>[Message.swift]"]
end

subgraph group_presentation["Chat presentation"]
  node_chat_view["Chat view<br/>[ChatView.swift]"]
  node_message_views["Message rendering"]
  node_product_cards["Product cards"]
end

subgraph group_capabilities["Experience capabilities"]
  node_speech_capture["Speech capture"]
  node_text_speaker["Text-to-speech<br/>[TextSpeaker.swift]"]
  node_link_handler["Link routing"]
  node_feedback["Feedback payloads"]
end

subgraph group_theme["Theme system"]
  node_theme_model["Theme configuration"]
  node_theme_loader["Theme loading<br/>[ThemeLoader.swift]"]
  node_theme_css["CSS mapping"]
end

node_host(("Host app"))
node_backend{{"Concierge backend"}}

node_host -->|"requests chat"| node_concierge
node_concierge -->|"creates config"| node_config
node_concierge -->|"creates session"| node_chat_session
node_chat_session -->|"presents"| node_chat_view
node_chat_controller -->|"observes state"| node_input_controller
node_chat_controller -->|"coordinates speech"| node_speech_controller
node_speech_controller -->|"captures audio"| node_speech_capture
node_speech_controller -->|"speaks text"| node_text_speaker
node_chat_controller -->|"sends turns"| node_chat_service
node_chat_service -->|"streams requests"| node_backend
node_chat_service -->|"uses session"| node_session_manager
node_session_manager -->|"reads and writes"| node_session_store
node_chat_controller -->|"builds messages"| node_message_model
node_chat_view -.->|"renders chat"| node_message_views
node_message_views -->|"renders cards"| node_product_cards
node_product_cards -->|"routes links"| node_link_handler
node_chat_controller -->|"submits feedback"| node_feedback
node_concierge -.->|"loads theme"| node_theme_loader
node_theme_loader -.->|"decodes theme"| node_theme_model
node_theme_css -->|"maps styles"| node_theme_model

click node_concierge "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Core/Concierge.swift"
click node_config "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Configuration/ConciergeConfiguration.swift"
click node_chat_session "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Presentation/ConciergeChatSession.swift"
click node_chat_controller "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/ChatController.swift"
click node_input_controller "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/InputController.swift"
click node_speech_controller "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/SpeechController.swift"
click node_speech_capture "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/SpeechCapturer.swift"
click node_text_speaker "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/TextSpeaker.swift"
click node_chat_service "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/ConciergeChatService.swift"
click node_session_manager "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/SessionManager.swift"
click node_message_model "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Chat/Message.swift"
click node_chat_view "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Views/ChatView.swift"
click node_message_views "https://github.com/adobe/aepsdk-concierge-ios/tree/main/AEPBrandConcierge/Sources/Views/Chat"
click node_product_cards "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Views/ProductDetailCardView.swift"
click node_link_handler "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/ConciergeLinkHandler.swift"
click node_feedback "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Feedback/FeedbackPayload.swift"
click node_theme_model "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/Models/ConciergeTheme.swift"
click node_theme_loader "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/ThemeLoader.swift"
click node_theme_css "https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/ThemeCSSMapper.swift"

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_concierge,node_config,node_chat_session toneBlue
class node_chat_controller,node_input_controller,node_speech_controller,node_chat_service,node_session_manager,node_session_store,node_message_model toneAmber
class node_chat_view,node_message_views,node_product_cards toneMint
class node_speech_capture,node_text_speaker,node_link_handler,node_feedback toneRose
class node_theme_model,node_theme_loader,node_theme_css,node_host,node_backend toneIndigo
```

## Components

### SDK integration

- [Concierge API](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Core/Concierge.swift): `AEPBrandConcierge/Sources/Core/Concierge.swift`
- [Chat configuration](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Configuration/ConciergeConfiguration.swift): `AEPBrandConcierge/Sources/Models/Configuration/ConciergeConfiguration.swift`
- [Chat session](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Presentation/ConciergeChatSession.swift): `AEPBrandConcierge/Sources/Presentation/ConciergeChatSession.swift`

### Conversation

- [Chat controller](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/ChatController.swift): `AEPBrandConcierge/Sources/Controllers/ChatController.swift`
- [Input state](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/InputController.swift): `AEPBrandConcierge/Sources/Controllers/InputController.swift`
- [Speech controller](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Controllers/SpeechController.swift): `AEPBrandConcierge/Sources/Controllers/SpeechController.swift`
- [Chat service](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/ConciergeChatService.swift): `AEPBrandConcierge/Sources/Services/ConciergeChatService.swift`
- [Session manager](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/SessionManager.swift): `AEPBrandConcierge/Sources/Services/SessionManager.swift`
- **Persistent store**
- [Message model](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Chat/Message.swift): `AEPBrandConcierge/Sources/Models/Chat/Message.swift`

### Chat presentation

- [Chat view](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Views/ChatView.swift): `AEPBrandConcierge/Sources/Views/ChatView.swift`
- [Message rendering](https://github.com/adobe/aepsdk-concierge-ios/tree/main/AEPBrandConcierge/Sources/Views/Chat): `AEPBrandConcierge/Sources/Views/Chat`
- [Product cards](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Views/ProductDetailCardView.swift): `AEPBrandConcierge/Sources/Views/ProductDetailCardView.swift`

### Experience capabilities

- [Speech capture](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/SpeechCapturer.swift): `AEPBrandConcierge/Sources/Services/SpeechCapturer.swift`
- [Text-to-speech](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/TextSpeaker.swift): `AEPBrandConcierge/Sources/Services/TextSpeaker.swift`
- [Link routing](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Services/ConciergeLinkHandler.swift): `AEPBrandConcierge/Sources/Services/ConciergeLinkHandler.swift`
- [Feedback payloads](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Models/Feedback/FeedbackPayload.swift): `AEPBrandConcierge/Sources/Models/Feedback/FeedbackPayload.swift`

### Theme system

- [Theme configuration](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/Models/ConciergeTheme.swift): `AEPBrandConcierge/Sources/Theme/Models/ConciergeTheme.swift`
- [Theme loading](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/ThemeLoader.swift): `AEPBrandConcierge/Sources/Theme/ThemeLoader.swift`
- [CSS mapping](https://github.com/adobe/aepsdk-concierge-ios/blob/main/AEPBrandConcierge/Sources/Theme/ThemeCSSMapper.swift): `AEPBrandConcierge/Sources/Theme/ThemeCSSMapper.swift`

### Other components

- **Host app**
- **Concierge backend**

## Connections

- Host app → Concierge API: requests chat
- Concierge API → Chat configuration: creates config (evidence: `AEPBrandConcierge/Sources/Core/Concierge.swift`)
- Concierge API → Chat session: creates session (evidence: `AEPBrandConcierge/Sources/Core/Concierge.swift`)
- Chat session → Chat view: presents
- Chat controller → Input state: observes state (evidence: `AEPBrandConcierge/Sources/Controllers/ChatController.swift`)
- Chat controller → Speech controller: coordinates speech (evidence: `AEPBrandConcierge/Sources/Controllers/ChatController.swift`)
- Speech controller → Speech capture: captures audio (evidence: `AEPBrandConcierge/Sources/Controllers/SpeechController.swift`)
- Speech controller → Text-to-speech: speaks text (evidence: `AEPBrandConcierge/Sources/Controllers/SpeechController.swift`)
- Chat controller → Chat service: sends turns (evidence: `AEPBrandConcierge/Sources/Controllers/ChatController.swift`)
- Chat service → Concierge backend: streams requests (evidence: `AEPBrandConcierge/Sources/Services/ConciergeChatService.swift`)
- Chat service → Session manager: uses session (evidence: `AEPBrandConcierge/Sources/Services/ConciergeChatService.swift`)
- Session manager → Persistent store: reads and writes (evidence: `AEPBrandConcierge/Sources/Services/SessionManager.swift`)
- Chat controller → Message model: builds messages (evidence: `AEPBrandConcierge/Sources/Controllers/ChatController.swift`)
- Chat view → Message rendering: renders chat (evidence: `AEPBrandConcierge/Sources/Views/ChatView.swift`)
- Message rendering → Product cards: renders cards (evidence: `AEPBrandConcierge/Sources/Views/ProductDetailCardView.swift`)
- Product cards → Link routing: routes links (evidence: `AEPBrandConcierge/Sources/Views/ProductDetailCardView.swift`)
- Chat controller → Feedback payloads: submits feedback (evidence: `AEPBrandConcierge/Sources/Controllers/ChatController.swift`)
- Concierge API → Theme loading: loads theme
- Theme loading → Theme configuration: decodes theme
- CSS mapping → Theme configuration: maps styles (evidence: `AEPBrandConcierge/Sources/Theme/ThemeCSSMapper.swift`)
