diff --git a/Package.swift b/Package.swift
index 9c75930..5905914 100644
--- a/Package.swift
+++ b/Package.swift
@@ -2,20 +2,20 @@
import PackageDescription
let package = Package(
- name: "Puter",
+ name: "puter",
platforms: [.macOS(.v14)],
products: [
- .executable(name: "Puter", targets: ["Puter"])
+ .executable(name: "puter", targets: ["puter"])
],
targets: [
.executableTarget(
- name: "Puter",
- path: "Sources/Puter"
+ name: "puter",
+ path: "Sources/puter"
),
.testTarget(
- name: "PuterTests",
- dependencies: ["Puter"],
- path: "Tests/PuterTests"
+ name: "puterTests",
+ dependencies: ["puter"],
+ path: "Tests/puterTests"
)
]
)
diff --git a/README.md b/README.md
index 137dabf..7fb52a4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Puter
+# puter
A native macOS system monitor written in SwiftUI and inspired by Windows 11 Task Manager.
@@ -57,7 +57,7 @@ To create a standard double-clickable app bundle:
```sh
./scripts/build-app.sh
-open "dist/Puter.app"
+open "dist/puter.app"
```
To create a drag-to-install disk image containing the app and an Applications shortcut:
diff --git a/Resources/Info.plist b/Resources/Info.plist
index 4ab782d..6c57eb0 100644
--- a/Resources/Info.plist
+++ b/Resources/Info.plist
@@ -5,17 +5,17 @@
CFBundleDevelopmentRegion
en
CFBundleDisplayName
- Puter
+ puter
CFBundleExecutable
- Puter
+ puter
CFBundleIdentifier
- local.mactaskmanager.app
+ dev.soconnor.puter
CFBundleIconName
- Puter
+ puter
CFBundleInfoDictionaryVersion
6.0
CFBundleName
- Puter
+ puter
CFBundlePackageType
APPL
CFBundleShortVersionString
diff --git a/Sources/Puter/AppUtilitiesViews.swift b/Sources/puter/AppUtilitiesViews.swift
similarity index 98%
rename from Sources/Puter/AppUtilitiesViews.swift
rename to Sources/puter/AppUtilitiesViews.swift
index a796911..1e1d808 100644
--- a/Sources/Puter/AppUtilitiesViews.swift
+++ b/Sources/puter/AppUtilitiesViews.swift
@@ -83,7 +83,7 @@ struct SettingsView: View {
var body: some View {
@Bindable var monitor = monitor
VStack(spacing: 0) {
- PageHeader(title: "Settings", subtitle: "Customize Puter")
+ PageHeader(title: "Settings", subtitle: "Customize puter")
Form {
Section("General") {
Picker("Default start page", selection: $defaultStartPage) {
@@ -125,7 +125,7 @@ struct SettingsView: View {
}
Section("About") {
- LabeledContent("Application", value: "Puter")
+ LabeledContent("Application", value: "puter")
LabeledContent("Version", value: appVersion)
LabeledContent("Framework", value: "Native SwiftUI")
}
diff --git a/Sources/Puter/Components.swift b/Sources/puter/Components.swift
similarity index 100%
rename from Sources/Puter/Components.swift
rename to Sources/puter/Components.swift
diff --git a/Sources/Puter/ContentView.swift b/Sources/puter/ContentView.swift
similarity index 98%
rename from Sources/Puter/ContentView.swift
rename to Sources/puter/ContentView.swift
index 0b465b7..d4f7fa5 100644
--- a/Sources/Puter/ContentView.swift
+++ b/Sources/puter/ContentView.swift
@@ -2,7 +2,7 @@ import AppKit
import SwiftUI
extension Notification.Name {
- static let runNewTask = Notification.Name("Puter.runNewTask")
+ static let runNewTask = Notification.Name("puter.runNewTask")
}
struct ContentView: View {
@@ -70,14 +70,14 @@ struct ContentView: View {
TaskToolbarContent(showingNewTask: $showingNewTask)
}
}
- .navigationTitle("Puter")
+ .navigationTitle("puter")
.animation(.snappy(duration: 0.22), value: sidebarCompact)
.onChange(of: selection) { _, _ in searchText = "" }
.onReceive(NotificationCenter.default.publisher(for: .runNewTask)) { _ in showingNewTask = true }
.sheet(isPresented: $showingNewTask) {
NewTaskView(isPresented: $showingNewTask)
}
- .alert("Puter", isPresented: Binding(
+ .alert("puter", isPresented: Binding(
get: { monitor.errorMessage != nil },
set: { if !$0 { monitor.errorMessage = nil } }
)) {
diff --git a/Sources/Puter/FanControlService.swift b/Sources/puter/FanControlService.swift
similarity index 100%
rename from Sources/Puter/FanControlService.swift
rename to Sources/puter/FanControlService.swift
diff --git a/Sources/Puter/HardwareView.swift b/Sources/puter/HardwareView.swift
similarity index 99%
rename from Sources/Puter/HardwareView.swift
rename to Sources/puter/HardwareView.swift
index 00a1b23..d62b52c 100644
--- a/Sources/Puter/HardwareView.swift
+++ b/Sources/puter/HardwareView.swift
@@ -294,7 +294,7 @@ struct HardwareView: View {
metric("Control backend", FanControlService.isAvailable ? "Ready" : "Unavailable")
Spacer()
}
- Text("Puter reads fan sensors directly through the Mac's SMC interface. Manual targets are clamped to each fan's reported safe range; Automatic returns control to macOS.")
+ Text("puter reads fan sensors directly through the Mac's SMC interface. Manual targets are clamped to each fan's reported safe range; Automatic returns control to macOS.")
.font(.caption).foregroundStyle(.secondary)
HStack {
Button("Apply targets", systemImage: "speedometer") {
diff --git a/Sources/Puter/Models.swift b/Sources/puter/Models.swift
similarity index 100%
rename from Sources/Puter/Models.swift
rename to Sources/puter/Models.swift
diff --git a/Sources/Puter/PerformanceView.swift b/Sources/puter/PerformanceView.swift
similarity index 100%
rename from Sources/Puter/PerformanceView.swift
rename to Sources/puter/PerformanceView.swift
diff --git a/Sources/Puter/ProcessActions.swift b/Sources/puter/ProcessActions.swift
similarity index 99%
rename from Sources/Puter/ProcessActions.swift
rename to Sources/puter/ProcessActions.swift
index f945e48..a9a4629 100644
--- a/Sources/Puter/ProcessActions.swift
+++ b/Sources/puter/ProcessActions.swift
@@ -126,7 +126,7 @@ enum ProcessDiagnosticReporter {
let panel = NSSavePanel()
panel.title = "Create diagnostic report"
- panel.message = "Puter will sample \(process.displayName) for \(duration) seconds and save a text report."
+ panel.message = "puter will sample \(process.displayName) for \(duration) seconds and save a text report."
panel.prompt = "Create Report"
panel.nameFieldStringValue = safeFilename("\(process.displayName)-\(process.pid)-sample.txt")
panel.allowedContentTypes = [.plainText]
diff --git a/Sources/Puter/ProcessDependencyInspector.swift b/Sources/puter/ProcessDependencyInspector.swift
similarity index 100%
rename from Sources/Puter/ProcessDependencyInspector.swift
rename to Sources/puter/ProcessDependencyInspector.swift
diff --git a/Sources/Puter/ProcessViews.swift b/Sources/puter/ProcessViews.swift
similarity index 100%
rename from Sources/Puter/ProcessViews.swift
rename to Sources/puter/ProcessViews.swift
diff --git a/Sources/Puter/PuterApp.swift b/Sources/puter/PuterApp.swift
similarity index 97%
rename from Sources/Puter/PuterApp.swift
rename to Sources/puter/PuterApp.swift
index 19ebc7e..6501365 100644
--- a/Sources/Puter/PuterApp.swift
+++ b/Sources/puter/PuterApp.swift
@@ -6,7 +6,7 @@ struct PuterApp: App {
@AppStorage("sidebarCompact") private var sidebarCompact = false
var body: some Scene {
- WindowGroup("Puter") {
+ WindowGroup("puter") {
ContentView()
.environment(monitor)
.frame(minWidth: 820, minHeight: 560)
diff --git a/Sources/Puter/SecondaryViews.swift b/Sources/puter/SecondaryViews.swift
similarity index 99%
rename from Sources/Puter/SecondaryViews.swift
rename to Sources/puter/SecondaryViews.swift
index 0d49866..b5a062c 100644
--- a/Sources/Puter/SecondaryViews.swift
+++ b/Sources/puter/SecondaryViews.swift
@@ -66,7 +66,7 @@ struct AppHistoryView: View {
Button("Cancel", role: .cancel) {}
Button("Reset", role: .destructive) { monitor.resetAppHistory() }
} message: {
- Text("CPU time and network totals collected by Puter will be permanently cleared.")
+ Text("CPU time and network totals collected by puter will be permanently cleared.")
}
.sheet(item: $inspectedUsage) { AppUsagePropertiesView(usage: $0) }
}
diff --git a/Sources/Puter/SystemMonitor.swift b/Sources/puter/SystemMonitor.swift
similarity index 99%
rename from Sources/Puter/SystemMonitor.swift
rename to Sources/puter/SystemMonitor.swift
index 9d11501..6c6f72c 100644
--- a/Sources/Puter/SystemMonitor.swift
+++ b/Sources/puter/SystemMonitor.swift
@@ -147,7 +147,7 @@ final class SystemMonitor {
func terminate(_ process: ProcessRecord, force: Bool = false) {
guard process.pid != getpid() else {
- errorMessage = "Puter cannot end itself."
+ errorMessage = "puter cannot end itself."
return
}
let signal = force ? SIGKILL : SIGTERM
@@ -170,7 +170,7 @@ final class SystemMonitor {
func terminateGroup(_ group: [ProcessRecord]) {
guard !group.contains(where: { $0.pid == getpid() }) else {
- errorMessage = "Puter cannot end an application group that contains itself."
+ errorMessage = "puter cannot end an application group that contains itself."
return
}
let pids = Set(group.map(\.pid))
@@ -188,7 +188,7 @@ final class SystemMonitor {
func sendSignal(_ signal: Int32, to process: ProcessRecord, successMessage: String? = nil) {
guard process.pid != getpid() else {
- errorMessage = "Puter cannot control itself."
+ errorMessage = "puter cannot control itself."
return
}
if kill(process.pid, signal) != 0 {
@@ -415,7 +415,7 @@ private enum AppHistoryPersistence {
}
static let directory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0]
- .appendingPathComponent("MacTaskManager", isDirectory: true)
+ .appendingPathComponent("puter", isDirectory: true)
static let url = directory.appendingPathComponent("app-history.json")
}
diff --git a/Sources/Puter/SystemReportExporter.swift b/Sources/puter/SystemReportExporter.swift
similarity index 100%
rename from Sources/Puter/SystemReportExporter.swift
rename to Sources/puter/SystemReportExporter.swift
diff --git a/Tests/PuterTests/ModelTests.swift b/Tests/puterTests/ModelTests.swift
similarity index 99%
rename from Tests/PuterTests/ModelTests.swift
rename to Tests/puterTests/ModelTests.swift
index ed41816..972c339 100644
--- a/Tests/PuterTests/ModelTests.swift
+++ b/Tests/puterTests/ModelTests.swift
@@ -1,5 +1,5 @@
import XCTest
-@testable import Puter
+@testable import puter
final class ModelTests: XCTestCase {
func testAppleSystemServicePublisherAndDomainIdentity() {
diff --git a/Puter-design.afdesign b/puter-design.afdesign
similarity index 100%
rename from Puter-design.afdesign
rename to puter-design.afdesign
diff --git a/Puter.icon/Assets/puter-white.png b/puter.icon/Assets/puter-white.png
similarity index 100%
rename from Puter.icon/Assets/puter-white.png
rename to puter.icon/Assets/puter-white.png
diff --git a/Puter.icon/icon.json b/puter.icon/icon.json
similarity index 100%
rename from Puter.icon/icon.json
rename to puter.icon/icon.json
diff --git a/scripts/build-app.sh b/scripts/build-app.sh
index 493632f..819d97b 100755
--- a/scripts/build-app.sh
+++ b/scripts/build-app.sh
@@ -2,10 +2,10 @@
set -euo pipefail
PROJECT_DIR="${0:A:h:h}"
-APP_DIR="$PROJECT_DIR/dist/Puter.app"
-ICON_SOURCE="${PUTER_ICON_SOURCE:-$PROJECT_DIR/Puter.icon}"
+APP_DIR="$PROJECT_DIR/dist/puter.app"
+ICON_SOURCE="${PUTER_ICON_SOURCE:-$PROJECT_DIR/puter.icon}"
STAGING_ROOT="$(mktemp -d /tmp/puter-build.XXXXXX)"
-STAGED_APP="$STAGING_ROOT/Puter.app"
+STAGED_APP="$STAGING_ROOT/puter.app"
CONTENTS_DIR="$STAGED_APP/Contents"
trap '/bin/rm -rf -- "$STAGING_ROOT"' EXIT
@@ -14,9 +14,9 @@ cd "$PROJECT_DIR"
swift build -c release
mkdir -p "$CONTENTS_DIR/MacOS" "$CONTENTS_DIR/Resources"
-cp "$PROJECT_DIR/.build/release/Puter" "$CONTENTS_DIR/MacOS/Puter"
+cp "$PROJECT_DIR/.build/release/puter" "$CONTENTS_DIR/MacOS/puter"
cp "$PROJECT_DIR/Resources/Info.plist" "$CONTENTS_DIR/Info.plist"
-chmod +x "$CONTENTS_DIR/MacOS/Puter"
+chmod +x "$CONTENTS_DIR/MacOS/puter"
SMC_SOURCE="/Applications/Stats.app/Contents/Resources/smc"
if [[ -x "$SMC_SOURCE" ]]; then
@@ -31,14 +31,14 @@ if [[ -d "$ICON_SOURCE" ]]; then
--compile "$CONTENTS_DIR/Resources" \
--platform macosx \
--minimum-deployment-target 14.0 \
- --app-icon Puter \
+ --app-icon puter \
--output-partial-info-plist "$CONTENTS_DIR/Resources/IconInfo.plist" >/dev/null
[[ -s "$CONTENTS_DIR/Resources/Assets.car" ]] || {
print -u2 "Icon Composer did not produce an Assets.car file"
exit 1
}
- [[ "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconName' "$CONTENTS_DIR/Info.plist")" == "Puter" ]] || {
+ [[ "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconName' "$CONTENTS_DIR/Info.plist")" == "puter" ]] || {
print -u2 "CFBundleIconName must reference the Icon Composer asset"
exit 1
}
diff --git a/scripts/build-dmg.sh b/scripts/build-dmg.sh
index a07571f..f2e5703 100755
--- a/scripts/build-dmg.sh
+++ b/scripts/build-dmg.sh
@@ -2,8 +2,8 @@
set -euo pipefail
PROJECT_DIR="${0:A:h:h}"
-APP_PATH="$PROJECT_DIR/dist/Puter.app"
-DMG_PATH="$PROJECT_DIR/dist/Puter-macOS.dmg"
+APP_PATH="$PROJECT_DIR/dist/puter.app"
+DMG_PATH="$PROJECT_DIR/dist/puter-macOS.dmg"
STAGING_DIR="$(mktemp -d /tmp/puter-dmg.XXXXXX)"
cleanup() {
@@ -15,13 +15,13 @@ if [[ ! -d "$APP_PATH" ]]; then
"$PROJECT_DIR/scripts/build-app.sh"
fi
-ditto --norsrc "$APP_PATH" "$STAGING_DIR/Puter.app"
-xattr -cr "$STAGING_DIR/Puter.app"
-codesign --verify --deep --strict "$STAGING_DIR/Puter.app"
+ditto --norsrc "$APP_PATH" "$STAGING_DIR/puter.app"
+xattr -cr "$STAGING_DIR/puter.app"
+codesign --verify --deep --strict "$STAGING_DIR/puter.app"
ln -s /Applications "$STAGING_DIR/Applications"
hdiutil create \
- -volname "Puter" \
+ -volname "puter" \
-srcfolder "$STAGING_DIR" \
-format UDZO \
-imagekey zlib-level=9 \