# claration/feather architecture

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

## Overview

Feather is an iOS sideloading app for signing and installing apps with developer certificates. The main user journey is to browse AltStore-compatible sources or import an app, download it, configure signing and optional tweaks, sign it, then package and install it. The repository also includes certificate and source management, update discovery, and app customization. Edges are limited to relationships shown in the README or source index; several README-listed capabilities have no sampled implementation detail, so those links are marked unverified.

Main entry points: [`Feather/Views/Library/Install/InstallPreviewView.swift`](https://github.com/claration/feather/blob/main/Feather/Views/Library/Install/InstallPreviewView.swift) (Install preview), [`Feather/Backend/Observable/UpdateManager.swift`](https://github.com/claration/feather/blob/main/Feather/Backend/Observable/UpdateManager.swift) (Update discovery), [`Feather/Views/Library/LibraryView.swift`](https://github.com/claration/feather/blob/main/Feather/Views/Library/LibraryView.swift) (App library), [`Feather/Utilities/Handlers/SigningHandler.swift`](https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/SigningHandler.swift) (Signing handler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_discovery["Sources and discovery"]
  node_source_views["Source browsing"]
  node_source_vm["Source view model"]
  node_repo_model["Repository model<br/>[ASRepository.swift]"]
  node_fetch["JSON fetch"]
  node_updates["Update discovery"]
end

subgraph group_appflow["App acquisition and install"]
  node_download_ui["Download view"]
  node_downloads["Download manager"]
  node_library["App library<br/>[LibraryView.swift]"]
  node_archive["Archive handler"]
  node_install_preview["Install preview"]
  node_installer["Server installer"]
  node_install_status["Install status"]
  node_background_tasks["Background downloads"]
  node_audio["Background audio"]
end

subgraph group_signing["Signing and customization"]
  node_signing_ui["Signing options UI<br/>[SigningView.swift]"]
  node_options["Signing options"]
  node_signing_handler["Signing handler"]
  node_tweaks["Tweak injection<br/>[TweakHandler.swift]"]
  node_zsign["Zsign adapter<br/>[ZsignHandler.swift]"]
end

subgraph group_state["Local state"]
  node_storage[("Core Data storage<br/>[Storage.swift]")]
  node_cert_storage["Certificate storage"]
  node_source_metadata["Source provenance"]
  node_cert_reader["Certificate reader"]
end

subgraph group_presentation["App interface and shared UI"]
  node_app["Feather app<br/>[FeatherApp.swift]"]
  node_nimble_button["Shared button<br/>[NBButton.swift]"]
end

node_user(("User"))

node_user -->|"uses"| node_app
node_app -->|"shows"| node_download_ui
node_app -->|"uses"| node_storage
node_app -.->|"shows"| node_source_views
node_user -.->|"browses"| node_source_views
node_source_views -.->|"uses"| node_source_vm
node_source_vm -.->|"handles"| node_repo_model
node_updates -->|"fetches with"| node_fetch
node_updates -->|"parses"| node_repo_model
node_updates -->|"reads"| node_storage
node_app -.->|"uses"| node_updates
node_download_ui -->|"observes"| node_downloads
node_library -->|"uses"| node_downloads
node_library -->|"uses"| node_updates
node_library -->|"reads"| node_storage
node_library -->|"opens"| node_install_preview
node_install_preview -->|"packages via"| node_archive
node_install_preview -->|"starts"| node_installer
node_install_preview -->|"updates"| node_install_status
node_install_preview -->|"starts and stops"| node_audio
node_downloads -->|"tracks"| node_background_tasks
node_downloads -->|"controls"| node_audio
node_user -.->|"configures"| node_signing_ui
node_signing_ui -.->|"edits"| node_options
node_signing_handler -->|"reads"| node_options
node_signing_handler -->|"injects with"| node_tweaks
node_signing_handler -->|"signs with"| node_zsign
node_signing_handler -->|"saves signed app"| node_storage
node_library -->|"opens"| node_signing_ui
node_signing_handler -->|"reads certificate"| node_cert_reader
node_cert_storage -->|"persists"| node_storage
node_cert_storage -->|"decodes via"| node_cert_reader
node_source_metadata -->|"persists"| node_storage
node_updates -->|"uses provenance"| node_source_metadata
node_install_preview -->|"renders"| node_nimble_button

click node_app "https://github.com/claration/feather/blob/main/Feather/FeatherApp.swift"
click node_source_views "https://github.com/claration/feather/tree/main/Feather/Views/Sources"
click node_source_vm "https://github.com/claration/feather/blob/main/Feather/Views/Sources/SourcesViewModel.swift"
click node_repo_model "https://github.com/claration/feather/blob/main/AltSourceKit/Sources/AltSourceKit/Models/ASRepository.swift"
click node_fetch "https://github.com/claration/feather/blob/main/NimbleKit/Sources/NimbleJSON/NBFetchService.swift"
click node_updates "https://github.com/claration/feather/blob/main/Feather/Backend/Observable/UpdateManager.swift"
click node_download_ui "https://github.com/claration/feather/blob/main/Feather/Views/Download/DownloadHeaderView.swift"
click node_downloads "https://github.com/claration/feather/blob/main/Feather/Backend/Observable/DownloadManager.swift"
click node_library "https://github.com/claration/feather/blob/main/Feather/Views/Library/LibraryView.swift"
click node_archive "https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/ArchiveHandler.swift"
click node_install_preview "https://github.com/claration/feather/blob/main/Feather/Views/Library/Install/InstallPreviewView.swift"
click node_installer "https://github.com/claration/feather/blob/main/Feather/Backend/Server/ServerInstaller.swift"
click node_install_status "https://github.com/claration/feather/blob/main/Feather/Backend/Observable/InstallerStatusViewModel.swift"
click node_signing_ui "https://github.com/claration/feather/blob/main/Feather/Views/Signing/SigningView.swift"
click node_options "https://github.com/claration/feather/blob/main/Feather/Backend/Observable/OptionsManager.swift"
click node_signing_handler "https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/SigningHandler.swift"
click node_tweaks "https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/TweakHandler.swift"
click node_zsign "https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/ZsignHandler.swift"
click node_storage "https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage.swift"
click node_cert_storage "https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage%2BCertificate.swift"
click node_source_metadata "https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage%2BSourceMetadata.swift"
click node_cert_reader "https://github.com/claration/feather/blob/main/Feather/Utilities/CertificateReader/CertificateReader.swift"
click node_background_tasks "https://github.com/claration/feather/blob/main/Feather/Utilities/BackgroundTaskManager.swift"
click node_audio "https://github.com/claration/feather/blob/main/Feather/Utilities/BackgroundAudioManager.swift"
click node_nimble_button "https://github.com/claration/feather/blob/main/NimbleKit/Sources/NimbleViews/Views/NBButton.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_source_views,node_source_vm,node_repo_model,node_fetch,node_updates,node_user toneBlue
class node_download_ui,node_downloads,node_library,node_archive,node_install_preview,node_installer,node_install_status,node_background_tasks,node_audio toneAmber
class node_signing_ui,node_options,node_signing_handler,node_tweaks,node_zsign toneMint
class node_storage,node_cert_storage,node_source_metadata,node_cert_reader toneRose
class node_app,node_nimble_button toneIndigo
```

## Components

### Sources and discovery

- [Source browsing](https://github.com/claration/feather/tree/main/Feather/Views/Sources): `Feather/Views/Sources`
- [Source view model](https://github.com/claration/feather/blob/main/Feather/Views/Sources/SourcesViewModel.swift): `Feather/Views/Sources/SourcesViewModel.swift`
- [Repository model](https://github.com/claration/feather/blob/main/AltSourceKit/Sources/AltSourceKit/Models/ASRepository.swift): `AltSourceKit/Sources/AltSourceKit/Models/ASRepository.swift`
- [JSON fetch](https://github.com/claration/feather/blob/main/NimbleKit/Sources/NimbleJSON/NBFetchService.swift): `NimbleKit/Sources/NimbleJSON/NBFetchService.swift`
- [Update discovery](https://github.com/claration/feather/blob/main/Feather/Backend/Observable/UpdateManager.swift): `Feather/Backend/Observable/UpdateManager.swift`

### App acquisition and install

- [Download view](https://github.com/claration/feather/blob/main/Feather/Views/Download/DownloadHeaderView.swift): `Feather/Views/Download/DownloadHeaderView.swift`
- [Download manager](https://github.com/claration/feather/blob/main/Feather/Backend/Observable/DownloadManager.swift): `Feather/Backend/Observable/DownloadManager.swift`
- [App library](https://github.com/claration/feather/blob/main/Feather/Views/Library/LibraryView.swift): `Feather/Views/Library/LibraryView.swift`
- [Archive handler](https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/ArchiveHandler.swift): `Feather/Utilities/Handlers/ArchiveHandler.swift`
- [Install preview](https://github.com/claration/feather/blob/main/Feather/Views/Library/Install/InstallPreviewView.swift): `Feather/Views/Library/Install/InstallPreviewView.swift`
- [Server installer](https://github.com/claration/feather/blob/main/Feather/Backend/Server/ServerInstaller.swift): `Feather/Backend/Server/ServerInstaller.swift`
- [Install status](https://github.com/claration/feather/blob/main/Feather/Backend/Observable/InstallerStatusViewModel.swift): `Feather/Backend/Observable/InstallerStatusViewModel.swift`
- [Background downloads](https://github.com/claration/feather/blob/main/Feather/Utilities/BackgroundTaskManager.swift): `Feather/Utilities/BackgroundTaskManager.swift`
- [Background audio](https://github.com/claration/feather/blob/main/Feather/Utilities/BackgroundAudioManager.swift): `Feather/Utilities/BackgroundAudioManager.swift`

### Signing and customization

- [Signing options UI](https://github.com/claration/feather/blob/main/Feather/Views/Signing/SigningView.swift): `Feather/Views/Signing/SigningView.swift`
- [Signing options](https://github.com/claration/feather/blob/main/Feather/Backend/Observable/OptionsManager.swift): `Feather/Backend/Observable/OptionsManager.swift`
- [Signing handler](https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/SigningHandler.swift): `Feather/Utilities/Handlers/SigningHandler.swift`
- [Tweak injection](https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/TweakHandler.swift): `Feather/Utilities/Handlers/TweakHandler.swift`
- [Zsign adapter](https://github.com/claration/feather/blob/main/Feather/Utilities/Handlers/ZsignHandler.swift): `Feather/Utilities/Handlers/ZsignHandler.swift`

### Local state

- [Core Data storage](https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage.swift): `Feather/Backend/Storage/Storage.swift`
- [Certificate storage](https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage%2BCertificate.swift): `Feather/Backend/Storage/Storage+Certificate.swift`
- [Source provenance](https://github.com/claration/feather/blob/main/Feather/Backend/Storage/Storage%2BSourceMetadata.swift): `Feather/Backend/Storage/Storage+SourceMetadata.swift`
- [Certificate reader](https://github.com/claration/feather/blob/main/Feather/Utilities/CertificateReader/CertificateReader.swift): `Feather/Utilities/CertificateReader/CertificateReader.swift`

### App interface and shared UI

- [Feather app](https://github.com/claration/feather/blob/main/Feather/FeatherApp.swift): `Feather/FeatherApp.swift`
- [Shared button](https://github.com/claration/feather/blob/main/NimbleKit/Sources/NimbleViews/Views/NBButton.swift): `NimbleKit/Sources/NimbleViews/Views/NBButton.swift`

### Other components

- **User**

## Connections

- User → Feather app: uses
- Feather app → Download view: shows (evidence: `Feather/FeatherApp.swift`)
- Feather app → Core Data storage: uses (evidence: `Feather/FeatherApp.swift`)
- Feather app → Source browsing: shows
- User → Source browsing: browses
- Source browsing → Source view model: uses
- Source view model → Repository model: handles
- Update discovery → JSON fetch: fetches with (evidence: `Feather/Backend/Observable/UpdateManager.swift`)
- Update discovery → Repository model: parses (evidence: `Feather/Backend/Observable/UpdateManager.swift`)
- Update discovery → Core Data storage: reads (evidence: `Feather/Backend/Observable/UpdateManager.swift`)
- Feather app → Update discovery: uses
- Download view → Download manager: observes (evidence: `Feather/Views/Download/DownloadHeaderView.swift`)
- App library → Download manager: uses (evidence: `Feather/Views/Library/LibraryView.swift`)
- App library → Update discovery: uses (evidence: `Feather/Views/Library/LibraryView.swift`)
- App library → Core Data storage: reads (evidence: `Feather/Views/Library/LibraryView.swift`)
- App library → Install preview: opens (evidence: `Feather/Views/Library/LibraryView.swift`)
- Install preview → Archive handler: packages via (evidence: `Feather/Views/Library/Install/InstallPreviewView.swift`)
- Install preview → Server installer: starts (evidence: `Feather/Views/Library/Install/InstallPreviewView.swift`)
- Install preview → Install status: updates (evidence: `Feather/Views/Library/Install/InstallPreviewView.swift`)
- Install preview → Background audio: starts and stops (evidence: `Feather/Views/Library/Install/InstallPreviewView.swift`)
- Download manager → Background downloads: tracks (evidence: `Feather/Backend/Observable/DownloadManager.swift`)
- Download manager → Background audio: controls (evidence: `Feather/Backend/Observable/DownloadManager.swift`)
- User → Signing options UI: configures
- Signing options UI → Signing options: edits
- Signing handler → Signing options: reads (evidence: `Feather/Utilities/Handlers/SigningHandler.swift`)
- Signing handler → Tweak injection: injects with (evidence: `Feather/Utilities/Handlers/SigningHandler.swift`)
- Signing handler → Zsign adapter: signs with (evidence: `Feather/Utilities/Handlers/SigningHandler.swift`)
- Signing handler → Core Data storage: saves signed app (evidence: `Feather/Utilities/Handlers/SigningHandler.swift`)
- App library → Signing options UI: opens (evidence: `Feather/Views/Library/LibraryView.swift`)
- Signing handler → Certificate reader: reads certificate (evidence: `Feather/Utilities/Handlers/SigningHandler.swift`)
- Certificate storage → Core Data storage: persists (evidence: `Feather/Backend/Storage/Storage+Certificate.swift`)
- Certificate storage → Certificate reader: decodes via (evidence: `Feather/Backend/Storage/Storage+Certificate.swift`)
- Source provenance → Core Data storage: persists (evidence: `Feather/Backend/Storage/Storage+SourceMetadata.swift`)
- Update discovery → Source provenance: uses provenance (evidence: `Feather/Backend/Observable/UpdateManager.swift`)
- Install preview → Shared button: renders (evidence: `Feather/Views/Library/Install/InstallPreviewView.swift`)
