Skip to content

Commit b7294dd

Browse files
committed
Prepare fork for public release: remove Mixpanel telemetry, disable Sparkle updates, rename app
1 parent c116d92 commit b7294dd

6 files changed

Lines changed: 17 additions & 152 deletions

File tree

ClaudeIsland.xcodeproj/project.pbxproj

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10-
FD0F42E72EE7ABA400980302 /* Mixpanel in Frameworks */ = {isa = PBXBuildFile; productRef = FD0F42E62EE7ABA400980302 /* Mixpanel */; };
1110
FDA49F7D2EE11E3C00F9612E /* Markdown in Frameworks */ = {isa = PBXBuildFile; productRef = FD33FD722EDF32D7002A6548 /* Markdown */; };
1211
FDA49F7E2EE11E3C00F9612E /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = FDA49F7F2EE11E3C00F9612E /* Sparkle */; };
1312
/* End PBXBuildFile section */
1413

1514
/* Begin PBXFileReference section */
16-
FD33FD5D2EDF32D7002A6548 /* Claude Island.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Claude Island.app"; sourceTree = BUILT_PRODUCTS_DIR; };
15+
FD33FD5D2EDF32D7002A6548 /* Claude Island (Fork).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Claude Island (Fork).app"; sourceTree = BUILT_PRODUCTS_DIR; };
1716
/* End PBXFileReference section */
1817

1918
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
@@ -42,7 +41,6 @@
4241
isa = PBXFrameworksBuildPhase;
4342
buildActionMask = 2147483647;
4443
files = (
45-
FD0F42E72EE7ABA400980302 /* Mixpanel in Frameworks */,
4644
FDA49F7D2EE11E3C00F9612E /* Markdown in Frameworks */,
4745
FDA49F7E2EE11E3C00F9612E /* Sparkle in Frameworks */,
4846
);
@@ -62,7 +60,7 @@
6260
FD33FD5E2EDF32D7002A6548 /* Products */ = {
6361
isa = PBXGroup;
6462
children = (
65-
FD33FD5D2EDF32D7002A6548 /* Claude Island.app */,
63+
FD33FD5D2EDF32D7002A6548 /* Claude Island (Fork).app */,
6664
);
6765
name = Products;
6866
sourceTree = "<group>";
@@ -89,10 +87,9 @@
8987
packageProductDependencies = (
9088
FD33FD722EDF32D7002A6548 /* Markdown */,
9189
FDA49F7F2EE11E3C00F9612E /* Sparkle */,
92-
FD0F42E62EE7ABA400980302 /* Mixpanel */,
9390
);
9491
productName = ClaudeIsland;
95-
productReference = FD33FD5D2EDF32D7002A6548 /* Claude Island.app */;
92+
productReference = FD33FD5D2EDF32D7002A6548 /* Claude Island (Fork).app */;
9693
productType = "com.apple.product-type.application";
9794
};
9895
/* End PBXNativeTarget section */
@@ -122,7 +119,6 @@
122119
packageReferences = (
123120
FD33FD712EDF32D7002A6548 /* XCRemoteSwiftPackageReference "swift-markdown" */,
124121
FDA49F802EE11E3C00F9612E /* XCRemoteSwiftPackageReference "Sparkle" */,
125-
FD0F42E52EE7ABA400980302 /* XCRemoteSwiftPackageReference "mixpanel-swift" */,
126122
);
127123
preferredProjectObjectVersion = 77;
128124
productRefGroup = FD33FD5E2EDF32D7002A6548 /* Products */;
@@ -284,7 +280,7 @@
284280
CODE_SIGN_STYLE = Automatic;
285281
COMBINE_HIDPI_IMAGES = YES;
286282
CURRENT_PROJECT_VERSION = 4;
287-
DEVELOPMENT_TEAM = 2DKS5U9LV4;
283+
DEVELOPMENT_TEAM = 85MZB3GP6S;
288284
ENABLE_APP_SANDBOX = NO;
289285
ENABLE_HARDENED_RUNTIME = YES;
290286
ENABLE_PREVIEWS = YES;
@@ -298,8 +294,8 @@
298294
"@executable_path/../Frameworks",
299295
);
300296
MARKETING_VERSION = 1.3;
301-
PRODUCT_BUNDLE_IDENTIFIER = com.celestial.ClaudeIsland;
302-
PRODUCT_NAME = "Claude Island";
297+
PRODUCT_BUNDLE_IDENTIFIER = me.rosuh.ClaudeIsland;
298+
PRODUCT_NAME = "Claude Island (Fork)";
303299
REGISTER_APP_GROUPS = YES;
304300
STRING_CATALOG_GENERATE_SYMBOLS = YES;
305301
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -319,7 +315,7 @@
319315
CODE_SIGN_STYLE = Automatic;
320316
COMBINE_HIDPI_IMAGES = YES;
321317
CURRENT_PROJECT_VERSION = 4;
322-
DEVELOPMENT_TEAM = 2DKS5U9LV4;
318+
DEVELOPMENT_TEAM = 85MZB3GP6S;
323319
ENABLE_APP_SANDBOX = NO;
324320
ENABLE_HARDENED_RUNTIME = YES;
325321
ENABLE_PREVIEWS = YES;
@@ -333,8 +329,8 @@
333329
"@executable_path/../Frameworks",
334330
);
335331
MARKETING_VERSION = 1.3;
336-
PRODUCT_BUNDLE_IDENTIFIER = com.celestial.ClaudeIsland;
337-
PRODUCT_NAME = "Claude Island";
332+
PRODUCT_BUNDLE_IDENTIFIER = me.rosuh.ClaudeIsland;
333+
PRODUCT_NAME = "Claude Island (Fork)";
338334
REGISTER_APP_GROUPS = YES;
339335
STRING_CATALOG_GENERATE_SYMBOLS = YES;
340336
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -369,14 +365,6 @@
369365
/* End XCConfigurationList section */
370366

371367
/* Begin XCRemoteSwiftPackageReference section */
372-
FD0F42E52EE7ABA400980302 /* XCRemoteSwiftPackageReference "mixpanel-swift" */ = {
373-
isa = XCRemoteSwiftPackageReference;
374-
repositoryURL = "https://github.com/mixpanel/mixpanel-swift";
375-
requirement = {
376-
branch = master;
377-
kind = branch;
378-
};
379-
};
380368
FD33FD712EDF32D7002A6548 /* XCRemoteSwiftPackageReference "swift-markdown" */ = {
381369
isa = XCRemoteSwiftPackageReference;
382370
repositoryURL = "https://github.com/swiftlang/swift-markdown";
@@ -396,11 +384,6 @@
396384
/* End XCRemoteSwiftPackageReference section */
397385

398386
/* Begin XCSwiftPackageProductDependency section */
399-
FD0F42E62EE7ABA400980302 /* Mixpanel */ = {
400-
isa = XCSwiftPackageProductDependency;
401-
package = FD0F42E52EE7ABA400980302 /* XCRemoteSwiftPackageReference "mixpanel-swift" */;
402-
productName = Mixpanel;
403-
};
404387
FD33FD722EDF32D7002A6548 /* Markdown */ = {
405388
isa = XCSwiftPackageProductDependency;
406389
package = FD33FD712EDF32D7002A6548 /* XCRemoteSwiftPackageReference "swift-markdown" */;

ClaudeIsland.xcodeproj/xcshareddata/xcschemes/ClaudeIsland.xcscheme

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<BuildableReference
1717
BuildableIdentifier = "primary"
1818
BlueprintIdentifier = "FD33FD5C2EDF32D7002A6548"
19-
BuildableName = "Claude Island.app"
19+
BuildableName = "Claude Island (Fork).app"
2020
BlueprintName = "ClaudeIsland"
2121
ReferencedContainer = "container:ClaudeIsland.xcodeproj">
2222
</BuildableReference>
@@ -45,7 +45,7 @@
4545
<BuildableReference
4646
BuildableIdentifier = "primary"
4747
BlueprintIdentifier = "FD33FD5C2EDF32D7002A6548"
48-
BuildableName = "Claude Island.app"
48+
BuildableName = "Claude Island (Fork).app"
4949
BlueprintName = "ClaudeIsland"
5050
ReferencedContainer = "container:ClaudeIsland.xcodeproj">
5151
</BuildableReference>
@@ -62,7 +62,7 @@
6262
<BuildableReference
6363
BuildableIdentifier = "primary"
6464
BlueprintIdentifier = "FD33FD5C2EDF32D7002A6548"
65-
BuildableName = "Claude Island.app"
65+
BuildableName = "Claude Island (Fork).app"
6666
BlueprintName = "ClaudeIsland"
6767
ReferencedContainer = "container:ClaudeIsland.xcodeproj">
6868
</BuildableReference>

ClaudeIsland/App/AppDelegate.swift

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import AppKit
2-
import IOKit
3-
import Mixpanel
42
import Sparkle
53
import SwiftUI
64

@@ -41,32 +39,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
4139
return
4240
}
4341

44-
Mixpanel.initialize(token: "49814c1436104ed108f3fc4735228496")
45-
46-
let distinctId = getOrCreateDistinctId()
47-
Mixpanel.mainInstance().identify(distinctId: distinctId)
48-
49-
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown"
50-
let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "unknown"
51-
let osVersion = Foundation.ProcessInfo.processInfo.operatingSystemVersionString
52-
53-
Mixpanel.mainInstance().registerSuperProperties([
54-
"app_version": version,
55-
"build_number": build,
56-
"macos_version": osVersion
57-
])
58-
59-
fetchAndRegisterClaudeVersion()
60-
61-
Mixpanel.mainInstance().people.set(properties: [
62-
"app_version": version,
63-
"build_number": build,
64-
"macos_version": osVersion
65-
])
66-
67-
Mixpanel.mainInstance().track(event: "App Launched")
68-
Mixpanel.mainInstance().flush()
69-
7042
HookInstaller.installIfNeeded()
7143
NSApplication.shared.setActivationPolicy(.accessory)
7244

@@ -92,87 +64,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
9264
}
9365

9466
func applicationWillTerminate(_ notification: Notification) {
95-
Mixpanel.mainInstance().flush()
9667
updateCheckTimer?.invalidate()
9768
screenObserver = nil
9869
}
9970

100-
private func getOrCreateDistinctId() -> String {
101-
let key = "mixpanel_distinct_id"
102-
103-
if let existingId = UserDefaults.standard.string(forKey: key) {
104-
return existingId
105-
}
106-
107-
let platformExpert = IOServiceGetMatchingService(
108-
kIOMainPortDefault,
109-
IOServiceMatching("IOPlatformExpertDevice")
110-
)
111-
defer { IOObjectRelease(platformExpert) }
112-
113-
if let uuid = IORegistryEntryCreateCFProperty(
114-
platformExpert,
115-
kIOPlatformUUIDKey as CFString,
116-
kCFAllocatorDefault,
117-
0
118-
)?.takeRetainedValue() as? String {
119-
UserDefaults.standard.set(uuid, forKey: key)
120-
return uuid
121-
}
122-
123-
let newId = UUID().uuidString
124-
UserDefaults.standard.set(newId, forKey: key)
125-
return newId
126-
}
127-
128-
private func fetchAndRegisterClaudeVersion() {
129-
let claudeProjectsDir = ClaudePaths.projectsDir
130-
131-
guard let projectDirs = try? FileManager.default.contentsOfDirectory(
132-
at: claudeProjectsDir,
133-
includingPropertiesForKeys: [.contentModificationDateKey],
134-
options: .skipsHiddenFiles
135-
) else { return }
136-
137-
var latestFile: URL?
138-
var latestDate: Date?
139-
140-
for projectDir in projectDirs {
141-
guard let files = try? FileManager.default.contentsOfDirectory(
142-
at: projectDir,
143-
includingPropertiesForKeys: [.contentModificationDateKey],
144-
options: .skipsHiddenFiles
145-
) else { continue }
146-
147-
for file in files where file.pathExtension == "jsonl" && !file.lastPathComponent.hasPrefix("agent-") {
148-
if let attrs = try? file.resourceValues(forKeys: [.contentModificationDateKey]),
149-
let modDate = attrs.contentModificationDate {
150-
if latestDate == nil || modDate > latestDate! {
151-
latestDate = modDate
152-
latestFile = file
153-
}
154-
}
155-
}
156-
}
157-
158-
guard let jsonlFile = latestFile,
159-
let handle = FileHandle(forReadingAtPath: jsonlFile.path) else { return }
160-
defer { try? handle.close() }
161-
162-
let data = handle.readData(ofLength: 8192)
163-
guard let content = String(data: data, encoding: .utf8) else { return }
164-
165-
for line in content.components(separatedBy: .newlines) where !line.isEmpty {
166-
guard let lineData = line.data(using: .utf8),
167-
let json = try? JSONSerialization.jsonObject(with: lineData) as? [String: Any],
168-
let version = json["version"] as? String else { continue }
169-
170-
Mixpanel.mainInstance().registerSuperProperties(["claude_code_version": version])
171-
Mixpanel.mainInstance().people.set(properties: ["claude_code_version": version])
172-
return
173-
}
174-
}
175-
17671
private func ensureSingleInstance() -> Bool {
17772
let bundleID = Bundle.main.bundleIdentifier ?? "com.farouqaldori.ClaudeIsland"
17873
let runningApps = NSWorkspace.shared.runningApplications.filter {

ClaudeIsland/Info.plist

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
<plist version="1.0">
44
<dict>
55
<key>CFBundleName</key>
6-
<string>Claude Island</string>
6+
<string>Claude Island (Fork)</string>
77
<key>CFBundleDisplayName</key>
8-
<string>Claude Island</string>
8+
<string>Claude Island (Fork)</string>
99
<key>CFBundleIdentifier</key>
1010
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleVersion</key>
@@ -17,12 +17,14 @@
1717
<key>NSHumanReadableCopyright</key>
1818
<string>Copyright 2025. All rights reserved.</string>
1919

20-
<!-- Sparkle Update Configuration -->
20+
<!-- Sparkle Update Configuration disabled for this fork -->
21+
<!--
2122
<key>SUFeedURL</key>
2223
<string>https://claudeisland.com/appcast.xml</string>
2324
<key>SUPublicEDKey</key>
2425
<string>w5NwH5KRfE7LfeZ09J8lWx3UQrWTqUbfH4HHBa1OPRk=</string>
2526
<key>SUEnableAutomaticChecks</key>
2627
<true/>
28+
-->
2729
</dict>
2830
</plist>

ClaudeIsland/Services/State/SessionStore.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import Combine
1010
import Foundation
11-
import Mixpanel
1211
import os.log
1312

1413
/// Central state manager for all Claude sessions
@@ -126,11 +125,6 @@ actor SessionStore {
126125
let isNewSession = sessions[sessionId] == nil
127126
var session = sessions[sessionId] ?? createSession(from: event)
128127

129-
// Track new session in Mixpanel
130-
if isNewSession {
131-
Mixpanel.mainInstance().track(event: "Session Started")
132-
}
133-
134128
session.pid = event.pid
135129
if let pid = event.pid {
136130
let tree = ProcessTreeBuilder.shared.buildTree()

README.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,6 @@ Claude Island installs hooks into `~/.claude/hooks/` that communicate session st
4545

4646
When Claude needs permission to run a tool, the notch expands with approve/deny buttons—no need to switch to the terminal.
4747

48-
## Analytics
49-
50-
Claude Island uses Mixpanel to collect anonymous usage data:
51-
52-
- **App Launched** — App version, build number, macOS version
53-
- **Session Started** — When a new Claude Code session is detected
54-
55-
No personal data or conversation content is collected.
56-
5748
## License
5849

5950
Apache 2.0

0 commit comments

Comments
 (0)