Getting Started¶
Salut is currently a development preview. Pinned llama.cpp is the only inference backend, and GGUF is the only model format. There is no supported app download yet.
Install the Development Checkout¶
You need Python 3.14.10 or newer and uv.
git clone https://github.com/salut-run/salut.git
cd salut
uv pip install -e ".[dev]"
The source checkout can run the interface and control plane with
uv run python -m salut. Native inference requires the complete verified
v0.8.0/b11960 Apple-silicon runtime. Build the development app with
uv run poe package-macos and launch the resulting app. The package task
bundles the runtime from llama-runtime.toml. To use that runtime with the
source checkout, set SALUT_LLAMA_APP to the absolute path of the signed app:
export SALUT_LLAMA_APP=/absolute/path/to/Salut.app
uv run python -m salut
The source checkout verifies the same app signature, manifests, and complete runtime before launch.
Windows Desktop Preview¶
On Windows, the GUI uses Toga’s official WinForms backend. Settings and the notification-area menu use native controls, and the Playground keeps the existing chat page in WebView2. Install the Microsoft WebView2 Runtime before opening the Playground. The hosted GUI checks target Windows x64 with .NET Framework.
uv sync --locked --extra dev
uv run python -m salut
Open Settings from the notification-area icon. Closing Settings hides the window and keeps Salut running. Use Quit Salut to stop services and remove the icon. Automatic startup registration and the macOS menu-bar color preference are disabled on Windows.
Windows remains a compute worker for an Apple-silicon Mac coordinator. Set
SALUT_LLAMA_WINDOWS_ARCHIVES to the directory containing the exact Windows CUDA
archives named in llama-runtime.toml to enable verified native execution.
The coordinator keeps the GGUF and owns model loading. Settings and the
Playground can still open when the native inference runtime is unavailable.
The Windows CI job exercises the actual WinForms application and an unsigned Briefcase build. Those GUI checks are separate from physical GPU, memory, swap, installer and signing acceptance. See Release Status for the remaining release work.
The old SALUT_LLAMA_SERVER and SALUT_GGML_RPC_SERVER executable overrides
are no longer accepted. Update the coordinator and all workers together,
because b11960 uses a different native RPC protocol from b10621.
Salut starts the local API on port 7258 and the peer HTTPS listener on port 17258 by default. It generates an Ed25519 identity, advertises through mDNS, and begins browsing for peers.
A mnemonic for 7258 is SALU on a phone keypad (S=7, A=2, L=5,
U=8). Full SALUT gives 72588, above the maximum TCP port of 65535.
The commit that introduced this port does not explain why it was chosen.
Pair Peers¶
When another Salut node appears:
Open Settings → Peers.
Confirm the expected machine and certificate fingerprint.
Accept the pairing request.
Complete the same decision on the other node.
Only mutually paired peers can receive signed controls or participate in a distributed deployment.
Load a Local GGUF¶
With the complete verified b11960 Apple-silicon runtime, open Settings → Models → Choose GGUF File and select one complete local GGUF. The UI uses a 4096-token context and one request slot. Automatic loading does not download models or accept split GGUFs or MTP drafts.
You can also load through the local API:
curl http://localhost:7258/v1/models/load \
-H "Content-Type: application/json" \
-d '{"model":"my-model","path":"/absolute/model.gguf","context_size":4096}'
The API accepts context sizes from 1 through 131072, subject to native memory estimation. Salut checks memory before starting the model controller. It tries the local Metal device first, then healthy paired Metal or Windows CUDA devices at the same llama.cpp commit if more capacity is needed. A node already serving as another coordinator’s worker cannot load its own model until that worker deployment stops.
Placement prioritizes capacity. Physical comparison of predicted and actual allocations, aggregate-only capacity acceptance, and measured-bandwidth placement remain pending.
Explicit Development Deployment¶
The existing development operation also accepts one immutable execution plan through peer HTTPS. The plan identifies the exact GGUF, binary hashes, selected devices, and allocation weights.
A remote operator must be paired and explicitly allowed by full certificate
fingerprint in SALUT_LLAMA_OPERATOR_FINGERPRINTS on the coordinator. The
empty default denies every remote operator.
uv run python -m salut.inference.operator deploy \
--host coordinator.local \
--coordinator-fingerprint <full-fingerprint> \
--plan plan.json
The same command provides status and stop operations. This control uses
signed peer HTTPS. It does not require SSH.
Use the Local API¶
List the deployments visible to this API node:
curl http://localhost:7258/v1/models
Use an exact model ID returned by that operation:
curl http://localhost:7258/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "<model-id-from-v1-models>",
"messages": [{"role": "user", "content": "Hello!"}]
}'
from openai import OpenAI
client = OpenAI(base_url="http://localhost:7258/v1", api_key="unused")
response = client.chat.completions.create(
model="<model-id-from-v1-models>",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
Next Steps¶
Read Peers & Trust for the pairing model.
Read Network for native multi-node execution.
Read Models for the exact GGUF workflow.
See the API reference for current endpoints.
Check Release Status before treating an artifact as supported.