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>
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 | +[](https://github.com/spboucher-ai/zyquo-cloud/releases/latest) | |
| 21 | +[](https://github.com/spboucher-ai/zyquo-cloud/releases/latest) | |
| 22 | +[](https://swift.org) | |
| 23 | +[](LICENSE) | |
| 37 | 24 | |
| 38 | −Requires macOS 13+ and the Swift toolchain (Command Line Tools are enough — no Xcode). | |
| 25 | +[](https://github.com/spboucher-ai/zyquo-cloud/releases) | |
| 26 | +[](#-installation) | |
| 27 | +[](#-supported-providers) | |
| 28 | +[](#-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.