Download MLX models on your Mac and serve them to the rest of your network — an OpenAI-compatible endpoint, in a menu-bar app.
Bauhaus turns one Apple Silicon Mac into a shared local-inference server. Browse and download MLX models from HuggingFace, and serve them over an OpenAI-compatible API to every other machine and user account on your network. Anything that talks to ChatGPT can talk to your Mac — just change the base URL.
It manages its own runtime: on first launch it installs a private Python and MLX
under ~/Library/Application Support/Bauhaus and never touches your system
Python. Uninstalling is deleting one folder.
Experimental. Runs and is tested end-to-end on macOS 26 / Apple Silicon. Cross-machine LAN use works; TLS and notarized distribution are not yet included.
- Model browser — search the
mlx-communityorg, download with live progress, resume interrupted transfers. - OpenAI-compatible server —
/v1/chat/completions,/v1/completions,/v1/models, streaming included. Drop-in for any OpenAI SDK. - Runs many models — one process per model, with an LRU memory budget so a request for a second model evicts an idle one instead of OOMing the machine.
- Network-shared — bind the LAN, discoverable over Bonjour, optional API key.
- Multi-account — other user accounts on the same Mac share one copy of each model on disk and on the GPU.
One line — installs Bauhaus.app (the menu-bar server) to /Applications, allows
it through the firewall, and launches it:
curl -fsSL https://raw.githubusercontent.com/REPPL/Bauhaus/main/install.sh | bashThe server needs Apple Silicon (MLX runs on Metal). For the native chat client
(BauhausChat.app, universal — runs on Intel too, talks to a server over the
network):
curl -fsSL https://raw.githubusercontent.com/REPPL/Bauhaus/main/install.sh | bash -s -- clientThe installer verifies the download's signature before installing it, so you need minisign on your PATH:
brew install minisignThe release workflow signs a checksums file with a key held only in CI; the installer carries the matching public key and refuses to install anything that does not verify against it. The binaries are ad-hoc signed, not notarized; because the installer has already cryptographically verified the app, it clears the Gatekeeper quarantine so it launches without a prompt. The first launch installs the MLX runtime (a few minutes, shown in the control panel), then you can download and serve models. New here? See docs/getting-started.md.
make app # build Bauhaus.app (menu-bar app bundle)
make install # copy to /Applications and launch it
make run # or: run headless in the foreground, for developmentClick the menu-bar icon → Open Control Panel, or from any OpenAI client:
from openai import OpenAI
client = OpenAI(base_url="http://your-mac.local:11535/v1", api_key="not-needed")
print(client.chat.completions.create(
model="mlx-community/Qwen3-8B-4bit",
messages=[{"role": "user", "content": "Hello!"}],
).choices[0].message.content)By default the server is reachable by anyone on your network with no API key —
the control panel warns you while this is so. Set a key in Settings to require
Authorization: Bearer <key>. Same-machine clients (loopback, including other
user accounts) never need a key. The control panel and its /api/* endpoints are
bound to loopback only and are never reachable from the LAN.
cmd/bauhaus/— menu-bar app + singleton election.internal/— the engine:hub(HuggingFace client + downloader),runtime(Python/MLX provisioning + process pool),gateway(OpenAI + control API),registry,discovery,config,app.docs/— getting-started guide.
Design decisions and the empirical facts behind them: DECISIONS.md.
make test # go test -race ./...
make lint # fmt + vet + testMIT. See LICENSE.