CLI
Paddock ships two programs. paddock is the manager: it runs the Studio, owns the catalog and downloads, and supervises model servers. paddock-runner is one model server, and it is what actually holds a model on the GPU.
You can drive everything from the manager and never invoke a runner by hand. You can also run a runner on its own with no manager at all, which is what the config file it leaves behind is for.
paddock
Running paddock with no verb starts the manager and the Studio on http://127.0.0.1:11500. Model servers get their own ports, allocated upward from 11540.
# start the manager and the Studio
paddock
# download a catalog model, hash-verified
paddock pull qwen3.6-27b
# start an endpoint for it and wait until it is healthy
paddock serve qwen3.6-27b
# what is running
paddock psVerbs
| Verb | What it does |
|---|---|
inspect <PATH> | Reads a GGUF file and prints its model card. --json for the full machine-readable report. |
pull <ID> | Downloads a catalog model, weights and companions, into the models directory and verifies the hashes. Runners never download; this is the manager's job. |
serve <MODEL> | Starts a new endpoint: writes ~/paddock/servers/<port>.toml, launches a runner against it, pulls the model first if needed, waits for health, and prints the endpoint. Takes a catalog id, an installed model name, or a GGUF path. |
start <PORT|NAME> | Starts an already-configured endpoint from its file, verbatim, hand-edits included. |
stop <PORT|NAME> | Drains and stops a running model, then waits for it to exit. The endpoint stays configured, so start brings it back. |
switch <MODEL> | Same-port takeover: changes which model an endpoint serves without moving the port. |
ps | Lists runners on this machine, both its own and adopted ones, with live health. |
pin <PORT> | Marks a runner as never auto-stopped to make room, and excludes its VRAM from the reclaimable figure. --remove unpins. |
logs | Streams logs: a runner's by port, the manager's own with --manager, or the merged source-prefixed set, which is the default. --follow tails. |
Manager Flags
| Flag | Description | Default |
|---|---|---|
--host <IP> | Address to bind the Studio and manager API to | 127.0.0.1 |
--port <PORT> | Port for the Studio and manager API | 11500 |
--model-dir <PATH> | Directory to scan for GGUF models (repeatable) | ~/paddock/models |
serve takes the spawn's shape as flags of its own: --port, --max-ctx, --max-batch, --gpu to pin the runner to one card, --artifact to pick a weights variant such as q4, --pin, and --fp8-native.
paddock-runner
One runner serves one model. Everything is settable three ways with a fixed precedence: CLI flags override PADDOCK_* environment variables, which override the config file, which overrides the built-in defaults.
# serve a model directly
paddock-runner --model ~/paddock/models/your-model.gguf \
--device cuda --kernel-pack pd-cuda-sm120.so \
--max-ctx 16384
# run the config file the manager wrote
paddock-runner --config ~/paddock/servers/11540.toml
# hand that endpoint to the OS so it starts at boot
paddock-runner service install --config ~/paddock/servers/11540.tomlservice install registers a native Windows service or a systemd unit, and service uninstall removes it. No manager process is involved. See Running as a Service.
Flags
| Flag | Environment | Description | Default |
|---|---|---|---|
-c, --config <PATH> | - | Config file to load | ./paddock.toml if present |
--host <IP> | PADDOCK_HOST | Address to bind the HTTP API to. The default serves the network, which is why a key is required unless the caller is on loopback. | 0.0.0.0 |
--port <PORT> | PADDOCK_PORT | Port to bind the HTTP API to | 11540 |
-m, --model <PATH> | PADDOCK_MODEL | GGUF model to load and serve at startup | none |
--model-dir <PATH> | PADDOCK_MODEL_DIRS | Directory to scan for GGUF models (flag is repeatable; the env var is comma-separated) | ~/paddock/models |
--device <DEVICE> | PADDOCK_DEVICE | Compute device: cuda or cpu | cuda |
--gpu <ID> | PADDOCK_GPU | Which GPU to serve on: a CUDA ordinal or a device UUID prefix | first device |
--kernel-pack <PATH> | PADDOCK_KERNEL_PACK | Kernel pack path, required for --device cuda | none |
-c, --max-ctx <N> | PADDOCK_MAX_CTX | Max context length (KV cache). Aliases --ctx-size, --max-model-len | 4096 |
--max-batch <N> | PADDOCK_MAX_BATCH | Continuous-batching width: concurrent sequences per step (1 = serial loop). Aliases --parallel, --np, --max-num-seqs | 32 |
--mmproj <PATH> | PADDOCK_MMPROJ | Vision tower GGUF (mmproj) enabling image input | none |
--mtp <PATH> | PADDOCK_MTP | MTP drafter GGUF for speculative decoding | none |
--vram-budget <MIB> | - | Hard VRAM ceiling: pools size inside it, and a load that cannot fit refuses rather than oversubscribing the card | none |
--max-output-tokens <N> | PADDOCK_MAX_OUTPUT_TOKENS | Default max output tokens per reply when a request does not specify one | none |
--api-key <KEY> | PADDOCK_API_KEY | API key required for Bearer auth | none |
--web-search-provider <NAME> | - | Provider for the server-executed web_search tool: exa or tavily | none |
--web-search-api-key <KEY> | - | Your API key for that provider | none |
--mcp-servers <JSON> | PADDOCK_MCP_SERVERS | Registered MCP servers as one JSON array, so the endpoint's own tools are part of its contract | none |
Exposed Deployments
These matter when a runner is reachable from more than your own machine.
| Flag | Description |
|---|---|
--max-output-ceiling <N> | Hard ceiling on generated tokens per reply, clamping whatever a request asks for. |
--ratelimit-per-minute <N> | Per-client generation-request rate limit. |
--ratelimit-per-day <N> | Per-client generation-request daily quota. |
--trusted-proxy | Trust a reverse proxy's X-Real-IP when keying rate limits. Without it the limits key on the connecting address, which behind a proxy is the proxy. |
--no-auth | Explicitly disable Bearer auth on a network bind. Only for deployments where a firewall or reverse proxy carries the auth; the server logs a loud warning. |
--metrics-auth <on|off> | Whether /metrics requires the API key. Default is loopback open, network callers authenticated. See Metrics. |
--no-metrics | Remove the Prometheus endpoint entirely. |
--no-events | Disable the per-request event ring the activity log is built from. Metadata-only and in memory; independent of --no-metrics. |
Two PDF settings exist only as config-file keys or environment variables, not flags: pdf_max_pages (PADDOCK_PDF_MAX_PAGES, default 20) caps pages rendered per document, and pdf_page_long_edge (PADDOCK_PDF_PAGE_LONG_EDGE, default 1568) sets the target long edge in pixels for each rendered page. The renderer itself is built into the binary and needs no configuring.
The Config File
The config file uses the same names as the flags, with model_dirs as a list and max_tokens for the output-token default. Unknown keys and malformed files are errors that stop startup. paddock serve writes one of these per endpoint at ~/paddock/servers/<port>.toml, and the file is yours to keep, hand-edit, or run without the manager.
host = "127.0.0.1"
port = 11540
model = "~/paddock/models/your-model.gguf"
model_dirs = ["~/paddock/models"]
device = "cuda"
kernel_pack = "pd-cuda-sm120.so"
max_ctx = 16384
max_batch = 16Authentication
- A caller on loopback. Never needs a key, whatever the server is bound to.
- A caller over the network, no key configured. The server generates one at startup, prints it in the banner, and requires it. This is the default, because the default bind serves the network.
- Explicit key. Required on every request.
When auth is on, clients send Authorization: Bearer <key> on /v1 and /api paths.
Startup Banner and Logs
The banner prints the resolved configuration after the socket binds, tagging each value that came from an environment variable or a flag so you can see where every setting originated. Log filtering follows the standard RUST_LOG environment variable; the default is info with debug-level logging for Paddock's own crates. The banner respects NO_COLOR and drops color when output is piped.
Inspecting A Model File
paddock inspect reads a GGUF file and prints its model card: file size and GGUF version, architecture, trained context length, geometry (blocks, embedding width, attention and KV heads, sliding window), expert counts for MoE models, tokenizer and whether a chat template is embedded, tensor count, and the quantization mix with per-type sizes. Sizes that cannot be verified are reported as unknown instead of estimated.
# human-readable card
paddock inspect ~/paddock/models/your-model.gguf
# full report as JSON
paddock inspect ~/paddock/models/your-model.gguf --jsonTo measure a served endpoint rather than inspect a file, see Benchmarking.