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: hexagon-framed charcoal Z with blue accent bar and server stack on near-white; build 4

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

Showing 4 changed files with +97 and −77

modified Support/Info.plist +1 −1
@@ -28,7 +28,7 @@
28 28 <key>CFBundleShortVersionString</key>
29 29 <string>0.1.0</string>
30 30 <key>CFBundleVersion</key>
31 <string>3</string>
31 + <string>4</string>
32 32 <key>LSApplicationCategoryType</key>
33 33 <string>public.app-category.productivity</string>
34 34 <key>LSArchitecturePriority</key>
modified assets/icon/AppIcon.icns +0 −0

Binary file not shown.

modified assets/icon/zyquo-local-simple.svg +9 −16
@@ -1,8 +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 die, traces and glow dropped; dark graphite field + bold emerald Z with
5 its bright rim, crisp at 16 px.
4 + hexagon, server stack, sheen and shadows dropped; near-white field +
5 + chunky charcoal Z with its blue accent bar, crisp at 16 px.
6 6
7 7 Zyquo Local
8 8
@@ -11,25 +11,18 @@
11 11 -->
12 12 <svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
13 13 <defs>
14 <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
15 <stop offset="0" stop-color="#222B26"/>
16 <stop offset="1" stop-color="#101512"/>
17 </linearGradient>
18 <linearGradient id="emerald" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
19 <stop offset="270" stop-color="#1CD693"/>
20 <stop offset="760" stop-color="#0FA873"/>
14 + <linearGradient id="zaccent" x1="0" y1="0" x2="1" y2="0">
15 + <stop offset="0" stop-color="#2B6BFF"/>
16 + <stop offset="1" stop-color="#4C2BE0"/>
21 17 </linearGradient>
22 18 <clipPath id="squircle">
23 19 <rect x="100" y="100" width="824" height="824" rx="184" ry="184"/>
24 20 </clipPath>
25 21 </defs>
26 22 <g clip-path="url(#squircle)">
27 <rect x="100" y="100" width="824" height="824" fill="url(#bg)"/>
28 <path d="M 320 290 L 704 290 L 320 734 L 704 734"
29 fill="none" stroke="#9CF7D2" stroke-width="132"
30 stroke-linecap="round" stroke-linejoin="round"/>
31 <path d="M 320 290 L 704 290 L 320 734 L 704 734"
32 fill="none" stroke="url(#emerald)" stroke-width="116"
33 stroke-linecap="round" stroke-linejoin="round"/>
23 + <rect x="100" y="100" width="824" height="824" fill="#FCFCFD"/>
24 + <rect x="286" y="234" width="452" height="128" rx="16" fill="#12121E"/>
25 + <path d="M 596 362 L 738 362 L 448 646 L 306 646 Z" fill="#12121E"/>
26 + <path d="M 306 646 L 738 646 L 710 774 L 278 774 Z" fill="url(#zaccent)"/>
34 27 </g>
35 28 </svg>
modified assets/icon/zyquo-local.svg +87 −60
@@ -1,13 +1,14 @@
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2 <!--
3 3 zyquo-local.svg — the Zyquo Local app icon (final direction).
4 Big Sur squircle on deep graphite-to-near-black with a faint green
5 undertone (#1E2622 → #0F1412). Dominant bold geometric Z (~55 % of the
6 icon) in luminous emerald (#17C787 → #0E9F6E) with a thin bright rim and
7 a restrained glow — sharp, solid, clearly foreground. Behind it, a small,
8 dim silicon-die outline with fine circuit traces in emerald-gray frames
9 the letter without competing. One soft top light, flat vector, no bevel.
10 Source of truth for all raster sizes.
4 + Big Sur squircle, clean near-white soft-3D field (#FCFCFD, faint
5 + inner-edge shadow, gentle top light). Backdrop: thin rounded hexagon frame
6 + in a silver-gray gradient stroke — the on-device chip/module feel. Hero:
7 + very bold chunky geometric Z in deep charcoal (#0B0B14 → #1C1C2A) with a
8 + subtle top sheen; its bottom stroke is an electric-blue → indigo
9 + parallelogram (#2B6BFF → #4C2BE0). Bottom-right: small soft-3D server
10 + stack (three rounded rack units, glowing blue indicator dots) — local
11 + hosting. Soft shadows, no bevel. Source of truth for all raster sizes.
11 12
12 13 Zyquo Local
13 14
@@ -16,21 +17,49 @@
16 17 -->
17 18 <svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
18 19 <defs>
19 <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
20 <stop offset="0" stop-color="#1E2622"/>
21 <stop offset="1" stop-color="#0F1412"/>
20 + <linearGradient id="field" x1="0" y1="0" x2="0" y2="1">
21 + <stop offset="0" stop-color="#FFFFFF"/>
22 + <stop offset="1" stop-color="#F7F8FA"/>
22 23 </linearGradient>
23 <linearGradient id="emerald" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
24 <stop offset="280" stop-color="#17C787"/>
25 <stop offset="744" stop-color="#0E9F6E"/>
24 + <linearGradient id="hex" x1="0" y1="0" x2="0" y2="1">
25 + <stop offset="0" stop-color="#C9CDD6"/>
26 + <stop offset="1" stop-color="#9AA0AD"/>
26 27 </linearGradient>
27 <radialGradient id="topLight" cx="0.5" cy="0.14" r="0.8">
28 <stop offset="0" stop-color="#313D36" stop-opacity="0.9"/>
29 <stop offset="0.55" stop-color="#313D36" stop-opacity="0.22"/>
30 <stop offset="1" stop-color="#313D36" stop-opacity="0"/>
28 + <linearGradient id="charcoal" x1="0" y1="0" x2="0" y2="1" gradientUnits="userSpaceOnUse">
29 + <stop offset="280" stop-color="#0B0B14"/>
30 + <stop offset="740" stop-color="#1C1C2A"/>
31 + </linearGradient>
32 + <linearGradient id="zaccent" x1="0" y1="0" x2="1" y2="0">
33 + <stop offset="0" stop-color="#2B6BFF"/>
34 + <stop offset="1" stop-color="#4C2BE0"/>
35 + </linearGradient>
36 + <linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
37 + <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.22"/>
38 + <stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
39 + </linearGradient>
40 + <linearGradient id="rack" x1="0" y1="0" x2="0" y2="1">
41 + <stop offset="0" stop-color="#FFFFFF"/>
42 + <stop offset="1" stop-color="#E9ECF2"/>
43 + </linearGradient>
44 + <radialGradient id="topLight" cx="0.5" cy="0.1" r="0.9">
45 + <stop offset="0" stop-color="#FFFFFF" stop-opacity="0.9"/>
46 + <stop offset="0.6" stop-color="#FFFFFF" stop-opacity="0"/>
31 47 </radialGradient>
32 <filter id="restrainedGlow" x="-40%" y="-40%" width="180%" height="180%">
33 <feGaussianBlur in="SourceGraphic" stdDeviation="18"/>
48 + <filter id="softShadow" x="-30%" y="-30%" width="160%" height="160%">
49 + <feDropShadow dx="0" dy="14" stdDeviation="22" flood-color="#20263B" flood-opacity="0.28"/>
50 + </filter>
51 + <filter id="hexShadow" x="-30%" y="-30%" width="160%" height="160%">
52 + <feDropShadow dx="0" dy="8" stdDeviation="12" flood-color="#3A4154" flood-opacity="0.16"/>
53 + </filter>
54 + <filter id="rackShadow" x="-40%" y="-40%" width="180%" height="180%">
55 + <feDropShadow dx="0" dy="6" stdDeviation="10" flood-color="#26304A" flood-opacity="0.30"/>
56 + </filter>
57 + <filter id="dotGlow" x="-120%" y="-120%" width="340%" height="340%">
58 + <feGaussianBlur in="SourceGraphic" stdDeviation="4" result="blur"/>
59 + <feMerge>
60 + <feMergeNode in="blur"/>
61 + <feMergeNode in="SourceGraphic"/>
62 + </feMerge>
34 63 </filter>
35 64 <clipPath id="squircle">
36 65 <rect x="100" y="100" width="824" height="824" rx="184" ry="184"/>
@@ -38,50 +67,48 @@
38 67 </defs>
39 68
40 69 <g clip-path="url(#squircle)">
41 <!-- dark on-device silicon field, one soft top light -->
42 <rect x="100" y="100" width="824" height="824" fill="url(#bg)"/>
70 + <!-- near-white soft-3D field, gentle top light, faint inner-edge shadow -->
71 + <rect x="100" y="100" width="824" height="824" fill="url(#field)"/>
43 72 <rect x="100" y="100" width="824" height="824" fill="url(#topLight)"/>
73 + <rect x="106" y="106" width="812" height="812" rx="178" fill="none"
74 + stroke="#E3E6EC" stroke-width="12" opacity="0.8"/>
44 75
45 <!-- supporting motif: minimal processor die + fine traces, dim -->
46 <g stroke="#2C3A33" stroke-width="5" fill="none">
47 <rect x="272" y="272" width="480" height="480" rx="52"/>
48 <rect x="296" y="296" width="432" height="432" rx="40" stroke-width="2.5" opacity="0.7"/>
49 <g stroke-linecap="round">
50 <line x1="392" y1="272" x2="392" y2="188"/>
51 <line x1="512" y1="272" x2="512" y2="164"/>
52 <line x1="632" y1="272" x2="632" y2="188"/>
53 <line x1="392" y1="752" x2="392" y2="836"/>
54 <line x1="512" y1="752" x2="512" y2="860"/>
55 <line x1="632" y1="752" x2="632" y2="836"/>
56 <line x1="272" y1="392" x2="188" y2="392"/>
57 <line x1="272" y1="512" x2="164" y2="512"/>
58 <line x1="272" y1="632" x2="188" y2="632"/>
59 <line x1="752" y1="392" x2="836" y2="392"/>
60 <line x1="752" y1="512" x2="860" y2="512"/>
61 <line x1="752" y1="632" x2="836" y2="632"/>
62 </g>
63 </g>
64 <!-- trace terminal nodes, dim emerald-gray -->
65 <g fill="#33443B">
66 <circle cx="392" cy="188" r="7"/><circle cx="512" cy="164" r="7"/><circle cx="632" cy="188" r="7"/>
67 <circle cx="392" cy="836" r="7"/><circle cx="512" cy="860" r="7"/><circle cx="632" cy="836" r="7"/>
68 <circle cx="188" cy="392" r="7"/><circle cx="164" cy="512" r="7"/><circle cx="188" cy="632" r="7"/>
69 <circle cx="836" cy="392" r="7"/><circle cx="860" cy="512" r="7"/><circle cx="836" cy="632" r="7"/>
70 </g>
71
72 <!-- restrained soft glow behind the Z (never blurring its edges) -->
73 <path d="M 336 302 L 688 302 L 336 722 L 688 722"
74 fill="none" stroke="#17C787" stroke-opacity="0.35" stroke-width="104"
75 stroke-linecap="round" stroke-linejoin="round" filter="url(#restrainedGlow)"/>
76 + <!-- quiet backdrop: thin rounded hexagon frame, silver-gray gradient -->
77 + <path d="M 472.2 227.0 Q 512.0 204.0 551.8 227.0 L 742.4 337.0 Q 782.2 360.0 782.2 406.0 L 782.2 626.0 Q 782.2 672.0 742.4 695.0 L 551.8 805.0 Q 512.0 828.0 472.2 805.0 L 281.6 695.0 Q 241.8 672.0 241.8 626.0 L 241.8 406.0 Q 241.8 360.0 281.6 337.0 Z"
78 + fill="none" stroke="url(#hex)" stroke-width="17" filter="url(#hexShadow)"/>
76 79
77 <!-- thin bright rim so the Z detaches cleanly -->
78 <path d="M 336 302 L 688 302 L 336 722 L 688 722"
79 fill="none" stroke="#8FF2CB" stroke-width="104"
80 stroke-linecap="round" stroke-linejoin="round"/>
80 + <!-- hero: chunky charcoal Z (~50% of the icon) -->
81 + <g filter="url(#softShadow)">
82 + <!-- top bar -->
83 + <rect x="332" y="290" width="360" height="100" rx="14" fill="url(#charcoal)"/>
84 + <!-- diagonal band -->
85 + <path d="M 582 390 L 692 390 L 462 633 L 352 633 Z" fill="url(#charcoal)"/>
86 + <!-- bottom stroke: electric-blue → indigo parallelogram accent -->
87 + <path d="M 352 632 L 692 632 L 668 734 L 328 734 Z" fill="url(#zaccent)"/>
88 + <!-- subtle top-face sheen -->
89 + <rect x="332" y="290" width="360" height="48" rx="14" fill="url(#sheen)"/>
90 + <path d="M 582 390 L 692 390 L 661 421 L 551 421 Z" fill="url(#sheen)" opacity="0.6"/>
91 + </g>
81 92
82 <!-- the dominant Z monogram: sharp, solid, luminous emerald -->
83 <path d="M 336 302 L 688 302 L 336 722 L 688 722"
84 fill="none" stroke="url(#emerald)" stroke-width="92"
85 stroke-linecap="round" stroke-linejoin="round"/>
93 + <!-- crisp accent: soft-3D server stack, bottom-right, in front -->
94 + <g filter="url(#rackShadow)">
95 + <g>
96 + <rect x="646" y="664" width="172" height="48" rx="15" fill="url(#rack)" stroke="#D4D9E2" stroke-width="2.5"/>
97 + <rect x="646" y="721" width="172" height="48" rx="15" fill="url(#rack)" stroke="#D4D9E2" stroke-width="2.5"/>
98 + <rect x="646" y="778" width="172" height="48" rx="15" fill="url(#rack)" stroke="#D4D9E2" stroke-width="2.5"/>
99 + <!-- vent slots -->
100 + <g stroke="#C6CCD8" stroke-width="5" stroke-linecap="round">
101 + <line x1="666" y1="688" x2="730" y2="688"/>
102 + <line x1="666" y1="745" x2="730" y2="745"/>
103 + <line x1="666" y1="802" x2="730" y2="802"/>
104 + </g>
105 + <!-- glowing blue indicator dots -->
106 + <g fill="#2B6BFF" filter="url(#dotGlow)">
107 + <circle cx="788" cy="688" r="8"/>
108 + <circle cx="788" cy="745" r="8"/>
109 + <circle cx="788" cy="802" r="8"/>
110 + </g>
111 + </g>
112 + </g>
86 113 </g>
87 114 </svg>
88 115