From ca8449ae26d6e1ffb2a29c1f6ed01b50c8c48a08 Mon Sep 17 00:00:00 2001 From: liukewia Date: Mon, 7 Sep 2026 18:40:37 +0800 Subject: [PATCH 1/2] fix(desktop): build macOS icns with sips + iconutil wails3's encoder resizes with Mitchell-Netravali, whose negative lobe overshoots on the logo's high-contrast edges. The R channel clips at 0 while G/B keep mid values, leaving near-opaque dark pixels scattered over the red tile: 4 in the 64px layer, 13 at 128px, 23 at 256px. It also emits only 8 layers, missing icon_16x16 and icon_32x32, so Finder has to downscale a larger layer for small sizes. Generate the .iconset with sips and pack it with iconutil instead. All 10 layers are present and Core Graphics downsampling leaves no overshoot. generate:icons is split because sips and iconutil are macOS-only: the shared task keeps emitting the Windows .ico on every platform, while the new darwin-only task owns the .icns. Co-authored-by: Cursor --- desktop/src/build/Taskfile.yml | 32 +++++++++++++++++++++++---- desktop/src/build/darwin/Taskfile.yml | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/desktop/src/build/Taskfile.yml b/desktop/src/build/Taskfile.yml index 7a364e87..dd940c7c 100644 --- a/desktop/src/build/Taskfile.yml +++ b/desktop/src/build/Taskfile.yml @@ -26,20 +26,44 @@ tasks: - echo "skip generate bindings" generate:icons: - summary: Generates .ico from appicon.png and .icns from appicon-macos.png + summary: Generates .ico from appicon.png dir: build sources: - appicon.png - - appicon-macos.png generates: - - darwin/icons.icns - windows/icon.ico cmds: # Windows / Linux keep the full-bleed artwork. - wails3 generate icons -input appicon.png -windowsfilename windows/icon.ico -macfilename "" + + generate:icons:darwin: + summary: Generates .icns from appicon-macos.png via sips + iconutil + dir: build + sources: + - appicon-macos.png + generates: + - darwin/icons.icns + cmds: # macOS expects 824x824 artwork on a 1024x1024 canvas; a full-bleed tile # renders ~24% larger than every other app in the Dock and Launchpad. - - wails3 generate icons -input appicon-macos.png -macfilename darwin/icons.icns -windowsfilename "" + # + # sips downsamples through Core Graphics. wails3's encoder resizes with + # Mitchell-Netravali, which rings on the logo's high-contrast edges and + # leaves stray pixels in the 32/64/128 layers. + - | + set -euo pipefail + work="$(mktemp -d "${TMPDIR:-/tmp}/octop-iconset.XXXXXX")" + trap 'rm -rf "$work"' EXIT + iconset="${work}/AppIcon.iconset" + mkdir -p "$iconset" + for spec in 16:icon_16x16 32:icon_16x16@2x 32:icon_32x32 64:icon_32x32@2x \ + 128:icon_128x128 256:icon_128x128@2x 256:icon_256x256 \ + 512:icon_256x256@2x 512:icon_512x512 1024:icon_512x512@2x; do + px="${spec%%:*}" + sips -s format png -z "$px" "$px" appicon-macos.png \ + --out "${iconset}/${spec#*:}.png" >/dev/null + done + iconutil -c icns "$iconset" -o darwin/icons.icns dev:frontend: summary: Serves the embedded shell assets for Wails dev mode diff --git a/desktop/src/build/darwin/Taskfile.yml b/desktop/src/build/darwin/Taskfile.yml index a9d69adb..fd51f71a 100644 --- a/desktop/src/build/darwin/Taskfile.yml +++ b/desktop/src/build/darwin/Taskfile.yml @@ -9,7 +9,7 @@ tasks: deps: - task: common:go:mod:tidy - task: common:build:frontend - - task: common:generate:icons + - task: common:generate:icons:darwin cmds: - go build {{.BUILD_FLAGS}} -o {{.OUTPUT}} vars: From 85c45bcaee279d3c029a4b4c0d2821c51066bb3e Mon Sep 17 00:00:00 2001 From: liukewia Date: Tue, 8 Sep 2026 15:17:20 +0800 Subject: [PATCH 2/2] chore: update tray and app icon assets for desktop Replaced existing tray-icon.png and appicon images with updated versions to enhance visual quality and consistency across platforms. --- desktop/src/assets/tray-icon.png | Bin 12269 -> 8025 bytes desktop/src/build/appicon-macos.png | Bin 186057 -> 433408 bytes desktop/src/build/appicon.png | Bin 131241 -> 235931 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/desktop/src/assets/tray-icon.png b/desktop/src/assets/tray-icon.png index 8b84ff0e0f5cf890692e52adc05038600cbde6ad..78e5667383a44b8b9c4d460ec3c7a93e75953bed 100644 GIT binary patch literal 8025 zcmV-fAEw}mP)4 z`=4|EbM8`A0wYXPN`ZCja-y@d>>vB{pIb0E_%;-aZ+DBulbxZVY3@+*V5cJv~5QKQKHDRLX#>uFwtDQiQ*k5$9rmo4nRFHOEZ()noiq)a2K{rFD%0MF=35 z0}2J8sZnj^LLRcA;RQ4_tgQg|G>sp>S}a(g6i{|`<;02=m4B!Jq%^RRpOvDmy7c==@w{P3`@h~o$dp*O#fBp?wBUiyANV!;A;zY9Q0nG-^2t$*Z^x#;h| z5!<&PiNE|6*s|3{rQ#x=caY0D`U1PrX*}@&;h?S6 z!T50~H8#9Z$>qK>YT2?o>$QeV0wB$h>*cCd$GDA+-*R^BI2(`s0eEFg89B#6q2Pg@ z1?((>Kz(4>4SMMBu;$x&q6A`g<+7^;($<#8#PJlw>Y-BU+V;EddUkC`N4~SWySz^V zP>z;tD1=+??*8}O(9o@T^3UyfVtpA94jLOA86+cvzy zdMp4VslyJzwg}w%7S=-77 z=EU_EwDYu+0e|h9h1j`k4t}|^gnS_Zd>OI#&Y69jb|WcIM(|BtG6^wMUK;o^BmIPq zDXn�=8}|wHC`)?wvh*p`b(V=*WfPc4|6Uot@?Knl+cBxBq(FOYn1fI3fss0JI1y z3Gb7rMaF4!M$Hd{7OS~Q=VHpSl_XB{lPF4vJhtyBwN@(E_ndp~?^K|LLS8f#|##Q zcw77G)z90VwW<@fN{zqL3!c1S@Byt@~qx-&bgeuWJ5*53ps)H z>qlY7j%TrY&17ubE>-Wg#@WVMLPpxjLO(KrF6t>KOL>VDl|{=_1Z3x7N3F3@^p6|6 zwZBxFKB2q2pNAbaq)hJb?VW>NyQX0CmI@jgJn$p5JW_)rBp*vrDWD;v15R_UkpQQG zZ(C>_z}E3t&?BsbV@Cr6m6nP-xw*CVN)?WFbmX)JtY4pZw{Csf>3--aY~4<$ksGn& zttYQc$g^K8C`I!}Y$XW{5SNFkQmLSMl+!WIeP$&4|#>84s5~YOl#DSmaq-|=+2)-#xI63qU$QD;l>zguV7Og->K|@0q zW6M^FN~PMm%+!)aQ1<01P8tcoX0d?q4Fl~+5|l+hf$L-TsK+|2zv&D52l&?|JmSce zE1TV(o_FDu%|eaktIXLD^6$PuV-T_hhG1EY3t7?T%!^|26ztiPT(D_XO~KaR z`vSfs8LAO*j;RB~MPRt3$Dati*;s~KVfWrMXNN;2K%oK1alFbqAEIw8ryk^%kg<7I$%swZ$<$zKN=o`?>McPLLhaUz^ zoeE4o6c|4qXlnx+8ni$L2cZ<^)mMR+Ujbfx3D~|J7#PsPXd0!3#a?`rb4|5?5#~W1 z

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 bZBqI_LQF7HI{NiA00000NkvXXu0mjf`OAKN literal 12269 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