# snaphutaoremasteringproject/snap.hutao.remastered architecture

> Architecture diagram of the GitHub repository snaphutaoremasteringproject/snap.hutao.remastered, 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/snaphutaoremasteringproject/snap.hutao.remastered
- Repository: https://github.com/snaphutaoremasteringproject/snap.hutao.remastered

## Overview

Snap Hutao Remastered is a Windows desktop toolkit for Genshin Impact. The visible workflow includes users changing storage settings: the settings view model delegates folder changes to an operation that obtains a folder choice, checks and copies data, and updates local settings. The tree also shows plugin, game-account, metadata, gacha, and automation capabilities. Source excerpts support only a few concrete runtime links; other feature nodes are included from the tree without guessed connections.

Main entry points: [`src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs) (Folder migration), [`src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs`](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs) (Storage settings), [`src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/HutaoPlugin.cs`](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/HutaoPlugin.cs) (Plugin API), [`src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs`](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs) (Runtime paths)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Desktop app"]
  node_app["Snap Hutao<br/>[App.xaml.cs]"]
  node_window["Window controller"]
  node_notify["Tray controller"]
  node_runtime["Runtime paths<br/>[HutaoRuntime.cs]"]
end

subgraph group_settings["Settings and storage"]
  node_settingsvm["Storage settings"]
  node_folderop["Folder migration"]
  node_settingkeys["Setting keys<br/>[SettingKeys.cs]"]
  node_localsettings[("Local settings<br/>[LocalSetting.cs]")]
end

subgraph group_plugins["Plugin system"]
  node_pluginsvc["Plugin service<br/>[PluginService.cs]"]
  node_plugincontext["Plugin context<br/>[PluginContext.cs]"]
  node_pluginapi["Plugin API<br/>[HutaoPlugin.cs]"]
end

subgraph group_game["Game services"]
  node_accounts["Game accounts"]
  node_packages["Game packages"]
  node_metadata["Metadata services"]
  node_gacha["Gacha history"]
end

subgraph group_integration["Integrations"]
  node_pipe["Pipe server"]
  node_pipehandler["Pipe handler"]
  node_cultivation["Cultivation service"]
end

node_user(("Windows user"))
node_bettergenshin(("BetterGI client"))
node_picker["Folder picker"]
node_dialog["Confirmation dialog"]

node_user -->|"uses"| node_app
node_user -.->|"changes storage"| node_settingsvm
node_settingsvm -->|"executes"| node_folderop
node_folderop -->|"picks folder"| node_picker
node_folderop -->|"confirms migration"| node_dialog
node_folderop -->|"reads data path"| node_runtime
node_folderop -->|"updates paths"| node_localsettings
node_settingsvm -->|"reads keys"| node_settingkeys
node_runtime -->|"reads paths"| node_localsettings
node_pluginapi -->|"receives context"| node_plugincontext
node_pluginapi -->|"uses service"| node_pluginsvc
node_pipe -.->|"dispatches"| node_pipehandler
node_pipehandler -->|"queries project"| node_cultivation
node_bettergenshin -.->|"sends requests"| node_pipe

click node_app "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/App.xaml.cs"
click node_window "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Windowing/XamlWindowController.cs"
click node_notify "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Shell/NotifyIconController.cs"
click node_runtime "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs"
click node_settingsvm "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs"
click node_folderop "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs"
click node_settingkeys "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/SettingKeys.cs"
click node_localsettings "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/LocalSetting.cs"
click node_pluginsvc "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Plugin/PluginService.cs"
click node_plugincontext "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/PluginContext.cs"
click node_pluginapi "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/HutaoPlugin.cs"
click node_accounts "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Account/GameInRegistryAccountService.cs"
click node_packages "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Package/Advanced/GamePackageServiceContext.cs"
click node_metadata "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs"
click node_gacha "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/GachaLog/GachaLogServiceMetadataContext.cs"
click node_pipe "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/BetterGenshinImpactNamedPipeServer.cs"
click node_pipehandler "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Handler/QueryCurrentCultivationProjectHandler.cs"
click node_cultivation "https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Cultivation/AutomationCultivationService.cs"

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_window,node_notify,node_runtime,node_user,node_bettergenshin toneBlue
class node_settingsvm,node_folderop,node_settingkeys,node_localsettings toneAmber
class node_pluginsvc,node_plugincontext,node_pluginapi toneMint
class node_accounts,node_packages,node_metadata,node_gacha toneRose
class node_pipe,node_pipehandler,node_cultivation,node_picker,node_dialog toneIndigo
```

## Components

### Desktop app

- [Snap Hutao](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/App.xaml.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/App.xaml.cs`
- [Window controller](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Windowing/XamlWindowController.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Windowing/XamlWindowController.cs`
- [Tray controller](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Shell/NotifyIconController.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/UI/Shell/NotifyIconController.cs`
- [Runtime paths](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs`

### Settings and storage

- [Storage settings](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs`
- [Folder migration](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`
- [Setting keys](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/SettingKeys.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/SettingKeys.cs`
- [Local settings](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/LocalSetting.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/Setting/LocalSetting.cs`

### Plugin system

- [Plugin service](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Plugin/PluginService.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Plugin/PluginService.cs`
- [Plugin context](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/PluginContext.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/PluginContext.cs`
- [Plugin API](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/HutaoPlugin.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/API/Model/HutaoPlugin.cs`

### Game services

- [Game accounts](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Account/GameInRegistryAccountService.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Account/GameInRegistryAccountService.cs`
- [Game packages](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Package/Advanced/GamePackageServiceContext.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Game/Package/Advanced/GamePackageServiceContext.cs`
- [Metadata services](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Metadata/ContextAbstraction/MetadataServiceContextExtension.cs`
- [Gacha history](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/GachaLog/GachaLogServiceMetadataContext.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/GachaLog/GachaLogServiceMetadataContext.cs`

### Integrations

- [Pipe server](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/BetterGenshinImpactNamedPipeServer.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/BetterGenshinImpactNamedPipeServer.cs`
- [Pipe handler](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Handler/QueryCurrentCultivationProjectHandler.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Handler/QueryCurrentCultivationProjectHandler.cs`
- [Cultivation service](https://github.com/snaphutaoremasteringproject/snap.hutao.remastered/blob/main/src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Cultivation/AutomationCultivationService.cs): `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Cultivation/AutomationCultivationService.cs`

### Other components

- **Windows user**
- **BetterGI client**
- **Folder picker**
- **Confirmation dialog**

## Connections

- Windows user → Snap Hutao: uses (evidence: `README.md`)
- Windows user → Storage settings: changes storage
- Storage settings → Folder migration: executes (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs`)
- Folder migration → Folder picker: picks folder (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`)
- Folder migration → Confirmation dialog: confirms migration (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`)
- Folder migration → Runtime paths: reads data path (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`)
- Folder migration → Local settings: updates paths (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageSetDataFolderOperation.cs`)
- Storage settings → Setting keys: reads keys (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/ViewModel/Setting/SettingStorageViewModel.cs`)
- Runtime paths → Local settings: reads paths (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/HutaoRuntime.cs`)
- Plugin API → Plugin context: receives context (evidence: `src/Snap.Hutao.Plugin.SDK/TestPlugin/TestPlugin.cs`)
- Plugin API → Plugin service: uses service (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Service/Plugin/PluginService.cs`)
- Pipe server → Pipe handler: dispatches
- Pipe handler → Cultivation service: queries project (evidence: `src/Snap.Hutao.Remastered/Snap.Hutao.Remastered/Core/LifeCycle/InterProcess/BetterGenshinImpact/Handler/QueryCurrentCultivationProjectHandler.cs`)
- BetterGI client → Pipe server: sends requests
