# giselezz/encore architecture

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

- Interactive diagram: https://gitdiagram.com/giselezz/encore
- Repository: https://github.com/giselezz/encore

## Overview

Encore is an offline iOS concert journal: people record shows, attach photos and captions, browse and revisit memories, and can share images into a concert or see the latest memory in a widget. The main flow runs from SwiftUI screens through view models and use cases to repository protocols, Core Data, and JPEG photo storage. The share extension reuses browse/save operations; the widget reads a featured-memory repository. Edges reflect README statements or shown source references/calls; unsampled subsystem links are limited to documented relationships.

Main entry points: [`Encore/EncoreShare/ShareViewController.swift`](https://github.com/giselezz/encore/blob/main/Encore/EncoreShare/ShareViewController.swift) (Share extension flow), [`Encore/Encore/UseCases`](https://github.com/giselezz/encore/tree/main/Encore/Encore/UseCases) (Concert use cases), [`Encore/Encore/ViewModels`](https://github.com/giselezz/encore/tree/main/Encore/Encore/ViewModels) (Screen view models), [`Encore/Encore/Repositories/CoreDataConcertRepository.swift`](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataConcertRepository.swift) (Core Data concert store)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Encore app"]
  node_library["Concert library"]
  node_concertdetail["Concert details"]
  node_memoryview["Add memory screen"]
  node_viewmodels["Screen view models"]
end

subgraph group_domain["Journal operations"]
  node_usecases["Concert use cases"]
  node_concertmodel["Concert model<br/>[Concert.swift]"]
  node_momentmodel["Memory model"]
  node_featuredmodel["Featured memory"]
end

subgraph group_storage["Local persistence"]
  node_concertprotocol["Concert repository contract"]
  node_memoryprotocol["Memory repository contract"]
  node_featuredprotocol["Featured repository contract"]
  node_concertrepo[("Core Data concert store")]
  node_memoryrepo[("Core Data memory store")]
  node_featuredrepo[("Latest memory reader")]
  node_photostorage["Photo storage"]
  node_sharedstorage[("App Group storage")]
end

subgraph group_extensions["Sharing and widget"]
  node_shareextension["Share extension flow"]
  node_shareview["Concert chooser"]
  node_widget["Home Screen widget<br/>[EncoreWidget.swift]"]
  node_widgetrefresh["Widget refresh wrappers"]
end

node_person(("Concert journal user"))
node_shareactor(("Share sheet user"))

node_person -->|"opens journal"| node_library
node_library -->|"updates state"| node_viewmodels
node_concertdetail -->|"loads details"| node_viewmodels
node_memoryview -->|"submits memory"| node_viewmodels
node_viewmodels -->|"invokes operations"| node_usecases
node_usecases -->|"reads and writes"| node_concertprotocol
node_usecases -->|"reads and writes"| node_memoryprotocol
node_usecases -->|"saves and cleans"| node_photostorage
node_concertrepo -->|"implements"| node_concertprotocol
node_memoryrepo -->|"implements"| node_memoryprotocol
node_featuredrepo -->|"implements"| node_featuredprotocol
node_photostorage -->|"uses shared folder"| node_sharedstorage
node_concertrepo -->|"maps records"| node_concertmodel
node_memoryrepo -->|"maps records"| node_momentmodel
node_featuredrepo -->|"returns latest"| node_featuredmodel
node_shareactor -->|"shares image"| node_shareextension
node_shareextension -->|"presents chooser"| node_shareview
node_shareextension -->|"reuses browse and save"| node_usecases
node_shareextension -->|"configures concert store"| node_concertrepo
node_shareextension -->|"configures memory store"| node_memoryrepo
node_shareextension -->|"configures photo storage"| node_photostorage
node_widget -->|"fetches latest memory"| node_featuredrepo
node_widget -->|"loads photo"| node_sharedstorage
node_widgetrefresh -->|"requests refresh"| node_widget
node_widgetrefresh -->|"wraps repository"| node_memoryprotocol

click node_library "https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/ConcertLibraryView.swift"
click node_concertdetail "https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/ConcertDetailView.swift"
click node_memoryview "https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/AddConcertMemoryView.swift"
click node_viewmodels "https://github.com/giselezz/encore/tree/main/Encore/Encore/ViewModels"
click node_usecases "https://github.com/giselezz/encore/tree/main/Encore/Encore/UseCases"
click node_concertmodel "https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/Concert.swift"
click node_momentmodel "https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/ConcertMoment.swift"
click node_featuredmodel "https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/FeaturedConcertMemory.swift"
click node_concertprotocol "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/ConcertRepository.swift"
click node_memoryprotocol "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/ConcertMemoryRepository.swift"
click node_featuredprotocol "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/FeaturedConcertMemoryRepository.swift"
click node_concertrepo "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataConcertRepository.swift"
click node_memoryrepo "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataConcertMemoryRepository.swift"
click node_featuredrepo "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataFeaturedConcertMemoryRepository.swift"
click node_photostorage "https://github.com/giselezz/encore/blob/main/Encore/Encore/Storage/LocalConcertPhotoStorage.swift"
click node_sharedstorage "https://github.com/giselezz/encore/blob/main/Encore/Encore/Shared/EncoreSharedStorage.swift"
click node_shareextension "https://github.com/giselezz/encore/blob/main/Encore/EncoreShare/ShareViewController.swift"
click node_shareview "https://github.com/giselezz/encore/blob/main/Encore/EncoreShare/ShareConcertView.swift"
click node_widget "https://github.com/giselezz/encore/blob/main/Encore/EncoreWidget/EncoreWidget.swift"
click node_widgetrefresh "https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/WidgetRefreshingMemoryRepository.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_library,node_concertdetail,node_memoryview,node_viewmodels,node_person,node_shareactor toneBlue
class node_usecases,node_concertmodel,node_momentmodel,node_featuredmodel toneAmber
class node_concertprotocol,node_memoryprotocol,node_featuredprotocol,node_concertrepo,node_memoryrepo,node_featuredrepo,node_photostorage,node_sharedstorage toneMint
class node_shareextension,node_shareview,node_widget,node_widgetrefresh toneRose
```

## Components

### Encore app

- [Concert library](https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/ConcertLibraryView.swift): `Encore/Encore/Views/ConcertLibraryView.swift`
- [Concert details](https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/ConcertDetailView.swift): `Encore/Encore/Views/ConcertDetailView.swift`
- [Add memory screen](https://github.com/giselezz/encore/blob/main/Encore/Encore/Views/AddConcertMemoryView.swift): `Encore/Encore/Views/AddConcertMemoryView.swift`
- [Screen view models](https://github.com/giselezz/encore/tree/main/Encore/Encore/ViewModels): `Encore/Encore/ViewModels`

### Journal operations

- [Concert use cases](https://github.com/giselezz/encore/tree/main/Encore/Encore/UseCases): `Encore/Encore/UseCases`
- [Concert model](https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/Concert.swift): `Encore/Encore/Domain/Concert.swift`
- [Memory model](https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/ConcertMoment.swift): `Encore/Encore/Domain/ConcertMoment.swift`
- [Featured memory](https://github.com/giselezz/encore/blob/main/Encore/Encore/Domain/FeaturedConcertMemory.swift): `Encore/Encore/Domain/FeaturedConcertMemory.swift`

### Local persistence

- [Concert repository contract](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/ConcertRepository.swift): `Encore/Encore/Repositories/ConcertRepository.swift`
- [Memory repository contract](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/ConcertMemoryRepository.swift): `Encore/Encore/Repositories/ConcertMemoryRepository.swift`
- [Featured repository contract](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/FeaturedConcertMemoryRepository.swift): `Encore/Encore/Repositories/FeaturedConcertMemoryRepository.swift`
- [Core Data concert store](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataConcertRepository.swift): `Encore/Encore/Repositories/CoreDataConcertRepository.swift`
- [Core Data memory store](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataConcertMemoryRepository.swift): `Encore/Encore/Repositories/CoreDataConcertMemoryRepository.swift`
- [Latest memory reader](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/CoreDataFeaturedConcertMemoryRepository.swift): `Encore/Encore/Repositories/CoreDataFeaturedConcertMemoryRepository.swift`
- [Photo storage](https://github.com/giselezz/encore/blob/main/Encore/Encore/Storage/LocalConcertPhotoStorage.swift): `Encore/Encore/Storage/LocalConcertPhotoStorage.swift`
- [App Group storage](https://github.com/giselezz/encore/blob/main/Encore/Encore/Shared/EncoreSharedStorage.swift): `Encore/Encore/Shared/EncoreSharedStorage.swift`

### Sharing and widget

- [Share extension flow](https://github.com/giselezz/encore/blob/main/Encore/EncoreShare/ShareViewController.swift): `Encore/EncoreShare/ShareViewController.swift`
- [Concert chooser](https://github.com/giselezz/encore/blob/main/Encore/EncoreShare/ShareConcertView.swift): `Encore/EncoreShare/ShareConcertView.swift`
- [Home Screen widget](https://github.com/giselezz/encore/blob/main/Encore/EncoreWidget/EncoreWidget.swift): `Encore/EncoreWidget/EncoreWidget.swift`
- [Widget refresh wrappers](https://github.com/giselezz/encore/blob/main/Encore/Encore/Repositories/WidgetRefreshingMemoryRepository.swift): `Encore/Encore/Repositories/WidgetRefreshingMemoryRepository.swift`

### Other components

- **Concert journal user**
- **Share sheet user**

## Connections

- Concert journal user → Concert library: opens journal
- Concert library → Screen view models: updates state (evidence: `Encore/Encore/Views/ConcertLibraryView.swift`)
- Concert details → Screen view models: loads details (evidence: `Encore/Encore/Views/ConcertDetailView.swift`)
- Add memory screen → Screen view models: submits memory (evidence: `Encore/Encore/Views/AddConcertMemoryView.swift`)
- Screen view models → Concert use cases: invokes operations (evidence: `Encore/Encore/ViewModels/ConcertDetailViewModel.swift`)
- Concert use cases → Concert repository contract: reads and writes (evidence: `Encore/Encore/UseCases/BrowseConcertHistory.swift`)
- Concert use cases → Memory repository contract: reads and writes (evidence: `Encore/Encore/UseCases/AddConcertMemory.swift`)
- Concert use cases → Photo storage: saves and cleans (evidence: `Encore/Encore/UseCases/AddConcertMemory.swift`)
- Core Data concert store → Concert repository contract: implements (evidence: `Encore/Encore/Repositories/CoreDataConcertRepository.swift`)
- Core Data memory store → Memory repository contract: implements (evidence: `Encore/Encore/Repositories/CoreDataConcertMemoryRepository.swift`)
- Latest memory reader → Featured repository contract: implements (evidence: `Encore/Encore/Repositories/CoreDataFeaturedConcertMemoryRepository.swift`)
- Photo storage → App Group storage: uses shared folder (evidence: `Encore/Encore/Storage/LocalConcertPhotoStorage.swift`)
- Core Data concert store → Concert model: maps records (evidence: `Encore/Encore/Repositories/CoreDataConcertRepository.swift`)
- Core Data memory store → Memory model: maps records (evidence: `Encore/Encore/Repositories/CoreDataConcertMemoryRepository.swift`)
- Latest memory reader → Featured memory: returns latest (evidence: `Encore/Encore/Repositories/CoreDataFeaturedConcertMemoryRepository.swift`)
- Share sheet user → Share extension flow: shares image
- Share extension flow → Concert chooser: presents chooser (evidence: `Encore/EncoreShare/ShareViewController.swift`)
- Share extension flow → Concert use cases: reuses browse and save (evidence: `Encore/EncoreShare/ShareViewController.swift`)
- Share extension flow → Core Data concert store: configures concert store (evidence: `Encore/EncoreShare/ShareViewController.swift`)
- Share extension flow → Core Data memory store: configures memory store (evidence: `Encore/EncoreShare/ShareViewController.swift`)
- Share extension flow → Photo storage: configures photo storage (evidence: `Encore/EncoreShare/ShareViewController.swift`)
- Home Screen widget → Latest memory reader: fetches latest memory (evidence: `Encore/EncoreWidget/EncoreWidget.swift`)
- Home Screen widget → App Group storage: loads photo (evidence: `Encore/EncoreWidget/EncoreWidget.swift`)
- Widget refresh wrappers → Home Screen widget: requests refresh (evidence: `Encore/Encore/Repositories/WidgetRefreshingMemoryRepository.swift`)
- Widget refresh wrappers → Memory repository contract: wraps repository (evidence: `Encore/Encore/Repositories/WidgetRefreshingMemoryRepository.swift`)
