The local model advisor.
Know before you download: will that model actually run on your machine?
Why ModelSift • Key Features • Quick Start • Connect Tools • Architecture • Contributing • Reporting Issues
Running open-weight LLMs locally sounds simple until you actually try it. We've all been there:
- The 14 GB surprise: You wait an hour for a download to finish, hit run, and the whole thing crashes because the KV cache pushed you past your VRAM limit. Nobody warned you.
- Heavyweight wrappers: A lot of existing desktop apps ship 500 MB to 1 GB+ Electron bundles just to launch a local model. That feels wrong for a tool developers keep open all day.
- Cryptic CLI flags: Getting
llama.cpptuned right means juggling-ngl,-c,-fa, context sizes, and port bindings — and actually understanding what quantization does to memory.
ModelSift exists to take that guesswork out. It's a small, fast desktop app built with Tauri 2, Rust, and React 19. It looks at your actual hardware — Apple Silicon unified memory, an NVIDIA/AMD GPU, or plain CPU RAM — does the real memory math (weights + KV cache + overhead), fetches verified GGUF files for you, and serves the model through a plain OpenAI-compatible API at http://127.0.0.1:13370/v1.
No trial and error. You know before you download whether a model fits.
- Honest memory math: Real-time fit calculation using proper GQA (Grouped-Query Attention) KV cache sizing, your chosen context window (2K up to 32K+), and GPU offload layers. You get a straight answer: Fits, Tight Fit, or Exceeds Limits.
- Small and fast: Native Rust backend, ThinLTO-optimized — roughly a 13 MB core binary and a ~30 MB installer. No bundled Chromium.
- Downloads you can trust: Resumable multi-stream downloads straight from HuggingFace Hub, with SHA-256 verification and a check of the actual GGUF header (
n_layers,n_kv_heads,head_dim) so a bad file never slips through. - Works with the tools you already use: A zero-buffering OpenAI gateway fixed at
http://127.0.0.1:13370/v1. Point Cursor, Continue, Cline, Aider, the OpenAI Python/TS SDKs, or plaincurlat it and it just works. - Embeddings too: Run sentence-embedding models side by side with chat models and call an OpenAI-compatible
POST /v1/embeddings. Requests are routed by themodelfield, and chat/embedding capabilities never cross. - It manages the server for you: Spawns and watches the
llama-serversidecar, waits for it to become healthy, isolates its port, and cleans everything up when you quit. - Cross-platform: Tuned for macOS (Metal / Accelerate), Linux (AVX2 / Zen4 kernels), and Windows.
The fastest way — grabs the latest release from GitHub:
curl -fsSL https://raw.githubusercontent.com/yoel3imari/modelsift/main/install.sh | bashA few useful variations:
curl -fsSL https://raw.githubusercontent.com/yoel3imari/modelsift/main/install.sh | bash -s -- --version v0.1.91
curl -fsSL https://raw.githubusercontent.com/yoel3imari/modelsift/main/install.sh | bash -s -- --dry-run
curl -fsSL https://raw.githubusercontent.com/yoel3imari/modelsift/main/install.sh | bash -s -- --format appimageMinimum systems for the prebuilt installers: Linux with glibc 2.39+ — Ubuntu 24.04+, Debian 13+, Fedora 40+, RHEL/Rocky/Alma 10+, openSUSE Leap 16+ or Tumbleweed — and macOS 15+ (Sequoia). The installer stops with a clear error on older systems; use the source build (below) there.
Linux
.rpmnote (v0.2.3 and earlier): those RPMs declareRequires: libayatana-appindicator, a package name no distribution provides, sodnf/zypperreject them. Use--format appimageabove (or the.debon Debian/Ubuntu) for those older releases; v0.2.4+ declares portable sonames instead and installs normally. The installer prints manual workarounds if it hits the old metadata.
Windows: grab the
.exe/.msifrom Releases directly.
Head to Releases and pick your installer:
- macOS:
.dmg(Apple Silicon) - Linux:
.AppImage(portable) or.deb/.rpm - Windows:
.exe/.msi(x64)
- Rust toolchain (1.80+):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- Node.js (v18+) and
npm:node -v
- Platform build dependencies:
- Linux (Ubuntu/Debian):
sudo apt update && sudo apt install -y build-essential pkg-config libssl-dev libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev - macOS: Xcode Command Line Tools (
xcode-select --install) - Windows: Visual Studio 2022 with C++ Build Tools
- Linux (Ubuntu/Debian):
# 1. Clone the repo
git clone https://github.com/yoel3imari/modelsift.git
cd modelsift
# 2. Install frontend dependencies
npm install
# 3. Fetch the pinned llama.cpp sidecar
npm run sidecar:fetch
# 4. Run in dev mode with hot reload
npm run tauri dev# Builds the frontend and packages a release bundle
npm run tauri buildOnce a model is running, ModelSift speaks plain OpenAI protocol at http://127.0.0.1:13370/v1. Anything that talks to OpenAI can talk to it.
Point your assistant at ModelSift:
- Base URL:
http://127.0.0.1:13370/v1 - API Key: anything works, e.g.
localornot-needed - Model: the ID of the model you loaded (or
default)
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:13370/v1",
api_key="not-needed",
)
response = client.chat.completions.create(
model="llama-3.1-8b-instruct-q4_k_m",
messages=[
{"role": "system", "content": "You are a concise software architect."},
{"role": "user", "content": "Explain Grouped-Query Attention in 2 sentences."},
],
stream=True,
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()curl -N http://127.0.0.1:13370/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "active-model",
"messages": [{"role": "user", "content": "Hello ModelSift!"}],
"stream": true
}'Embedding models (for example all-minilm-l6-v2-q8_0, bge-m3-q8_0, or qwen3-embedding-0.6b-q8_0) are launched from the Server view like any other model. The sidecar starts with --embeddings and the catalog's pooling strategy, and the gateway exposes:
curl http://127.0.0.1:13370/v1/embeddings \
-H "Content-Type: application/json" \
-d '{"model": "all-minilm-l6-v2-q8_0", "input": "Hello world"}'The response is the standard OpenAI embeddings envelope (data[].embedding). Text and embedding models can run at the same time; route by the model field. Sending a chat request to an embedding model (or an embeddings request to a text model) returns a 400 invalid_request_error explaining which endpoint to use.
Context limits: Embedding models use their native training context.
nomic-embed-text-v2-moe-q8_0is limited to 512 tokens, so keep input chunks short. The app clamps the sidecar context to the model's native maximum automatically.
curl http://127.0.0.1:13370/healthz
# Returns: {"status":"ok","state":"serving","model":"qwen2.5-coder-7b-instruct-q4_k_m","internal_port":18421}Under the hood it's a modular Rust workspace with a React 19 frontend:
modelsift/
├── crates/
│ ├── domain/ # Shared domain types, ServeConfig, FitResult, and error taxonomy
│ ├── hw_probe/ # Hardware inspection (sysinfo, macOS Metal sysctl, GPU bandwidth tables)
│ ├── fit_engine/ # Memory-fit math, GQA KV sizing and roofline models
│ ├── catalog/ # Curated GGUF catalog parsing, validation, and CDN sync
│ ├── downloader/ # Resumable Range downloader, streaming SHA-256 hasher and GGUF header parser
│ ├── library/ # Local model files, state storage and reconciliation
│ ├── server_manager/ # Supervised child process manager for llama-server
│ └── gateway/ # Axum HTTP/SSE reverse proxy, strictly bound to port 13370
├── src-tauri/ # Tauri 2 shell, capabilities, and IPC commands
├── src/ # React 19 + TypeScript + Vite + Tailwind CSS + shadcn/ui frontend
├── public/ # Static assets and app icon
├── scripts/ # Sidecar provisioning and bundle helpers
└── docs/ # Architecture Decision Records (ADRs) and technical guides
Tests cover both the Rust backend and the React frontend:
# All Rust unit and integration tests
cargo test --workspace
# TypeScript type checks and Vitest suites
npm test
# Sanity-check the production frontend bundle
npm run build
# Formatting and linting
cargo fmt --check
cargo clippy --workspace --all-targets -- -D warningsContributions are welcome — whether that's adding a new model architecture, improving hardware detection, polishing the UI, or fixing a bug you ran into.
- Fork the repo on GitHub.
- Create a feature branch:
git checkout -b feat/your-feature-name
- Set things up locally:
npm install npm run sidecar:fetch npm run tauri dev
- Keep the standards:
- Format Rust with
cargo fmt. - Keep
cargo clippy --workspace --all-targetswarning-free. - Make sure tests pass (
cargo testandnpm test). - Respect the guardrails in
AGENTS.md.
- Format Rust with
- Open a pull request:
- Say clearly what you fixed and what tests you added.
- Link any related issues.
More detail in the Contributing Guide.
Found a bug, hit a hardware detection quirk, or have an idea? We'd genuinely like to hear about it.
- Check first: have a quick look at GitHub Issues to avoid duplicates.
- Filing a bug report — it helps a lot if you include:
- OS and architecture: e.g. macOS 14.5 on M3, Ubuntu 24.04 x86_64, Windows 11.
- Hardware: total RAM, GPU model, VRAM size.
- Model and context: the exact model ID and context size you tried.
- Logs: check the Server Logs tab in the app, or look in:
- Linux:
~/.local/share/dev.yoel3imari.llm-advisor/ - macOS:
~/Library/Application Support/dev.yoel3imari.llm-advisor/ - Windows:
%LOCALAPPDATA%\dev.yoel3imari.llm-advisor\
- Linux:
- Steps to reproduce: numbered steps work best.
- Feature requests: open an issue with what you want, why you want it, and any alternatives you've considered.
ModelSift is open source under the GNU General Public License v3.0.
Inference sidecars use upstream binaries from llama.cpp (MIT License).