# How Dependencies Are Managed in Palmier Pro: A Package.swift Deep Dive

> Learn how Palmier Pro manages dependencies using Package.swift and Swift Package Manager. Discover semantic versioning and lock files for reproducible builds.

- Repository: [Palmier/palmier-pro](https://github.com/palmier-io/palmier-pro)
- Tags: deep-dive
- Published: 2026-06-30

---

**Palmier Pro uses the Swift Package Manager (SPM) to declare, resolve, and link external libraries through a centralized [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift) manifest, utilizing semantic versioning constraints and a `Package.resolved` lock file for reproducible builds.**

Palmier Pro manages its external libraries exclusively through the Swift Package Manager, the native dependency-resolution system built into the Swift toolchain. All third-party packages are declared in the repository's [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift) file at the root level, which `swift build` and Xcode use to fetch, compile, and link dependencies for the macOS 26 target.

## The Package.swift Manifest Structure

The [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift) file serves as the single source of truth for dependency management in Palmier Pro. Located at the repository root, this manifest defines the platform constraints, executable product, external dependencies, and target configuration.

### Platform and Product Configuration

The manifest restricts the application to **macOS 26**, the only supported operating system version. Line 7 declares this constraint:

```swift
platforms: [.macOS(.v26)]

```

Lines 8-10 define the deliverable artifact as an executable product named "PalmierPro":

```swift
products: [
    .executable(name: "PalmierPro", targets: ["PalmierPro"])
]

```

### Dependency Declaration

The `dependencies` array on lines 12-20 lists seven external packages required by the application. Each entry follows the pattern `.package(url: "<repository>", from: "<minimum-version>")`, including:

- **swift-sdk**
- **Sparkle**
- **Sentry**
- **Clerk**
- **Convex**
- **swift-transformers**
- **Lottie**

This configuration uses the **"from"** operator to adopt semantic versioning, allowing SPM to accept newer versions that do not break the major version (e.g., specifying `from: "0.11.0"` permits 0.12.x and 0.13.x but not 1.0.0).

### Target Configuration and Linking

Lines 22-34 define the executable target "PalmierPro" and specify which dependency products to link. The target declares its module dependencies using `.product(name: "...", package: "...")` entries, connecting the source code to the fetched external libraries.

### Resources and Build Plugins

The manifest bundles assets with the compiled binary through a resources section (lines 41-46). Additionally, line 47 references a custom build-tool plugin for Metal kernel compilation:

```swift
plugins: ["MetalCIKernelPlugin"]

```

## How SPM Resolves Dependencies in Palmier Pro

When the repository is cloned, running `swift build` or opening the project in Xcode triggers SPM to process the manifest through three distinct phases:

1. **Resolve versions** – SPM consults `Package.resolved` to lock exact versions of dependencies.
2. **Fetch packages** – Download source code from the URLs listed in the `dependencies` array.
3. **Compile and link** – Build each package according to its own manifest, then link the resulting modules to the `PalmierPro` target.

Because the version constraints use semantic versioning with the "from" operator, the system automatically updates to compatible patch and minor versions while protecting against breaking API changes in major version updates.

## Managing Dependencies in Palmier Pro

### Adding a New Dependency

To introduce a new library to the project:

1. Add a `.package(url:from:)` entry to the `dependencies` array in [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift).
2. Reference the product in the target's `dependencies` list using `.product(name: "<Product>", package: "<Repo-Name>")`.
3. Run `swift package update` to refresh `Package.resolved`.

For example, to add Kingfisher for image caching:

```bash

# Edit Package.swift manually to add:

# .package(url: "https://github.com/onevcat/Kingfisher.git", from: "6.0.0")

# Then add to target dependencies:

# .product(name: "Kingfisher", package: "Kingfisher")

```

### Importing Dependencies in Source Code

Once declared in the manifest, import modules in the Swift source files located in `Sources/PalmierPro/`:

```swift
import Lottie   // from the lottie-ios package declared on line 19
import Sparkle  // from the Sparkle package declared on line 13

// Use Lottie to load an animation
let animationView = AnimationView(name: "logo")

```

### Building the Project

To install all declared dependencies and build the application:

```bash
swift build

```

## Key Files in the Dependency Management Workflow

- **Package.swift** – The central manifest at the repository root that lists all external Swift packages and configures the app target, platform constraints, and build plugins.
- **Package.resolved** – An auto-generated lock file that records the exact versions chosen during resolution, ensuring reproducible builds across different environments.
- **Sources/PalmierPro/** – Contains the application’s Swift source files that import the dependencies declared in the manifest.
- **Plugins/MetalCIKernelPlugin/MetalCIKernelPlugin.swift** – The custom build-tool plugin referenced in the manifest on line 47 for Metal kernel compilation.

## Summary

- Palmier Pro uses **Swift Package Manager (SPM)** exclusively for dependency management through the [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift) manifest.
- The **platform restriction** on line 7 limits the app to macOS 26 only.
- Seven external packages are declared on **lines 12-20**, including Sparkle, Sentry, Clerk, and Lottie.
- The **"from"** operator enables semantic versioning, allowing automatic updates within major versions while preventing breaking changes.
- **Package.resolved** locks exact versions for reproducible builds.
- The **MetalCIKernelPlugin** on line 47 provides custom build tooling for Metal kernel compilation.

## Frequently Asked Questions

### What is the minimum macOS version required to build Palmier Pro?

Palmier Pro requires **macOS 26** (the upcoming major version), as specified on line 7 of [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift) with `platforms: [.macOS(.v26)]`. This constraint ensures the application can utilize the latest Apple frameworks and APIs available only in that version.

### How does Palmier Pro lock dependency versions for reproducible builds?

The project uses a **Package.resolved** file, which SPM auto-generates at the repository root. This lock file records the exact Git commit hashes and versions of all resolved dependencies, ensuring that every developer and CI environment fetches identical package versions when running `swift build`.

### Where do I add a new external library in Palmier Pro?

You must edit the **Package.swift** file at the repository root. Add a `.package(url:from:)` entry to the `dependencies` array (around lines 12-20), then reference the specific product in the target's `dependencies` list using `.product(name:package:)` syntax. Finally, run `swift package update` to generate an updated `Package.resolved` file.

### What is the MetalCIKernelPlugin used for in the build process?

The **MetalCIKernelPlugin**, referenced on line 47 of [`Package.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Package.swift), is a custom build-tool plugin located in [`Plugins/MetalCIKernelPlugin/MetalCIKernelPlugin.swift`](https://github.com/palmier-io/palmier-pro/blob/main/Plugins/MetalCIKernelPlugin/MetalCIKernelPlugin.swift). It compiles Metal CIKernel shaders during the build process, integrating GPU-accelerated image processing capabilities directly into the Palmier Pro executable.