open source · GPU-native · dual backend
Two engines. One dashboard. Zero config headaches.
Pick a profile in the TUI or shell — llmux runs the right engine for you.
the problem
01
vLLM wants HF Transformer weights. llama.cpp wants GGUF. Different images, different flags, different compose files.
$ vllm serve — or — $ llama-server --model ...02
Start llama.cpp on 8080, forget that vLLM was already on it. Container crash, logs panic, you dig for the offender.
$ docker ps | grep 808003
Find the file name, hf download, move to models/, edit compose, hope the path matches.
$ hf download ... && vim docker-compose.yaml04
Want to compare a GPTQ vLLM run against a Q4_K_M GGUF run? Write the curl by hand, time it yourself, twice.
$ time curl /v1/chat/completions ...how it works
One .env.common holds your HF token and cache path. Both backends share it.
Press n, pick vLLM or llama.cpp, type a model name. Profile + config auto-generated.
Cross-backend conflict gate checks ports and GPUs, then spins the container on the OpenAI-compatible API.
demo
terminal
before & after
features
Every vLLM and llama.cpp profile shows up in the same list. Start, stop, logs, edit — all keyboard-driven.
Catches port + GPU collisions between vLLM and llama.cpp before docker is even touched.
A live tok/s column on the dashboard, polled from each container's /metrics (llmux stats). Plus a warmup + median /v1/chat/completions bench for either engine.
llama.cpp profiles ride llama-server's -hf / -hff to download GGUFs straight into the host HF cache on first start. No host-side hf CLI, no manual models/ wiring.
Press m, type a HF repo, get per-GPU fit estimates powered by hf-mem. Works for both backends.
Real-time GPU usage bars on the dashboard, auto-refresh every 5 seconds. No more nvidia-smi in a loop.
Every TUI feature has a Typer CLI twin — llmux up, bench, profile quick-setup, image build-dev, system mem-estimate. Scripted from day one.
Pin a profile to any docker image — vllm-dev:<branch>, an official version, or a custom registry tag — via profile.image_tag. UI override beats the pin, the pin beats the default.
Build vLLM or llama.cpp from source with one command. Auto-detects your GPU compute capability (CUDA_DOCKER_ARCH / TORCH_CUDA_ARCH_LIST) so the image only ships what your card actually runs.
Flip any config flag on or off without deleting it — a row switch in the TUI, or config edit --disable/--enable from the CLI. Disabled flags are parked as inert comments, and your own hand-written notes survive every edit.
Rename a profile or a config in place — R in the TUI, or profile rename / config rename headless. Profiles pointing at a renamed config are repointed automatically, and a rename is refused while the container is running rather than orphaning it.
what's next
llmux profile clone duplicates a profile within a backend today. What's still
open is cross-backend cloning — turning a vLLM profile into its llama.cpp GGUF equivalent
in one keystroke, to pair with the built-in OpenAI-compatible bench for apples-to-apples
throughput/latency.
Q4_K_M vs Q8_0 given target GPU and the built-in memory estimator.
faq
gpu_id and port in profiles.yaml.
enable_lora: true in profiles.yaml + LORA_BASE_PATH in .env.common).
llama.cpp LoRA support is on the roadmap.
--no-webui unconditionally. Only the OpenAI-compatible HTTP API is exposed,
so both engines look identical to clients.
uv is recommended for the TUI's venv but pip works too.