Self-hosted models
Run an open model on your own GPU and share it. One command does all of it:
1aile local setup
It looks at this machine (GPU, memory, free disk), installs an engine if there is
none, offers the models that fit with their list price, downloads the one you
pick, asks it a test question, and turns sharing on. Then aile start serves it.
Already running a model server (vLLM, LM Studio, your own Ollama)? Point at it instead:
1aile local http://127.0.0.1:1234 # point at an endpoint and turn it on2aile local # show current state3aile local --off # stop sharing it; the endpoint is remembered
Engines
| Engine | When | What aile does |
|---|---|---|
| Ollama | The default, and whenever Ollama is already here | Installs it with your permission (winget, Homebrew, or Ollama's script on Linux), starts it if it is stopped, and drives it through its API. Ollama keeps running when aile stops. |
| llama.cpp | --engine llamacpp, or when Ollama cannot be installed | Downloads one pinned llama-server build (CUDA, Vulkan, Metal or CPU, picked from your GPU) into aile's own folder, checks its sha256, and runs it only while aile start runs. No install, no administrator rights. Serves one model at a time. |
Nothing is installed or downloaded except by a command you run. The node's relay code cannot reach the downloader at all, whatever the server sends.
Which models sell
A self-hosted model is sold as local/<id> only when <id> has a published list
price, matched exactly. Ollama's own names (llama3.1:8b) and Hugging Face file
names have none, so a model pulled under its own name runs but earns nothing.
aile local models lists the models aile knows how to download and sell:
Llama, Qwen, Gemma, Mistral, Phi, gpt-oss and DeepSeek builds, each paired with
the id it is sold under, with its size, whether it fits this machine, and its
live list price. A pull saves the model under that id, so it is ready to sell:
1aile local pull llama3.1:8b # saved as meta-llama/llama-3.1-8b-instruct2aile local pull qwen/qwen3-8b # by the id itself3aile local pull google/gemma-3-12b-it --quant Q8_0
You earn list × your margin (aile rates). Downloads are 4-bit builds by default
and are sold under the full model's id.
Any other model
Anything in the Ollama library, and any GGUF on Hugging Face, downloads and runs:
1aile local pull mistral:7b2aile local pull hf.co/<user>/<repo> # the 4-bit build3aile local pull hf.co/<user>/<repo>:Q8_0 # a named build4aile local run hf.co/<user>/<repo> "hello" # talk to it
The client says whether it sells, from the server's own price check. One that does
not is still yours to use locally. Set HF_TOKEN for a gated repo.
Talking to it
1aile local run qwen/qwen3-8b "explain a mutex in one line" # one answer, then exit2aile local run qwen/qwen3-8b # a chat; Ctrl+C or /bye leaves
This traffic is not blind
Your machine reads these prompts
A self-hosted model runs on your machine, so your machine reads the prompts it answers. Your machine reading the prompts is what "runs here" means. It is a different property from the other two kinds, and it is opt-in for that reason.
Subscription and API-key traffic on the same machine are unaffected and stay
blind. The client repeats the distinction at aile local, aile capacity,
aile status and aile start, so you know which kind is active.
What does not leave: the weights. Only inference output goes out. Aile never custodies a model.
The endpoint is constrained
The URL is validated before it is saved and must be a loopback or LAN address.
A public value would turn your node back into an open proxy for whatever is at that address. That is what the egress allowlist exists to prevent. The constraint is not configurable, and no config key can widen it.
Which model names are advertised
By default the client asks your endpoint (GET /v1/models) and advertises what it
returns. To set them yourself:
1aile config localModels llama3,mistral # comma-separated; blank = ask the endpoint
Names are forwarded verbatim
Callers send local/<name>; Aile strips local/ and passes the rest to your
endpoint unchanged, so the names you advertise must be exactly the names your
endpoint answers to. If your endpoint serves llama3 and you advertise llama-3,
requests for local/llama-3 will not resolve.
Priced at the model's published list × your margin; a name with no published price is not served.
How callers reach it
Your priced models are listed as local/<name> while your node is healthy. A
caller sends that id, or the bare name with x-aile-provider: local, and the reply
carries x-aile-model: local/<name>. Your endpoint gets the body as the caller
sent it, apart from the output cap:
- A chat request's
max_completion_tokensarrives asmax_tokens, which is what local runtimes read. - On an x402 payment, a body naming no output cap gets the cap it was priced
on, and one carrying llama.cpp's own
n_predictorn_cmplis refused rather than rewritten. - A caller key can refuse self-hosted models ("Allow self-hosted model" unticked in its routing). Requests on that key never reach you.
Quality is not assumed
Self-hosted capacity is the one kind Aile can probe for served quality: a known-answer probe runs against local listings and surfaces on the listing card.
A model lists once its node has answered one probe, right or wrong. A reply cut
off at the probe's short token limit, or one that only reasons, lists it too but
is not scored; a model with only such replies reads "Not checkable". Beyond that
the result is evidence: it gates nothing, feeds no trust tier, and cannot show
which model answered. A sharer advertising llama3 and serving something
smaller is not caught by it. See
Verification.
Accounts versus capacity
A machine sharing only a local model has no credential to hold, so:
1aile accounts # "no accounts" — correct, and it points you at capacity2aile capacity # counts the local model, and says "not serving" if the endpoint is down
Turning it off
1aile local --off
The endpoint is remembered, so turning it back on is one command. To forget it:
1aile config --reset localEndpoint