On-demand model swapping
One endpoint, every model. A request naming a model that isn't loaded swaps it in, evicting whatever no longer fits, and holds the group together when several have to coexist.
Quartermaster is an all-in-one local inference platform. Point it at your models folder: it works out what fits in your VRAM, launches each model with computed flags, and hot-swaps between them on demand behind one OpenAI- and Anthropic-compatible API.
v1.0.2 · all releases · Docker and source below
No signed macOS build yet. After downloading: xattr -d com.apple.quarantine ./quartermaster-setup-darwin-arm64-v1.0.2
One endpoint in front of every model you own, the sizing decisions made for you instead of by you, and a front end for all of it.
Point it at a folder. Every GGUF is identified from its own header, and context length, GPU offload, CPU-MoE split and KV-cache sizing are computed per model and per architecture. No hand-written config block per model, and no second block when a new quant lands.
Per-model parametersContext, KV cache, offload and speculative decoding, with the computed default one click away.
Fully customizableThe whole llama-server command line is right there and editable. Edits fold back into the fields above, and flags Quartermaster doesn't model are kept verbatim, the UI is a layer over the flags, not a replacement for them.
Free VRAM is sampled at startup and every model is sized against what is actually left, not against the number on the box. The gauge breaks a load down the way the card sees it, so an estimate that is about to go wrong is visible before you press load rather than after the driver kills the process.
VRAM breakdownOne bar per segment: weights, KV cache, compute buffer, and what the rest of the system already holds.
It orchestrates llama-server, stable-diffusion.cpp, TTS and transcription servers, rerank and embedding models, upscaling and segmentation, all behind one OpenAI-compatible surface. Then it gives you a front end for them, on its own port with per-user login and server-side history, so a model is not just reachable the moment it is discovered, it is useful, with nothing else installed in front of it.
ChatAn ordinary conversation, with the thinking stream kept out of the answer.
Tools and web searchThe model calling out mid-conversation and reading a result in full.
Image generationDiffusion models in the same catalog, driven from the same UI.
SpeechText to speech and transcription against your local voices.
Search Hugging Face from inside the app, compare quants against the VRAM you actually have, and download into your models folder with the transfer resumable if it breaks. What lands is picked up and configured without a restart.
Model hubSearch, pick a quant, download into your models folder.
Manage modelsEvery discovered model, grouped by GGUF, with its variants under it.
The backends it ships with install themselves from their upstream GitHub releases, but nothing is hard-wired to them. Point a row at a binary you built yourself and it joins the same registry: picked per model class, launched with the flags the config generates, no different from a managed install. Or hand it a GitHub repo and it follows that project's releases for you.
Settings, BackendsManaged installs on top, the registry they write into underneath: every row is a binary Quartermaster can spawn, whether it installed it or you did.
A plethora of features to make it a breeze to run your models the way you want to
One endpoint, every model. A request naming a model that isn't loaded swaps it in, evicting whatever no longer fits, and holds the group together when several have to coexist.
Snapshots a slot's KV-cache to disk before the model is evicted and restores it when the conversation comes back, so a long chat isn't re-prefilled because a throwaway request borrowed the GPU.
Bind several listeners on one shared scheduler, each with its own /v1/models view. Loading on one port can evict on another: one process, one GPU accounting.
Activity, streaming logs, per-model performance and context use on one page, so a slow request is something you can look at rather than guess about.
API keys can be scoped to individual models. Bind the API to your tailnet and the dashboard and config endpoints answer to localhost only unless you widen them yourself.
Prometheus metrics, a log stream you can pipe, ops endpoints to load and unload a model on demand, and a config file that hot-reloads when you edit it. No plugin system to learn: the surface is HTTP and YAML.
Every model meant another hand-written block of config: how much context, how many layers on the GPU, how big the KV cache, whether the experts go on the CPU. Then a new quant lands and you do it again. Sometimes I wanted a configuration with high context, other times I wanted a very lean model load to allow something else on my GPU at the same time. The solution I came up with is the variants system.
It started as a fork of llama-swap, which had the swapping right, and grew in the obvious direction from there: read the GGUF header, measure the VRAM that is actually free, and compute the numbers instead of typing them. Once that worked the rest followed. Image and audio backends in the same catalog, several ports sharing one scheduler, a KV-cache that survives being evicted, and a UI that shows what the box is doing rather than a log you have to tail.
It is its own thing now.
Windows, Linux, macOS and Docker, from the same single binary. The installer and the Docker image bring the inference backends with them; everywhere else you install them from Settings on first run, or point at ones you already have.
A per-user install, no admin rights needed. The first-run wizard fetches the inference backends, asks for your models folder, and generates a config before the window opens.
Download v1.0.2 · 32 MBThe same wizard, in your browser: it fetches a verified binary, the backends for your GPU, and a config built from your models folder. It prints the address it serves on and holds the terminal until you finish, so open that address if no browser appears. On macOS clear the quarantine flag first. Or take the bare static binary instead, amd64 and arm64 for Linux and Apple silicon for macOS, and install the backends later from Settings.
chmod +x quartermaster-setup-darwin-arm64-*xattr -d com.apple.quarantine quartermaster-setup-darwin-arm64-*./quartermaster-setup-darwin-arm64-*
One image, for linux/amd64 and linux/arm64, and it serves the moment it starts: llama-server and sd-server ship inside it, the same upstream Vulkan builds a desktop install downloads. Point it at your models folder and open the dashboard.
docker run -p 127.0.0.1:1250:8080 -v quartermaster-data:/data \ -v ./models:/data/models ghcr.io/quartermaster-labs/quartermaster:latest
Prefer to build it yourself? Building from source takes Go 1.26+ and Node 24 for the UI, one binary out the other end.
These are the same help articles behind the Help button in the sidebar, and the assistant in the playground searches them as a tool, so the quickest way to learn Quartermaster is to open the chat and ask. Why did my model get evicted, what does this flag do, how do I cap the VRAM budget: it reads the manual and answers with your setup in front of it.