Skip to content

Repository files navigation

AeroLLM

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.

Screenshots

Chat Models
Chat Models
Library Search
Library Search
Speech-to-text Text-to-speech
Speech-to-text Text-to-speech

Features

  • 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.

Requirements

  • Apple Silicon (arm64) Mac. Intel is not supported.
  • macOS 14 (Sonoma) or later.
  • Disk space for the models you download. Each is several GB.

Install

  1. Open AeroLLM--arm64.dmg and drag AeroLLM to Applications.
  2. 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:
    xattr -dr com.apple.quarantine /Applications/AeroLLM.app
    
    After that it opens normally.

First run

  1. 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.
  2. 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.

Optional: OpenAI-compatible server

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.

Architecture

  • 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.

Development

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 build

Build a DMG:

scripts/build-release.sh                    # uses the existing runtime if present
scripts/build-release.sh --rebuild-runtime  # rebuild CPython and mlx-lm first

The 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.

About

Local LLM chat app for Apple Silicon Macs.

Topics

Resources

Stars

24 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages