Skip to content

feat(macos): embed SessionLedger app icon metadata - #388

Merged
KooshaPari merged 2 commits into
mainfrom
feat/macos-app-icon-bundle
Aug 1, 2026
Merged

feat(macos): embed SessionLedger app icon metadata#388
KooshaPari merged 2 commits into
mainfrom
feat/macos-app-icon-bundle

Conversation

@KooshaPari

Copy link
Copy Markdown
Owner

Adds AppIcon metadata and embeds the tracked iconset into unsigned SessionLedger.app bundles when iconutil is available.

Validation: built a temporary bundle with a fake executable, iconutil produced AppIcon.icns, and plutil validated Info.plist.

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@KooshaPari, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 29 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 68443cd2-f015-455c-a22e-886d15bdbc88

📥 Commits

Reviewing files that changed from the base of the PR and between b9e2630 and 9ac6c01.

📒 Files selected for processing (4)
  • tests/alertmanager_soft.rs
  • tests/alloc_profile.rs
  • tests/loom_http_sse_soak.rs
  • tests/replay_breadth.rs
📝 Walkthrough

Summary

Adds macOS application icon metadata and embeds AppIcon.icns into unsigned SessionLedger.app bundles when iconutil is available. The implementation is narrowly scoped and aligns with the stated objective.

Must Fix

None identified.

Should Fix

None identified.

Consider

  • Add automated coverage for both successful icon conversion and the iconutil-unavailable fallback.
  • Consider explicitly setting the generated icon filename if macOS packaging conventions require it.

Approve / Request Changes

Approve.

Walkthrough

The macOS packaging script now emits additional Info.plist metadata and optionally converts assets/icons/sessionledger.iconset into an embedded AppIcon.icns, with a warning when iconutil is unavailable.

Changes

macOS packaging

Layer / File(s) Summary
Bundle metadata and icon embedding
packaging/macos/package-app.sh
The generated Info.plist includes principal-class, icon, and graphics-switching metadata. The script conditionally invokes iconutil to create AppIcon.icns from the application iconset.
Estimated code review effort: 2 (Simple) ~10 minutes
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the macOS icon metadata and embedding changes.
Description check ✅ Passed The description matches the PR scope and validation steps for the app icon changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/macos-app-icon-bundle
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/macos-app-icon-bundle

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packaging/macos/package-app.sh`:
- Around line 51-54: Update the bundle metadata near CFBundleIconFile by
removing CFBundleIconName, since the package includes only the standalone
AppIcon.icns and no asset catalog. Keep CFBundleIconFile set to AppIcon.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 25a1e834-60f8-4373-b503-37f0880cde0b

📥 Commits

Reviewing files that changed from the base of the PR and between a22420c and b9e2630.

📒 Files selected for processing (1)
  • packaging/macos/package-app.sh
📜 Review details
⏰ Context from checks skipped due to timeout. (32)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: race smoke + channel/cancel model · windows-latest
  • GitHub Check: clean-host smoke · Windows unsigned portable install
  • GitHub Check: race smoke + channel/cancel model · macos-latest
  • GitHub Check: jemalloc default-on · windows default build
  • GitHub Check: session-ledger build · windows-latest
  • GitHub Check: sl-daemon build · windows-latest
  • GitHub Check: jemalloc default-on · unix default build
  • GitHub Check: sl-daemon · repository builder image offline build / sl-daemon · repository builder image offline build
  • GitHub Check: compression ratio gate
  • GitHub Check: jemalloc hard · feature build
  • GitHub Check: alloc profile hard · dhat smoke
  • GitHub Check: daemon graph hard · tokio graph
  • GitHub Check: cargo deny check
  • GitHub Check: cargo audit
  • GitHub Check: load macro gate · macro routes smoke
  • GitHub Check: update check hard · sl-daemon tests
  • GitHub Check: update check hard · root SelfCheck wrapper
  • GitHub Check: fuzz blocking · SelfCheck
  • GitHub Check: loom permutation · daemon mpsc
  • GitHub Check: loom permutation · daemon pipeline
  • GitHub Check: loom permutation · daemon broadcast
  • GitHub Check: miri permutation · race_model
  • GitHub Check: fuzz blocking · sustained 30s
  • GitHub Check: loom permutation · daemon shutdown
  • GitHub Check: loom permutation · hermetic wrappers
  • GitHub Check: pipeline perf regression gate
  • GitHub Check: loom permutation · core models
  • GitHub Check: shuttle permutation · cargo test shuttle_permutation
  • GitHub Check: visual contract · WCAG AA
  • GitHub Check: browser e2e · axe · responsive · visual
  • GitHub Check: prepare
⚠️ CI failures not shown inline (2)

GitHub Check: Summary: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age>=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts

GitHub Check: Mergify Merge Queue: The current Mergify configuration is invalid

Conclusion: failure

View job details

* Invalid condition 'author=dependabot[bot] | renovate[bot]' @ root → pull_request_rules → item 1 → conditions → item 0 → author=dependabot[bot] | renovate[bot]
```
Invalid GitHub login
```
* Invalid condition 'author=trunk-io[bot] | mergify[bot] | github-actions[bot]' @ root → pull_request_rules → item 2 → conditions → item 0 → author=trunk-io[bot] | mergify[bot] | github-actions[bot]
```
Invalid GitHub login
```
* Invalid condition 'age>=30d' @ root → pull_request_rules → item 8 → conditions → item 2 → age>=30d
```
Invalid attribute
```
* Extra inputs are not permitted @ root → pull_request_rules → item 0 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 1 → actions → post_merge
* Extra inputs are not permitted @ root → pull_request_rules → item 3 → actions → request_reviews → github_accounts
🔇 Additional comments (2)
packaging/macos/package-app.sh (2)

49-50: LGTM!

Also applies to: 55-56


66-75: LGTM!

Comment on lines +51 to +54
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== file excerpt =="
sed -n '1,120p' packaging/macos/package-app.sh | cat -n

echo
echo "== repository icon-related files =="
git ls-files | rg -i 'AppIcon|iconutil|package-app|\.icns|\.car|Assets\.car|xcassets' || true

echo
echo "== search CFBundleIconName/CFBundleIconFile references =="
rg -n "CFBundleIcon(Name|File)|Assets\.car|AppIcon\.icns|iconutil" . || true

Repository: KooshaPari/SessionLedger

Length of output: 3993


🌐 Web query:

Apple Info.plist CFBundleIconName CFBundleIconFile Assets.car AppIcon.icns key reference

💡 Result:

In modern Apple development, application icons are primarily managed through Asset Catalogs, which are compiled into a binary file named Assets.car located in the app bundle's Contents/Resources directory [1][2]. The Info.plist keys CFBundleIconName and CFBundleIconFile serve different roles based on the platform version and the icon technology used [3][4][1]. CFBundleIconName (String) This is the modern key used to reference an icon asset within an Assets.car file [3][1]. When provided, the system looks inside the compiled asset catalog for an icon set with the specified name [3][5]. This key is essential for modern macOS (including the Liquid Glass icon system introduced in macOS 26) and iOS applications that use Asset Catalogs [2][6][7]. CFBundleIconFile (String) This is a legacy key that identifies a standalone icon file (typically AppIcon.icns) located in the bundle's resources directory [3][8][4]. While older versions of macOS and legacy apps rely on this for icon display, it is often included alongside CFBundleIconName to ensure backward compatibility for older operating systems that do not support modern asset catalogs or the newer icon formats [1][9][10]. Relationship and Usage 1. Assets.car: This is the compiled output of an asset catalog (e.g.,.xcassets or.icon files). It acts as a container for various icon resolutions, layers, and, in newer versions, advanced graphical materials [2][6]. 2. AppIcon.icns: This remains the standard for legacy macOS icon support. Developers often include both the.icns file and the Assets.car file in their bundle to support both older and newer OS versions [1][9][10]. 3. Modern Best Practice: When building apps with modern Xcode versions, you should use an Asset Catalog to manage your icons. Xcode handles the compilation of these assets into Assets.car and automatically configures the appropriate Info.plist keys [11][2]. If you are building outside of Xcode, you must ensure the Assets.car is correctly generated (often using actool) and that your Info.plist correctly identifies the icon name to match the entry within that catalog [9][2][6]. In summary, CFBundleIconName is the modern standard for referencing icons from an asset catalog, whereas CFBundleIconFile is a legacy reference for standalone.icns files [3][1]. For cross-version compatibility, many developers bundle both and define both keys in the Info.plist [9][10].

Citations:


Include the full icon metadata with the standalone .icns.

This bundle creates only Contents/Resources/AppIcon.icns, and CFBundleIconName points to an icon asset in an asset catalog that is not packaged. Remove CFBundleIconName as the comment suggests, or add the matching Assets.car; CFBundleIconFile=AppIcon alone is sufficient for the .icns output.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packaging/macos/package-app.sh` around lines 51 - 54, Update the bundle
metadata near CFBundleIconFile by removing CFBundleIconName, since the package
includes only the standalone AppIcon.icns and no asset catalog. Keep
CFBundleIconFile set to AppIcon.

Auto-merge: routine maintenance lane
Copilot AI review requested due to automatic review settings August 1, 2026 23:04

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@KooshaPari
KooshaPari merged commit 58dfc53 into main Aug 1, 2026
79 of 93 checks passed
@KooshaPari
KooshaPari deleted the feat/macos-app-icon-bundle branch August 1, 2026 23:04
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.

2 participants