How to Update Palmier Pro to the Latest Version: Automatic and Manual Methods

Palmier Pro uses the Sparkle framework to automatically check for updates and can also be updated manually by downloading the latest DMG from GitHub releases.

Keeping your installation current ensures you have the latest features and security patches. The palmier-io/palmier-pro repository implements both automatic and manual update pathways. This guide explains how to update Palmier Pro to the latest version using the built-in updater or by manually replacing the application bundle.

Automatic Updates via Sparkle

The application integrates the Sparkle framework to handle version checking and downloads. The update logic is centralized in Updater.swift, which manages state through the shared Updater singleton.

Background Check Process

When Palmier Pro launches, the Updater singleton is created automatically. Inside the init method, the updater calls controller.updater.checkForUpdateInformation() (line 24) to query the appcast feed URL defined in Info.plist under the SUFeedURL key.

If a newer version exists on the remote feed, Sparkle invokes the delegate method updater(_:didFindValidUpdate:) (line 47). This triggers markUpdateAvailable(_:) (lines 35-38), which sets updateAvailable = true and stores the version string in updateVersion.

User Interface Notification

The user interface surfaces available updates through UpdateBadgeView.swift. When updater.updateAvailable is true, the view renders the badge (lines 7-42) to notify you.

To install the update:

  1. Click the update badge button.
  2. The badge triggers updater.checkForUpdates(nil) (line 10), launching Sparkle's native installer UI.
  3. Follow the prompts to download and install the new version automatically.

To dismiss the notification without updating, click the "✕" button. This calls updater.dismissUpdate() (line 26), which invokes clearUpdateAvailability() (lines 40-43) to reset updateAvailable to false and clear the stored version string.

Manual Update Method

If you prefer not to use the automatic updater, or if the automatic check fails, perform a manual update:

  1. Navigate to the GitHub releases page.
  2. Download the latest DMG directly from https://github.com/palmier-io/palmier-pro/releases/latest/download/PalmierPro.dmg.
  3. Mount the DMG and drag the Palmier Pro application to your Applications folder, replacing the existing bundle.

This method bypasses the Sparkle framework entirely and is useful when you need precise control over the replacement timing.

Programmatic Update Examples

Triggering an Update Check

You can initiate an update check from any SwiftUI view by accessing the shared instance:

import SwiftUI

struct ContentView: View {
    var body: some View {
        Button("Check for updates") {
            Updater.shared.checkForUpdates(nil)
        }
    }
}

Checking the Current Version

To verify which version is currently running, inspect the bundle's Info.plist:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "unknown"
print("Running Palmier Pro version \(version)")

Dismissing the Update Alert

To programmatically clear the update state:

Updater.shared.dismissUpdate()

Key Source Files

Understanding the update architecture requires familiarity with these components:

  • Updater.swift – Main Sparkle integration, state management, and delegate methods.
  • UpdateBadgeView.swift – UI component that renders the update availability badge.
  • Changelog.swift – Persists the last seen version using the lastSeenVersion key.
  • Telemetry.swift – Reports the current app version when sending usage analytics.
  • Info.plist – Contains the SUFeedURL entry pointing to the Sparkle appcast.

Summary

  • Palmier Pro uses the Sparkle framework in Updater.swift to handle automatic background checks via checkForUpdateInformation().
  • The Updater singleton sets updateAvailable = true when updates are found, triggering UpdateBadgeView.swift to display the notification.
  • Install updates by clicking the badge, which calls checkForUpdates(nil) to launch Sparkle's installer.
  • You can manually update by downloading the latest DMG from the GitHub releases page and replacing the app bundle.
  • Dismiss notifications programmatically using Updater.shared.dismissUpdate(), which invokes clearUpdateAvailability().

Frequently Asked Questions

How does Palmier Pro check for updates automatically?

On application launch, the shared Updater singleton calls controller.updater.checkForUpdateInformation() to query the appcast URL specified in Info.plist. If a newer version exists, Sparkle invokes the delegate method updater(_:didFindValidUpdate:) (line 47), which sets updateAvailable = true and stores the version string for the UI to display.

Can I trigger an update check manually from the code?

Yes. You can call Updater.shared.checkForUpdates(nil) from any SwiftUI view or view controller. This method launches the Sparkle update installer UI immediately, allowing users to download and install the latest version without waiting for the automatic background check.

Where is the update availability state stored?

The update state is managed by the Updater class in Updater.swift. When an update is found, the markUpdateAvailable(_:) method sets updateAvailable = true and stores the version string. The persistent storage of the last seen version occurs in Changelog.swift using the lastSeenVersion key.

What should I do if the automatic updater fails?

If the Sparkle-based automatic update fails, you can manually update Palmier Pro by downloading the latest DMG from https://github.com/palmier-io/palmier-pro/releases/latest/download/PalmierPro.dmg. Mount the disk image and drag the application to your Applications folder to replace the existing version.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →