# proverbiallemon/sailswift architecture

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

- Interactive diagram: https://gitdiagram.com/proverbiallemon/sailswift
- Repository: https://github.com/proverbiallemon/sailswift
- Video tour (about a minute): https://gitdiagram.com/proverbiallemon/sailswift/video

## Overview

Sailswift is a native macOS manager for Ship of Harkinian mods. Users browse GameBanana or open an install link, download and install a mod, then manage enabled state and load order or launch the game. The app also saves/restores profiles, shares modpacks, and checks installed mods for updates. AppState is the central workflow coordinator; the graph reflects README capabilities and sampled source, while some unsampled feature wiring is documented rather than inferred.

Main entry points: [`Sailswift/App/AppState.swift`](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/App/AppState.swift) (App state), [`Sailswift/Views/MainView.swift`](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/MainView.swift) (Main view), [`Sailswift/ViewModels/DownloadManager.swift`](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/DownloadManager.swift) (Download manager), [`Sailswift/ViewModels/ModManager.swift`](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/ModManager.swift) (Mod manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["App interface"]
  node_app["SwiftUI app<br/>[SailswiftApp.swift]"]
  node_main["Main view<br/>[MainView.swift]"]
  node_modlist["Mod list<br/>[ModListView.swift]"]
  node_browser["Mod browser"]
  node_settings["Settings<br/>[SettingsView.swift]"]
end

subgraph group_workflow["Mod workflows"]
  node_appstate["App state<br/>[AppState.swift]"]
  node_modmanager["Mod manager<br/>[ModManager.swift]"]
  node_downloads["Download manager"]
  node_profiles["Profile manager<br/>[ModProfile.swift]"]
  node_modpack["Modpack export"]
end

subgraph group_services["Services and integrations"]
  node_api["GameBanana API"]
  node_updates["Update checker"]
  node_files["File service<br/>[FileService.swift]"]
  node_archivecheck["Archive validator"]
  node_gameconfig["Game config"]
  node_updater["App updater"]
end

subgraph group_state["Local state"]
  node_mod["Mod model<br/>[Mod.swift]"]
  node_modpackmodel["Modpack model<br/>[Modpack.swift]"]
  node_profilesfile[("Profiles JSON")]
  node_modfiles[("Installed mods")]
  node_configfile[("Game config file")]
end

node_user(("User"))
node_game["Ship of Harkinian"]
node_gamebanana["GameBanana"]
node_sparkle["Sparkle update service"]
node_system["macOS file system"]

node_user -->|"opens"| node_app
node_app -->|"shows"| node_main
node_main -->|"dispatches actions"| node_appstate
node_main -->|"shows mods"| node_modlist
node_main -->|"shows browser"| node_browser
node_main -->|"shows settings"| node_settings
node_browser -->|"requests install"| node_appstate
node_appstate -->|"manages mods"| node_modmanager
node_appstate -->|"starts downloads"| node_downloads
node_appstate -->|"manages profiles"| node_profiles
node_appstate -->|"syncs load order"| node_gameconfig
node_appstate -->|"checks updates"| node_updates
node_appstate -->|"fetches mod files"| node_api
node_modmanager -->|"lists and changes files"| node_files
node_modmanager -->|"reads mods"| node_modfiles
node_modmanager -->|"creates models"| node_mod
node_downloads -->|"fetches file info"| node_api
node_downloads -->|"validates extraction"| node_archivecheck
node_downloads -->|"installs files"| node_modfiles
node_profiles -->|"loads and saves"| node_profilesfile
node_profiles -->|"captures mod state"| node_modfiles
node_appstate -->|"supports sharing"| node_modpack
node_modpack -->|"exports and imports"| node_modpackmodel
node_gameconfig -->|"reads and writes"| node_configfile
node_appstate -->|"launches"| node_game
node_api -->|"requests metadata"| node_gamebanana
node_updates -->|"checks mod records"| node_api
node_updates -->|"checks installed mods"| node_modfiles
node_settings -->|"configures updates"| node_updater
node_updater -->|"checks releases"| node_sparkle
node_downloads -.->|"uses archive tools"| node_system

click node_app "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/App/SailswiftApp.swift"
click node_main "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/MainView.swift"
click node_modlist "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModListView.swift"
click node_browser "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModBrowserView.swift"
click node_settings "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/SettingsView.swift"
click node_appstate "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/App/AppState.swift"
click node_modmanager "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/ModManager.swift"
click node_downloads "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/DownloadManager.swift"
click node_profiles "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/ModProfile.swift"
click node_modpack "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModpackExportView.swift"
click node_api "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/GameBananaAPI.swift"
click node_updates "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/ModUpdateChecker.swift"
click node_files "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/FileService.swift"
click node_archivecheck "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/ArchiveEntryValidator.swift"
click node_gameconfig "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/GameConfigService.swift"
click node_updater "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/UpdaterService.swift"
click node_mod "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/Mod.swift"
click node_modpackmodel "https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/Modpack.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_app,node_main,node_modlist,node_browser,node_settings,node_user toneBlue
class node_appstate,node_modmanager,node_downloads,node_profiles,node_modpack toneAmber
class node_api,node_updates,node_files,node_archivecheck,node_gameconfig,node_updater toneMint
class node_mod,node_modpackmodel,node_profilesfile,node_modfiles,node_configfile toneRose
class node_game,node_gamebanana,node_sparkle,node_system toneIndigo
```

## Components

### App interface

- [SwiftUI app](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/App/SailswiftApp.swift): `Sailswift/App/SailswiftApp.swift`
- [Main view](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/MainView.swift): `Sailswift/Views/MainView.swift`
- [Mod list](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModListView.swift): `Sailswift/Views/ModListView.swift`
- [Mod browser](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModBrowserView.swift): `Sailswift/Views/ModBrowserView.swift`
- [Settings](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/SettingsView.swift): `Sailswift/Views/SettingsView.swift`

### Mod workflows

- [App state](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/App/AppState.swift): `Sailswift/App/AppState.swift`
- [Mod manager](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/ModManager.swift): `Sailswift/ViewModels/ModManager.swift`
- [Download manager](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/DownloadManager.swift): `Sailswift/ViewModels/DownloadManager.swift`
- [Profile manager](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/ModProfile.swift): `Sailswift/Models/ModProfile.swift`
- [Modpack export](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Views/ModpackExportView.swift): `Sailswift/Views/ModpackExportView.swift`

### Services and integrations

- [GameBanana API](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/ViewModels/GameBananaAPI.swift): `Sailswift/ViewModels/GameBananaAPI.swift`
- [Update checker](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/ModUpdateChecker.swift): `Sailswift/Services/ModUpdateChecker.swift`
- [File service](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/FileService.swift): `Sailswift/Services/FileService.swift`
- [Archive validator](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/ArchiveEntryValidator.swift): `Sailswift/Services/ArchiveEntryValidator.swift`
- [Game config](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/GameConfigService.swift): `Sailswift/Services/GameConfigService.swift`
- [App updater](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Services/UpdaterService.swift): `Sailswift/Services/UpdaterService.swift`

### Local state

- [Mod model](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/Mod.swift): `Sailswift/Models/Mod.swift`
- [Modpack model](https://github.com/proverbiallemon/sailswift/blob/main/Sailswift/Models/Modpack.swift): `Sailswift/Models/Modpack.swift`
- **Profiles JSON**
- **Installed mods**
- **Game config file**

### Other components

- **User**
- **Ship of Harkinian**
- **GameBanana**
- **Sparkle update service**
- **macOS file system**

## Connections

- User → SwiftUI app: opens
- SwiftUI app → Main view: shows
- Main view → App state: dispatches actions
- Main view → Mod list: shows mods
- Main view → Mod browser: shows browser
- Main view → Settings: shows settings
- Mod browser → App state: requests install
- App state → Mod manager: manages mods
- App state → Download manager: starts downloads
- App state → Profile manager: manages profiles
- App state → Game config: syncs load order
- App state → Update checker: checks updates
- App state → GameBanana API: fetches mod files
- Mod manager → File service: lists and changes files
- Mod manager → Installed mods: reads mods
- Mod manager → Mod model: creates models
- Download manager → GameBanana API: fetches file info
- Download manager → Archive validator: validates extraction
- Download manager → Installed mods: installs files
- Profile manager → Profiles JSON: loads and saves
- Profile manager → Installed mods: captures mod state
- App state → Modpack export: supports sharing
- Modpack export → Modpack model: exports and imports
- Game config → Game config file: reads and writes
- App state → Ship of Harkinian: launches
- GameBanana API → GameBanana: requests metadata
- Update checker → GameBanana API: checks mod records
- Update checker → Installed mods: checks installed mods
- Settings → App updater: configures updates
- App updater → Sparkle update service: checks releases
- Download manager → macOS file system: uses archive tools
