llmserve

App Listed

TUI for serving local LLM models. Pick a model, pick a backend, serve it.

Downloads
424
Dependents
Not applicable
Stars
417
Forks
26
Contributors
4
Commits
86
Latest release
0.0.7 ·

About

From the project README ·

llmserve icon

Any model. Any backend. One TUI to serve them all.

If you're like me, you've got dozens of GGUF and MLX models scattered across LM Studio, HuggingFace cache, and random directories — and you want to quickly spin one up with whichever inference engine happens to be installed. llmserve is the front door for that. It finds your models, finds your backends, and gets out of the way.

It auto-detects locally installed inference engines (llama-server, KoboldCpp, LocalAI, MLX, and more), discovers model files across multiple locations, and lets you launch servers with live log output — all from a single interactive TUI. No config files to write, no CLI flags to remember.

Sister project: Use llmfit to figure out which models fit your hardware, then use llmserve to actually run them.

demo


Install

Quick install (macOS / Linux)
curl -fsSL https://llmserve.axjns.dev/install.sh | sh
Homebrew
brew trust AlexsJones/llmserve
brew tap AlexsJones/llmserve
brew install llmserve

Homebrew 5.1.15+ refuses to load formulae from untrusted third-party taps, so brew trust is required before brew install. On older versions the brew trust line is unnecessary (and unavailable); skip it.

Cargo
cargo install llmserve
Read the full README
From source
cargo install --path .

Usage

llmserve

The TUI has three panels:

PanelPositionToggleDescription
SourcesLeft1File tree of model locations with counts and serving indicators
ModelsCenterAlways onSearchable, sortable model table with serve status
Serve/LogsRight3Running server cards + live backend output logs

Focus cycles between visible panels with Tab. Resize the focused panel with Shift+Left/Shift+Right.

Keybindings
KeyAction
TabCycle focus: Sources -> Models -> Logs
1 / 3Toggle sources / logs panel
j/kNavigate (works in focused panel)
g/GJump to top / bottom
Ctrl-d/Ctrl-uHalf page down / up
Shift+Left/RightResize focused panel
EnterModels: open serve dialog / Sources: filter by source
SpaceSources: expand/collapse node
aAdd model directory (with tab-completion)
xRemove custom directory (sources panel)
/Search / filter models by name
bPick default backend
fCycle format filter (All / GGUF / MLX)
oCycle sort (Name / Size / Source)
sStop a server
SStop all servers
wToggle log word wrap
CClear dead server logs
rRefresh models and backends
tCycle theme
qQuit
Serve dialog

When you press Enter on a model, a confirmation dialog opens:

KeyAction
h/l or Left/RightCycle through backends (shows availability + already-serving status)
p or TabEdit port number
Enter/yLaunch server
Esc/nCancel

The dialog shows the resolved preset for the selected backend (context size, flash attention, batch size, GPU layers, extra args).


Features

  • Auto-detects inference backends — llama-server, KoboldCpp, LocalAI, MLX (Apple Silicon), Ollama, vLLM, LM Studio
  • Source tree — collapsible file tree showing all model locations with model counts and green dots for serving models
  • Add directories live — press a, type a path with tab-completion, and the directory is scanned immediately and persisted to config
  • Filter by source — click a source in the tree to show only its models
  • Per-backend presets — context size, batch size, GPU layers, threads, and extra CLI args per backend
  • Serve multiple models — run different models on different backends simultaneously, each on its own auto-assigned port
  • Live log output — stdout/stderr from inference backends streams into the logs panel in real-time with color-coded error/warning highlighting
  • Crash diagnostics — when a server exits, its logs are preserved so you can see exactly what went wrong
  • Word wrap — press w to wrap long log lines in the logs panel
  • Resizable panels — Shift+arrows to grow/shrink any focused panel
  • Toggleable panels — 1 hides/shows sources, 3 hides/shows logs
  • 7 themes — Default, Dracula, Solarized, Nord, Monokai, Gruvbox, Catppuccin Mocha
  • Vision model support — auto-detects mmproj projector files and passes --mmproj to llama-server

Configuration

Config lives at ~/.config/llmserve/config.toml. Created automatically on first run.

# Extra directories to scan for model files
extra_model_dirs = [
    "/path/to/more/models",
]

# Global defaults
preferred_port = 8080
preferred_host = "0.0.0.0"
default_ctx_size = 8192
flash_attn = true

# Preferred backend on startup (auto-detected if not set)
# default_backend = "llama-server"

# theme = "Dracula"
Backend presets

Each backend has its own preset that overrides global defaults. Missing fields fall back to the global value.

[presets.llama-server]
ctx_size = 8192
flash_attn = true
batch_size = 2048
gpu_layers = -1          # -1 = all layers to GPU
threads = 8
extra_args = ["--mlock", "--cont-batching"]

[presets.koboldcpp]
ctx_size = 8192
gpu_layers = -1
port = 5001

[presets.localai]
ctx_size = 8192
port = 8080

[presets.mlx]
ctx_size = 4096
port = 8081
FieldTypeDescription
ctx_sizeintegerContext window size
hoststringBind address
portintegerBind port
flash_attnbooleanEnable flash attention (llama-server)
batch_sizeintegerBatch size for prompt processing
gpu_layersintegerGPU layers to offload (-1 = all)
threadsintegerCPU threads for inference
extra_argsstring[]Extra CLI arguments passed to the backend

Backend detection

llmserve detects 7 backends at startup. Backends that can serve local model files are marked with a checkmark:

BackendLocal GGUFLocal MLXDetectionEnv override
llama-serverYes—which llama-server—
KoboldCppYes—binary + API :5001KOBOLDCPP_HOST
LocalAIYes—binary + API :8080 + DockerLOCALAI_HOST
MLX—Yespython3 -c "import mlx_lm" (macOS)—
Ollama——GET :11434/api/tagsOLLAMA_HOST
vLLM——binary + API :8000VLLM_HOST
LM Studio——GET :1234/v1/modelsLMSTUDIO_HOST

Backends that can't serve local files (Ollama, vLLM, LM Studio) are detected but show a clear reason in the serve dialog. They use their own model registries or manage their own servers.

Model discovery

SourceDefault path
LM Studio~/.lmstudio/models/
llama.cpp~/.cache/llm-models/
HuggingFace/MLX~/.cache/huggingface/hub/ (mlx-community repos)
OllamaVia API
Customextra_model_dirs in config

Development

make build       # Debug build
make test        # Unit + integration tests (CI-safe)
make test-local  # All tests including local model serve rotation
make clippy      # Lint
make fmt         # Format
make install     # Install to ~/.cargo/bin

Project structure

src/
  main.rs       — Terminal init/restore, main loop
  lib.rs        — Module exports for integration tests
  app.rs        — App state, input modes, navigation, filtering, serve lifecycle
  backends.rs   — Backend detection (7 backends: llama-server, KoboldCpp, LocalAI, MLX, Ollama, vLLM, LM Studio)
  config.rs     — Config + per-backend presets, load/save TOML
  events.rs     — Crossterm event handling, vim-style keybindings
  models.rs     — Model discovery from disk + APIs
  server.rs     — Server launch/monitor/stop, non-blocking log capture
  theme.rs      — 7 color themes
  ui.rs         — Ratatui rendering (3-panel layout, popups, log viewer)
tests/
  serve_integration.rs — Integration tests (serve, verify HTTP, rotate backends)

Companion to llmfit

llmserve is designed as a companion to llmfit:

  • llmfit answers: "Which models fit my hardware?" — scores models across quality, speed, fit, and context
  • llmserve answers: "Let me serve this one right now" — picks a model, picks a backend, launches it

Both share the same TUI patterns (vim keys, ratatui, crossterm) and theme system.

License

MIT

Runs on
GPU support unknown
What shows it
  • no dependency or feature matches a backend row
Native code
None found
  • No native code found
Python bindings
No Python binding crate found
License
MIT

Compare with similar projects

Order: strongest tier first, then most downloads, then name, with unmeasured values last. A library counts downloads over 30 days. An app counts binary downloads per release. An app with none counts its crate downloads over 30 days. ML Rust runs this catalogue, so its closest project always gets a row.

llmserve beside the projects that share a topic with it
ProjectDownloadsDependentsStarsLatest releaseRuns on (GPU)Native codeLicense
llmserve This page App Listed

TUI for serving local LLM models. Pick a model, pick a backend, serve it.

424 binary downloads per release Not applicable 417 0.0.7 GPU support unknown No native code found MIT
candle-vllm App Listed

Efficent platform for inference and serving local LLMs including an OpenAI compatible API server.

Also in Build LLM apps and agents.

138 binary downloads per release Not applicable 739 Not measured Not measured MIT
batched-fn Listed Dormant

Middleware for serving deep learning models with batched prediction

Also in Run and serve models.

76 downloads over 30 days 0 22 0.2.5 GPU support unknown No native code found Apache-2.0
blazr App Listed

Inference server for LLMs, speech and embeddings: OpenAI-compatible routes with streaming, plus speech synthesis (TTS) and transcription (ASR). Serves Llama, Mistral, Qwen, Mamba2, MLA+MoE and hybrid models from SafeTensors, AWQ, GPTQ and GGUF.

Also in Build LLM apps and agents.

8 binary downloads per release Not applicable 7 0.7.1 CUDA, WebGPU Binds native code: ring (feature distributed) Apache-2.0
oxibonsai Listed

Pure Rust 1-bit LLM inference engine for PrismML Bonsai models — umbrella crate

Also in Build LLM apps and agents.

1 downloads over 30 days 0 137 0.2.3 CUDA, Metal No native code found Apache-2.0

600 KB WASM runtime for Cactus Compute's Needle AI tool-calling models, Needle 3, 2 and 1 from one build. Browser, Cloudflare Workers, Node.js, Python, C FFI and no_std. Token-exact with the JAX reference. No backend, no API key.

Also in Run and serve models.

126 downloads over 30 days 0 107 0.3.1 GPU support unknown No native code found MIT
llamastash App New

Zero-overhead, terminal-native local-LLM orchestrator. Run any engine, any model via the same proxy.

Also in Build LLM apps and agents.

41 binary downloads per release Not applicable 288 0.11.0 GPU support unknown Binds native code: tree-sitter, tree-sitter-language MIT
Why ListedNo archive, New or Featured rule places it, so it is Listed.

What it lacks for Featured

  • Every version is 0.0.x.

What else the check found

  • The last activity is on 26 Oct 2026, 14 days ago. The rules expect an update within 365 days. Dormancy rule

Exact rules: Listed, Featured app. The check on applied thresholds version 9.

Every rule outcome, as the check records it
  • expected-interval: app: E = 365 days
  • dormancy: last activity 2026-10-26, 14 days ago, E = 365: active
  • featured: not featured: every version is 0.0.x
  • listed: listed: no archive, new or featured rule applies

Measurements and sources

Each signal row shows the raw value, its source and the fetch date. The Sources list gathers every distinct source on this page. Movement needs more history.

Sources6 sources
Adoption424 binary downloads per release4 not measured
Adoption measurements
SignalValueSourceFetchedCounts
Active dependentsNot measuredYes
New dependents (365 days)Not measuredYes
Peak active dependentsNot measuredYes
Active dependents as a share of the peakNot measuredYes
Binary downloads per release424GitHub releasesYes
MaintenanceLatest human commit: 14 days ago4 not measured
Maintenance measurements
SignalValueSourceFetchedCounts
Latest human commit2026-10-26GitHub repositoryYes
Latest release2026-07-10GitHub releasesYes
First release2026-03-22crates.io database dumpYes
Latest version0.0.7crates.io database dumpNo
Days the oldest outside issue waits for a reply0GitHub repositoryYes
Maintainer replies over 365 days14GitHub repositoryYes
Repository archivedfalseGitHub repositoryYes
Repository gonefalseGitHub repositoryYes
Release commit or manifest in the repotruecrates.io packageNo
Published docsNot measuredYes
Latest release fails cargo checkNot measuredYes
Build check dateNot measuredYes
Build check toolchainNot measuredYes
SecurityNot measured
Security measurements
SignalValueSourceFetchedCounts
Unpatched vulnerabilities past the grace windowNot measuredYes
RustSec unmaintained advisoryNot measuredYes
Deprecation noticeNot measuredYes
Deprecated requirementNot measuredYes
Distribution4 releases, 5 downloads over 30 days6 not measured
Distribution measurements
SignalValueSourceFetchedCounts
Releases4crates.io database dumpNo
Downloads over 30 days5crates.io database dumpNo
Binary downloads over the last 3 releases1274GitHub releasesYes
Homebrew installs on request over 365 daysNot measuredYes
Repology repository familiesNot measuredYes
Docker pull growth over 90 daysNot measuredYes
Docker pulls at the growth baselineNot measuredYes
Every version a prereleasetruecrates.io database dumpYes
Every version 0.0.xtruecrates.io database dumpYes
Every version yankedNot measuredYes
Crate deleted from crates.ioNot measuredYes
Repository417 stars, 26 forks, 4 contributors, 86 commits. Stars alone never qualify a project.
Repository measurements
SignalValueSourceFetchedCounts
GitHub stars417GitHub repositoryYes — one part of the repository route
GitHub forks26GitHub repositoryYes — one part of the repository route
Contributors with a GitHub account4GitHub contributorsYes — one part of the repository route
Commits on the default branch86GitHub repositoryNo
Repository's main crate left out of the entrynonecrates.io database dumpYes
Facts that never count
Facts that never count measurements
SignalValueSourceFetchedCounts
LicenseMITcrates.io database dumpNo
Runs on, from listed crates and their direct dependenciesGPU support unknowncrates.io database dumpNo
What shows each backendno dependency or feature matches a backend rowcrates.io database dumpNo
Native code, from listed crates and their dependenciesNo native code foundcrates.io database dumpNo
Python bindings, from direct dependencies of listed cratesNo Python binding crate foundcrates.io database dumpNo
Crates that depend on a listed crate directlyNot measuredNo

Corrections and review history

Report a correction

No correction applies to this entry.

Judgments

A judgment enters only through an approved issue and a merged pull request.

No judgment applies to this entry.