Skip to content

Regenerate app icons from Icon Composer - #1005

Merged
lawrencecchen merged 3 commits into
mainfrom
task-icon-composer-source
Mar 6, 2026
Merged

lawrencecchen merged 3 commits into
mainfrom
task-icon-composer-source

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Mar 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add design/cmux.icon and AppIcon.icon (Apple Icon Composer project) as the icon source of truth
  • Regenerate all app icon PNGs using ictool (Icon Composer CLI) with proper macOS padding
  • Update all icon sets: AppIcon (light+dark), AppIcon-Debug (with DEV banner), AppIconLight, AppIconDark
  • Add AppIcon.icon to the Xcode project as a resource for future native .icon support

Testing

  • Built and verified dock icon size matches other apps
  • Verified DEV banner on debug builds
  • Verified light/dark icon variants in Settings UI

Summary by CodeRabbit

  • New Features
    • Added a chevron app icon with watchOS support, responsive scaling, neutral shadow and translucency for consistent appearance across device shapes.
  • Chores
    • Integrated the new icon into the app asset catalog so it appears as an available app/icon resource.

Store the .icon project file in design/cmux.icon so the icon can be
edited in Icon Composer and regenerated from source.
@vercel

vercel Bot commented Mar 6, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Mar 6, 2026 0:24am

@coderabbitai

coderabbitai Bot commented Mar 6, 2026 •

Copy link
Copy Markdown

Warning

Rate limit exceeded

@lawrencecchen has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 0 minutes and 56 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5f95247d-306e-4a14-aadb-995bde327090

📥 Commits

Reviewing files that changed from the base of the PR and between ae49832 and fabd535.

📒 Files selected for processing (3)
  • AppIcon.icon/icon.json
  • GhosttyTabs.xcodeproj/project.pbxproj
  • design/cmux.icon/icon.json
📝 Walkthrough

Walkthrough

Adds two new icon asset JSON files (cmux and AppIcon) defining a chevron layer, shadow/translucency, positioning, and platform support; and updates the Xcode project file to reference the new AppIcon asset in resources and project groups.

Changes

Cohort / File(s) Summary
Design Icon
design/cmux.icon/icon.json
New icon config: one group with a chevron layer, scale/translation, non-glass rendering, neutral shadow (opacity 0.5), translucency 0.5, and platform support (watchOS circles, shared squares).
App Icon Asset
AppIcon.icon/icon.json
New app icon JSON mirroring the chevron layer, positioning/scale, shadow and translucency settings; added with no trailing newline.
Xcode Project
GhosttyTabs.xcodeproj/project.pbxproj
Project file updated to add AppIcon.icon as a resource: new PBXFileReference and PBXBuildFile entries; AppIcon.icon added to Assets.xcassets group and Resources build phase.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped in the repo, left a chevron bright,
JSON leaves shimmer in half-opacity light,
A shadow, a nudge, assets tucked in place —
I thumped once for icons and gave them some grace.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Regenerate app icons from Icon Composer' clearly summarizes the main change: using Icon Composer to regenerate app icons, which matches the PR's core objective of adding Icon Composer as the source of truth.
Description check ✅ Passed The description includes a comprehensive Summary and Testing section covering what changed, why it changed, how it was tested, and what was verified. However, the Demo Video section is not filled (no video provided) and the Review Trigger and Checklist sections are completely absent.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch task-icon-composer-source

Comment @coderabbitai help to get the list of available commands and usage tips.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 2 files

@greptile-apps

greptile-apps Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds the Apple Icon Composer source project (design/cmux.icon/) as a design asset, enabling future icon edits to be made from source rather than directly modifying the exported PNGs. There are no runtime changes.

Key changes:

  • design/cmux.icon/icon.json: New Icon Composer project config defining a single layer using the chevron asset, with squircle/watchOS platform support configured.
  • design/cmux.icon/Assets/cmux-icon-chevron 2.png: A copy of the existing design/cmux-icon-chevron.png asset embedded inside the Icon Composer bundle (required by the tool's project structure).

Note: icon.json is missing a trailing newline (see comment).

Confidence Score: 4/5

  • Safe to merge — adds only design source files with no runtime impact; one minor style issue flagged (trailing newline).
  • This PR is safe to merge as it introduces only design assets (Apple Icon Composer project bundle) with zero impact on application code, dependencies, or runtime behavior. The single issue is a missing trailing newline in icon.json, a minor style convention violation that doesn't affect functionality. Score reduced from 5 to 4 to reflect this minor style finding.
  • design/cmux.icon/icon.json — add trailing newline

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["design/cmux-icon-chevron.png\n(original source asset)"] -->|"copied into bundle"| B["design/cmux.icon/Assets/\ncmux-icon-chevron 2.png"]
    B --> C["design/cmux.icon/icon.json\n(Icon Composer project config)"]
    C -->|"open in Icon Composer"| D["Edit & Regenerate Icons"]
    D --> E["Exported app icon PNGs\n(no runtime change in this PR)"]
Loading

Last reviewed commit: ea55b5c

Comment thread design/cmux.icon/icon.json Outdated
],
"squares" : "shared"
}
} No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The file is missing a trailing newline. Most editors and linters expect files to end with a newline character, and it can create noisy diffs in the future.

Suggested change
}
}

Use ictool to render light/dark icon PNGs from the .icon source file
with proper macOS padding. Updates AppIcon, AppIcon-Debug (with DEV
banner), AppIconLight, and AppIconDark imagesets. Adds AppIcon.icon
to the Xcode project as a resource.
@lawrencecchen lawrencecchen changed the title Add Apple Icon Composer source file Regenerate app icons from Icon Composer Mar 6, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ae4983220f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread GhosttyTabs.xcodeproj/project.pbxproj Outdated
buildActionMask = 2147483647;
files = (
A5001100 /* Assets.xcassets in Resources */,
IC000001 /* AppIcon.icon in Resources */,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove AppIcon.icon from Copy Bundle Resources

Adding AppIcon.icon to the target’s PBXResourcesBuildPhase causes Xcode to copy the raw Icon Composer source folder into every app bundle because this reference is treated as a plain folder resource. This source asset is design-time only, so bundling it provides no runtime value while increasing shipped artifact size (including the large chevron PNG); keep it in the repository if needed, but do not include it in Copy Bundle Resources.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
GhosttyTabs.xcodeproj/project.pbxproj (1)

67-67: Consider not shipping AppIcon.icon in app resources.

Line 282 adds the Icon Composer source package to runtime resources. If this is design-time-only source, it unnecessarily increases the app bundle payload. Keeping it in the project tree is enough for editing.

♻️ Suggested pbxproj adjustment
-		IC000001 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = IC000002 /* AppIcon.icon */; };
...
-				IC000001 /* AppIcon.icon in Resources */,

Also applies to: 282-282

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@GhosttyTabs.xcodeproj/project.pbxproj` at line 67, The AppIcon.icon file is
being included in the app runtime resources (PBXBuildFile entry IC000001
referencing fileRef IC000002), so remove that PBXBuildFile entry from the
Resources build phase (or remove the fileRef from the PBXResourcesBuildPhase) in
project.pbxproj so the Icon Composer source is kept in the project but not
copied into the app bundle at runtime; locate the PBXBuildFile with reference
IC000001 (and the PBXFileReference IC000002) and delete the build file entry or
remove its UUID from the Resources build phase list.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@GhosttyTabs.xcodeproj/project.pbxproj`:
- Line 67: The AppIcon.icon file is being included in the app runtime resources
(PBXBuildFile entry IC000001 referencing fileRef IC000002), so remove that
PBXBuildFile entry from the Resources build phase (or remove the fileRef from
the PBXResourcesBuildPhase) in project.pbxproj so the Icon Composer source is
kept in the project but not copied into the app bundle at runtime; locate the
PBXBuildFile with reference IC000001 (and the PBXFileReference IC000002) and
delete the build file entry or remove its UUID from the Resources build phase
list.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3fbf6206-2053-44b6-8789-3c517707fcdb

📥 Commits

Reviewing files that changed from the base of the PR and between ea55b5c and ae49832.

⛔ Files ignored due to path filters (33)
  • AppIcon.icon/Assets/cmux-icon-chevron 2.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/128.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/128@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/16.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/16@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/256.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/256@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/32.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/32@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/512.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon-Debug.appiconset/512@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/128.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/128@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/128@2x_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/128_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/16.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/16@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/16@2x_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/16_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/256.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/256@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/256@2x_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/256_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/32.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/32@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/32@2x_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/32_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/512.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/512@2x.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/512@2x_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIcon.appiconset/512_dark.png is excluded by !**/*.png
  • Assets.xcassets/AppIconDark.imageset/AppIconDark.png is excluded by !**/*.png
  • Assets.xcassets/AppIconLight.imageset/AppIconLight.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • AppIcon.icon/icon.json
  • GhosttyTabs.xcodeproj/project.pbxproj

- Add trailing newline to icon.json files
- Remove AppIcon.icon from Copy Bundle Resources (design-time only)
@lawrencecchen
lawrencecchen merged commit 3566b6e into main Mar 6, 2026
12 checks passed
@lawrencecchen
lawrencecchen deleted the task-icon-composer-source branch March 6, 2026 12:30
bn-l pushed a commit to bn-l/cmux that referenced this pull request Apr 3, 2026
* Add Apple Icon Composer source file

Store the .icon project file in design/cmux.icon so the icon can be
edited in Icon Composer and regenerated from source.

* Regenerate all app icons from Icon Composer

Use ictool to render light/dark icon PNGs from the .icon source file
with proper macOS padding. Updates AppIcon, AppIcon-Debug (with DEV
banner), AppIconLight, and AppIconDark imagesets. Adds AppIcon.icon
to the Xcode project as a resource.

* Address review: fix trailing newline, remove .icon from bundle

- Add trailing newline to icon.json files
- Remove AppIcon.icon from Copy Bundle Resources (design-time only)

This branch was successfully deployed

1 active deployment
Preview — fabd535c Deployed Mar 6, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant