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 — ships with localized strings for all UI text
| 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.
HavenAcknowledgments is available under the BSD 3-Clause License. See LICENSE.md for details.