
Local Qwen on Apple Silicon is an MLX server on loopback, not Ollama, not LM Studio, and not the Qwen inside Cursor’s model picker. Use Python 3.11, the official 4-bit MLX quant, and mlx_vlm.server on port 8080. Cursor stays your conductor; this install is the worker that drafts GCT, Content Factory, and weekly MAA without burning Cursor tokens. Routing lives at Cursor and local Qwen. How Dennis sits at the desk: How I Use Local Qwen.

Who is this for?
Anyone who wants a Qwen on the Mac that a Cursor agent (or any other local agent) can call at http://127.0.0.1:8080/v1. If you came here from a Cursor chat that mixed up “Qwen in settings” with “Qwen on this laptop,” read the routing page first: Cursor and local Qwen.
This is not a Kimi Code install. Kimi is Moonshot’s hosted CLI. This is not a Claude skill-pack zip. Skill packs still start at New agents start here and localservicespotlight.com/install/.
What do you need?
- Apple Silicon Mac. We verified on a MacBook Pro with 128 GB unified memory on 25 August 2026. 27B 4-bit is about 16 GB of weights plus KV cache — 32 GB unified memory is a practical floor; 64 GB+ is comfortable.
- Python 3.11 (Homebrew’s default python3 may be 3.14; MLX wheels we used were cp311). We used
~/.local/bin/python3.11. - Hugging Face access to
mlx-community/Qwen3.8-27B-4bit(~16 GB download). - No Ollama. No LM Studio. Those are other stacks.
What exact stack did we ship?
| Piece | Value (25 Aug 2026) |
|---|---|
| Weights | Official mlx-community/Qwen3.8-27B-4bit (not a homemade 6-bit; no stock uniform 6-bit in that repo at ship time) |
| Why mlx-vlm | Qwen3.8 is a vision-language model. mlx-lm cannot load it. Server is python -m mlx_vlm.server. |
| Packages | mlx 0.32.1, mlx-lm 0.31.3, mlx-vlm 0.6.16, openai 3.3.1, langgraph 1.2.11 |
| Bind | --host 127.0.0.1 --port 8080 only. Do not publish this process to the internet. It has no real auth. |
| API | OpenAI-compatible /v1/chat/completions, model id as listed by GET /v1/models, Bearer token local |
| Download gotcha | Hugging Face Xet hung on this machine. Working env: HF_HUB_DISABLE_XET=1. Unauthenticated Hub was slow (~1 hour). |
How do you install it?
Team copy (private repo): ~/Projects/agent-runtime/local-qwen-agents/ — python3.11 -m venv .venv, then install from that folder’s requirements.txt.
Minimal server start once the quant is in the Hugging Face cache:
HF_HUB_DISABLE_XET=1 \ .venv/bin/python -m mlx_vlm.server \ --model mlx-community/Qwen3.8-27B-4bit \ --host 127.0.0.1 \ --port 8080
Wrapper we use on PATH: qwen up · qwen down · qwen status · qwen ping · qwen gct · qwen factory · qwen maa.
First load into unified memory is slow. qwen ping should return PONG. A sample GCT screen on this Mac returned DISCOVERY_REQUIRED in about 63 seconds at roughly 17 tokens per second decode. Treat those as one machine’s receipts, not a promise.
Confirm the server, not the Cursor picker:
curl -sS http://127.0.0.1:8080/v1/models
You should see mlx-community/Qwen3.8-27B-4bit. If that works and Cursor still “cannot see Qwen,” you are looking at the wrong lane. Read Cursor and local Qwen.
Every completion on this Mac is logged without prompt text. The public meter — tokens, usable vs rejected drafts, Anthropic list-price equivalent — is on the routing page and on How I Use Local Qwen. Same method as the Claude usage log: show the numbers, do not invent an invoice.
How do you point Cursor at it?
You do not paste http://127.0.0.1:8080 into Cursor → Models → Override OpenAI Base URL. Cursor’s cloud cannot call your loopback. You add a Cursor rule that says: I am the conductor; for GCT / factory / MAA first drafts, run qwen (or POST to port 8080) without waiting to be asked.
Save this as an always-apply Cursor rule (team file: local-qwen-agents/cursor-rule.mdc):
--- description: Local MLX Qwen is a cheap worker. Delegate GCT/factory/MAA first drafts without being asked. Not Cursor's chat model. Not Kimi. alwaysApply: true --- # Local Qwen worker — auto-delegate Public map: https://blitzmetrics.com/cursor-and-local-qwen/ Install: https://blitzmetrics.com/install-local-qwen/ Local Qwen is a **worker**. You (Cursor Grok / Claude / Composer) are the **conductor**. Cursor Auto and the model picker do **not** call localhost. Do not paste 127.0.0.1 into Override OpenAI Base URL. Cloud Qwen in Cursor settings is a different vendor. Kimi Code (`kimi`) is a different hosted CLI. If the task is GCT, Content Factory (Produce → Process → Post → Promote) first drafts, weekly MAA first drafts, or bulk rewrites after you set the offer: run local Qwen without waiting to be asked. Stage only. Never send, publish, or spend from that worker. If ping fails after up, say so and stay on the Cursor model.
Any other agent (Claude Code, Codex, a Python script, LangGraph) uses the same OpenAI-compatible URL. That is the point of staying on /v1.
What about 6-bit, 8-bit, or a smaller Qwen?
We shipped 4-bit because it is the official mlx-community file and it fits. An 8-bit sibling exists if you later prefer quality over RAM. A smaller Qwen is a different worker: keep the same port convention or you will train agents to guess. Change the model id in one config, not in tribal chat.
FAQ
Why not Ollama?
Dennis asked for a clean MLX path. Ollama is fine for other desks. This page documents the stack we actually ran and verified.
Can I use this as my only Cursor model?
Not as the picker model, for the loopback reason on the routing page. You can use it as the only writer of first drafts.
Does local Qwen send email or publish WordPress?
No. Stage only. Conductor keeps Gmail drafts, Basecamp, and Application Passwords.
Where is the agency work defined?
Content Factory (Produce → Process → Post → Promote), GCT, MAA, model judgment.
Should I tunnel port 8080 so Cursor’s picker can see it?
No. The MLX server has no real auth. A tunnel also replaces the conductor. Keep loopback. Let the agent call it.
Parent map: Cursor and local Qwen. Desk playbook: How I Use Local Qwen. Building in public: Building in Public. Everything else: canonical directory.

