A local LLM chat app for Apple Silicon Macs. It browses and downloads models from Hugging Face, runs them on-device with MLX, and can expose an OpenAI-compatible API for other apps. Inference runs locally. Its only network use is Hugging Face for model search and downloads, plus the optional speech feature, which downloads its runtime when you install it.
| Chat | Models |
|---|---|
![]() |
![]() |
| Library | Search |
![]() |
![]() |
| Speech-to-text | Text-to-speech |
![]() |
![]() |
- Chat with streaming responses. Markdown, KaTeX math, Mermaid diagrams, and syntax-highlighted code. Per-chat model picker, message editing, branch navigation, and conversation history with search.
- Models. Search Hugging Face for MLX models and download them. Downloads resume after an interruption and show progress in a dock.
- Library. Manage downloaded models: load, unload, set a default, or delete.
- Server. Optional OpenAI-compatible endpoint (/v1/chat/completions, /v1/models). Off by default. Binds to localhost unless you turn on LAN access and set an API key.
- Speech. Optional text-to-speech and speech-to-text. Requires installing the mlx-audio runtime. Recording needs microphone access.
- Apple Silicon (arm64) Mac. Intel is not supported.
- macOS 14 (Sonoma) or later.
- Disk space for the models you download. Each is several GB.
- Open AeroLLM--arm64.dmg and drag AeroLLM to Applications.
- The app is ad-hoc signed, so on first launch macOS Gatekeeper blocks it. To open it,
either right-click the app and choose Open, then Open in the dialog, or run this once
in Terminal:
After that it opens normally.
xattr -dr com.apple.quarantine /Applications/AeroLLM.app
- Open Models, search for a model (for example "Llama 3.2 3B" or "Qwen3 4B"), and download one. Downloads resume if interrupted and show progress in the dock.
- Open Chat, pick the model in the composer, and type. The first message loads the model into memory, which takes a few seconds. After that, responses stream.
State is stored under ~/.aerollm/ (models/, models.json, settings.json, conversations.json, logs/sidecar.log). Deleting a model removes only files under that directory.
In Settings, under API server, turn it on. By default it binds 127.0.0.1 on the configured port. To reach it from other devices, turn on LAN access and set an API key, which is required for LAN. Point an OpenAI client at http://localhost:/v1 and use the loaded model's id.
- Frontend. Tauri v2 webview with React 19, TypeScript, and Tailwind v4.
- Backend. Rust. Hugging Face search, HTTP range downloads (segmented and resumable), the model index, an OpenAI-compatible axum proxy, and the inference sidecar supervisor.
- Inference. A bundled CPython runtime runs mlx-lm for text models and mlx-vlm for vision-language models on a loopback port. The Rust side streams the output to the UI and, when the server is enabled, through the proxy.
npm install
npm run tauri dev # run the app (needs the bundled runtime for inference)
npm run build # tsc + vite build
cd src-tauri && cargo buildBuild a DMG:
scripts/build-release.sh # uses the existing runtime if present
scripts/build-release.sh --rebuild-runtime # rebuild CPython and mlx-lm firstThe release script regenerates the app and DMG icons from public/icon.svg, builds the arm64 bundle, signs the nested Python and MLX binaries, and writes src-tauri/target/release/bundle/dmg/AeroLLM--arm64.dmg.
scripts/spike.sh checks the bundled runtime by downloading a small model and running one completion.





