Control Panel
Run a local model on your Mac with a compressed memory footprint, using a point-and-click web app — no Python required.
:::info Runs on your Mac, not in your browser alone This app starts a real local server on your own machine, using your Mac's own chip. There's no hosted version — install VeloxQuant-MLX first, then run the command below. :::
Install
pip install veloxquant-mlx
Start the panel
veloxquant panel
Your browser opens automatically at http://127.0.0.1:7860.
Set it up
- Model — paste a model name, e.g.
mlx-community/Llama-3.2-1B-Instruct-4bit. (Don't have one yet? Any model from mlx-community on Hugging Face works.) - Compression method — leave it on the default if you're not sure. It's a safe, broadly-compatible choice.
- Click Start Server. The status pill goes
Starting→Running. - Copy the Base URL shown on the page.
That's it — you now have a local, OpenAI-compatible endpoint running on your Mac.
Chat with it
Paste the Base URL into any tool that supports a custom OpenAI-compatible endpoint — Cursor, a chat UI, or your own script.
With Python:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="not-needed")
response = client.chat.completions.create(
model="default_model",
messages=[{"role": "user", "content": "Say hi"}],
max_tokens=50,
)
print(response.choices[0].message.content)
Or from the terminal:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"default_model","messages":[{"role":"user","content":"Say hi"}],"max_tokens":50}'
When you're done, click Stop Server in the panel to shut it down and free the port.
What "compression" means here
VeloxQuant shrinks the memory a model's conversation history takes up (its "KV cache"), so you can hold longer conversations or run bigger models on the same Mac.
One honest caveat: the compression ratio shown in the panel today describes how well the data compresses, not how much memory your Mac actually saves while running — that part is still on our roadmap. So don't expect your Mac's memory usage to drop by the ratio shown; think of it as a preview of where we're headed, not a live memory saving yet.
If something goes wrong
| What you see | What it means |
|---|---|
| "port already in use" | Something else is using that port — try a different one, or stop the other program. |
| "cannot be served" for a method | That method isn't supported by the server yet — pick a different one from the list. |
| "model not found" | Double check the model name, or make sure you're online the first time (it needs to download). |
| "ran out of memory loading the model" | The model is too big for your Mac's RAM — try a smaller one. |
Status flips to Error while running | The server crashed. Scroll the log at the bottom of the page to see why. |
Prefer the command line?
Everything the panel does, you can also run directly:
veloxquant serve \
--model mlx-community/Llama-3.2-1B-Instruct-4bit \
--host 127.0.0.1 --port 8000
The server reuses prompt prefixes across requests automatically (so a second
request sharing a long system prompt with an earlier one skips re-prefilling
it) — tune how much it retains with --prompt-cache-size (max number of
distinct prefixes kept, default 10). --prompt-cache-bytes is also accepted
but, in the currently supported mlx_lm version, is parsed and not actually
applied by its server — the CLI will warn if you set it. Use
--prompt-cache-size to control memory instead. See the
mlx_lm Integration guide
for the equivalent for direct mlx_lm.generate() callers, and for which KV-cache
methods support partial-prefix reuse versus exact-repeat-only.
Method-specific overrides with --set
Beyond --bits, method-specific KVCacheConfig fields (e.g. svdq_rank for
svdq, kivi_group_size for kivi) are set with a repeatable
--set FIELD=VALUE:
veloxquant serve \
--model mlx-community/Llama-3.2-1B-Instruct-4bit \
--method svdq \
--set svdq_rank=32
Run veloxquant methods --json to see which fields apply to a given method.
Values are type-checked against the KVCacheConfig dataclass before the model
loads, so a bad value (wrong type, unknown field name) is rejected with the
field name in the error rather than failing deep inside cache construction.
About 20 of KVCacheConfig's fields — svdq_rank among them — are
optional: they default to None and fall back to a computed default when
left unset (svdq_rank=None means "derive the rank from
svdq_energy_threshold instead of using a fixed rank"). Passing --set svdq_rank= (blank on the right of =) explicitly clears the field back to
that None/computed-default behavior — it is not an error, and it is the only
way to reset an optional field once you've set it to a concrete value. The
same blank-clears-to-default behavior applies in the panel's UI: leaving one
of these fields empty is a deliberate choice to use the computed default, not
a validation failure.