Start here

Quickstart

Install, pull a model, talk to it, serve it. Four commands. If you would rather not use a terminal at all, the apps do the same four steps with a window.

The four steps

1 · INSTALL install.sh checksum checked, a service registered 2 · PULL llamay pull resumes, verifies, content-addressed store 3 · SERVE llamay serve localhost:11435 often already running 4 · ASK POST /v1/chat/… or /v1/messages, or /api/chat
Step 3 has often already happened: the installers register a service, so a server is up before you first ask it anything.

1 · Install

macOS and Linux:

curl -fsSL https://llamay.com/install.sh | sh

Windows, in PowerShell:

irm https://llamay.com/install.ps1 | iex

The script works out your platform, downloads the matching build, checks it against the release's SHA256SUMS, installs the binary and sets up a service. It refuses to continue on a machine with no SHA-256 tool, rather than skipping the check.

PlatformBinaryService
macOS/usr/local/bin/llamayLaunchAgent, runs as you
Linux/usr/local/bin/llamaysystemd, its own llamay user
Windows%LOCALAPPDATA%\Programs\llamayA scheduled task at logon

LLAMAY_NO_SERVICE=1 before the script installs only the command line. Packages, the apps and the portable archives are on the download page; every route is on the install page.

2 · Get a model

llamay pull qwen2.5:0.5b        # 400 MB, runs anywhere
llamay models                   # what this machine has
llamay models
name                                     size  architecture           store
all-minilm:latest                    43.8 MiB  bert (embedder)        llamay
gemma2:2b                             1.6 GiB  gemma2 (decoder)       llamay
qwen2.5:0.5b                        379.4 MiB  qwen2 (decoder)        llamay

Downloads resume, and a file is installed only under the SHA-256 of its finished bytes. Models Ollama already downloaded are listed too, and run without a second download. Hugging Face and plain URLs work as well; see getting models.

3 · Talk to it

llamay run -m qwen2.5:0.5b -chat -p "Name the capital of France in one word."

-chat sends the prompt through the model's own chat template, as a conversation. Without it the prompt is continued as raw text, which is what a base model expects.

The whole of the above, recorded on a laptop:

Transcript — the whole session as text
~/llamay $ # one static binary — this is the whole install
~/llamay $ llamay version
llamay         v0.1.58-1-gb14f550
build          go1.26.8 darwin/arm64, cgo on, tags metal
revision       b14f5501578e
kernels        neon+i8mm
gpu            metal built in; metal:Apple M4
formats        23: F32, F16, Q4_0, Q4_1, Q5_0, Q5_1, Q8_0, Q8_1, Q2_K, Q3_K, Q4_K, Q5_K, Q6_
K, Q8_K, IQ2_XXS, IQ2_XS, IQ3_XXS, IQ4_NL, IQ3_S, IQ2_S, IQ4_XS, BF16, MXFP4
architectures  17 entries, 39 names: azmx (azmx-one, llama, mistral), qwen2 (qwen3), gemma,
gemma2, gemma3 (gemma3_text), azmx-code (azmx_code, azmxcode), gpt-oss (gptoss, gpt_oss, ope
nai-moe), phi3 (phi3.5), stablelm (stablelm2), gpt2, falcon (rw), gptneox (gpt_neox, gpt-neo
x, neox), phi2, qwen3moe (qwen3_moe), qwen2moe (qwen2_moe), azmx-ocr (ocr, ctc), azmx-embed
(bert, embedding)
~/llamay $ # models are named, not pathed, once they are in the store
~/llamay $ llamay models
name                                     size  architecture           store
all-minilm:latest                    43.8 MiB  bert (embedder)        llamay
gemma2:2b                             1.6 GiB  gemma2 (decoder)       llamay
gemma3:270m                         278.0 MiB  gemma3 (decoder)       llamay
gpt2:q8_0                           169.4 MiB  gpt2 (decoder)         llamay
qwen2.5:0.5b                        379.4 MiB  qwen2 (decoder)        llamay
smollm2:135m                        258.3 MiB  llama (decoder)        llamay
azmx-code-test:latest                 1.1 GiB  gemma3 (decoder)       ollama

6 in ~/.llamay/models, 1 in ~/.ollama/models
~/llamay $ # and that is the entire setup
~/llamay $ llamay run -m gemma2:2b -chat -n 110 -p "Explain what a KV cache is to someone wh
o writes web servers. Two sentences."
A KV cache is a memory-based store used by web servers to quickly retrieve frequently access
ed data. It works by storing key-value pairs (like website configurations, user sessions, or
 static content) and using those pairs to bypass the slower database or disk access for fast
er responses.


prompt 25 tokens in 2.507s (10.0 tok/s) · generated 58 in 15.61s (3.7 tok/s) · stop: eog
Install to first token. One binary, one model already in the store, one command. Nothing is configured and nothing is sent anywhere. Recorded 2026-09-18 · Apple M4, macOS 26.0.1 · llamay v0.1.58-1-gb14f550 · metal:Apple M4 · 0:29

4 · Serve it

llamay serve

With no -m, serve takes the first decoder in your store, sorted by name so a restart serves the same one. It listens on localhost:11435: this machine only. With no models at all it still starts, answers /healthz and POST /api/pull, and loads the first model that lands.

curl -s localhost:11435/v1/chat/completions -d '{
  "model": "qwen2.5:0.5b",
  "messages": [{"role": "user", "content": "Name the capital of France in one word."}]
}'
{"choices":[{"finish_reason":"stop","index":0,"message":{"content":"Paris","role":"assistant"}}], ...}

The same server answers POST /v1/messages in Anthropic's shape and POST /api/chat in Ollama's, so an existing client needs a new base URL and nothing else. The API in five minutes does this with each SDK.

Why 11435

It sits beside Ollama's 11434, so both can run at once. And /healthz answers with the model, the version and an instance id, so "is it running" is a question about identity rather than about whether something holds a port.

The same model behind an HTTP endpoint, answering the request every client already sends:

Transcript — the whole session as text
~/llamay $ llamay serve -m qwen2.5:0.5b -addr localhost:11439
time=2026-09-18T08:49:09.326-04:00 level=INFO msg="device graph attached" max-tokens=256
time=2026-09-18T08:49:09.326-04:00 level=INFO msg="llamay serving" addr=localhost:11439 mode
l=qwen2.5:0.5b arch=qwen2 max-loaded=2 keepalive=5m0s params="0.36 GB" context=32768 threads
=7 kv=f32 lexicon=0

  OpenAI      POST http://localhost:11439/v1/chat/completions
  Anthropic   POST http://localhost:11439/v1/messages
  Embeddings  POST http://localhost:11439/v1/embeddings     (start with -embed <encoder.gguf
>)
  Rerank      POST http://localhost:11439/rerank            (start with -rerank <reranker.gg
uf>)
  Contexts    POST http://localhost:11439/v1/contexts        (then /{id}/fork?n=8, /{id}/sna
pshot)
  Models      POST http://localhost:11439/api/pull          (and /api/copy, /api/delete)
  Stats       GET  http://localhost:11439/v1/stats


~/llamay $ # the server stays up; the rest of this is a second terminal
~/llamay $ curl -s http://localhost:11439/v1/models | jq
{
  "data": [
    {
      "created": 1789735749,
      "id": "all-minilm:latest",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "gemma2:2b",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "gemma3:270m",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "gpt2:q8_0",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "qwen2.5:0.5b",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "smollm2:135m",
      "object": "model",
      "owned_by": "azmx"
    },
    {
      "created": 1789735749,
      "id": "azmx-code-test:latest",
      "object": "model",
      "owned_by": "azmx"
    }
  ],
  "object": "list"
}
~/llamay $ curl -s http://localhost:11439/v1/chat/completions -H 'content-type: application/
json' \
>   -d '{"model":"qwen2.5:0.5b","messages":[{"role":"user","content":"One sentence: why run
a model locally?"}]}' | jq
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "running a model locally can be beneficial because it allows you to optim
ize the model locally, which can be faster and more efficient compared to running the model
globally.",
        "role": "assistant"
      }
    }
  ],
  "created": 1789735751,
  "id": "chatcmpl-llamay",
  "model": "qwen2.5:0.5b",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 31,
    "llamay_cached_prompt_tokens": 0,
    "llamay_decode_ms": 1528.48,
    "llamay_prefill_ms": 153.028,
    "prompt_tokens": 17,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "total_tokens": 48
  }
}
~/llamay $ # the same route with stream:true — this is the wire format
~/llamay $ curl -sN http://localhost:11439/v1/chat/completions -H 'content-type: application
/json' \
>   -d '{"model":"qwen2.5:0.5b","stream":true,"messages":[{"role":"user","content":"Count to
 five."}]}' | head -c 520
data: {"choices":[{"delta":{"content":"Count"},"finish_reason":null,"index":0}],"created":17
89735751,"id":"chatcmpl-llamay","model":"qwen2.5:0.5b","object":"chat.completion.chunk"}

data: {"choices":[{"delta":{"content":"ing"},"finish_reason":null,"index":0}],"created":1789
735751,"id":"chatcmpl-llamay","model":"qwen2.5:0.5b","object":"chat.completion.chunk"}

data: {"choices":[{"delta":{"content":" to"},"finish_reason":null,"index":0}],"created":1789
735751,"id":"chatcmpl-llamay","model":"qwen2.5:0.5b","object":"cha~/llamay $ # and the same
stream read the way a client reads it
~/llamay $ curl -sN http://localhost:11439/v1/chat/completions -H 'content-type: application
/json' \
>   -d '{"model":"qwen2.5:0.5b","stream":true,"messages":[{"role":"user","content":"Count to
 five, then stop."}]}' \
>   | python3 scripts/site/demo_sse.py
1
2
3
4
5
An OpenAI endpoint on your own machine. llamay serve, then the request every client already sends — non-streaming, then streaming, with the base URL as the only thing that changed. Recorded 2026-09-18 · Apple M4, macOS 26.0.1 · llamay v0.1.58-1-gb14f550 · metal:Apple M4 · 0:29

Where to go next