docs: legendary README, MIT license, screenshots and icon assets, macOS gitignore
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Showing 7 changed files with +320 and −46
modified
.gitignore
+37 −2
@@ -1,5 +1,40 @@ | ||
| 1 | +# Build | |
| 1 | 2 | .build/ |
| 3 | +build/ | |
| 2 | 4 | dist/ |
| 3 | −*.icns.tmp/ | |
| 4 | −.DS_Store | |
| 5 | +DerivedData/ | |
| 6 | +*.o | |
| 7 | +*.dSYM | |
| 8 | + | |
| 9 | +# SwiftPM | |
| 5 | 10 | Package.resolved |
| 11 | +.swiftpm/ | |
| 12 | + | |
| 13 | +# Xcode user state (no .xcodeproj in this repo, kept for safety) | |
| 14 | +*.xcuserstate | |
| 15 | +xcuserdata/ | |
| 16 | +*.xccheckout | |
| 17 | +*.moved-aside | |
| 18 | +*.pbxuser | |
| 19 | +!default.pbxuser | |
| 20 | +*.mode1v3 | |
| 21 | +*.mode2v3 | |
| 22 | +*.perspectivev3 | |
| 23 | + | |
| 24 | +# CocoaPods / Carthage (unused, kept for safety) | |
| 25 | +Pods/ | |
| 26 | +Carthage/Build/ | |
| 27 | + | |
| 28 | +# macOS | |
| 29 | +.DS_Store | |
| 30 | +.AppleDouble | |
| 31 | +.LSOverride | |
| 32 | +Icon? | |
| 33 | +._* | |
| 34 | + | |
| 35 | +# Icon pipeline intermediates | |
| 36 | +assets/icon/AppIcon.iconset/ | |
| 37 | +*.icns.tmp/ | |
| 38 | + | |
| 39 | +# Secrets | |
| 40 | +*.env | |
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
+262 −44
@@ -1,62 +1,280 @@ | ||
| 1 | −<!-- | |
| 2 | − README.md | |
| 3 | − Zyquo Local | |
| 1 | +<div align="center"> | |
| 4 | 2 | |
| 5 | − Author: Simon-Pierre Boucher | |
| 6 | − Mail: contact@spboucher.ai | |
| 7 | −--> | |
| 3 | +<img src="assets/icon/app-icon.png" width="180" alt="Zyquo Local icon"> | |
| 8 | 4 | |
| 9 | 5 | # Zyquo Local |
| 10 | 6 | |
| 11 | −**Zyquo Local** is a native macOS AI chat client that runs large language | |
| 12 | −models **100 % locally on Apple Silicon** with [MLX](https://github.com/ml-explore/mlx-swift). | |
| 13 | −No API keys, no network calls for inference, no data ever leaving the Mac. | |
| 14 | −It is the on-device sibling of Zyquo Cloud, sharing the same design DNA — an | |
| 15 | −emerald-graphite "on-device" identity. | |
| 7 | +### Every token stays on your Mac. 🍏⚡ | |
| 16 | 8 | |
| 17 | −Browse Hugging Face **inside the app**, download MLX models with one click | |
| 18 | −(resumable, pausable), and chat with them: token streaming, multi-turn | |
| 19 | −context management, per-response stats (tok/s, time-to-first-token), | |
| 20 | −collapsible reasoning for `<think>` models, prompt library, personas, | |
| 21 | −Quick Chat (⌥Space), two-model Compare mode, Markdown/PDF export. | |
| 9 | +**A legendary native macOS AI chat client that runs large language models 100 % locally on Apple Silicon with [MLX](https://github.com/ml-explore/mlx-swift) — no API keys, no cloud, no data ever leaving your machine.** | |
| 22 | 10 | |
| 23 | −- Platform: **Apple Silicon only** (M1+), macOS 14+ | |
| 24 | −- Bundle: `Zyquo Local.app` (`com.zyquo.local`), arm64 | |
| 25 | −- Data: `~/Library/Application Support/ZyquoLocal/` (models in `Models/`) | |
| 11 | +<br> | |
| 26 | 12 | |
| 27 | −## Building (no Xcode IDE) | |
| 13 | +[](https://github.com/spboucher-ai/zyquo-local/releases/latest) | |
| 14 | +[](https://github.com/spboucher-ai/zyquo-local/releases/latest) | |
| 15 | +[](https://support.apple.com/en-us/116943) | |
| 16 | +[](https://swift.org) | |
| 17 | +[](https://github.com/ml-explore/mlx-swift) | |
| 18 | +<br> | |
| 19 | +[](LICENSE) | |
| 20 | +[](https://github.com/spboucher-ai/zyquo-local/releases) | |
| 21 | +[](https://github.com/spboucher-ai/zyquo-local/releases/latest) | |
| 28 | 22 | |
| 29 | −The project is plain SwiftPM — no `.xcodeproj`, the Xcode IDE is never used. | |
| 30 | −Two prerequisites beyond Command Line Tools: | |
| 23 | +<br> | |
| 31 | 24 | |
| 32 | −1. **Apple Metal Toolchain** on `PATH` (MLX compiles GPU kernels at build | |
| 33 | − time). This machine keeps it at `~/Developer/Metal.xctoolchain`. | |
| 34 | −2. **SDK pin**: `SDKROOT` → `MacOSX26.5.sdk` (SwiftUI macro plugins are | |
| 35 | − Xcode-only in the 27.x CLT SDKs). | |
| 25 | +**[⬇️ Download the latest DMG](https://github.com/spboucher-ai/zyquo-local/releases/latest/download/ZyquoLocal.dmg)** · Developer ID signed · Notarized by Apple · Stapled | |
| 36 | 26 | |
| 37 | −The Makefile handles both: | |
| 27 | +</div> | |
| 28 | + | |
| 29 | +--- | |
| 30 | + | |
| 31 | +## 📑 Table of Contents | |
| 32 | + | |
| 33 | +- [Why Zyquo Local?](#-why-zyquo-local) | |
| 34 | +- [Features](#-features) | |
| 35 | + - [Private, local inference](#-private-local-inference) | |
| 36 | + - [Browse & download models inside the app](#-browse--download-models-inside-the-app) | |
| 37 | + - [A chat experience that respects your hardware](#-a-chat-experience-that-respects-your-hardware) | |
| 38 | + - [Power tools](#-power-tools) | |
| 39 | + - [macOS-native polish](#-macos-native-polish) | |
| 40 | +- [Screenshots](#-screenshots) | |
| 41 | +- [Verified performance](#-verified-performance) | |
| 42 | +- [Installation](#-installation) | |
| 43 | +- [Requirements](#-requirements) | |
| 44 | +- [Usage](#-usage) | |
| 45 | +- [Building from source](#%EF%B8%8F-building-from-source) | |
| 46 | +- [Architecture](#%EF%B8%8F-architecture) | |
| 47 | +- [Roadmap](#-roadmap) | |
| 48 | +- [Contributing](#-contributing) | |
| 49 | +- [License](#-license) | |
| 50 | +- [Author](#-author) | |
| 51 | + | |
| 52 | +--- | |
| 53 | + | |
| 54 | +## 🔒 Why Zyquo Local? | |
| 55 | + | |
| 56 | +Cloud chatbots read your prompts. **Zyquo Local doesn't have a server to send them to.** | |
| 57 | + | |
| 58 | +Inference runs entirely on your Mac's unified memory and GPU through Apple's MLX framework. The only network calls the app ever makes are the ones **you** trigger to download model weights from Hugging Face — and even those are resumable, verified, and stored in a folder you control. Everything else — every conversation, every token, every system prompt — lives in `~/Library/Application Support/ZyquoLocal/` and nowhere else. | |
| 59 | + | |
| 60 | +--- | |
| 61 | + | |
| 62 | +## ✨ Features | |
| 63 | + | |
| 64 | +### 🔐 Private, local inference | |
| 65 | + | |
| 66 | +- **100 % on-device generation** via [mlx-swift-lm](https://github.com/ml-explore/mlx-swift-lm) — no API keys, no accounts, no telemetry, works fully offline once a model is downloaded. | |
| 67 | +- **57 supported architectures** out of the box: Llama, Qwen 2/3/3.5/3.6, Mistral/Mixtral, Gemma 1–4, Phi-3/4, DeepSeek-V3 distills, gpt-oss, GLM-4, SmolLM3, LFM2, OpenELM, StarCoder2, Granite, and more — with a compatibility check *before* you download anything. | |
| 68 | +- **True token streaming** with a live tokens/second ticker, cancellable mid-generation — the stop button actually stops the GPU loop. | |
| 69 | +- **Reasoning display**: `<think>…</think>` output from thinking models (DeepSeek-R1 distills, Qwen3 thinking mode, QwQ-class) streams into a collapsible *Thought process* section, parsed incrementally and robust to tags split across token chunks. | |
| 70 | +- **First-class statistics** under every response: `⚡ tokens/sec · token count · time-to-first-token`, plus peak-memory tracking per generation. | |
| 71 | +- **Multi-turn context management**: KV-cache reuse across turns (no re-prefill), automatic oldest-turn truncation when the context window fills (the system prompt always survives), and a live context-usage bar. | |
| 72 | +- **Verifiable memory hygiene**: one model loaded at a time, explicit Load/Unload, and unloading provably returns memory to the OS (gigabytes → kilobytes, measured via MLX memory APIs). | |
| 73 | + | |
| 74 | +### 🧲 Browse & download models inside the app | |
| 75 | + | |
| 76 | +- **Live Hugging Face search** without leaving the app: scopes for the curated *Featured* catalog, the `mlx-community` organization, or all MLX-tagged repos; sort by downloads/likes/newest; filter by size class; gated-repo and unsupported-architecture warnings right on the card. | |
| 77 | +- **A hand-picked Featured catalog of 30 models** — tiny (Qwen3-0.6B, Llama-3.2-1B, SmolLM3-3B…), mid (Qwen3-8B/14B, Gemma-3-12B, Phi-4, gpt-oss-20b…), large (Mistral-Small-24B, Gemma-3-27B, Qwen3-30B-A3B MoE, Llama-3.3-70B…), coding (Qwen2.5-Coder, Qwen3-Coder-30B-A3B) and reasoning (R1 distills, Qwen3-Thinking) — every repo ID and download size verified against the live Hub. | |
| 78 | +- **Industrial-grade download manager**: pause / resume / cancel per model, **HTTP Range resume that survives app restarts**, automatic retry with backoff on transient network drops, 2 parallel file streams, live speed + ETA, atomic `.partial → final` completion, per-file size verification, and a disk-space pre-check before a single byte is fetched. | |
| 79 | +- **RAM verdicts everywhere**: a `MemoryAdvisor` reads *your* Mac's physical memory and stamps every model — installed or discoverable — with **Fits / Tight / Too large**, so you never download something your machine can't run. | |
| 80 | +- **Model library**: sizes on disk, architecture and quantization badges, context-window length, last-used dates, per-model default generation parameters, Reveal in Finder, and delete-with-reclaimed-space confirmation. | |
| 81 | +- **Optional Hugging Face token** (Settings → Models & Storage, masked input) for gated repos like Llama and Gemma — sent exclusively to huggingface.co, stripped from cross-host CDN redirects. | |
| 82 | + | |
| 83 | +### 💬 A chat experience that respects your hardware | |
| 84 | + | |
| 85 | +- **Multi-conversation sidebar** with full-text search across titles *and* message content, pinning, renaming, date grouping (Pinned / Today / Yesterday / Previous 7 Days / Older), and per-conversation model badges. | |
| 86 | +- **Per-conversation everything**: model, system prompt, temperature, top-p, repetition penalty, max tokens, and seed — with plain-language explanations and app-wide defaults in Settings. | |
| 87 | +- **Model switcher in the chat header**: click the model chip to swap among downloaded models (RAM verdicts included) with inline load progress; each conversation remembers its model. | |
| 88 | +- **Message actions**: copy, edit & resend (rewinds the conversation), regenerate, quote-reply, delete. | |
| 89 | +- **Full Markdown rendering** (swift-markdown): headings, lists, quotes, tables, inline styles — and **syntax-highlighted code blocks with one-click copy**. | |
| 90 | +- **Attachments**: drag & drop or attach text files (`txt`, `md`, code, `csv`, `json`…) — contents are injected into your message as labeled fenced blocks. | |
| 91 | +- **Auto-titled conversations** using the loaded model itself after the first exchange. | |
| 92 | +- **Onboarding that doesn't waste your time**: first launch offers starter models *sized for your specific Mac* with one-click download and inline progress. | |
| 93 | + | |
| 94 | +### 🛠 Power tools | |
| 95 | + | |
| 96 | +- **⚡ Quick Chat** (global `⌥Space`): a Spotlight-style floating panel for one-shot questions to the loaded model, from anywhere in macOS — no accessibility permissions needed. | |
| 97 | +- **🆚 Compare mode**: run **two models side-by-side** on the same prompt with independent streaming and stats — RAM-gated so you can't load a pair your memory can't hold. | |
| 98 | +- **📚 Prompt library**: 56 built-in templates across 8 categories (writing, coding, analysis, learning, productivity, communication, language, creative) with `{{variable}}` placeholders — plus your own saved templates. | |
| 99 | +- **🎭 Personas**: reusable system prompt + preferred model + parameter bundles (4 thoughtful built-ins included). | |
| 100 | +- **📤 Export** any conversation to **Markdown or PDF**; bulk export/import of all conversations as JSON. | |
| 101 | +- **📊 Live resource footer**: currently loaded model, real-time MLX active-memory readout, and a colored pressure dot. | |
| 102 | + | |
| 103 | +### 🍎 macOS-native polish | |
| 104 | + | |
| 105 | +- **Real Mac app**: SwiftUI, `NavigationSplitView`, native Settings (6 tabs), translucent sidebar, hover states, snappy popovers, 0.5 pt hairlines — designed, not generated. | |
| 106 | +- **Menu bar extra** (toggleable) with loaded-model status, download progress at a glance, and Quick Chat access. | |
| 107 | +- **Keyboard-first**: `⌘N` new chat · `⌘K` model switcher · `⌘L` library · `⌘F` search · `⌘↩` send · `⇧⌘E` export · `⌥Space` Quick Chat. | |
| 108 | +- **Light & dark themes** from a strict design-token system (emerald-on-graphite identity), five accent colors, adjustable chat text size with live preview. | |
| 109 | +- **Signed & notarized**: Developer ID, hardened runtime, stapled ticket — Gatekeeper installs it without warnings. | |
| 110 | + | |
| 111 | +--- | |
| 112 | + | |
| 113 | +## 📸 Screenshots | |
| 114 | + | |
| 115 | +<div align="center"> | |
| 116 | + | |
| 117 | +**Chat — streaming, thinking disclosure, per-response stats (dark theme)** | |
| 118 | + | |
| 119 | +<img src="assets/screenshots/chat-dark.png" width="820" alt="Chat in dark mode with thought process disclosure and generation statistics"> | |
| 120 | + | |
| 121 | +<br><br> | |
| 122 | + | |
| 123 | +**Discover — the curated catalog with RAM verdicts for *your* Mac** | |
| 124 | + | |
| 125 | +<img src="assets/screenshots/discover.png" width="820" alt="Discover tab with featured models, sizes and memory verdicts"> | |
| 126 | + | |
| 127 | +<br><br> | |
| 128 | + | |
| 129 | +**Library — installed models with architecture, quantization and context badges** | |
| 130 | + | |
| 131 | +<img src="assets/screenshots/library.png" width="820" alt="Installed models with badges and actions"> | |
| 132 | + | |
| 133 | +</div> | |
| 134 | + | |
| 135 | +--- | |
| 136 | + | |
| 137 | +## 🏁 Verified performance | |
| 138 | + | |
| 139 | +Every release is validated by an end-to-end harness (`ZyquoLocal --verify`) that downloads real models through the app's own pipeline, then checks loading, deterministic generation, multi-turn recall, streaming cancellation, and memory release. Measured on an Apple M5 Max (48 GB): | |
| 140 | + | |
| 141 | +| Model | Load | Generate | Multi-turn | Cancel | Unload | tok/s | TTFT | | |
| 142 | +|---|:-:|:-:|:-:|:-:|:-:|--:|--:| | |
| 143 | +| Qwen3-0.6B-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 109.4 | 0.08 s | | |
| 144 | +| Llama-3.2-1B-Instruct-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 222.8 | 0.74 s | | |
| 145 | +| SmolLM3-3B-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 97.4 | 0.11 s | | |
| 146 | +| gemma-3-4b-it-qat-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 58.3 | 1.08 s | | |
| 147 | +| Qwen2.5-Coder-7B-Instruct-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 112.5 | 0.42 s | | |
| 148 | +| DeepSeek-R1-0528-Qwen3-8B-4bit | ✅ | ✅ | ✅ | ✅ | ✅ | 61.3 | 0.08 s | | |
| 149 | + | |
| 150 | +Full methodology and the 30/30 catalog verification: [`docs/VERIFICATION.md`](docs/VERIFICATION.md). | |
| 151 | + | |
| 152 | +--- | |
| 153 | + | |
| 154 | +## 📦 Installation | |
| 155 | + | |
| 156 | +1. **[Download `ZyquoLocal.dmg`](https://github.com/spboucher-ai/zyquo-local/releases/latest/download/ZyquoLocal.dmg)** from the latest release. | |
| 157 | +2. Open the DMG and drag **Zyquo Local** into **Applications**. | |
| 158 | +3. Launch it. The app is Developer ID signed and notarized by Apple — no Gatekeeper hoops. | |
| 159 | +4. Pick a starter model sized for your Mac and click **Download**. That's it — chat away, even offline. | |
| 160 | + | |
| 161 | +> 💡 Models are stored in `~/Library/Application Support/ZyquoLocal/Models/` and can be deleted from the in-app Library at any time (the app shows exactly how much space you'll reclaim). | |
| 162 | + | |
| 163 | +--- | |
| 164 | + | |
| 165 | +## 🧰 Requirements | |
| 166 | + | |
| 167 | +| | Minimum | | |
| 168 | +|---|---| | |
| 169 | +| **Mac** | Apple Silicon (M1 or later) — MLX requires it; Intel Macs are not supported | | |
| 170 | +| **macOS** | 14.0 (Sonoma) or later | | |
| 171 | +| **Memory** | 8 GB runs ≤4 B models comfortably · 16 GB → 7–14 B · 32 GB → 24–32 B · 64 GB → 70 B | | |
| 172 | +| **Disk** | 0.35 GB (smallest model) → 40 GB (Llama-3.3-70B); the app pre-checks free space | | |
| 173 | +| **Network** | Only for downloading models; inference is fully offline | | |
| 174 | + | |
| 175 | +--- | |
| 176 | + | |
| 177 | +## 🚀 Usage | |
| 178 | + | |
| 179 | +| I want to… | Do this | | |
| 180 | +|---|---| | |
| 181 | +| Get my first model | Launch → pick a starter card → **Download** → it auto-appears in the model chip | | |
| 182 | +| Chat | Type and hit `⌘↩`; press the stop button to halt generation instantly | | |
| 183 | +| See how a model thinks | Reasoning models stream into the collapsible **Thought process** section | | |
| 184 | +| Switch models | Click the model chip in the header (or `⌘K`) — verdicts tell you what fits | | |
| 185 | +| Tune generation | The sliders icon in the input bar (per-conversation) or Settings → Inference (defaults) | | |
| 186 | +| Ask from anywhere | `⌥Space` — Quick Chat floats above whatever you're doing | | |
| 187 | +| Race two models | Menu **Model → Compare Models…**, pick two, broadcast one prompt | | |
| 188 | +| Reuse a great prompt | The templates icon in the input bar — 56 built-ins with fillable variables | | |
| 189 | +| Share a conversation | Header export menu → Markdown or PDF | | |
| 190 | +| Use gated models (Llama, Gemma) | Settings → Models & Storage → add your Hugging Face token | | |
| 191 | + | |
| 192 | +--- | |
| 193 | + | |
| 194 | +## 🏗️ Building from source | |
| 195 | + | |
| 196 | +Zyquo Local is plain **Swift Package Manager** — no `.xcodeproj`, and the Xcode IDE is never required. Two prerequisites beyond the Command Line Tools: | |
| 197 | + | |
| 198 | +1. **Apple's Metal Toolchain** on `PATH` — MLX compiles its GPU kernels at build time. On a machine with Xcode 26+: `xcodebuild -downloadComponent MetalToolchain`; a standalone `Metal.xctoolchain` on `PATH` also works. | |
| 199 | +2. **SDK pin** on macOS 27 CLT setups: `SDKROOT=MacOSX26.5.sdk` (SwiftUI macros are Xcode-only plugins in the 27.x CLT SDKs). | |
| 38 | 200 | |
| 39 | 201 | ```sh |
| 40 | −make build # debug build | |
| 41 | −make dev # debug bundle (ad-hoc signed) + launch | |
| 42 | −make poc MODEL=<dir> PROMPT="…" # CLI inference proof-of-concept | |
| 43 | −make icon # regenerate AppIcon.icns from the SVG source | |
| 44 | −make release # Developer ID signed + notarized + stapled app & DMG | |
| 202 | +git clone https://github.com/spboucher-ai/zyquo-local.git | |
| 203 | +cd zyquo-local | |
| 204 | + | |
| 205 | +make build # debug build | |
| 206 | +make dev # debug bundle (ad-hoc signed) + launch | |
| 207 | +make poc MODEL=<model-dir> PROMPT="Hello" # CLI inference proof-of-concept | |
| 208 | +make icon # regenerate AppIcon.icns from the SVG source | |
| 209 | +make release # Developer ID signed + notarized + stapled app & DMG | |
| 210 | +``` | |
| 211 | + | |
| 212 | +The full recipe, the Metal-toolchain findings, and the research that pinned every dependency version live in [`docs/BUILD.md`](docs/BUILD.md) and [`docs/MLX-RESEARCH.md`](docs/MLX-RESEARCH.md). | |
| 213 | + | |
| 214 | +--- | |
| 215 | + | |
| 216 | +## 🏛️ Architecture | |
| 217 | + | |
| 218 | +``` | |
| 219 | +Sources/ZyquoLocal/ | |
| 220 | +├── App/ @main entry, scenes, CLI modes (--poc, --hub-poc, --verify) | |
| 221 | +├── DesignSystem/ ZyquoTheme — every color, font, spacing and radius token | |
| 222 | +├── Models/ Conversation, Message, LocalModel, DownloadTask, Persona | |
| 223 | +├── Engine/ InferenceEngine (actor) · ChatSession · MemoryAdvisor · GenerationParams | |
| 224 | +├── Hub/ HubService · DownloadManager · FileTransfer · ModelStore | |
| 225 | +├── Services/ Persistence · ModelCatalog · PromptLibrary · Personas · Export · Settings | |
| 226 | +├── ViewModels/ AppModel · ChatController (streaming + <think> parser) | |
| 227 | +└── Views/ Chat · Library · Settings · QuickChat · Compare · Components | |
| 45 | 228 | ``` |
| 46 | 229 | |
| 47 | −Full recipe and the Phase 0 findings: [`docs/BUILD.md`](docs/BUILD.md). | |
| 230 | +- **`InferenceEngine` is a Swift actor** — all inference behavior lives behind it; states flow `unloaded → loading → ready ⇄ generating`, generation is an `AsyncThrowingStream` of token/stats/finish events, and cancellation genuinely stops the loop. | |
| 231 | +- **Dependencies** (pinned, researched, minimal): `mlx-swift-lm` · `swift-transformers` (tokenization) · `swift-huggingface` · `swift-markdown`. Downloads use a custom `URLSession` transport — delegate-backed, chunked, Range-resumable. | |
| 232 | +- **7 300+ lines of Swift 6**, zero compiler warnings, every file headed and every screen built from design tokens. | |
| 233 | + | |
| 234 | +--- | |
| 235 | + | |
| 236 | +## 🗺 Roadmap | |
| 237 | + | |
| 238 | +- [ ] Multi-model residency (keep 2+ small models warm simultaneously) | |
| 239 | +- [ ] Prompt-cache persistence across launches (MLX `saveCache`) for instant long-context reload | |
| 240 | +- [ ] Vision-language models (MLXVLM) — image input for Gemma-3 / Qwen-VL class models | |
| 241 | +- [ ] Tool calling / MCP bridge for local agents | |
| 242 | +- [ ] Speculative decoding with paired draft models | |
| 243 | +- [ ] Sparkle-based in-app updates | |
| 244 | +- [ ] Localization (French first 🇫🇷) | |
| 245 | + | |
| 246 | +--- | |
| 247 | + | |
| 248 | +## 🤝 Contributing | |
| 249 | + | |
| 250 | +Issues and pull requests are welcome! | |
| 251 | + | |
| 252 | +1. Fork, then `git clone` your fork. | |
| 253 | +2. Follow [Building from source](#%EF%B8%8F-building-from-source) — `make build` must pass with **zero warnings**. | |
| 254 | +3. Match the existing style: design tokens only in views, inference logic only in `Engine/`, mandatory file headers. | |
| 255 | +4. `ZyquoLocal --verify` should stay green if you touch the engine or Hub layers. | |
| 256 | +5. Open a PR with a clear description of *what* and *why*. | |
| 257 | + | |
| 258 | +--- | |
| 259 | + | |
| 260 | +## 📄 License | |
| 261 | + | |
| 262 | +Released under the **[MIT License](LICENSE)** — © 2026 Simon-Pierre Boucher. | |
| 263 | + | |
| 264 | +--- | |
| 265 | + | |
| 266 | +## 👤 Author | |
| 267 | + | |
| 268 | +<div align="center"> | |
| 269 | + | |
| 270 | +**Simon-Pierre Boucher** | |
| 271 | + | |
| 272 | +📫 Contact: [contact@spboucher.ai](mailto:contact@spboucher.ai) | |
| 48 | 273 | |
| 49 | −## Verification | |
| 274 | +<br> | |
| 50 | 275 | |
| 51 | −`ZyquoLocal --verify` downloads a spread of Featured models (tiny → 8B, | |
| 52 | −multiple architectures), then for each: validates files, loads, runs a | |
| 53 | −deterministic generation, a multi-turn exchange, a streaming-cancellation | |
| 54 | −test, unloads and confirms memory release — and dry-verifies the entire | |
| 55 | −curated catalog against the live Hub. Results: [`docs/VERIFICATION.md`](docs/VERIFICATION.md). | |
| 276 | +*Zyquo Local is part of the Zyquo family of native macOS AI apps.* | |
| 56 | 277 | |
| 57 | −## Documentation | |
| 278 | +⭐ If Zyquo Local is useful to you, a star helps more people run their AI locally. | |
| 58 | 279 | |
| 59 | −- [`docs/PLAN.md`](docs/PLAN.md) — phase-by-phase build log | |
| 60 | −- [`docs/MLX-RESEARCH.md`](docs/MLX-RESEARCH.md) — MLX Swift stack research | |
| 61 | −- [`docs/MODELS.md`](docs/MODELS.md) — HF Hub API contract + curated catalog | |
| 62 | −- [`docs/BUILD.md`](docs/BUILD.md) — the no-Xcode build recipe | |
| 280 | +</div> | |
added
assets/icon/app-icon.png
+0 −0
Binary file not shown.
added
assets/screenshots/chat-dark.png
+0 −0
Binary file not shown.
added
assets/screenshots/discover.png
+0 −0
Binary file not shown.
added
assets/screenshots/library.png
+0 −0
Binary file not shown.