SPB Git

spb/zyquo-local Public MIT

Native macOS AI chat that runs LLMs 100% locally on Apple Silicon with MLX — no cloud, no API keys.

Swift 97.2% Shell 1.8% Makefile 1%

icon: sky rework — Big Sur squircle, sky-indigo gradient, geometric cloud, white Z with luminous diagonal; bundle version 2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
simon-pierre boucher committed 12 days ago (Jul 30, 2026) parent 69e32df

Showing 7 changed files with +81 and −95

modified Support/Info.plist +7 −14
@@ -1,11 +1,4 @@
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3 Info.plist
4 Zyquo Local
5
6 Author: Simon-Pierre Boucher
7 Mail: contact@spboucher.ai
8 -->
9 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
10 3 <plist version="1.0">
11 4 <dict>
@@ -13,30 +6,30 @@
13 6 <string>en</string>
14 7 <key>CFBundleDisplayName</key>
15 8 <string>Zyquo Local</string>
16 <key>CFBundleName</key>
17 <string>Zyquo Local</string>
18 9 <key>CFBundleExecutable</key>
19 10 <string>ZyquoLocal</string>
11 + <key>CFBundleIconFile</key>
12 + <string>AppIcon</string>
20 13 <key>CFBundleIdentifier</key>
21 14 <string>com.zyquo.local</string>
22 15 <key>CFBundleInfoDictionaryVersion</key>
23 16 <string>6.0</string>
17 + <key>CFBundleName</key>
18 + <string>Zyquo Local</string>
24 19 <key>CFBundlePackageType</key>
25 20 <string>APPL</string>
26 21 <key>CFBundleShortVersionString</key>
27 22 <string>0.1.0</string>
28 23 <key>CFBundleVersion</key>
29 <string>1</string>
30 <key>CFBundleIconFile</key>
31 <string>AppIcon</string>
32 <key>LSMinimumSystemVersion</key>
33 <string>14.0</string>
24 + <string>2</string>
34 25 <key>LSApplicationCategoryType</key>
35 26 <string>public.app-category.productivity</string>
36 27 <key>LSArchitecturePriority</key>
37 28 <array>
38 29 <string>arm64</string>
39 30 </array>
31 + <key>LSMinimumSystemVersion</key>
32 + <string>14.0</string>
40 33 <key>NSHighResolutionCapable</key>
41 34 <true/>
42 35 <key>NSHumanReadableCopyright</key>
modified assets/icon/AppIcon.icns +0 −0

Binary file not shown.

modified assets/icon/menubar/MenuBarIcon.png +0 −0

Binary file not shown.

modified assets/icon/menubar/MenuBarIcon@2x.png +0 −0

Binary file not shown.

modified assets/icon/zyquo-local-simple.svg +9 −11
@@ -1,7 +1,8 @@
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!--
3 3 zyquo-local-simple.svg — simplified variant baked for 16/32 px:
4 traces and glow dropped, thicker Z, higher contrast.
4 + cloud, beam and shadows dropped; flat sky gradient + bold white Z,
5 + crisp at 16 px.
5 6
6 7 Zyquo Local
7 8
@@ -10,22 +11,19 @@
10 11 -->
11 12 <svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
12 13 <defs>
13 <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
14 <stop offset="0" stop-color="#222B26"/>
15 <stop offset="1" stop-color="#101512"/>
16 </linearGradient>
17 <linearGradient id="emerald" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
18 <stop offset="270" stop-color="#1CD693"/>
19 <stop offset="760" stop-color="#0FA873"/>
14 + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
15 + <stop offset="0" stop-color="#6FA8FF"/>
16 + <stop offset="0.52" stop-color="#4E6AF0"/>
17 + <stop offset="1" stop-color="#3A3F9E"/>
20 18 </linearGradient>
21 19 <clipPath id="squircle">
22 20 <rect x="100" y="100" width="824" height="824" rx="184" ry="184"/>
23 21 </clipPath>
24 22 </defs>
25 23 <g clip-path="url(#squircle)">
26 <rect x="100" y="100" width="824" height="824" fill="url(#bg)"/>
27 <path d="M 320 290 L 704 290 L 320 734 L 704 734"
28 fill="none" stroke="url(#emerald)" stroke-width="118"
24 + <rect x="100" y="100" width="824" height="824" fill="url(#sky)"/>
25 + <path d="M 330 296 L 694 296 L 330 728 L 694 728"
26 + fill="none" stroke="#FFFFFF" stroke-width="118"
29 27 stroke-linecap="round" stroke-linejoin="round"/>
30 28 </g>
31 29 </svg>
modified assets/icon/zyquo-local-template.svg +3 −5
@@ -1,8 +1,8 @@
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!--
3 3 zyquo-local-template.svg — monochrome menu-bar template glyph (18×18 pt
4 design, rendered @1x/@2x; NSImage isTemplate = true). Pure black shapes
5 on transparency; macOS recolors it.
4 + design, rendered @1x/@2x; NSImage isTemplate = true). Pure black bold Z on
5 + transparency, matching the app icon's monogram; macOS recolors it.
6 6
7 7 Zyquo Local
8 8
@@ -11,8 +11,6 @@
11 11 -->
12 12 <svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
13 13 <path d="M 300 250 L 724 250 L 300 774 L 724 774"
14 fill="none" stroke="#000000" stroke-width="130"
14 + fill="none" stroke="#000000" stroke-width="140"
15 15 stroke-linecap="round" stroke-linejoin="round"/>
16 <circle cx="724" cy="250" r="84" fill="#000000"/>
17 <circle cx="300" cy="774" r="84" fill="#000000"/>
18 16 </svg>
modified assets/icon/zyquo-local.svg +62 −65
@@ -1,9 +1,10 @@
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!--
3 zyquo-local.svg — the Zyquo Local app icon (Z-core: the Z as a luminous
4 circuit trace on deep graphite silicon). Source of truth for all raster
5 sizes; chosen over the Z-chip exploration (kept in zyquo-local-chip.svg)
6 for its far stronger small-size legibility.
3 + zyquo-local.svg — the Zyquo Local app icon.
4 + Sky rework: Big Sur squircle, vertical sky gradient (#6FA8FF → #4E6AF0 →
5 + #3A3F9E), sleek geometric cloud silhouette, bold white Z embossed into and
6 + crossing through the cloud, its diagonal stroke a luminous beam of light.
7 + Source of truth for all raster sizes.
7 8
8 9 Zyquo Local
9 10
@@ -12,37 +13,51 @@
12 13 -->
13 14 <svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
14 15 <defs>
15 <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
16 <stop offset="0" stop-color="#1E2622"/>
17 <stop offset="1" stop-color="#0F1412"/>
16 + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
17 + <stop offset="0" stop-color="#6FA8FF"/>
18 + <stop offset="0.52" stop-color="#4E6AF0"/>
19 + <stop offset="1" stop-color="#3A3F9E"/>
18 20 </linearGradient>
19 <linearGradient id="emerald" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
20 <stop offset="280" stop-color="#17C787"/>
21 <stop offset="744" stop-color="#0E9F6E"/>
21 + <!-- sunlit-from-above cloud body -->
22 + <linearGradient id="cloud" x1="0" y1="0" x2="0" y2="1">
23 + <stop offset="0" stop-color="#DCE8FF"/>
24 + <stop offset="1" stop-color="#A4C0F4"/>
22 25 </linearGradient>
23 <radialGradient id="topLight" cx="0.5" cy="0.18" r="0.75">
24 <stop offset="0" stop-color="#2E3933" stop-opacity="0.85"/>
25 <stop offset="0.55" stop-color="#2E3933" stop-opacity="0.25"/>
26 <stop offset="1" stop-color="#2E3933" stop-opacity="0"/>
27 </radialGradient>
28 <radialGradient id="coreGlow" cx="0.5" cy="0.47" r="0.55">
29 <stop offset="0" stop-color="#17C787" stop-opacity="0.22"/>
30 <stop offset="0.65" stop-color="#17C787" stop-opacity="0.05"/>
31 <stop offset="1" stop-color="#17C787" stop-opacity="0"/>
26 + <!-- Z monogram, white to near-white -->
27 + <linearGradient id="zink" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
28 + <stop offset="300" stop-color="#FFFFFF"/>
29 + <stop offset="720" stop-color="#EAF1FF"/>
30 + </linearGradient>
31 + <!-- luminous beam along the Z diagonal -->
32 + <linearGradient id="beam" gradientUnits="userSpaceOnUse"
33 + x1="840" y1="132" x2="184" y2="892">
34 + <stop offset="0" stop-color="#FFFFFF" stop-opacity="0"/>
35 + <stop offset="0.32" stop-color="#FFFFFF" stop-opacity="0.34"/>
36 + <stop offset="0.5" stop-color="#FFFFFF" stop-opacity="0.5"/>
37 + <stop offset="0.68" stop-color="#FFFFFF" stop-opacity="0.34"/>
38 + <stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
39 + </linearGradient>
40 + <radialGradient id="sunGlow" cx="0.5" cy="0.12" r="0.8">
41 + <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.30"/>
42 + <stop offset="0.5" stop-color="#FFFFFF" stop-opacity="0.06"/>
43 + <stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
32 44 </radialGradient>
33 <filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
34 <feGaussianBlur in="SourceGraphic" stdDeviation="16" result="blur"/>
45 + <filter id="softGlow" x="-40%" y="-40%" width="180%" height="180%">
46 + <feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur"/>
35 47 <feMerge>
36 48 <feMergeNode in="blur"/>
37 49 <feMergeNode in="SourceGraphic"/>
38 50 </feMerge>
39 51 </filter>
40 <filter id="softGlow" x="-60%" y="-60%" width="220%" height="220%">
41 <feGaussianBlur in="SourceGraphic" stdDeviation="5" result="blur"/>
42 <feMerge>
43 <feMergeNode in="blur"/>
44 <feMergeNode in="SourceGraphic"/>
45 </feMerge>
52 + <filter id="beamBlur" x="-60%" y="-60%" width="220%" height="220%">
53 + <feGaussianBlur in="SourceGraphic" stdDeviation="22"/>
54 + </filter>
55 + <filter id="zShadow" x="-40%" y="-40%" width="180%" height="180%">
56 + <feDropShadow dx="0" dy="10" stdDeviation="14" flood-color="#333884" flood-opacity="0.62"/>
57 + <feGaussianBlur in="SourceGraphic" stdDeviation="0.6" result="crisp"/>
58 + </filter>
59 + <filter id="cloudShadow" x="-30%" y="-30%" width="160%" height="160%">
60 + <feDropShadow dx="0" dy="14" stdDeviation="26" flood-color="#2A2F7E" flood-opacity="0.35"/>
46 61 </filter>
47 62 <clipPath id="squircle">
48 63 <rect x="100" y="100" width="824" height="824" rx="184" ry="184"/>
@@ -50,49 +65,31 @@
50 65 </defs>
51 66
52 67 <g clip-path="url(#squircle)">
53 <rect x="100" y="100" width="824" height="824" fill="url(#bg)"/>
54 <rect x="100" y="100" width="824" height="824" fill="url(#topLight)"/>
55 <circle cx="512" cy="500" r="430" fill="url(#coreGlow)"/>
68 + <!-- high-daylight sky -->
69 + <rect x="100" y="100" width="824" height="824" fill="url(#sky)"/>
70 + <rect x="100" y="100" width="824" height="824" fill="url(#sunGlow)"/>
56 71
57 <!-- faint circuit lattice in the field -->
58 <g stroke="#28312C" stroke-width="6" stroke-linecap="round" fill="none">
59 <path d="M 512 130 L 512 236"/>
60 <path d="M 512 788 L 512 894"/>
61 <path d="M 168 340 L 262 340 L 300 302"/>
62 <path d="M 856 684 L 762 684 L 724 722"/>
63 <path d="M 168 620 L 240 620"/>
64 <path d="M 856 404 L 784 404"/>
65 </g>
66 <g fill="#333E38">
67 <circle cx="512" cy="130" r="8"/>
68 <circle cx="512" cy="894" r="8"/>
69 <circle cx="168" cy="340" r="8"/>
70 <circle cx="856" cy="684" r="8"/>
71 <circle cx="168" cy="620" r="8"/>
72 <circle cx="856" cy="404" r="8"/>
73 </g>
72 + <!-- luminous beam sweeping the sky along the Z diagonal -->
73 + <line x1="836" y1="136" x2="188" y2="888" stroke="url(#beam)"
74 + stroke-width="200" stroke-linecap="round" filter="url(#beamBlur)"/>
74 75
75 <!-- the Z as a luminous conductor trace -->
76 <g filter="url(#glow)">
77 <path d="M 330 300 L 694 300 L 330 724 L 694 724"
78 fill="none" stroke="url(#emerald)" stroke-width="86"
79 stroke-linecap="round" stroke-linejoin="round"/>
76 + <!-- sleek geometric cloud silhouette -->
77 + <g filter="url(#cloudShadow)">
78 + <circle cx="402" cy="572" r="110" fill="url(#cloud)"/>
79 + <circle cx="524" cy="516" r="140" fill="url(#cloud)"/>
80 + <circle cx="648" cy="580" r="102" fill="url(#cloud)"/>
81 + <rect x="318" y="572" width="410" height="110" rx="55" fill="url(#cloud)"/>
80 82 </g>
81 83
82 <!-- connection stubs off the Z ends, like a routed net -->
83 <g stroke="#0E9F6E" stroke-width="18" stroke-linecap="round" opacity="0.85">
84 <path d="M 330 300 L 236 300" fill="none"/>
85 <path d="M 694 724 L 788 724" fill="none"/>
86 </g>
84 + <!-- luminous diagonal: light passing through the sky -->
85 + <line x1="652" y1="332" x2="372" y2="692" stroke="#FFFFFF" stroke-opacity="0.6"
86 + stroke-width="120" stroke-linecap="round" filter="url(#beamBlur)"/>
87 87
88 <!-- node dots at the bends + line ends -->
89 <g fill="#EAFFF6" filter="url(#softGlow)">
90 <circle cx="694" cy="300" r="13"/>
91 <circle cx="330" cy="724" r="13"/>
92 </g>
93 <g fill="#BFF5DF" filter="url(#softGlow)">
94 <circle cx="236" cy="300" r="11"/>
95 <circle cx="788" cy="724" r="11"/>
88 + <!-- bold Z monogram, embossed into the cloud, sunlit from above -->
89 + <g filter="url(#zShadow)">
90 + <path d="M 372 332 L 652 332 L 372 692 L 652 692"
91 + fill="none" stroke="url(#zink)" stroke-width="88"
92 + stroke-linecap="round" stroke-linejoin="round"/>
96 93 </g>
97 94 </g>
98 95 </svg>
99 96