A SwiftUI library that automatically generates and displays third-party license acknowledgments for Swift packages.
- Automatic scanning — reads
Package.resolvedand LICENSE files from package checkouts at build time - 25+ license types — detects MIT, Apache 2.0, BSD, GPL, LGPL, MPL, Creative Commons, and more via SPDX identifiers
- Ready-to-use UI — searchable, platform-adaptive SwiftUI views with Markdown license rendering
- Platform native —
NavigationSplitViewon macOS,NavigationStackon iOS - Manual licenses — include vendored or non-SPM dependencies via a
Licenses/directory - SPM & Xcode — works with both Swift Package Manager and Xcode project files
- Swift 6 concurrency — strict
Sendableconformance and@Observabledata loading - Localized — all UI text ships in 50 languages, including right-to-left support for Arabic, Hebrew, and Urdu
| Minimum | |
|---|---|
| iOS | 26+ |
| macOS | 26+ |
| Swift | 6.3+ |
| Xcode | 26+ |
Add HavenAcknowledgments as a dependency in your Package.swift:
dependencies: [
.package(url: "https://github.com/Haven-Apps/HavenAcknowledgments.git", from: "1.0.0")
]Then add the library and the build plugin to your target:
.target(
name: "MyApp",
dependencies: ["HavenAcknowledgments"],
plugins: [
.plugin(name: "HavenAcknowledgmentsPlugin", package: "HavenAcknowledgments")
]
)- Go to File > Add Package Dependencies and enter the repository URL.
- Add
HavenAcknowledgmentsto your target's Frameworks, Libraries, and Embedded Content. - Add
HavenAcknowledgmentsPluginunder Build Phases > Run Build Tool Plug-ins.
Drop HavenAcknowledgmentsView into any SwiftUI hierarchy:
import HavenAcknowledgments
struct SettingsView: View {
var body: some View {
HavenAcknowledgmentsView()
}
}Use the .acknowledgmentsSheet(isPresented:) modifier for modal presentation:
import HavenAcknowledgments
struct SettingsView: View {
@State private var showAcknowledgments = false
var body: some View {
Button("Acknowledgments") {
showAcknowledgments = true
}
.acknowledgmentsSheet(isPresented: $showAcknowledgments)
}
}Load acknowledgments from a non-standard location by conforming to AcknowledgmentsManifestProvider:
struct RemoteManifestProvider: AcknowledgmentsManifestProvider {
let url: URL
func loadManifest() async throws -> AcknowledgmentsManifest {
let (data, _) = try await URLSession.shared.data(from: url)
return try AcknowledgmentsManifest.decode(from: data)
}
}
// Then pass it to any view:
HavenAcknowledgmentsView(provider: RemoteManifestProvider(url: myURL))The build plugin runs at build time and:
- Parses your project's
Package.resolvedto discover all dependencies - Locates SPM package checkouts (via
.build/checkouts/or Xcode's DerivedData) - Reads each package's LICENSE file and detects the license type
- Merges any manual entries from a
Licenses/directory in your project root - Outputs an
Acknowledgments.jsonmanifest as a build resource
At runtime, HavenAcknowledgmentsView loads this manifest and displays a searchable, navigable list of all acknowledged packages with their full license text.
To include licenses for dependencies that aren't managed by SPM (such as vendored code or CocoaPods libraries), create a Licenses/ directory at the root of your project:
MyProject/
├── Licenses/
│ ├── SomeVendoredLib.txt
│ └── AnotherDependency.txt
├── Package.swift
└── Sources/
The generator detects the license type from each file's contents and merges them into the manifest. Entries are deduplicated by name against auto-detected packages.
| Module | Purpose |
|---|---|
HavenAcknowledgmentsCore |
Shared models — Acknowledgment, License, AcknowledgmentsManifest |
HavenAcknowledgments |
SwiftUI views, data loading, and public API |
AcknowledgmentsGeneratorTool |
Build-time executable that scans dependencies and produces the JSON manifest |
HavenAcknowledgmentsPlugin |
SPM/Xcode build tool plugin that invokes the generator |
Full API documentation is available as a DocC catalog bundled with the package. Build documentation in Xcode via Product > Build Documentation.
All UI text is translated into 50 languages.
Arabic (ar), Bangla (bn), Catalan (ca), Chinese Simplified (zh-Hans), Chinese Traditional (zh-Hant), Croatian (hr), Czech (cs), Danish (da), Dutch (nl), English (en), English (en-AU), English (en-CA), English (en-GB), Finnish (fi), French (fr), French Canada (fr-CA), German (de), Greek (el), Gujarati (gu), Hebrew (he), Hindi (hi), Hungarian (hu), Indonesian (id), Italian (it), Japanese (ja), Kannada (kn), Korean (ko), Malay (ms), Malayalam (ml), Marathi (mr), Norwegian (no), Odia (or), Polish (pl), Portuguese Brazil (pt-BR), Portuguese Portugal (pt-PT), Punjabi (pa), Romanian (ro), Russian (ru), Slovak (sk), Slovenian (sl), Spanish Latin America (es-419), Spanish Spain (es-ES), Swedish (sv), Tamil (ta), Telugu (te), Thai (th), Turkish (tr), Ukrainian (uk), Urdu (ur), Vietnamese (vi)
HavenAcknowledgments is available under the BSD 3-Clause License. See LICENSE.md for details.