Generators
ggml-llm— the llama.cpp runtime is updated to b11385.ggml-decision— new backend for Generator Typed Decision (GGML). Local functions can callcontext.buttress.decide(). See functions.ggml-tts— model files download in parallel, and a model released while loading is freed when loading finishes. OuteTTS models read every contraction and ellipsis correctly, and text that contains$no longer changes the prompt.
Agents
- MCP servers accept
exposure/tool_exposure(directorhidden) andtimeout. See agents. - Set
codemode = trueto let an agent run scripts that call its tools in batches. Scripts stop after 5 minutes by default, 30 minutes at most.
Generators
ggml-llmmulti-GPU splitting —split_modeselects how a model is spread across GPUs (none,layer,row, or the experimentaltensor), andtensor_splitsets the per-GPU proportions, as[3, 1]or"3,1". Both can be set in[runtime]or overridden per model, and are currently configurable in BRICKS Buttress only. Tensor parallelism is experimental and needs a compatible backend and model. See configuration.ggml-stt— Whisper supports thesnapdragonacceleration backend on compatible Qualcomm Linux arm64 hardware. See configuration.
Fixes
ggml-llm— Generators sharing a session cache no longer overwrite each other’s records, so a saved session survives a restart.ggml-llm/ggml-stt— a context release delay of zero takes effect immediately, and an LLM model released while it is loading is freed once loading finishes.
Agents
- Local devices (experimental) — set
local_devices = trueon an agent to let it discover the BRICKS devices and project previews on your network, capture screenshots, inspect Bricks and logs, send taps, keys, and text, and run scripts through DevTools. It is enabled per agent, and uses device credentials where they are required. See agents.
Fixes
- MLX models — unloading and reloading a model no longer leaves a release request waiting, or makes the newly loaded model unavailable.
Agents
- Agents (experimental) —
[[agents]]tables in the server config define LLM agents that run inside the server, on a configuredggmlormlxgenerator (model = "buttress/<repo_id>") or an Anthropic, OpenAI, or Google model. Each agent takes a system prompt, local functions as tools, optional MCP servers, turn and token limits, and on-disk sessions that can be resumed or forked. Local functions and daemons call them withcontext.agents.run(name, { prompt, sessionId, fork }); over HTTP,GET /agents,POST /agents/:name/run(?stream=1for SSE, which announces the session id first so an interrupted first turn stays continuable), and session listing and abort routes.bricks-buttress agent <name>opens a full-screen chat in the terminal — markdown answers, streamed thinking, tool-call lines,/new,/exit, and Ctrl+C to abort a turn, with--plainfor pipes — and takes--sessions,--session <id>, and--fork <id>. See configuration. - Tool calling works on the
ggml-llmandmlx-llmbackends: tool calls come back as structuredtool_callson the OpenAI-compatible and Anthropic Messages endpoints, instead of raw<tool_call>text. Parallel calls, reasoning round-trips, and mid-stream abort are verified, which is what lets agents run on local GGUF and MLX models.
Local functions
- A local function can read and write the bound workspace’s Data Bank through
context.bank.list,get,update, andremove, oncebricks buttress bank-keyhas stored credentials. See local functions. - Daemon local functions — a function file with
meta.daemon = trueruns as a long-lived background function with no deadline. It getscontext.setInterval,context.bank.subscribe(propertyIds, onChange)for Data Bank change notifications over one auto-reconnecting connection, andcontext.onEventandcontext.daemons.emitfor function-to-daemon signalling. Daemons are not callable as MCP tools or over HTTP, restart on file edit, and show a live table on/status. - A local-function call whose client disconnected before dispatch is skipped, instead of running its side effects to its own timeout.
Fixes
- CORS is decided once per path: a browser
POST /functions/<name>with a JSON body passes preflight,/anthropic-messageskeeps itsx-api-keyandanthropic-versionheaders, and per-surfacecors_allowed_originsis honoured. Turning off[autodiscover] http.corsis no longer needed as a workaround. - The server no longer exits on a late native callback — a client aborting a completion or transcription mid-stream (
ggml-llm,mlx-llm,onnx-stt), or a failed or just-finishedonnx-ttsoronnx-sttmodel load still reporting download progress. - An unparseable
agents_options.session_max_agefails startup, instead of silently sweeping sessions after 30 days. - Standalone build:
onnx-ttsandonnx-sttsessions initialise again. They failed with “A boolean was expected” since the inference runtime update in v2.25.5. Chatterbox Multilingual is verified on a Snapdragon host.
Generators
- The
onnx-ttsbackend serves the Chatterbox voice models, including Chatterbox Multilingual, so a Generator TTS (ONNX) can offload synthesis without downloading the model. See configuration.
Generators
- New
ggml-ttsbackend — a Generator TTS (GGML) can offload synthesis to a Buttress server. The device streams the audio back without downloading the backbone or codec GGUF, with capability detection and memory guardrails, and the status page reports the new backend. See configuration.
Models
- A generator pinned to an exact model id resolves to it even when a looser sibling entry also matches.
Local functions
- File downloads work from the packaged distribution again —
/functions/files/*and/buttress/downloadanswered HTTP 200 with[object Object]in v2.25.1. See local functions. - A raw-prompt completion returns its generated text instead of an empty string.
Models
GET /v1/modelslists the canonical model id for a generator pinned to a specific file, so two generators sharing a repository are distinguishable and the id echoed back by a completion is one the listing actually shows. The compatibility endpoints accept only configured models. See configuration.
Fixes
- Download credentials are kept out of logs and error output.
- A failed install rollback keeps its backups instead of deleting them. See installation.
Local functions
- Local functions (experimental) —
.ts/.jsfiles you drop in a configured directory become both MCP tools and HTTP endpoints, so an agent can run server-side work — ffmpeg, or the server’s own LLM / STT / TTS generators — without standing up a separate service. One file is one function, with a JSON Schema declaration MCP receives verbatim, SSE progress streaming, a per-call scratch directory with file upload and download, optional custom authentication, optional hot reload, ready-to-copy samples, and a local functions activity card on the status page. - A function can also be called with
GET /functions/<name>using the query string as input, so a browser, anEventSource, a webhook, or plain curl can invoke one. - A new
simple-ragfunction sample ships with the vector search support it needs bundled into the distribution. bricks buttress mcp-configwrites the.mcp.jsonentry an agent needs. See BRICKS CLI.
Installation
- Standalone distribution —
bricks-buttressnow ships as a self-contained executable. The installer detects the host’s ggml accelerator (CUDA, Vulkan, Snapdragon, or default) and downloads only the native packages that build needs, installs into the same~/.bricks-cli/binthe BRICKS CLI uses, andbricks-buttress updateupdates in place. See installation.
Generators
- Generator Vector Store — the GGML embedding model and tokenizer can now be offloaded to BRICKS Buttress, so a device can index and search documents without downloading either GGUF. See BRICKS Foundation.
Fixes
- Session uploads get a unique stored filename, so two files uploaded in the same session cannot overwrite each other.
- Model downloads for the LLM, STT, and ONNX backends stay inside the server’s cache directory.
- Generator finalization is authorized per session and correctly refcounted, so a session that starts the same model twice releases both.
Backends
- ONNX backends — Generator STT and TTS workloads can offload to BRICKS Buttress through transformers.js and ONNX Runtime, with automatic hardware detection across CUDA, CoreML, DirectML, and CPU, and memory-aware model selection. See configuration.
- Parakeet engine — the GGML STT backend now runs both Whisper and NVIDIA Parakeet, and advertises the engines it supports so older clients fall back safely.
Autodiscovery
- Web LAN auto-discovery — web and virtual devices can find a BRICKS Buttress on the local network through a signed HTTP probe and offload inference to it, controlled by the new per-device Local Network Access setting. See autodiscovery.
Generators
- Generator STT (GGML) — Buttress applies GPU / flash-attention / thread settings correctly at load time.
- Generator LLM (MLX) — Buttress forwards tokenizer and model config overrides when provided.
WebSocket RPC
- Binary payload serialization —
ArrayBufferpayloads (e.g. from RealtimeTranscriber) and binary auth tokens are now serialized and deserialized as properUint8Array/Buffervalues, fixing previousInvalid paramserrors ontranscribeDataand other binary-payload calls. - Proper error instances — JSON-RPC error responses arrive at callers as
Errorinstances with the server’scode/message, fixing previousTranscription error: [object Object]notifications.
CLI
buttress-server --versionreports the packaged version of the standalone CLI.
Generators
- Generator LLM (GGML) — bumped
llama.cppruntime to b9254 and exposed MTP (multi-token prediction) speculative decoding parameters.
Sessions
- WebSocket session resume — sessions survive reconnects through proxies / tunnels. A server-issued session id is exchanged on the WS handshake and restored on subsequent connects, replacing the previous IP-based scheme.
File uploads
- Per-session scope — uploads and downloads are now scoped to the active session id (
X-Buttress-Sess-Idheader required). Uploaded files land under a per-session subdirectory and are wiped when the session times out.
Authentication
- Workspace-scoped JWT auth — each Buttress server is bound to a workspace via
bricks buttress bindand verifies issued tokens with EdDSA./buttress/rpc,/oai-compat,/anthropic-messages, and upload / download endpoints now require authentication. See workspace binding.
Discovery
- LAN auto-discovery — Launcher selects from a multi-server pool (90s TTL, ranked by hardware caps) and only trusts servers in the workspace’s bound list. See autodiscovery.
- Signed UDP ANNOUNCE — per-server Ed25519 signatures protect LAN discovery from spoofing.
PROTOCOL_VERSIONbumps to 2.0 — re-runbricks buttress bindand restart the server after upgrading.
Compat endpoints
- New TOML config flags
[openai_compat] enabledand[anthropic_messages] enabledto enable the experimental compat endpoints. See configuration.