Lemonade is a local AI server: install it, pull a model, and you get chat, coding, image generation, speech and transcription on your own hardware, behind the same OpenAI, Anthropic and Ollama style APIs that hundreds of apps already speak. It picks an engine for each job, llama.cpp for language models, Stable Diffusion for images, Whisper for transcription and Kokoro for speech, and handles the downloads and hardware setup.
What sets it apart is hardware reach. AMD engineers contribute optimisations for Ryzen AI NPUs, Radeon GPUs and Strix Halo, and it runs GGUF, ONNX and FLM models across CPU, GPU and NPU, with CUDA, Metal and Vulkan back ends too. The lemonade command runs models, lists and pulls them, sets aliases with failover, and lemonade launch connects a coding agent such as Claude Code or OpenCode to a local model.
It is Apache-2.0 at about 6,000 stars and moves fast, with release v2026.43.3 when scanned. It is a younger project than Ollama, so fewer apps name it directly, but its Ollama-compatible API covers most of them.
- Repository: github.com/lemonade-sdk/lemonade
- Licence: Apache-2.0 (Apache License 2.0)
- Language: C++. Stars: 6,000. Forks: 538. Last push: Oct 26, 2026.
- Scan: safe, Oct 26, 2026, commit 04d6f0f
Who it is for
Owners of AMD Ryzen AI laptops and Radeon GPUs who want their NPU and GPU used properly, and anyone who wants one local server for text, images and speech instead of three separate tools.
Getting started
1. Ubuntu: install from the stable PPA (Windows: run the MSI; macOS: the .pkg on the releases page)
sudo add-apt-repository ppa:lemonade-team/stable && sudo apt install lemonade-server2. Download and chat with a model
lemonade run Gemma-4-E2B-it-GGUF3. Point Claude Code at a local model
lemonade launch claudeThe web interface is at http://localhost:13305 once the server is running. The Windows MSI is at github.com/lemonade-sdk/lemonade/releases/latest/download/lemonade.msi. If you use the Docker image, its docs warn that -p 13305:13305 exposes an unauthenticated API on every interface: publish to 127.0.0.1 or set LEMONADE_API_KEY.
Safety scan
We cloned lemonade-sdk/lemonade at commit 04d6f0f on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No secrets, no committed binaries and no bare-IP URLs across about 346,000 lines of C++, TypeScript and Python.
- The persistence hits are the packages registering the server as a service: postinst-rpm creates a lemonade user and enables lemond.service under systemd, and the macOS package installs a LaunchAgent. That is what a background server should do, but it means Lemonade runs until you stop or uninstall it.
- The curl | sh hits are benign. setup.sh (847 lines, uses sudo) is the developer build script and installs Rust with rustup; agent_launcher.cpp only prints the OpenCode and Junie install commands for you to run if those agents are missing. Engines such as llama.cpp builds are downloaded from GitHub releases when you pick a back end.
- The 147 known advisories (4 critical, 62 high) sit in the two front ends, src/app (the Tauri desktop app) and src/web-app, including DOMPurify, shell-quote and follow-redirects. Some of that code ships to users inside the interface; the C++ server itself has no lockfile advisories.
- 27 workflows. Two use pull_request_target: auto-label and a Claude review that runs only when a maintainer requests it. Both check out the base branch, not the pull request, though the review job does hand the pull request to an AI model holding an API key. No third-party action is pinned to a commit. Dependabot, licence and contributing guide present; no security policy or CodeQL.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | 5 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 1 Cargo build script. 2 installer scripts (one fetches and runs a remote script; one can call sudo) |
| Committed binaries | None. |
| CI workflows | 27 workflows. 2 use pull_request_target, none check out the pull request head. 16 of 16 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often lemonade-server.ai, huggingface.co, github.com, raw.githubusercontent.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 147 advisories across 1,062 pinned packages: 4 critical, 62 high, 49 moderate, 19 low, 13 unrated. src/app/package-lock.json: 483 packages, 50 advisories; src/app/src-tauri/Cargo.lock: 591 packages, 22 advisories; src/web-app/package-lock.json: 221 packages, 80 advisories. |
| Project hygiene | Has automated dependency updates, licence file, contributing guide. Missing security policy, CodeQL. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Pattern hits (5)
| Where | Rule | Match |
|---|---|---|
| setup.sh:767 | download-piped-to-shell | if curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path; then |
| src/cpp/cli/agent_launcher.cpp:216 | download-piped-to-shell | " curl -fsSL https://opencode.ai/install | bash\n" |
| src/cpp/cli/agent_launcher.cpp:291 | download-piped-to-shell | " curl -fsSL https://junie.jetbrains.com/install.sh | bash\n" |
| src/cpp/postinst-full-mac:17 | persistence | AGENT_PLIST="${INSTALL_ROOT}/Library/LaunchAgents/${AGENT_LABEL}.plist" |
| src/cpp/postinst-rpm:29 | persistence | systemctl enable lemond.service > /dev/null 2>&1 || true |
Installer scripts (2)
Worst known vulnerabilities (24 of 147)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-cg2g-xh64-v4q7 | critical | dompurify@3.4.11 | DOMPurify SAFE_FOR_TEMPLATES bypass: split template expressions survive in attached shadow root content on DOM output mo… |
| GHSA-jqcg-44mw-7w3h | critical | proxy-addr@2.0.7 | proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet |
| GHSA-pqg4-j6r4-53mv | critical | shell-quote@1.8.4 | shell-quote: `quote()` command injection via a line terminator in a token after a `{ comment }` token |
| GHSA-cg2g-xh64-v4q7 | critical | dompurify@3.4.10 | DOMPurify SAFE_FOR_TEMPLATES bypass: split template expressions survive in attached shadow root content on DOM output mo… |
| GHSA-vc2v-76pw-4v95 | high | compression@1.8.1 | compression vulnerable to Denial of Service via memory leak on premature response close |
| GHSA-mrv2-3pqr-j5jr | high | dompurify@3.4.11 | DOMPurify IN_PLACE: hook that removes a parent or sibling leaves the detached subtree's event handlers armed (incomplete… |
| GHSA-27r3-jxmh-p828 | high | body-parser@1.20.5 | body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body |
| GHSA-8r9p-f939-6h3c | high | follow-redirects@1.16.0 | follow-redirects sensitiveHeaders regex escaping can expose credential headers |
| GHSA-q3jh-wrc6-jgq8 | high | follow-redirects@1.16.0 | follow-redirects array-form headers bypass cross-origin credential stripping |
| GHSA-587h-7wmj-h5pm | high | launch-editor@2.14.1 | launch-editor: `fs.existsSync()` existence check can be bypassed on Windows |
| GHSA-395f-4hp3-45gv | high | shell-quote@1.8.4 | shell-quote: Quadratic-complexity Denial of Service in `parse()` (CWE-407) |
| GHSA-v245-v573-v5vm | high | linkify-it@5.0.1 | linkify-it: Quadratic-complexity DoS via the `mailto:` validator scan-loop on attacker text |
| GHSA-gfr2-rv44-r23c | high | markdown-it@14.2.0 | markdown-it: Quadratic-time rendering of a single multi-line link reference definition with default options (regression … |
| GHSA-r7fv-28h4-cvq7 | high | markdown-it@14.2.0 | markdown-it: Quadratic complexity in smartquotes with unmatched closing quotes |
| GHSA-r28c-9q8g-f849 | high | postcss@8.5.15 | PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure |
| GHSA-28wg-ghj8-5hjv | high | nanoid@3.3.12 | nanoid: non-secure generators can loop indefinitely with negative size |
| GHSA-2v37-7h3g-55p8 | high | nanoid@3.3.12 | nanoid: custom generators can loop indefinitely when size is zero |
| GHSA-68fv-2mgg-jv7q | high | source-map-js@1.2.1 | source-map-js allows event-loop denial of service through indexed source-map section offsets |
| GHSA-4c8g-83qw-93j6 | high | fast-uri@3.1.2 | fast-uri vulnerable to host confusion via failed IDN canonicalization |
| GHSA-7p8r-x3mc-p8w7 | high | fast-uri@3.1.2 | fast-uri vulnerable to host confusion via backslash authority introducer |
| GHSA-f65p-4m7j-42xc | high | fast-uri@3.1.2 | fast-uri vulnerable to server-side request forgery via malformed IPv6 normalization |
| GHSA-fph4-wmhf-6fwf | high | fast-uri@3.1.2 | fast-uri vulnerable to server-side request forgery via repeated hostname percent-decoding |
| GHSA-jqff-g426-hqxp | high | fast-uri@3.1.2 | fast-uri vulnerable to host confusion via percent-encoded scheme normalization |
| GHSA-qw65-cvwx-89v3 | high | fast-uri@3.1.2 | fast-uri vulnerable to authority injection via an unvalidated port in serialize |
Workflows worth a look
- .github/workflows/auto-label.yml: pull_request_target
- .github/workflows/claude-review.yml: pull_request_target
By the numbers
| Stars | 6,000 |
|---|---|
| Forks | 538 |
| Contributors | 142 |
| Commits | 1,720 |
| Open issues | 431 |
| Open pull requests | 176 |
| Releases | 80 |
| Latest release | v2026.43.3 |
| Licence | Apache-2.0 |
| Main language | C++ |
| Project age | 1 year |
| Last push | Oct 26, 2026 |
| Tracked files | 1,169 |
| Lines of code | 345.7K |
| Checkout size | 18 MB |
Lines by language: C++ 109K, TypeScript 53.1K, Python 47.1K, CSS 31.6K, Markdown 26K, C/C++ header 21.6K.
Questions
Is Lemonade free?
Yes. Lemonade is free and open source under Apache-2.0, and the models it runs are free to download under their own licences. An experimental option can route requests to cloud providers such as OpenRouter or Fireworks, which charge separately, but it is off unless you configure it.
Do I need an AMD computer to use Lemonade?
No. It runs on CPUs and on NVIDIA, Apple Silicon and other GPUs through llama.cpp's CUDA, Metal and Vulkan back ends. AMD hardware gets extra optimisations, and Ryzen AI NPU support is where it stands out.
How is Lemonade different from Ollama?
Both serve local models behind an API. Lemonade also covers image generation, speech and transcription in the same server, targets NPUs as well as GPUs, and exposes OpenAI, Anthropic and Ollama compatible APIs, so apps built for Ollama can use it too.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
