Use a local model.

Puggie can talk to a model server on your own computer, a GPU box or a spare machine on your network. No Puggie account, no token bill and no source checkout: start an OpenAI-compatible server, add its address in the app, and give it to a bot.

What Puggie supports

Any server that speaks the OpenAI chat API works. These four get a little extra help: Puggie asks them for their model list and reads the context and vision support they report.

ServerBase URL on the same machineWhat Puggie reads
llama.cpp
llama-server
http://127.0.0.1:8080/v1The context and vision projector from /props; its models can also be the decision model.
Ollama
ollama serve
http://127.0.0.1:11434/v1Context from num_ctx or the loaded model, and vision from the model's capabilities.
vLLM
vllm serve
http://127.0.0.1:8000/v1The context it serves (max_model_len).
LM Studio
the app's local server
http://127.0.0.1:1234/v1The loaded context length, and whether a model is a vision model.
Another server
anything OpenAI-compatible
https://models.example.com/v1Its /models list if it has one; otherwise type the model IDs yourself.

The base URL must be the API root that has /models and /chat/completions under it; for most servers that means it ends in /v1. Puggie does not download, load or manage models. It only sends requests to the server while a bot works.

Before you start

A bot is not a single chat turn. It reads a long prompt with tool definitions, calls tools, reads the results and goes on for several turns. A model that is pleasant in a chat window can still be a poor fit for a bot: it needs to follow instructions, call tools reliably and keep enough context to remember the job.

Run the server

The commands below listen on 127.0.0.1 only. That is what you want when the bot runs on the same computer as the model. To reach it from another machine, put HTTPS in front of it (below) rather than opening the raw port.

llama.cpp

Download or build llama-server and point it at a GGUF file. The alias is the model ID Puggie will show.

llama-server \
  -m /models/Qwen3-14B-Q4_K_M.gguf \
  --alias qwen3-14b \
  --host 127.0.0.1 --port 8080 \
  --ctx-size 32768 \
  --n-predict 8192 \
  --jinja \
  --parallel 1

--jinja uses the model's own chat template, which is what makes tool calls work. --ctx-size is the context Puggie reads back from /props; do not leave it at the server's small default if you want agent work. If the model has a vision projector, llama.cpp reports it too.

curl -s http://127.0.0.1:8080/v1/models

Ollama

Start the server with the context length you want, then pull a model. Setting the context at the server keeps it from changing when the model reloads.

OLLAMA_HOST=127.0.0.1:11434 \
OLLAMA_CONTEXT_LENGTH=32768 \
OLLAMA_NUM_PARALLEL=1 \
OLLAMA_MAX_LOADED_MODELS=1 \
ollama serve

In another terminal:

ollama pull qwen3:14b
ollama run qwen3:14b "Say hello"

The model ID is exactly what ollama list prints, including the tag, for example qwen3:14b. If your Ollama version ignores OLLAMA_CONTEXT_LENGTH, make a model with the setting in its Modelfile:

ollama show --modelfile qwen3:14b > Modelfile
printf '\nPARAMETER num_ctx 32768\n' >> Modelfile
ollama create qwen3-14b-32k -f Modelfile
curl -s http://127.0.0.1:11434/v1/models

vLLM

vLLM serves an OpenAI-compatible endpoint and reports its context as max_model_len. Tool calling needs both a model that supports it and the right parser.

vllm serve Qwen/Qwen3-14B \
  --served-model-name qwen3-14b \
  --host 127.0.0.1 --port 8000 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.90 \
  --enable-auto-tool-choice \
  --tool-call-parser hermes

hermes is the common parser for Qwen models; check vLLM's tool-calling table for the parser your model needs. --served-model-name sets the ID Puggie sees. Lower --gpu-memory-utilization if the GPU is shared with something else.

curl -s http://127.0.0.1:8000/v1/models

LM Studio

  1. Install LM Studio and download a model that supports tool use.
  2. Load it and set the context length to 32,768 (or as much as your memory allows).
  3. Open the Developer tab, start the local server on port 1234, and turn on tool use if your version offers it.
  4. Use http://127.0.0.1:1234/v1 and the model key from its model list.

LM Studio reports the loaded context and marks vision models, so the app usually fills in the right values. If you turn on "serve on local network", remember that the address is still plain HTTP and Puggie will refuse it from another machine: use the HTTPS proxy below.

Another OpenAI-compatible server

It needs at least GET /v1/models (optional if you will type the model IDs) and POST /v1/chat/completions with streaming and tool calls. A server that only offers /v1/completions, or that ignores the tools field, can chat but cannot run a bot's tools.

curl -s https://models.example.com/v1/models

Networking: where the server and the bot are

Puggie accepts https:// anywhere. It accepts plain http:// only for 127.0.0.1, localhost and [::1]. That is a fixed rule, not a warning you can dismiss. It is also the part people get wrong, because "localhost" means the computer running the bot, not the computer you are holding.

Bot runs onThe model server isUse
A computer, installed "On the computer"The same computerhttp://127.0.0.1:8080/v1
A computer, installed "In a container"The same computerhttps://models.example.com/v1. Loopback inside the container is the container, not the computer.
Your phoneA computer on your networkhttps://models.example.com/v1. 127.0.0.1 would be the phone itself.
The hub containerThe same serverhttps://models.example.com/v1 for the same reason.
Your phoneAn OpenAI-compatible server app on the phonehttp://127.0.0.1:PORT/v1. Allowed, but not a supported way to run a bot; see below.

To give a server on another machine an HTTPS name, keep it bound to 127.0.0.1 and put a reverse proxy in front of it. Caddy is one small option; the block below gets a trusted certificate for a name that resolves to the machine:

models.example.com {
    reverse_proxy 127.0.0.1:8080
}

Then the base URL is https://models.example.com/v1. Tailscale Serve does the same job with a *.ts.net HTTPS name if the machines are on your tailnet. A self-signed certificate is not trusted when the bot connects, so it fails with a connection error; use a certificate from a public CA or Tailscale. A compose service name such as http://model:8080/v1 is also rejected: it is not loopback, even though it is on the same Docker network.

Keep the raw port private. Ollama has no authentication by default, and most local servers log every prompt. Bind them to 127.0.0.1 or your private network, use --api-key where the server supports it, and never expose port 8080 or 11434 directly to the internet.

Add it in Puggie

Models belong to the machine that runs the bot. Add the endpoint on that machine, not just on the phone.

  1. Open Setup → Models. If you have more than one computer, a row of chips at the top chooses the machine. "This phone" is one of them.
  2. Scroll to the bottom of the provider list and tap Custom OpenAI-compatible endpoint.
  3. Give it a Name you will recognise, such as Home model. The name becomes the provider's ID; using the same name again updates that endpoint, and a different name adds another one.
  4. Paste the Base URL, including /v1, for example http://127.0.0.1:8080/v1 or https://models.example.com/v1.
  5. Leave API key empty unless your server asks for one. If it does, paste it here; it is stored in the encrypted store on that machine, never in the endpoint's config file.
  6. For Model IDs, leave the field empty and tap Find to use every model the server lists, or type one or more IDs separated by commas. If the server has no model list, type the IDs and save without Find.
  7. Turn on The models think (reasoning) only if the model reports a separate reasoning field. Turn on The models read images for a vision model; the switch applies to every model at this endpoint, so keep text and vision models at separate endpoints if you mix them.
  8. Tap Save and choose model. The model list opens; pick one to try it in a chat.

To point an existing bot at it, open the bot and use Model → Change model, or tap the model chip above the message box. A new bot asks for a model under Model; if the list is empty, Add a model account or server opens the same form.

The endpoint's sheet has Remove; it deletes the endpoint and its key. Sessions using it stop working until you add it again. A model added on the phone is not visible to a bot on a computer, and the other way round; add it once on each machine that should use it.

Settings that matter for bots

On-phone models

Puggie does not run a bot's model on the phone. A phone-sized model that is useful for real work is slow, hot and battery-hungry, and Android can stop a background server when the app leaves the screen. Bots that need to keep working belong on a computer.

What does run on the phone are small helpers, mostly on Pixels with Gemini Nano: dictation, Tidy up, reading a photo, Scan, catch-up, tappable dates, Translate, memory by meaning and making a pet from a photo. They help you use the app; they do not answer a bot's messages.

You can add an OpenAI-compatible server running on the phone itself at a loopback address such as http://127.0.0.1:8080/v1, because the plain-HTTP rule allows loopback. That is an experiment, not a supported path: only bots on the phone can reach it, and the server has to stay running while they work. For anything unattended, put the model on a computer and give it an HTTPS name.

If something goes wrong

The published images carry curl, so you can test from the same place the bot runs. For a machine added by worker.sh, use docker exec puggie-worker curl -sS https://models.example.com/v1/models (or podman exec if it chose Podman); for the hub, docker compose exec hub curl -sS https://models.example.com/v1/models. If that works but the app does not, the endpoint was added on another machine.

For the server-specific details, see the llama.cpp server README, Ollama's OpenAI compatibility notes, vLLM's OpenAI server docs and LM Studio's endpoint docs.

New to self-hosting? Start with the self-hosting guide, then come back here for the model. Join the beta to get the app.