Skip to content

Commit 5820364

Browse files
Axuclaude
authored andcommitted
[C] feat(branding): rename to "Dev Island", bundle id app.devisland.Island, brew dev-island, fuller icon
Three brand-consistency changes for v0.1.1: 1. Logo fills the icon canvas The v0.1.0 source PNG had ~30% transparent padding around the dark squircle design, so the rendered macOS icon showed a small capsule floating inside macOS's default rounded-square container — looked under-sized in Finder and the Dock. Trim the source to its non-transparent bounds (1562×1562 from a 2048×2048 canvas) and regenerate AppIcon.icns. Now the design is the icon shape; macOS's rounded-square mask aligns with the user's squircle. docs/media/logo-trimmed.png is the trimmed master, fed to scripts/make-icon.sh. 2. Display name "Island" → "Dev Island" Product name on devisland.app is "Dev Island", but the macOS bundle was just "Island". Updated CFBundleName + CFBundleDisplayName so Finder, About menu, Force Quit dialog, etc. all show "Dev Island". The Swift target / executable name stays "IslandApp" — it's a build-system identifier, not user-facing. 3. Bundle identifier com.island.app → app.devisland.Island Reverse-DNS of the actual product domain (devisland.app's TLD is .app, so reverse is `app.devisland.X`). Updated everywhere it was hard-coded: - Info.plist CFBundleIdentifier - scripts/build-app.sh BUNDLE_ID + codesign -i flag - .github/workflows/release.yml codesign -i flag - IslandCore.KeychainStore.service (where the Manus API key lives) - IslandCore.TunnelManager UserDefaults suite (webhook id) - IslandLogger subsystem (api/webhook/tunnel/store/sync/storage) - TaskNotifier logger subsystem - dist/homebrew-island Cask zap paths ⚠️ Existing v0.1.0 installs lose their Keychain entry + UserDefaults suite on upgrade — only affects the developer's own test install right now, future users land on v0.1.1+ from the start. 4. Cask name `island` → `dev-island` The brew tap will be `sheepxux/dev-island` (repo: homebrew-dev-island) and the install command `brew install --cask dev-island`. Renamed the formula file via `git mv` so history follows. README + workflow release notes updated to match. VERSION bumped 0.1.0 → 0.1.1. v0.1.0 stays public as the first ship; v0.1.1 lands the rename + icon fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6f50e8b commit 5820364

14 files changed

Lines changed: 99 additions & 66 deletions

File tree

.github/workflows/release.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ jobs:
174174
set -euo pipefail
175175
codesign --force --deep --options runtime \
176176
--sign "${SIGNING_IDENTITY}" \
177-
-i com.island.app \
177+
-i app.devisland.Island \
178178
--timestamp \
179179
build/Island.app
180180
codesign --verify --strict --verbose=2 build/Island.app
@@ -273,8 +273,8 @@ jobs:
273273
## Homebrew (optional, when the tap is published)
274274
275275
```sh
276-
brew tap sheepxux/island
277-
brew install --cask island
276+
brew tap sheepxux/dev-island
277+
brew install --cask dev-island
278278
```
279279
280280
**SHA-256**: `${{ steps.package.outputs.sha256 }}`

IslandApp/Resources/AppIcon.icns

621 KB
Binary file not shown.

IslandApp/Resources/Info.plist

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,33 @@
3333
<string>en</string>
3434

3535
<key>CFBundleDisplayName</key>
36-
<string>Island</string>
36+
<string>Dev Island</string>
3737

3838
<key>CFBundleExecutable</key>
3939
<string>IslandApp</string>
4040

4141
<key>CFBundleIconFile</key>
4242
<string>AppIcon</string>
4343

44+
<!--
45+
Bundle identifier in reverse-DNS form. The domain is
46+
devisland.app (TLD is .app), so the reverse is app.devisland.X
47+
where X is the product code. We use `Island` for X to match
48+
the Swift target / executable name; the user-facing "Dev
49+
Island" name lives in CFBundleDisplayName.
50+
51+
Changing this AFTER any user has installed the app will
52+
invalidate their Keychain entry (API key) and UserDefaults
53+
suite (webhook id). Treat as immutable post-v0.2.0.
54+
-->
4455
<key>CFBundleIdentifier</key>
45-
<string>com.island.app</string>
56+
<string>app.devisland.Island</string>
4657

4758
<key>CFBundleInfoDictionaryVersion</key>
4859
<string>6.0</string>
4960

5061
<key>CFBundleName</key>
51-
<string>Island</string>
62+
<string>Dev Island</string>
5263

5364
<key>CFBundlePackageType</key>
5465
<string>APPL</string>

IslandAppLib/Notifications/TaskNotifier.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import UserNotifications
2424
public final class TaskNotifier: NSObject, UNUserNotificationCenterDelegate {
2525
public static let shared = TaskNotifier()
2626

27-
private static let log = Logger(subsystem: "com.island.app", category: "notifier")
27+
private static let log = Logger(subsystem: "app.devisland.Island", category: "notifier")
2828

2929
/// Last seen task list, keyed by ID. We diff this against each new
3030
/// snapshot to find status transitions.
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import os
22

3+
/// Centralized `os.Logger` instances. Subsystem matches the bundle
4+
/// identifier (`app.devisland.Island`) so all our log lines are
5+
/// addressable via `log show --predicate 'subsystem == "app.devisland.Island"'`
6+
/// when diagnosing user-reported issues.
37
enum IslandLogger {
4-
static let api = Logger(subsystem: "com.island.app", category: "api")
5-
static let webhook = Logger(subsystem: "com.island.app", category: "webhook")
6-
static let tunnel = Logger(subsystem: "com.island.app", category: "tunnel")
7-
static let store = Logger(subsystem: "com.island.app", category: "store")
8-
static let sync = Logger(subsystem: "com.island.app", category: "sync")
9-
static let storage = Logger(subsystem: "com.island.app", category: "storage")
8+
private static let subsystem = "app.devisland.Island"
9+
10+
static let api = Logger(subsystem: subsystem, category: "api")
11+
static let webhook = Logger(subsystem: subsystem, category: "webhook")
12+
static let tunnel = Logger(subsystem: subsystem, category: "tunnel")
13+
static let store = Logger(subsystem: subsystem, category: "store")
14+
static let sync = Logger(subsystem: subsystem, category: "sync")
15+
static let storage = Logger(subsystem: subsystem, category: "storage")
1016
}

IslandCore/Sources/IslandCore/Storage/KeychainStore.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import Foundation
22
import Security
33

44
enum KeychainStore {
5-
static let service = "com.island.app"
5+
/// Keychain service identifier. Matches the bundle identifier so
6+
/// when the app is rebranded (com.island.app → app.devisland.Island)
7+
/// the Keychain entry's namespace tracks the change. Existing v0.1.0
8+
/// users will need to re-enter their API key after the rename — see
9+
/// Info.plist's CFBundleIdentifier comment.
10+
static let service = "app.devisland.Island"
611
static let accountKey = "manus_api_key"
712

813
enum KeychainError: Error {

IslandCore/Sources/IslandCore/Tunnel/TunnelManager.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ actor TunnelManager {
9090
do {
9191
let webhookId = try await client.registerWebhook(publicURL: webhookURL)
9292
currentWebhookId = webhookId
93-
UserDefaults(suiteName: "com.island.app")?.set(webhookId, forKey: "webhookId")
93+
UserDefaults(suiteName: "app.devisland.Island")?.set(webhookId, forKey: "webhookId")
9494
IslandLogger.tunnel.info("Webhook registered: \(webhookId)")
9595
} catch {
9696
IslandLogger.tunnel.error("Webhook registration failed: \(error)")
@@ -100,7 +100,7 @@ actor TunnelManager {
100100

101101
private func cleanupWebhook() async {
102102
// Clean up stored webhook from a previous session that may have crashed
103-
let defaults = UserDefaults(suiteName: "com.island.app")
103+
let defaults = UserDefaults(suiteName: "app.devisland.Island")
104104
let storedId = currentWebhookId ?? defaults?.string(forKey: "webhookId")
105105
guard let id = storedId else { return }
106106
do {

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ zero Gatekeeper warnings on first launch.
6868
*Coming soon.* Once the public tap is published:
6969

7070
```sh
71-
brew tap sheepxux/island
72-
brew install --cask island
71+
brew tap sheepxux/dev-island
72+
brew install --cask dev-island
7373
```
7474

7575
The Cask will declare `depends_on cask: "cloudflared"` so realtime webhook

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.0
1+
0.1.1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
# frozen_string_literal: true
22

3-
# Island.app — Dynamic-Island-style menubar status for Manus AI tasks.
3+
# Dev Island — A live status bar for the AI agents working in the
4+
# background.
45
#
5-
# This Cask is meant to live in a separate `sheepxux/homebrew-island`
6-
# tap repo, NOT inside the Island monorepo itself. We keep this draft
7-
# under `dist/homebrew-island/Casks/island.rb` so the source-of-truth
6+
# This Cask is meant to live in a separate `sheepxux/homebrew-dev-island`
7+
# tap repo, NOT inside the Dev Island monorepo itself. We keep this draft
8+
# under `dist/homebrew-island/Casks/dev-island.rb` so the source-of-truth
89
# stays version-controlled alongside the app, but the actual brew tap
910
# repository pulls (or copies) this file at release time.
1011
#
1112
# Quick local test (before publishing the tap):
12-
# brew install --cask ./dist/homebrew-island/Casks/island.rb
13+
# brew install --cask ./dist/homebrew-island/Casks/dev-island.rb
1314
#
1415
# Why no `livecheck` block: livecheck auto-opens issues when version
1516
# detection breaks, and we publish releases manually for now. Add it
@@ -19,20 +20,23 @@
1920
# url :url
2021
# strategy :github_latest
2122
# end
22-
cask "island" do
23-
version "0.1.0"
23+
cask "dev-island" do
24+
version "0.1.1"
2425
# Replaced by the GitHub Actions release workflow's per-tag SHA-256
2526
# before publishing. Local test value is the SHA of the most recent
26-
# local build under build/Island-<version>.zip.
27+
# local build under build/Island.zip.
2728
sha256 "0000000000000000000000000000000000000000000000000000000000000000"
2829

29-
url "https://github.com/sheepxux/Dev-Island/releases/download/v#{version}/Island-#{version}.zip"
30-
name "Island"
31-
desc "Dynamic-Island-style menubar status for Manus AI tasks"
30+
# Stable filename — `Island.zip` is also published as a per-version
31+
# asset (`Island-#{version}.zip`) but pinning to the stable name lets
32+
# the cask formula update with just the SHA, not the URL.
33+
url "https://github.com/sheepxux/Dev-Island/releases/download/v#{version}/Island.zip"
34+
name "Dev Island"
35+
desc "Live status bar for AI agents working in the background"
3236
homepage "https://devisland.app"
3337

3438
# Apple Silicon arm64 + Intel x86_64 universal binary. macOS 14+ for
35-
# the SwiftUI / Observation features Island uses.
39+
# the SwiftUI / Observation features Dev Island uses.
3640
depends_on macos: ">= :sonoma"
3741

3842
# Realtime task updates rely on a cloudflared tunnel exposing a local
@@ -47,19 +51,20 @@
4751

4852
app "Island.app"
4953

50-
# `zap` is what `brew uninstall --zap island` uses to wipe per-user
51-
# state. Listing every location Island writes to means a clean
54+
# `zap` is what `brew uninstall --zap dev-island` uses to wipe per-user
55+
# state. Listing every location Dev Island writes to means a clean
5256
# uninstall doesn't leave behind:
5357
# - the SQLite store from IslandCore.SQLiteStore
54-
# - the Keychain entry written by IslandCore.KeychainStore (handled
55-
# by macOS, not files — no zap entry)
56-
# - app preferences from `defaults`
57-
# - log files from os.Logger (handled by the system log subsystem,
58-
# not files we own — no zap entry)
58+
# - app preferences from `defaults` (UserDefaults suite name matches
59+
# the bundle identifier app.devisland.Island)
60+
# - Saved Application State frame data
61+
#
62+
# The Keychain entry that holds the Manus API key is handled by macOS
63+
# itself when the bundle is removed, no `zap` entry needed.
5964
zap trash: [
60-
"~/Library/Application Support/Island",
61-
"~/Library/Preferences/com.island.app.plist",
62-
"~/Library/Caches/com.island.app",
63-
"~/Library/Saved Application State/com.island.app.savedState",
65+
"~/Library/Application Support/Dev Island",
66+
"~/Library/Preferences/app.devisland.Island.plist",
67+
"~/Library/Caches/app.devisland.Island",
68+
"~/Library/Saved Application State/app.devisland.Island.savedState",
6469
]
6570
end

0 commit comments

Comments
 (0)