Goethe user guide
Run and share your models on your own infra in 3 steps, and run them fast.
Goethe turns a Linux machine into your own API, compatible with OpenAI, Anthropic and LiteLLM clients. Install it, add a model, and point your apps, your team or your other machines at one address. Your prompts, your data and your models stay on hardware you control.
What you can use it for
- Easy to serve. Every model you load is served at the same URL; a request picks its model by name.
- Fast. Use the custom kernel attachments to accelerate and optimise model capability.
- A private API for your team. One key per person or app; nothing reaches the API until you allow it.
- Home or office over a VPN. Serve from a GPU box and use it from your laptop through Tailscale, WireGuard or ZeroTier.
- Your own apps and tools. Point OpenAI, Anthropic or LiteLLM clients, Open WebUI, coding assistants and similar tools at hardware you control.
- Many models, many GPUs. Compare models by name on the same address, split large models across GPUs, or run on cloud GPUs when you need them.
Quick install
curl -fsSL https://meshapplied.com/install.sh | bash
goethe startgoethe start starts Goethe and walks you through three steps: install a model, serve it through the API, and configure who can reach it. If you prefer plain commands:
# 1. Start Goethe and load a model
goethe up
goethe install --model zai-org/GLM-5.3-Flash --load
# 2. Share it
goethe configure api # this machine only, your VPN (recommended), or a public address
goethe key --create my-laptop # one key per app or person
goethe api # the address to give your appsgoethe status tells you whether Goethe is running, with the API address and your keys.
API compatibility
The API is at https://<address>:<port>/v1. It speaks three schemas at once, so OpenAI, Anthropic and LiteLLM clients all work against the same address and key:
- OpenAI: chat, completions, responses, embeddings, rerank, models.
- Anthropic:
POST /v1/messages(and token count); errors on this route use Anthropic's format. - LiteLLM proxy: the same routes without
/v1, plus/model/info,/model_group/info, liveliness and readiness.
| Endpoint | Purpose |
|---|---|
POST /v1/chat/completions | Chat, with streaming, tools and reasoning |
POST /v1/completions | Plain text completion |
POST /v1/responses | OpenAI Responses API |
POST /v1/messages | Anthropic Messages API |
POST /v1/embeddings | Embeddings |
POST /v1/rerank | Reranking |
GET /v1/models | Models your key can use |
GET /health | Up check (no key) |
Send the key as Authorization: Bearer … (OpenAI), x-api-key (Anthropic), x-litellm-api-key (LiteLLM) or api-key (Azure-style). The API uses HTTPS with a certificate Goethe creates; clients skip verification (curl -k, verify=False) or trust <goethe-home>/nginx/certs/server.crt.
curl
curl -k https://<address>:8443/v1/chat/completions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"model":"zai-org/GLM-5.3-Flash","messages":[{"role":"user","content":"Hello!"}],"max_tokens":128}'OpenAI SDK
import httpx
from openai import OpenAI
client = OpenAI(
base_url="https://<address>:8443/v1",
api_key="goethe_sk_...",
http_client=httpx.Client(verify=False),
)
reply = client.chat.completions.create(
model="zai-org/GLM-5.3-Flash",
messages=[{"role": "user", "content": "Hello!"}],
)
print(reply.choices[0].message.content)Anthropic SDK
import httpx
from anthropic import Anthropic
client = Anthropic(
base_url="https://<address>:8443",
api_key="goethe_sk_...",
http_client=httpx.Client(verify=False),
)
reply = client.messages.create(
model="zai-org/GLM-5.3-Flash",
max_tokens=256,
messages=[{"role": "user", "content": "Hello!"}],
)
print(reply.content[0].text)LiteLLM
import litellm
reply = litellm.completion(
model="litellm_proxy/zai-org/GLM-5.3-Flash",
api_base="https://<address>:8443",
api_key="goethe_sk_...",
messages=[{"role": "user", "content": "Hello!"}],
ssl_verify=False,
)In other tools that take a custom OpenAI endpoint: set the base URL to https://<address>:<port>/v1, your Goethe key, and a model name from goethe api.
Limits: about 20 requests per second per client address; per-key --rpm; bodies up to 10 MB. Unloading a model finishes in-flight requests first; new ones get 503 with Retry-After.
CLI
Every value goes after its flag: goethe unload --model …, goethe gpu --allow gpu0. Listing commands accept --json. Exit codes: 0 success, 1 error, 2 wrong usage, 3 needed confirmation without a terminal (add --yes).
Everyday
goethe up # start; also starts at boot from now on
goethe status # running or not, API address and keys
goethe down # stop; won't start at boot until the next up
goethe ps # what is running
goethe api # address, keys and loaded models
goethe logs --model zai-org/GLM-5.3-Flash -f
goethe logs --daemon
goethe doctor
goethe hw profileStart and stop
| Command | What it does |
|---|---|
goethe start | Start and guided setup: model, serve, API access |
goethe up | Start Goethe and API; start at boot (use --no-boot to skip) |
goethe status | Running state, address and keys |
goethe down | Stop Goethe and models; stop start-at-boot |
goethe service … | enable / disable / status / restore --on|--off |
Models
| Command | What it does |
|---|---|
goethe recommend | Catalog models that fit your GPUs |
goethe install --model … | Download from Hugging Face or register a local folder |
goethe scan | Add folders you placed in the models directory |
goethe models | Installed and catalog models, and whether each fits |
goethe config --model … | Default ctx, concurrency, GPUs for a model |
goethe remove --model … | Unload and delete (or unregister a folder) |
Running
| Command | What it does |
|---|---|
goethe load --model … | Load and wait until ready (--gpu, --tp, --ctx, --max-conc, --replica) |
goethe unload --model … | Stop a model (--all, --force) |
goethe ps | Running instances, GPUs, speed |
goethe logs | --model, --daemon, --gateway, -f, -n |
Sharing
| Command | What it does |
|---|---|
goethe configure api | Local, VPN or public access |
goethe api | Address, auth, models, keys, curl example |
goethe key | --create, --revoke, --rpm, --expires, --models, --admin |
goethe allowlist | --add / --remove client addresses |
goethe alias | Short names for clients (--set, --remove) |
goethe gateway | Listen address; --bind 127.0.0.1|0.0.0.0|IP |
goethe domain | DNS A record help; --check name |
GPUs and system
| Command | What it does |
|---|---|
goethe gpu | Memory and allow/deny (--deny, --allow) |
goethe hw profile | GPUs, CPU, memory, disk, cloud |
goethe doctor | Setup check with a fix for each problem |
goethe update | Install latest Goethe |
goethe uninstall | Remove Goethe (--keep-models) |
Add models
goethe recommend
goethe install --model zai-org/GLM-5.3-Flash
goethe install --model zai-org/GLM-5.3-Flash --loadThe model id is the Hugging Face repo name. Useful flags: --load, --ctx, --max-conc, --trust-remote-code (only for models you trust), --hf-token for gated or private models (asked once per download, never stored).
For a gated or private model: accept the license on Hugging Face, create a read token, then goethe install --model <org>/<model> --hf-token. In goethe start, choose “A private or gated model”.
To register a folder you already have, put it under Goethe's models directory and run goethe scan, or:
goethe install --model /data/models/my-finetune --name me/my-finetunegoethe models
goethe remove --model zai-org/GLM-5.3-FlashLoad and run
goethe load --model zai-org/GLM-5.3-FlashGoethe picks GPUs, sizes memory and waits until the model answers. The first load on a new machine can take a few extra minutes; later loads are faster. Examples:
goethe load --model zai-org/GLM-5.3-Flash --gpu gpu1
goethe load --model zai-org/GLM-5.3-Flash --tp 2
goethe load --model zai-org/GLM-5.3-Flash --gpu gpu0 gpu1
goethe load --model zai-org/GLM-5.3-Flash --ctx 65536 --max-conc 32
goethe load --model zai-org/GLM-5.3-Flash --replica
goethe config --model zai-org/GLM-5.3-Flash --ctx 65536 --max-conc 32Load as many models as your GPUs can hold; they share one API address. Use goethe ps to see what is running.
goethe unload --model zai-org/GLM-5.3-Flash
goethe unload --all
goethe unload --model zai-org/GLM-5.3-Flash --forceIf a GPU is already used by other programs, Goethe asks before loading beside them; it never stops processes it did not start. Use --yes in scripts, or goethe gpu --deny gpu0 / --allow to control which GPUs Goethe may use.
Hardware requirements
| Architecture | Compute | GPUs |
|---|---|---|
| Blackwell | 12.0, 12.1 | GeForce RTX 5090, RTX PRO 6000 Blackwell, DGX Spark (GB10) |
| Blackwell data center | 10.0, 10.3 | B200, GB200, B300, GB300 |
| Hopper | 9.0 | H100, H200, GH200 |
| Ada | 8.9 | GeForce RTX 4090, RTX 6000 Ada, L40S, L40, L4 |
| Ampere | 8.0, 8.6 | A100, A30, A40, A10, RTX A6000, GeForce RTX 3090 |
Older GPUs (Volta, Turing and earlier) are not supported. A machine can mix generations; each model runs on GPUs of one generation. Large models can be split with --tp (and --ep for MoE). 4-bit NVFP4 models run on every supported GPU.
Goethe ships its own CUDA 13 runtime. You only need the NVIDIA driver:
| NVIDIA driver | Goethe runs on |
|---|---|
| 580 or newer | Every supported GPU |
| 535 to 579 | Data-center GPUs (A100, H100, H200, B200, L40S, L4 and similar), via CUDA forward compatibility |
| Older than 535 | Not supported |
GeForce and TITAN cards need driver 580 or newer. Check with nvidia-smi. Enough GPU memory for the model is the other hard requirement; goethe recommend lists what fits.
Software requirements
- Linux on x86_64 or ARM64 with glibc 2.30 or newer (for example Ubuntu 20.04+ or Debian 11+).
- Disk space for your models, plus about 12 GB for Goethe itself.
- Goethe brings its own CUDA runtime and compiler; you do not install a CUDA toolkit. The installer checks the machine and can install missing system pieces after asking. Run
goethe doctorany time for a check with fixes.
After install, open a new terminal if goethe is not found yet. Files live under /workspace/.goethe on cloud volumes, /var/lib/goethe as root, or ~/.goethe otherwise.
goethe update --check # is there a new version?
goethe update # install it; loaded models keep serving
goethe uninstall # remove Goethe; add --keep-models to keep modelsWhere it runs
| Environment | Examples |
|---|---|
| Your own hardware | Workstations and servers with one or more NVIDIA GPUs, including DGX Spark |
| Cloud GPU VMs | AWS, Google Cloud, Azure, Oracle Cloud, Lambda, CoreWeave, Paperspace |
| GPU containers | RunPod, Vast.ai, and Docker with the NVIDIA Container Toolkit |
Goethe recognises the cloud provider or container, keeps files on a persistent volume when there is one, and shows the address to use from outside. In a container, the GPU and driver come from the host.
Supported models
Hugging Face format (config.json plus .safetensors). Architectures include Llama, Qwen, DeepSeek, Mistral, Gemma, Phi, GLM (including GLM-5.3 Flash), GPT-OSS, Kimi, MiniMax, Nemotron, Granite, Command R, OLMo, InternLM, InternVL, embeddings and more. Dense, MoE, hybrid and vision-language models are supported. goethe install / goethe scan say immediately if an architecture is not supported.
| Format | Typical use |
|---|---|
| BF16 / FP16 | Original weights |
| NVFP4 | 4-bit; much smaller than BF16, all supported GPUs |
| FP8 | 8-bit; native on Blackwell |
| MXFP4 | GPT-OSS on Blackwell |
| AWQ, GPTQ | 4-bit community quantizations |
| INT8 (W8A8) | 8-bit integer |
| Mixed (ModelOpt) | NVFP4 and FP8 in one model (Blackwell) |
Format is detected from the files. GGUF and .bin pickle weights are not supported; use safetensors.
Settings
Optional. Set in your shell or in goethe.env inside Goethe's folder so the background service picks them up.
| Variable | What it changes |
|---|---|
GOETHE_HOME | Where Goethe keeps its files |
GOETHE_PUBLIC_PORT | API port (default 8443) |
GOETHE_NO_AUTOSTART=1 | Never set up start at boot |
GOETHE_PUBLIC_IP | Public IP shown in public configure mode |
GOETHE_MAX_BODY_MB | Largest request size in MB (default 10) |
NO_COLOR=1 | Turn off colored output |
Troubleshooting
goethe: command not found: open a new terminal, or export PATH="$HOME/.local/bin:$PATH".
goethed is not running: run goethe up. Check with goethe status.
Unknown model: use an id from goethe models.
A load fails: Goethe prints the reason and the end of the log; full log: goethe logs --model … -n 200. Common fixes: free GPU memory (--ctx, --max-conc, --tp, or a smaller / quantized model); --trust-remote-code when the model needs it; goethe doctor for driver and GPU issues.
| Answer | Meaning | Fix |
|---|---|---|
| No connection | Wrong address/port, http vs https, or firewall | Use the address from goethe api |
403 | Address not allowed | goethe allowlist --add … |
401 | Missing or wrong key | Authorization: Bearer … |
404 Model Not Found | Unknown model or key scoped away from it | Name from goethe api |
429 | Too many requests | Slow down or raise --rpm |
503 | Model not ready or unloading | Wait or check goethe ps |
Anything else: goethe doctor, then goethe logs --daemon.