diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a79331a..65c2f22 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -60,7 +60,7 @@ jobs:
BUILD_DIR=build
PKG_ROOT=$BUILD_DIR/pkg-root
PACKAGING_DIR=packaging
- APP_PATH="$PKG_ROOT/Applications/Utilities/BootstrapMate.app"
+ APP_PATH="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app"
# Create app bundle
mkdir -p "$APP_PATH/Contents/MacOS"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6f2bc5c..7e92b74 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -78,7 +78,7 @@ jobs:
PACKAGING_DIR=packaging
SWIFT_REL=.build/apple/Products/Release
ACTOOL_OUT="$BUILD_DIR/actool-out"
- APP="$PKG_ROOT/Applications/Utilities/BootstrapMate.app"
+ APP="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app"
APP_MACOS="$APP/Contents/MacOS"
APP_RES="$APP/Contents/Resources"
APP_HELPER_LD="$APP/Contents/Library/LaunchDaemons"
diff --git a/Makefile b/Makefile
index 7205e53..b642882 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ BINARY_NAME = managedbootstrapinstall
GUI_BINARY_NAME = BootstrapMateGUI
HELPER_BINARY_NAME = BootstrapMateHelper
BINARY_INSTALL_PATH = usr/local/bootstrapmate
-APP_BUNDLE_PATH = Applications/Utilities/BootstrapMate.app
+APP_BUNDLE_PATH = Applications/Utilities/Managed Bootstrap Install.app
APP_MACOS_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/MacOS
APP_RESOURCES_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Resources
APP_HELPER_LD_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Library/LaunchDaemons
@@ -126,7 +126,7 @@ swift-build:
copy-binary: swift-build
@echo "$(BLUE)Signing and copying binaries to app bundle...$(NC)"
- @mkdir -p $(APP_MACOS_DIR)
+ @mkdir -p "$(APP_MACOS_DIR)"
# Sign the CLI binary with hardened runtime before packaging
@codesign --force --sign "$(SIGNING_IDENTITY_APP)" \
@@ -150,12 +150,12 @@ copy-binary: swift-build
$(SWIFT_HELPER_BINARY)
# Copy all binaries to app bundle MacOS directory
- @cp $(SWIFT_BINARY) $(APP_MACOS_DIR)/$(BINARY_NAME)
- @chmod 755 $(APP_MACOS_DIR)/$(BINARY_NAME)
- @cp $(SWIFT_GUI_BINARY) $(APP_MACOS_DIR)/$(GUI_BINARY_NAME)
- @chmod 755 $(APP_MACOS_DIR)/$(GUI_BINARY_NAME)
- @cp $(SWIFT_HELPER_BINARY) $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)
- @chmod 755 $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)
+ @cp $(SWIFT_BINARY) "$(APP_MACOS_DIR)/$(BINARY_NAME)"
+ @chmod 755 "$(APP_MACOS_DIR)/$(BINARY_NAME)"
+ @cp $(SWIFT_GUI_BINARY) "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)"
+ @chmod 755 "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)"
+ @cp $(SWIFT_HELPER_BINARY) "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)"
+ @chmod 755 "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)"
# Create placeholder for symlink directory
@mkdir -p $(PKG_ROOT)/$(BINARY_INSTALL_PATH)
@@ -177,19 +177,19 @@ compile-icon:
create-app-bundle: copy-binary compile-icon
@echo "$(BLUE)Creating app bundle...$(NC)"
- @mkdir -p $(APP_RESOURCES_DIR)
- @rm -rf $(APP_RESOURCES_DIR)/*
-
+ @mkdir -p "$(APP_RESOURCES_DIR)"
+ @rm -rf "$(APP_RESOURCES_DIR)"/*
+
# Copy Info.plist template and substitute version placeholders
@sed -e 's/{{MARKETING_VERSION}}/$(MARKETING_VERSION)/g' \
-e 's/{{BUILD_NUMBER}}/$(BUILD_NUMBER)/g' \
- $(PACKAGING_DIR)/resources/Info.plist.template > $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist
-
+ $(PACKAGING_DIR)/resources/Info.plist.template > "$(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist"
+
# Copy compiled Assets.car (contains Liquid Glass icon for macOS 26+)
- @cp $(ACTOOL_OUT)/Assets.car $(APP_RESOURCES_DIR)/Assets.car
-
+ @cp $(ACTOOL_OUT)/Assets.car "$(APP_RESOURCES_DIR)/Assets.car"
+
# Copy .icns fallback (macOS 13–25) - composited by actool, not a raw layer PNG
- @cp $(ACTOOL_OUT)/$(ICON_NAME).icns $(APP_RESOURCES_DIR)/$(ICON_NAME).icns
+ @cp $(ACTOOL_OUT)/$(ICON_NAME).icns "$(APP_RESOURCES_DIR)/$(ICON_NAME).icns"
@echo "$(GREEN)✓ App bundle created$(NC)"
@@ -197,9 +197,9 @@ create-launchdaemon: create-app-bundle
@echo "$(BLUE)Copying LaunchDaemon plists...$(NC)"
@mkdir -p $(PKG_ROOT)/Library/LaunchDaemons
@mkdir -p $(SCRIPTS_DIR)
- @mkdir -p $(APP_HELPER_LD_DIR)
+ @mkdir -p "$(APP_HELPER_LD_DIR)"
@cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.plist $(PKG_ROOT)/Library/LaunchDaemons/
- @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist $(APP_HELPER_LD_DIR)/
+ @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist "$(APP_HELPER_LD_DIR)/"
@cp $(PACKAGING_DIR)/scripts/postinstall $(SCRIPTS_DIR)/
@chmod +x $(SCRIPTS_DIR)/postinstall
@echo "$(GREEN)✓ LaunchDaemon plists and scripts copied$(NC)"
@@ -210,7 +210,7 @@ sign-app: create-launchdaemon
--options runtime \
--timestamp \
--deep \
- $(PKG_ROOT)/$(APP_BUNDLE_PATH)
+ "$(PKG_ROOT)/$(APP_BUNDLE_PATH)"
@echo "$(GREEN)✓ App bundle signed$(NC)"
build-pkg: sign-app
diff --git a/Sources/app/Views/RunView.swift b/Sources/app/Views/RunView.swift
index 2151bf9..963f94c 100644
--- a/Sources/app/Views/RunView.swift
+++ b/Sources/app/Views/RunView.swift
@@ -67,7 +67,7 @@ struct RunView: View {
Button {
startRun()
} label: {
- Label("Run BootstrapMate", systemImage: "play.fill")
+ Label("Run Managed Bootstrap Install", systemImage: "play.fill")
}
.buttonStyle(.glassProminent)
.tint(.green)
@@ -77,7 +77,7 @@ struct RunView: View {
Button {
startRun()
} label: {
- Label("Run BootstrapMate", systemImage: "play.fill")
+ Label("Run Managed Bootstrap Install", systemImage: "play.fill")
}
.controlSize(.large)
.disabled(xpcClient.helperStatus != .registered)
diff --git a/Sources/app/Views/SettingsView.swift b/Sources/app/Views/SettingsView.swift
index 77fd08c..cc5b21a 100644
--- a/Sources/app/Views/SettingsView.swift
+++ b/Sources/app/Views/SettingsView.swift
@@ -66,7 +66,7 @@ struct SettingsView: View {
.aspectRatio(contentMode: .fit)
.frame(width: 72, height: 72)
- Text("BootstrapMate")
+ Text("Managed Bootstrap Install")
.font(.largeTitle.bold())
Text("Enterprise management tools provisioning for automated device setup using manifests.")
diff --git a/Sources/core/Utilities/BootstrapMateConstants.swift b/Sources/core/Utilities/BootstrapMateConstants.swift
index a0902b3..73cb49b 100644
--- a/Sources/core/Utilities/BootstrapMateConstants.swift
+++ b/Sources/core/Utilities/BootstrapMateConstants.swift
@@ -2,7 +2,7 @@ import Foundation
public enum BootstrapMateConstants {
public static let daemonIdentifier = "com.github.bootstrapmate"
- public static let executablePath = "/Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall"
+ public static let executablePath = "/Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall"
public static let helperBundleID = "com.github.bootstrapmate.helper"
public static let helperPlistName = "com.github.bootstrapmate.helper.plist"
public static let defaultRetryCount = 3
diff --git a/packaging/LaunchDaemons/com.github.bootstrapmate.plist b/packaging/LaunchDaemons/com.github.bootstrapmate.plist
index 07cfcee..22d4a1c 100644
--- a/packaging/LaunchDaemons/com.github.bootstrapmate.plist
+++ b/packaging/LaunchDaemons/com.github.bootstrapmate.plist
@@ -6,7 +6,7 @@
com.github.bootstrapmate
ProgramArguments
- /Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall
+ /Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall
RunAtLoad
diff --git a/packaging/resources/Info.plist.template b/packaging/resources/Info.plist.template
index 46a456b..e2be4bd 100644
--- a/packaging/resources/Info.plist.template
+++ b/packaging/resources/Info.plist.template
@@ -7,7 +7,9 @@
CFBundleIdentifier
com.github.bootstrapmate
CFBundleName
- BootstrapMate
+ Managed Bootstrap Install
+ CFBundleDisplayName
+ Managed Bootstrap Install
CFBundleIconFile
BootstrapMate
CFBundleIconName
diff --git a/packaging/scripts/postinstall b/packaging/scripts/postinstall
index 0aeb733..7db560f 100755
--- a/packaging/scripts/postinstall
+++ b/packaging/scripts/postinstall
@@ -11,7 +11,8 @@ log() {
log "=== BootstrapMate postinstall started ==="
-APP_PATH="/Applications/Utilities/BootstrapMate.app"
+APP_PATH="/Applications/Utilities/Managed Bootstrap Install.app"
+LEGACY_APP_PATH="/Applications/Utilities/BootstrapMate.app"
BINARY_PATH="${APP_PATH}/Contents/MacOS/managedbootstrapinstall"
SYMLINK_DIR="/usr/local/bootstrapmate"
SYMLINK_PATH="${SYMLINK_DIR}/managedbootstrapinstall"
@@ -24,6 +25,13 @@ CACHE_DIR="${MANAGED_DIR}/cache"
log "Creating directories..."
+# Remove the pre-rename app bundle: the payload no longer covers the old path,
+# so an upgrade would otherwise leave both apps in /Applications/Utilities
+if [[ -d "${LEGACY_APP_PATH}" ]]; then
+ rm -rf "${LEGACY_APP_PATH}"
+ log "Removed legacy app bundle: ${LEGACY_APP_PATH}"
+fi
+
# Create Managed Bootstrap directories FIRST (before daemon can start)
mkdir -p "${LOG_DIR}"
chmod 755 "${LOG_DIR}"
@@ -37,7 +45,7 @@ if [[ -x "${BINARY_PATH}" ]]; then
log "Binary found: ${BINARY_PATH}"
# Get binary info
- log "Binary architecture: $(file ${BINARY_PATH})"
+ log "Binary architecture: $(file "${BINARY_PATH}")"
# Create symlink directory and symlink
rm -f "${SYMLINK_DIR}/.placeholder" 2>/dev/null || true