SPB Git

spb/zyquo-cloud Public MIT

Native macOS AI chat client for 12 cloud providers — your keys, every cloud model, one beautiful chat.

Swift 97.4% Shell 1.7% Makefile 1%

docs: legendary README (icon, badges, screenshots, full feature/security/build docs), MIT license, macOS gitignore, .env.keys.example

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

Showing 7 changed files with +408 and −41

added .env.keys.example +23 −0
@@ -0,0 +1,23 @@
1 +#
2 +# .env.keys.example
3 +# Zyquo Cloud
4 +#
5 +# Author: Simon-Pierre Boucher
6 +# Mail: contact@spboucher.ai
7 +#
8 +# Copy to .env.keys (gitignored) and fill in the keys you have.
9 +# Used only by `make verify` (the live API verification harness) and
10 +# `ZyquoCloud --load-vault`; the app itself stores keys in its encrypted vault.
11 +#
12 +export OPENAI_API_KEY=""
13 +export ANTHROPIC_API_KEY=""
14 +export XAI_API_KEY=""
15 +export MISTRAL_API_KEY=""
16 +export GEMINI_API_KEY=""
17 +export DASHSCOPE_API_KEY=""
18 +export DEEPSEEK_API_KEY=""
19 +export MOONSHOT_API_KEY=""
20 +export PERPLEXITY_API_KEY=""
21 +export TOGETHER_API_KEY=""
22 +export DEEPINFRA_API_KEY=""
23 +export CEREBRAS_API_KEY=""
modified .gitignore +40 −3
@@ -1,7 +1,44 @@
1 .build/
2 .DS_Store
3 *.icns.tmp
1 +# Secrets — never commit API keys
4 2 .env.keys
3 +*.env
4 +
5 +# Swift Package Manager
6 +.build/
7 +.swiftpm/
8 +
9 +# Build products & distribution
5 10 dist/
6 11 *.zip
7 12 *.dmg
13 +*.xcarchive
14 +
15 +# Xcode (if ever opened in Xcode)
16 +DerivedData/
17 +build/
18 +*.xcuserstate
19 +*.xcuserdatad/
20 +xcuserdata/
21 +*.pbxuser
22 +*.mode1v3
23 +*.mode2v3
24 +*.perspectivev3
25 +*.moved-aside
26 +*.hmap
27 +*.ipa
28 +
29 +# CocoaPods / Carthage (not used, defensive)
30 +Pods/
31 +Carthage/Build/
32 +
33 +# macOS
34 +.DS_Store
35 +.AppleDouble
36 +.LSOverride
37 +Icon?
38 +._*
39 +.Spotlight-V100
40 +.Trashes
41 +
42 +# Temporary
43 +*.icns.tmp
44 +*.log
added LICENSE +21 −0
@@ -0,0 +1,21 @@
1 +MIT License
2 +
3 +Copyright (c) 2026 Simon-Pierre Boucher
4 +
5 +Permission is hereby granted, free of charge, to any person obtaining a copy
6 +of this software and associated documentation files (the "Software"), to deal
7 +in the Software without restriction, including without limitation the rights
8 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 +copies of the Software, and to permit persons to whom the Software is
10 +furnished to do so, subject to the following conditions:
11 +
12 +The above copyright notice and this permission notice shall be included in all
13 +copies or substantial portions of the Software.
14 +
15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 +SOFTWARE.
modified README.md +324 −38
@@ -5,58 +5,344 @@
5 5 Mail: contact@spboucher.ai
6 6 -->
7 7
8 # Zyquo Cloud
8 +<div align="center">
9 9
10 **Zyquo Cloud** is a native macOS AI chat client — Swift + SwiftUI, built entirely without Xcode
11 (Swift Package Manager + command-line toolchain). Bring your own API keys and chat with any model
12 from **12 cloud AI providers**, switch models mid-conversation, compare models side by side, and
13 manage everything from a fast, beautiful, truly native Mac interface.
10 +<img src="assets/readme/icon.png" width="180" alt="Zyquo Cloud icon" />
14 11
15 ## Providers
12 +# ☁️ Zyquo Cloud
16 13
17 OpenAI · Anthropic · xAI · Mistral · Google Gemini · Alibaba Qwen (DashScope) · DeepSeek ·
18 Kimi (Moonshot) · Perplexity · Together AI · DeepInfra · Cerebras — plus any custom
19 OpenAI-compatible endpoint (OpenRouter, Groq, …). 170+ chat models built in, verified live against
20 every provider (`docs/VERIFICATION.md`), with dynamic `/models` refresh.
14 +### *Your keys, every cloud model, one beautiful chat.*
21 15
22 ## Highlights
16 +**A truly native macOS AI chat client for 12 cloud providers — built entirely without Xcode.**
23 17
24 - **Streaming chat** with stop, per-message model switching, regenerate-with-another-model
25 - **Reasoning display** (DeepSeek, Qwen thinking, Claude extended thinking…) in a collapsible section
26 - **Perplexity citations** as numbered source chips
27 - **Vision**: drag & drop images to vision-capable models; text files inject inline
28 - **Compare mode**: broadcast one prompt to 2–4 models in parallel columns
29 - **Quick Chat**: ⌥Space Spotlight-style floating panel from anywhere
30 - **Prompt library** (56 built-in templates + yours), **personas**, ⌘K command palette
31 - **Export** conversations to Markdown or PDF; full-text search; auto-titles
32 - Token usage + estimated cost per message and per conversation
33 - **Custom key vault** — AES-256-GCM (CryptoKit), machine-bound via HKDF (hardware UUID + salt +
34 compiled-in pepper). No Keychain. Keys never leave `~/Library/Application Support/ZyquoCloud/vault.zq`.
18 +<br/>
35 19
36 ## Build
20 +[![Release](https://img.shields.io/github/v/release/spboucher-ai/zyquo-cloud?style=for-the-badge&color=4E6AF0&label=Release)](https://github.com/spboucher-ai/zyquo-cloud/releases/latest)
21 +[![Platform](https://img.shields.io/badge/Platform-macOS%2013%2B-blue?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/spboucher-ai/zyquo-cloud/releases/latest)
22 +[![Swift](https://img.shields.io/badge/Swift-5.9%2B-F05138?style=for-the-badge&logo=swift&logoColor=white)](https://swift.org)
23 +[![License](https://img.shields.io/badge/License-MIT-2FA36B?style=for-the-badge)](LICENSE)
37 24
38 Requires macOS 13+ and the Swift toolchain (Command Line Tools are enough — no Xcode).
25 +[![Downloads](https://img.shields.io/github/downloads/spboucher-ai/zyquo-cloud/total?style=for-the-badge&color=8A5BFF&label=Downloads)](https://github.com/spboucher-ai/zyquo-cloud/releases)
26 +[![Notarized](https://img.shields.io/badge/Apple-Notarized%20%26%20Stapled-000000?style=for-the-badge&logo=apple&logoColor=white)](#-installation)
27 +[![Providers](https://img.shields.io/badge/Providers-12-4E8BFF?style=for-the-badge)](#-supported-providers)
28 +[![Live%20verified](https://img.shields.io/badge/API%20verification-202%2F202%20✓-2FA36B?style=for-the-badge)](#-live-api-verification)
29 +
30 +<br/>
31 +
32 +<img src="assets/readme/screenshot-chat.png" width="850" alt="Zyquo Cloud — chat with syntax-highlighted code and markdown tables" />
33 +
34 +</div>
35 +
36 +---
37 +
38 +## 📖 Table of Contents
39 +
40 +- [✨ Features](#-features)
41 +- [🔌 Supported Providers](#-supported-providers)
42 +- [🖼 Screenshots](#-screenshots)
43 +- [📦 Installation](#-installation)
44 +- [🧰 Requirements](#-requirements)
45 +- [🚀 Usage](#-usage)
46 +- [🔐 Security & Privacy](#-security--privacy)
47 +- [🧪 Live API Verification](#-live-api-verification)
48 +- [🛠 Building from Source](#-building-from-source)
49 +- [🏛 Architecture](#-architecture)
50 +- [🗺 Roadmap](#-roadmap)
51 +- [🤝 Contributing](#-contributing)
52 +- [📄 License](#-license)
53 +- [👤 Author](#-author)
54 +
55 +---
56 +
57 +## ✨ Features
58 +
59 +Every feature below exists in the shipped code — nothing aspirational.
60 +
61 +### 💬 Core chat
62 +
63 +- **True token-by-token streaming** over Server-Sent Events, with a stop button (`⌘.`), a blinking
64 + stream caret, smooth auto-scroll and a *"Jump to latest"* pill when you scroll up.
65 +- **Switch model per conversation *and* per message** — start a thread on GPT, get a second opinion
66 + from Claude, regenerate with DeepSeek. The model chip in the header opens a searchable picker
67 + grouped by provider, with favorites (⭐) pinned first and capability badges (👁 vision, 🧠 reasoning,
68 + 🔧 tools) plus context-window and pricing info on every row.
69 +- **Reasoning / extended-thinking display**: models that think (DeepSeek V4, Qwen thinking models,
70 + Claude extended thinking, Kimi K-series, Mistral Magistral-style chunks…) stream their thought
71 + process into a collapsible *"Thinking…"* section, kept separate from the answer.
72 +- **Perplexity citations** rendered as numbered, clickable source chips under the answer.
73 +- **Message actions** on hover or right-click: copy, **edit & resend** (rewinds the thread),
74 + **regenerate**, quote-reply, delete.
75 +- **Token usage & estimated cost** per message (hover) and per conversation (info popover +
76 + sidebar footer), computed from each model's real pricing.
77 +- **Per-conversation system prompt** + a global default; **generation parameters**
78 + (temperature, top-p, max tokens, penalties, reasoning effort, thinking toggle) — the editor only
79 + shows the parameters the selected model actually supports.
80 +
81 +### 🖼 Vision & attachments
82 +
83 +- **Drag & drop or attach images** (PNG/JPEG/WebP/GIF) for vision-capable models — encoded to each
84 + provider's format automatically (OpenAI `image_url` data-URIs, Anthropic base64 content blocks).
85 +- **Drop text/code files** (30+ extensions) — contents are injected inline, fenced with the filename.
86 +- 56pt thumbnails above the input with one-click removal; dashed accent highlight while dragging.
87 +
88 +### ⚡ Productivity
89 +
90 +- **Prompt Library** — 58 hand-crafted built-in templates across 8 categories (Writing, Coding,
91 + Analysis, Translation, Business, Learning, Creativity, Productivity), each with a `{{input}}`
92 + slot, plus your own custom templates.
93 +- **Personas** — 8 thoughtful built-ins (Senior Code Reviewer, Socratic Tutor, Ruthless Editor…)
94 + bundling a system prompt + preferences; apply one from the palette in two keystrokes.
95 +- **⌘K Command Palette** — one search box over models, templates, and personas.
96 +- **Quick Chat (⌥Space)** — a global, Spotlight-style floating panel available from any app:
97 + ask, read the streamed answer, then *"Continue in Zyquo Cloud"* to promote it to a full thread.
98 +- **Compare mode** — broadcast one prompt to **2–4 models side-by-side**, each column streaming
99 + independently with its own copy/regenerate.
100 +- **Export** any conversation to **Markdown** or **PDF** (thinking sections and citations included).
101 +- **Full-text search** across all conversations (titles *and* message bodies), plus pin, rename,
102 + tags, and automatic *Pinned / Today / Yesterday / Previous 7 Days / Older* grouping.
103 +- **Automatic titles** — after the first exchange, the cheapest non-reasoning model of the same
104 + provider names the conversation.
105 +
106 +### 🧠 Model management
107 +
108 +- **170 built-in chat models**, every one verified live against the real APIs (see
109 + [verification](#-live-api-verification)).
110 +- **Dynamic refresh** — pull `/models` from any provider and diff it against the catalog.
111 +- **Custom models & endpoints** — add any OpenAI-compatible endpoint (OpenRouter, Groq, self-hosted
112 + gateways…) with a custom model ID and base URL.
113 +
114 +### 🍎 macOS-native polish
115 +
116 +- 100 % **SwiftUI + AppKit**, no Electron, no web views — launches instantly.
117 +- **Menu bar extra** (toggleable) with a template glyph that adapts to light/dark menu bars.
118 +- **Light & dark themes** from one semantic token system (sky-indigo accent + 4 alternates),
119 + adjustable chat font size (12–18 pt) with live preview.
120 +- Full keyboard: `⌘N` new chat · `⌘K` palette · `⌘F` search · `⌘↩` send · `⌘⇧E` export ·
121 + `⌥Space` Quick Chat · `⌘.` stop.
122 +- **Markdown done right**: headings, nested lists, task lists, blockquotes, GFM tables with
123 + alternating row tints, links — and code blocks with a language label, hover copy button, and a
124 + built-in syntax highlighter covering **11 language families** (Swift, Python, JS/TS, JSON,
125 + HTML/CSS, Bash, SQL, Go, Rust, C/C++/Obj-C).
126 +
127 +---
128 +
129 +## 🔌 Supported Providers
130 +
131 +| Provider | Wire format | Dynamic `/models` | Notable support |
132 +|---|---|:---:|---|
133 +| **OpenAI** | OpenAI | ✅ | GPT-5.x families, o-series reasoning, vision |
134 +| **Anthropic** | Native Messages API | ✅ | Claude 5 / 4.x, extended thinking, vision blocks |
135 +| **xAI** | OpenAI-compatible | ✅ | Grok 4.5 / 4.3 / 4.20, reasoning effort |
136 +| **Mistral** | OpenAI-compatible | ✅ | Large/Medium/Small, Codestral, reasoning chunks |
137 +| **Google Gemini** | OpenAI-compat endpoint | ✅ | Gemini 3.x / 2.5, thought signatures tolerated |
138 +| **Alibaba Qwen** (DashScope intl) | OpenAI-compatible | ✅ | Qwen 3.x families, `enable_thinking`, QwQ/QVQ |
139 +| **DeepSeek** | OpenAI-compatible | ✅ | V4 Flash/Pro, `reasoning_content` streaming |
140 +| **Kimi** (Moonshot) | OpenAI-compatible | ✅ | K3 / K2.x, moonshot-v1 vision |
141 +| **Perplexity** | OpenAI-compat + search | — | Sonar family, citations & search results |
142 +| **Together AI** | OpenAI-compatible | ✅ | Curated serverless catalog (Llama, DeepSeek, Qwen…) |
143 +| **DeepInfra** | OpenAI-compatible | ✅ | Open models + proxied Claude/Gemini |
144 +| **Cerebras** | OpenAI-compatible | ✅ | Ultra-fast inference, `max_completion_tokens` |
145 +
146 +Provider quirks (auth headers, `stream_options`, `reasoning_effort` value sets, streaming-only
147 +models, completions-style deltas, keep-alive comments…) are all isolated in the provider layer —
148 +documented in [`docs/PROVIDERS.md`](docs/PROVIDERS.md), a 1,600-line API research dossier.
149 +
150 +---
151 +
152 +## 🖼 Screenshots
153 +
154 +<div align="center">
155 +
156 +**Chat — syntax-highlighted code, GFM tables, per-message cost**
157 +
158 +<img src="assets/readme/screenshot-chat.png" width="850" alt="Chat view" />
159 +
160 +<br/><br/>
161 +
162 +**Empty state — model chip and suggested prompts**
163 +
164 +<img src="assets/readme/screenshot-empty.png" width="850" alt="Empty state" />
165 +
166 +</div>
167 +
168 +---
169 +
170 +## 📦 Installation
171 +
172 +### Download (recommended)
173 +
174 +1. Grab **[`ZyquoCloud.dmg` from the latest release](https://github.com/spboucher-ai/zyquo-cloud/releases/latest)**.
175 +2. Open the DMG and drag **Zyquo Cloud** into **Applications**.
176 +3. Launch it. No Gatekeeper warnings: the app is **Developer ID-signed, notarized by Apple, and
177 + stapled** (`spctl` verdict: *accepted — Notarized Developer ID*), universal **arm64 + x86_64**.
178 +
179 +### First run
180 +
181 +Open **Settings → Providers & Keys** (`⌘,`), paste the API keys for the providers you use, and hit
182 +**Test** — a green dot and the round-trip latency confirm each key. That's it.
183 +
184 +---
185 +
186 +## 🧰 Requirements
187 +
188 +| | |
189 +|---|---|
190 +| **macOS** | 13 Ventura or later |
191 +| **Architecture** | Apple Silicon & Intel (universal binary) |
192 +| **Accounts** | Your own API keys for the providers you want (BYOK — no subscription, no middleman) |
193 +| **Network** | Outbound HTTPS to the providers you configure — nothing else |
194 +
195 +---
196 +
197 +## 🚀 Usage
198 +
199 +| Action | How |
200 +|---|---|
201 +| New chat | `⌘N` or the sidebar button |
202 +| Send | `⌘↩` |
203 +| Stop generating | `⌘.` or the stop button |
204 +| Switch model | Click the model chip, or `⌘K` |
205 +| Insert a prompt template / apply a persona | `⌘K` |
206 +| Quick Chat from anywhere | `⌥Space` |
207 +| Compare 2–4 models | Split icon in the chat header |
208 +| Search conversations | `⌘F` |
209 +| Export Markdown / PDF | `⌘⇧E` |
210 +| Attach images / files | 📎, drag & drop, or paste |
211 +| Per-conversation parameters | Sliders icon in the input bar |
212 +| System prompt & usage stats | ⓘ in the chat header |
213 +
214 +---
215 +
216 +## 🔐 Security & Privacy
217 +
218 +- **Your keys never leave your Mac.** They live in a single encrypted vault file
219 + (`~/Library/Application Support/ZyquoCloud/vault.zq`) — **AES-256-GCM** via CryptoKit.
220 +- The master key is derived with **HKDF-SHA256** from a random salt **+ this Mac's hardware UUID +
221 + your account** + an obfuscated compiled-in pepper: the vault is **machine-bound** and useless if
222 + copied to another computer. Tampering is detected by the GCM tag.
223 +- **Deliberately no macOS Keychain** — no keychain prompts, no iCloud sync of secrets, fully
224 + auditable storage. Keys are decrypted only at request time, never logged, and always displayed
225 + redacted (`••••` + last 4).
226 +- **No telemetry, no analytics, no accounts.** The app talks exclusively to the AI providers you
227 + configure. Conversations are plain JSON on your disk, exportable and greppable.
228 +- Hardened-runtime binary with an empty entitlement surface (no JIT, no sandbox exceptions).
229 +
230 +---
231 +
232 +## 🧪 Live API Verification
233 +
234 +Zyquo Cloud ships with `zyquo-verify`, a harness that drives the **exact production provider
235 +clients** against the real APIs:
236 +
237 +- lists `/models` on every provider and diffs against the built-in catalog,
238 +- sends a completion to **every one of the 170 catalog models**,
239 +- tests **streaming** on every provider and **vision** on every vision-capable provider.
240 +
241 +Final run: **202 / 202 tests green** across all 12 providers — full table in
242 +[`docs/VERIFICATION.md`](docs/VERIFICATION.md). Run it yourself:
243 +
244 +```sh
245 +cp .env.keys.example .env.keys # add your keys (file is gitignored)
246 +make verify
247 +```
248 +
249 +---
250 +
251 +## 🛠 Building from Source
252 +
253 +No Xcode required — the whole app builds with Swift Package Manager and Command Line Tools.
39 254
40 255 ```sh
41 make # release build → dist/Zyquo Cloud.app (ad-hoc signed, for local use)
256 +git clone https://github.com/spboucher-ai/zyquo-cloud.git
257 +cd zyquo-cloud
258 +
259 +make # release build → dist/Zyquo Cloud.app (ad-hoc signed)
42 260 make run # build + launch
43 make test # unit tests (Swift Testing)
44 make icon # regenerate AppIcon.icns from assets/icon/*.svg
45 make release # universal binary, Developer ID signed, notarized, stapled + DMG
46 make verify # live API verification across all providers (needs .env.keys)
261 +make test # unit test suite (Swift Testing)
262 +make icon # regenerate AppIcon.icns from the SVG sources in assets/icon/
263 +make release # universal binary + Developer ID signing + notarization + DMG
47 264 ```
48 265
49 `make release` uses the Developer ID identity and `notarytool` keychain profile configured on this
50 machine (see `docs/SIGNING.md`).
266 +**Toolchain notes** (from real-world CLT-only builds, encoded in the Makefile):
267 +
268 +- Builds pin `SDKROOT` to the macOS 26 SDK — newer SDKs declare SwiftUI property wrappers as
269 + macros whose compiler plugin only ships with Xcode.
270 +- The x86_64 slice links with `-U __swift_FORCE_LOAD_$_swiftCompatibility56` because CLT ships
271 + that back-deployment library arm64-only.
272 +- `scripts/test.sh` wires CLT's Swift Testing framework and macro plugin so `make test` works
273 + without Xcode.
274 +
275 +**Dependencies:** exactly one — [`swift-markdown`](https://github.com/swiftlang/swift-markdown)
276 +(Apple) for Markdown parsing. Networking is plain `URLSession`; crypto is CryptoKit.
51 277
52 ## Layout
278 +---
279 +
280 +## 🏛 Architecture
53 281
54 282 ```
55 Sources/ZyquoCloud/ # app target (App, DesignSystem, Models, Providers, Services, ViewModels, Views, Verify)
56 Sources/ZyquoVerify/ # zyquo-verify — live API verification launcher
57 Tests/ZyquoCloudTests/ # unit tests
58 assets/icon/ # SVG icon sources (single source of truth)
59 docs/ # PROVIDERS.md (API research), PLAN.md, VERIFICATION.md, SIGNING.md
283 +Sources/ZyquoCloud/
284 +├── App/ @main entry (GUI + --verify + --load-vault modes), scenes, commands
285 +├── DesignSystem/ ZyquoTheme tokens (colors/type/spacing/radii/motion), components, brand glyph
286 +├── Models/ Conversation, Message, AIModel, ProviderID, Persona, ChatParameters…
287 +├── Providers/ ProviderProtocol · OpenAICompatibleClient (11 providers + custom)
288 +│ · AnthropicClient (native Messages API) · ProviderRegistry
289 +├── Services/ StreamingService (SSE) · ModelCatalog (+ generated data) · SecureKeyStore
290 +│ · PersistenceService · ConversationExporter · prompt/persona libraries
291 +├── ViewModels/ ConversationStore (chat engine) · KeyVaultStore
292 +├── Views/ Chat, Sidebar, Markdown renderer + highlighter, Settings, QuickChat, Compare
293 +└── Verify/ zyquo-verify harness (202-test live sweep)
60 294 ```
61 295
62 © 2026 Simon-Pierre Boucher. All rights reserved.
296 +Design principles: single source of truth everywhere (models only from `ModelCatalog`, colors only
297 +from `ZyquoTheme`), provider quirks never leak past the client layer, structured concurrency
298 +(`async/await` + `AsyncThrowingStream`) with `@MainActor` UI state, zero third-party HTTP/crypto.
299 +
300 +---
301 +
302 +## 🗺 Roadmap
303 +
304 +- [ ] Function calling / tools UI
305 +- [ ] Web search toggle for providers that support it natively
306 +- [ ] Conversation folders with drag & drop
307 +- [ ] Prompt-template variables beyond `{{input}}`
308 +- [ ] Localization (the string layer is centralization-ready)
309 +- [ ] Sparkle-based auto-updates
310 +
311 +Suggestions welcome — open an issue!
312 +
313 +---
314 +
315 +## 🤝 Contributing
316 +
317 +1. Fork, then `git clone` your fork.
318 +2. `make test` must stay green; `make` must build with **zero warnings**.
319 +3. Follow the conventions in [`CLAUDE.md`](CLAUDE.md): design tokens only (no raw hex in views),
320 + one term per concept, provider quirks stay in the provider layer, and every code file carries
321 + the standard header.
322 +4. Open a PR with a clear description. For provider/catalog changes, update
323 + [`docs/PROVIDERS.md`](docs/PROVIDERS.md) and `ModelCatalogData.swift` **together** and include
324 + a `make verify` run for the affected provider.
325 +
326 +---
327 +
328 +## 📄 License
329 +
330 +Released under the [MIT License](LICENSE) — © 2026 Simon-Pierre Boucher.
331 +
332 +---
333 +
334 +## 👤 Author
335 +
336 +<div align="center">
337 +
338 +**Simon-Pierre Boucher**
339 +
340 +📧 Contact: [contact@spboucher.ai](mailto:contact@spboucher.ai)
341 +
342 +<sub>Part of the <b>Zyquo</b> family of native macOS AI apps.</sub>
343 +
344 +<br/>
345 +
346 +<img src="assets/readme/icon.png" width="48" alt="" />
347 +
348 +</div>
added assets/readme/icon.png +0 −0

Binary file not shown.

added assets/readme/screenshot-chat.png +0 −0

Binary file not shown.

added assets/readme/screenshot-empty.png +0 −0

Binary file not shown.