turbollm 0.7.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +497 -463
  2. package/dist/cli.js +4637 -2047
  3. package/dist/webdist/assets/ChatScreen-CEMM3c4T.js +41 -0
  4. package/dist/webdist/assets/CustomizeScreen-QBH-lamm.js +4 -0
  5. package/dist/webdist/assets/DeveloperScreen-CUSmAT_L.js +1 -0
  6. package/dist/webdist/assets/EnginesScreen-CxVyQ04U.js +5 -0
  7. package/dist/webdist/assets/ModelDetailDialog-CtrZ6odT.js +1 -0
  8. package/dist/webdist/assets/ModelDirs-MIQRpOiQ.js +1 -0
  9. package/dist/webdist/assets/ModelsScreen-BuZH5fye.js +1 -0
  10. package/dist/webdist/assets/SettingsScreen-DpyvTxBO.js +1 -0
  11. package/dist/webdist/assets/alert-dialog-NJbgeueX.js +1 -0
  12. package/dist/webdist/assets/check-R4c79Xkn.js +1 -0
  13. package/dist/webdist/assets/circle-x-DoZx722k.js +1 -0
  14. package/dist/webdist/assets/common-BkuT8XJF.js +1 -0
  15. package/dist/webdist/assets/copy-button-CvYEyWud.js +1 -0
  16. package/dist/webdist/assets/external-link-CLr8NpF9.js +1 -0
  17. package/dist/webdist/assets/index-B3f5udGb.css +1 -0
  18. package/dist/webdist/assets/index-BhB9CGsv.js +10 -0
  19. package/dist/webdist/assets/pencil-Co_wjceA.js +1 -0
  20. package/dist/webdist/assets/personas-D9qR7c_5.js +43 -0
  21. package/dist/webdist/assets/plus-mxaaevXg.js +1 -0
  22. package/dist/webdist/assets/radix-RipaNCX7.js +51 -0
  23. package/dist/webdist/assets/save-d7rhw6iu.js +1 -0
  24. package/dist/webdist/assets/skeleton-D2X0KEDs.js +1 -0
  25. package/dist/webdist/assets/sparkles-B3j8q0hr.js +1 -0
  26. package/dist/webdist/assets/trash-2-Dm-i43d8.js +1 -0
  27. package/dist/webdist/assets/vendor-D_-14Whs.js +3 -0
  28. package/dist/webdist/index.html +4 -2
  29. package/package.json +62 -62
  30. package/dist/webdist/assets/index-B-GrbX4x.css +0 -1
  31. package/dist/webdist/assets/index-CbHny3S1.js +0 -149
package/README.md CHANGED
@@ -1,463 +1,497 @@
1
- <p align="center">
2
- <img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/turbollm/web/public/brand/turbollm-icon-512.jpeg?v=2" width="92" height="92" alt="TurboLLM" />
3
- </p>
4
-
5
- <h1 align="center">TurboLLM</h1>
6
-
7
- <p align="center">
8
- <strong>Run <em>any</em> local LLM engine, auto-tuned to your GPU — with a polished web UI
9
- and an OpenAI/Anthropic-compatible API.</strong><br/>
10
- Bring your own llama.cpp fork. No compiling. No Electron. No Python. Point Claude Code at
11
- your own machine in one command — fully offline.
12
- </p>
13
-
14
- <p align="center">
15
- <a href="https://www.npmjs.com/package/turbollm"><img src="https://img.shields.io/npm/v/turbollm.svg?color=e2552e" alt="npm version" /></a>
16
- <a href="https://www.npmjs.com/package/turbollm"><img src="https://img.shields.io/npm/dm/turbollm.svg?color=e2552e" alt="npm downloads" /></a>
17
- <img src="https://img.shields.io/badge/node-%E2%89%A522-3c873a.svg" alt="node >= 22" />
18
- <img src="https://img.shields.io/badge/license-FSL--1.1--ALv2-blue.svg" alt="license" />
19
- <img src="https://img.shields.io/badge/platform-Windows%20%C2%B7%20macOS%20%C2%B7%20Linux-555.svg" alt="platforms" />
20
- </p>
21
-
22
- <!-- Brand: shipped app icon web/public/brand/turbollm-icon-512.jpeg · high-res masters web/brand-assets/ (unshipped) · in-app mark web/src/components/Logo.tsx · favicon web/public/favicon.svg -->
23
-
24
- ```bash
25
- npx turbollm
26
- ```
27
-
28
- That one command starts a local daemon, opens a browser UI, and serves your models over an
29
- API any tool can talk to. TurboLLM is the **performance & bleeding-edge layer for local
30
- LLMs** — built for people who today hand-compile forks and hunt forums for the right flags.
31
-
32
- <p align="center">
33
- <img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/how-it-works.svg?v=2" width="860" alt="How TurboLLM works: clients -> one lightweight daemon -> any engine on your GPU" />
34
- </p>
35
-
36
- ---
37
-
38
- ## Contents
39
-
40
- - [Why TurboLLM](#why-turbollm)
41
- - [Features](#features)
42
- - [Quick start](#quick-start)
43
- - [⭐ Bring any engine — the headline feature](#-bring-any-engine--the-headline-feature)
44
- - [Models — bring your own, or browse Hugging Face](#models)
45
- - [Auto-tuning & performance](#auto-tuning--performance)
46
- - [Chat](#chat)
47
- - [APIs & integrations](#apis--integrations)
48
- - [Run Claude Code on your own GPU](#run-claude-code-on-your-own-gpu)
49
- - [Use it from any device on your network](#use-it-from-any-device-on-your-network)
50
- - [Share the GPU with ComfyUI](#share-the-gpu-with-comfyui)
51
- - [Command-line reference](#command-line-reference)
52
- - [Configuration & data](#configuration--data)
53
- - [Requirements](#requirements)
54
- - [Privacy](#privacy)
55
- - [How TurboLLM compares](#how-turbollm-compares)
56
- - [Troubleshooting](#troubleshooting)
57
- - [Develop from source](#develop-from-source)
58
- - [License](#license)
59
-
60
- ---
61
-
62
- ## Why TurboLLM
63
-
64
- Local-LLM tools make two choices for you, and both cost you performance:
65
-
66
- 1. **They pick the engine.** LM Studio ships one blessed runtime; Ollama hides the engine
67
- entirely. The fastest community innovations — new quant formats, speculative decoding,
68
- low-bit KV cache — land in **forks** first, and you can't use them without compiling.
69
- 2. **They don't tell you what speed to expect**, and they don't tune the dozens of launch
70
- flags (`-c`, `-ngl`, `--n-cpu-moe`, KV type, threads, flash-attn, draft models) that make
71
- the difference between 20 and 80 tokens/sec on the *same* hardware.
72
-
73
- TurboLLM does the opposite:
74
-
75
- - **🔌 Any engine, including forks.** Point it at any `llama-server`-compatible binary — a
76
- build you compiled, a community fork, or the one it auto-provisions for your GPU. It probes
77
- the binary's real capabilities and adapts the UI to them. **This is the whole point.**
78
- - **⚡ Auto-tuned to your hardware.** It benchmarks on load, derives fast defaults, and shows
79
- a **VRAM-fit verdict before you load** — no more flag guessing.
80
- - **📊 Real tokens/sec, never faked.** Speed in the model list is *measured on your machine*
81
- from actual generation — live while you chat, and remembered per model.
82
- - **🪶 Lightweight.** A ~0.3 MB npm package on Node — **no Electron, no bundled Chromium, no
83
- Python**. It downloads only the engine your GPU actually needs (Vulkan ≈ 38 MB).
84
- - **🔌 Drop-in APIs.** OpenAI **and** Anthropic-compatible — so Claude Code and every existing
85
- tool work unchanged.
86
- - **🔀 A gateway that loads models for you.** Name any model in your API request and TurboLLM
87
- loads it on demand, keeping your favorites hot in a small pool — so an agent that hops between
88
- models just works, with nothing to pre-wire.
89
- - **🔒 Offline-first & private.** No account, no backend, no internet, **no telemetry.**
90
-
91
- ---
92
-
93
- ## Features
94
-
95
- **Engines**
96
- - Bring any `llama-server`-compatible engine — stock builds or community forks — with real capability probing
97
- - Auto-provision a GPU-matched `llama-server` build on first run (CUDA / ROCm / Metal / SYCL / Vulkan, CPU fallback)
98
- - **vLLM** and **MLX** backends in addition to llama.cpp
99
- - One-click backend install + switch from the Engines screen
100
-
101
- **Models**
102
- - Use your own local GGUF / safetensors, or browse & download from Hugging Face in-app
103
- - Per-model load profiles (context, GPU offload, KV-cache quant, flash-attn, draft models)
104
- - **Configurable multi-GPU per model** — tensor split / main-GPU pick (llama.cpp), tensor-parallel (vLLM)
105
- - Auto-tune on load with a **VRAM-fit verdict before you load**
106
- - Measured tokens/sec per model never faked live while you chat and remembered
107
-
108
- **Chat**
109
- - Streaming chat with live t/s, TTFT, context meter, and reasoning/thinking support
110
- - **Persona picker** (8 styles, including Research) + per-chat system prompt and full sampling controls
111
- - **Inline Unicode charts** when a comparison or trend genuinely warrants a visual
112
- - Image and document attachments including **send an image or file with no text**
113
-
114
- **Agentic tools**
115
- - **Built-in tools**`web_search` (Tavily, advanced depth), `fetch_url`, and sandboxed `run_code`
116
- - **MCP server support** — connect any MCP server (stdio or SSE) from the Customize screen; tools appear automatically in every chat
117
- - **Research persona** — forces multi-step web search before every reply, cites sources inline
118
- - Agentic tool loop with live tool-call cards (pending done/error) streamed in the UI
119
-
120
- **Integrations**
121
- - OpenAI- **and** Anthropic-compatible APIs run Claude Code on your own GPU
122
- - **Smart gateway** — name a model in any request and it auto-loads; keep up to 4 models hot (LRU)
123
- - **Embeddings** (`/v1/embeddings`) and **structured output** (GBNF grammar / JSON-constrained)
124
- - LAN sharing with optional API-key auth
125
- - **Share the GPU with ComfyUI** auto-unload the model while ComfyUI renders, reload when it's done
126
-
127
- **Platform**
128
- - ~0.3 MB npm package on Node no Electron, no Chromium, no Python
129
- - Offline-first, no account, no telemetry
130
-
131
- ---
132
-
133
- ## Quick start
134
-
135
- ```bash
136
- # run without installing (recommended for first try)
137
- npx turbollm
138
-
139
- # or install globally
140
- npm install -g turbollm
141
- turbollm
142
- ```
143
-
144
- **On first run** the daemon:
145
-
146
- 1. Detects your GPU and **downloads a matching `llama-server` build** (CUDA for NVIDIA, ROCm
147
- for AMD, Metal for Apple, SYCL for Intel, Vulkan otherwise — with a CPU fallback).
148
- 2. Starts on <http://127.0.0.1:6996> and opens your browser.
149
- 3. Drops you on the **Chat** screen, ready to load a model.
150
-
151
- Then open **Models**, download or pick a GGUF, click **Load**, and start chatting. Stop the
152
- daemon any time with **Ctrl+C**.
153
-
154
- <!--
155
- 📸 SCREENSHOTS drop PNGs into assets/screenshots/ and uncomment. Suggested shots:
156
- - chat.png : a chat mid-stream showing the live t/s + context meter
157
- - models.png : the Models › Library with measured t/s per model
158
- - engines.png : the Engines screen + backend picker (the USP)
159
- - tuning.png : the model load-params panel (ctx/ngl/NextN/VRAM verdict)
160
- <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/chat.png" width="860" alt="TurboLLM chat" /></p>
161
- -->
162
-
163
- ---
164
-
165
- ## Bring any engine the headline feature
166
-
167
- No other local-LLM app lets you run **whatever inference engine you want**. TurboLLM treats
168
- the engine as a swappable component.
169
-
170
- **Add a custom engine** (Engines screen **Add engine**):
171
-
172
- 1. Compile or download any `llama-server`-compatible binary stock
173
- [llama.cpp](https://github.com/ggml-org/llama.cpp), a community fork, or your own build.
174
- 2. Point TurboLLM at the binary. It runs a **capability probe** and learns exactly which
175
- flags and features that build supports.
176
- 3. Activate it. The load-parameter UI **adapts to that engine** — features the build doesn't
177
- support are hidden; ones it adds (e.g. low-bit KV cache, NextN) light up.
178
-
179
- **Auto-provisioned default.** Don't want to fetch anything? On first run TurboLLM downloads
180
- the right upstream prebuilt for your GPU automatically — and a **backend picker** lets you
181
- switch between CUDA / ROCm / Metal / SYCL / Vulkan / CPU at any time (it downloads the variant
182
- you choose, LM Studio-style).
183
-
184
- **Engine types.** Both **llama.cpp / GGUF** and **MLX** (on macOS) are first-class engine
185
- kinds pick the right one per model.
186
-
187
- **Fully supervised.** Every engine runs under a real state machine: health-gated readiness,
188
- graceful stop, an **idle auto-stop** watchdog, and **live logs + clear error surfacing** in
189
- the UI when something fails to load.
190
-
191
- > Why it matters: fork-exclusive features — **speculative decoding (NextN / MTP / draft)**,
192
- > low-bit KV cache, new quant formats — are usable on day 0, with **zero compiler knowledge**
193
- > on your part beyond producing the binary (and often not even that).
194
-
195
- ---
196
-
197
- ## Models
198
-
199
- - **Use the folders you already have.** Point TurboLLM at any directory of GGUFs — your
200
- existing LM Studio / Ollama / manual downloads — **no re-downloading.** It parses GGUF
201
- metadata (arch, params, quant, context, vision) for every file.
202
- - **Browse & download from Hugging Face**, in-app: search, see the file tree, pick a quant,
203
- and download with **resume + SHA-256 verification**. Gated models (Llama, Gemma) work via
204
- your own HF token, which **never leaves your machine**.
205
- - **Import from any URL** — not just Hugging Face. Paste a direct `.gguf` link (model-author
206
- sites, mirrors, private servers); it disk-space-checks and downloads through the same
207
- manager.
208
- - **Quant recommendation per GPU** and a **VRAM-fit verdict** so you pick a quant that
209
- actually fits before you commit.
210
- - **Primary download folder**, real-time **measured t/s per model**, and **delete-from-disk**
211
- full library management.
212
-
213
- ---
214
-
215
- ## Auto-tuning & performance
216
-
217
- - **Auto-benchmark on load** derives fast defaults for your exact GPU.
218
- - **Real measured tokens/sec** in the model list **live** while a model is generating,
219
- **last-session** when it's idle (never a synthetic estimate).
220
- - **Full load-parameter UI**, a superset of what other tools expose:
221
- context length, GPU offload (`-ngl`), **MoE CPU-offload (`--n-cpu-moe`)**, parallel slots,
222
- **KV-cache quant type** (incl. low-bit on supporting forks), CPU threads, flash attention,
223
- and **speculative decoding (NextN / MTP / draft)**.
224
- - **Fast by default:** flash attention on, NextN self-speculative decoding on for models that
225
- carry a draft head, threads auto — best speed out of the box, safely gated to what your
226
- engine actually accepts.
227
- - **Multi-GPU, per model** split a model across cards (layer/row split + main-GPU pick on
228
- llama.cpp, tensor-parallel on vLLM). Defaults are no-ops, so single-GPU rigs are untouched and
229
- the VRAM verdict budgets across the GPUs the split actually uses.
230
- - **Saved per-model profiles** tune once, and it loads that way every time.
231
-
232
- ---
233
-
234
- ## Chat
235
-
236
- A genuinely good chat UI, not an afterthought:
237
-
238
- - **Streaming** with a **stop** button, **live tokens/sec**, **prompt-processing %** and
239
- **prefill t/s**, **time-to-first-token**, **total time**, exact **token counts**, and a
240
- **context-usage meter** (filled / max) on every reply.
241
- - **Thinking control** — toggle reasoning **off** to get a direct answer (saves time and
242
- tokens), or leave it **on** with collapsible, timed "thought for N s" blocks.
243
- - **Markdown + syntax-highlighted code** with one-click copy — plus **inline Unicode charts**
244
- the model draws when a comparison, trend, or hierarchy is genuinely worth a visual.
245
- - **Personas** — pick a style (Concise · Detailed · Blunt · Formal · Tutor · Creative · Default)
246
- per conversation, no prompt-wrangling required.
247
- - **Edit, regenerate, delete, copy** any message; **persistent, searchable conversations**
248
- with rename, delete, and **auto-generated titles**.
249
- - **Per-chat system prompt** and **per-chat sampling** overrides the full set: temperature,
250
- top-p/k, min-p, repeat/presence/frequency penalties, and **stop strings**.
251
- - **Image input** for vision models.
252
- - **TurboLLM Expert** a built-in assistant that knows the app and your hardware, for
253
- onboarding and troubleshooting without leaving the UI.
254
-
255
- ---
256
-
257
- ## APIs & integrations
258
-
259
- With a model loaded, TurboLLM serves two compatible APIs on the same port:
260
-
261
- ```bash
262
- # OpenAI-compatible
263
- curl http://127.0.0.1:6996/v1/chat/completions \
264
- -H "Content-Type: application/json" \
265
- -d '{"model":"local","messages":[{"role":"user","content":"hello"}]}'
266
- ```
267
-
268
- - **OpenAI-compatible** `/v1/chat/completions`, `/v1/embeddings`, … — point any OpenAI client
269
- or tool at it. Embedding models are auto-detected and pooled separately, so a RAG pipeline and
270
- a chat model can stay loaded side by side.
271
- - **Anthropic-compatible** `/v1/messages` — including **tool use and streaming** — which is
272
- what powers Claude Code below. No other local host offers this.
273
- - **Structured output** — constrain any response to a **GBNF grammar** (or JSON shape) for
274
- reliable machine-readable results.
275
- - **API-key auth** you can require when sharing over a LAN (Settings → Network).
276
-
277
- ### The gateway loads models for you
278
-
279
- Most local hosts make you load a model first, then call it. TurboLLM's gateway reads the
280
- `model` field of any incoming request, **fuzzy-matches it to your library, and loads it on the
281
- fly** if it isn't already running then keeps up to **four models hot** in an LRU pool so the
282
- next switch is instant. An agent (or Claude Code) that hops between a coding model, a vision
283
- model, and an embedder just names each one and it works no pre-wiring, no manual swaps. Tune
284
- it in Settings → Gateway (`autoSwap`, `keepN`).
285
-
286
- ---
287
-
288
- ## Run Claude Code on your own GPU
289
-
290
- TurboLLM's Anthropic-compatible endpoint means [Claude
291
- Code](https://www.npmjs.com/package/@anthropic-ai/claude-code) can run against whatever model
292
- you've loaded no cloud key, fully offline. One command wires it up:
293
-
294
- ```bash
295
- turbollm launch claude # opens Claude Code on your loaded model
296
- ```
297
-
298
- It sets Claude Code's `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` at TurboLLM and execs `claude`;
299
- extra args are forwarded. If `claude` isn't installed, it tells you how. The in-app
300
- **Developer** screen also shows copy-paste env snippets for any OpenAI- or Anthropic-compatible
301
- tool (Open WebUI, Kilo Code, opencode, …).
302
-
303
- ---
304
-
305
- ## Use it from any device on your network
306
-
307
- The UI runs in the browser, so any phone, tablet, or laptop on your LAN can use the model on
308
- your GPU box:
309
-
310
- ```bash
311
- turbollm --addr 0.0.0.0:6996 # bind all interfaces, then open http://<your-ip>:6996
312
- ```
313
-
314
- Turn on **Require API key** in Settings → Network when you expose it.
315
-
316
- ---
317
-
318
- ## Share the GPU with ComfyUI
319
-
320
- If you run **ComfyUI** on the same GPU, an LLM holding VRAM while ComfyUI renders means both
321
- fight for memory (and one usually OOMs). TurboLLM can hand the GPU over automatically:
322
-
323
- - The instant ComfyUI starts a render, TurboLLM **unloads its model and pauses new loads**.
324
- - When ComfyUI's queue drains, TurboLLM **reloads the exact model it unloaded**.
325
-
326
- It's **push-based, not polling** — ComfyUI signals TurboLLM the moment a job starts/ends, so
327
- the handoff is immediate and deterministic (the model is gone *before* ComfyUI executes).
328
-
329
- **One-time setup** (Settings → ComfyUI):
330
-
331
- 1. Turn on **Pause for ComfyUI** and **Save**.
332
- 2. Enter your ComfyUI folder (the one containing `custom_nodes`) and click **Install gate**.
333
- TurboLLM writes a small custom node into ComfyUI, wired to this daemon.
334
- 3. **Restart ComfyUI** once so it loads the node.
335
-
336
- The Settings panel shows a live indicator (rendering / idle / connected). To undo it, click
337
- **Remove** in the same panel.
338
-
339
- ---
340
-
341
- ## Command-line reference
342
-
343
- ```bash
344
- turbollm # start on :6996, open browser
345
- turbollm --port 9000 # listen on a specific port
346
- turbollm --no-open # start without opening a browser
347
- turbollm --addr 0.0.0.0:6996 # bind all interfaces (LAN sharing)
348
- turbollm launch claude # start Claude Code against the loaded model
349
- ```
350
-
351
- | Flag | Description |
352
- |------|-------------|
353
- | `--port <n>` | Listen on a specific port (default: `6996`) |
354
- | `--addr <host:port>` | Full host:port override, e.g. `0.0.0.0:6996` for LAN sharing |
355
- | `--no-open` | Start without opening a browser window |
356
- | `--config <file>` | Path to a custom config file |
357
- | `--help`, `-h` | Show usage and exit |
358
-
359
- ---
360
-
361
- ## Configuration & data
362
-
363
- Everything lives under **`~/.turbollm/`** on every OS `config.json`, the SQLite chat
364
- database, downloaded engines, models cache, and logs. Back it up or delete it to reset.
365
- Use `--config <file>` to point at an alternate config (its directory becomes the data dir).
366
-
367
- ---
368
-
369
- ## Requirements
370
-
371
- - **Node.js 22 or newer** — enforced at startup with a clear message. <https://nodejs.org>
372
- - **Windows, macOS, or Linux.**
373
- - A GPU is recommended but **not required** a CPU build is provisioned as a fallback.
374
- - On Windows, the first time the auto-downloaded `llama-server` runs, SmartScreen/Defender may
375
- prompt (it's an upstream binary). Allow it once.
376
-
377
- ---
378
-
379
- ## Privacy
380
-
381
- TurboLLM is **offline-first**: core local use needs no account, no backend, and no internet.
382
- **No analytics or telemetry are collected.** Your prompts, chats, files, and keys never leave
383
- your machine.
384
-
385
- ---
386
-
387
- ## How TurboLLM compares
388
-
389
- Focused on the differences that matter — all four are good tools.
390
-
391
- | | **TurboLLM** | LM Studio | Ollama | Open WebUI |
392
- |---|:---:|:---:|:---:|:---:|
393
- | Run **any engine / community forks** | ✅ | ❌ one runtime | ❌ hidden | ❌ |
394
- | **Auto-tune** launch flags to your GPU | ✅ | ❌ | ❌ | ❌ |
395
- | **Measured** t/s in the model list | ✅ | ◐ | ◐ | ❌ |
396
- | **Anthropic** API (tool use) → Claude Code | ✅ | ❌ | ❌ | ❌ |
397
- | OpenAI-compatible API | ✅ | ✅ | ✅ | ◐ proxy |
398
- | **Auto-load the requested model** (hot-swap pool) | ✅ | ❌ | ◐ | ❌ |
399
- | Use existing model folders (no re-download) | | | ❌ | ❌ |
400
- | Speculative decoding (NextN / MTP / draft) | ✅ | ◐ draft | ❌ | ❌ |
401
- | Web UI from any LAN device | | | | ✅ |
402
- | **Lightweight** (no Electron / no Python) | ✅ npm | ❌ Electron | ✅ Go | ❌ Python |
403
- | Offline-first · no telemetry | ✅ | | | |
404
-
405
- Prefer Open WebUI's chat breadth? It works great pointed at TurboLLM's OpenAI endpoint.
406
-
407
- ---
408
-
409
- ## Troubleshooting
410
-
411
- - **`TurboLLM requires Node.js 22 or newer`** upgrade Node: <https://nodejs.org>.
412
- - **Model won't load / OOM** pick a smaller quant (the VRAM verdict warns you), lower GPU
413
- offload, or close other GPU apps. Failures surface in the Engines screen with the engine log.
414
- - **Windows Defender / SmartScreen prompt** — that's the upstream `llama-server` binary on
415
- first run; allow it once.
416
- - **Port already in use** — `turbollm --port 9000`.
417
- - **Slow generation** — open the model's load params; ensure GPU offload is high and flash
418
- attention / NextN are on for supported models.
419
-
420
- ---
421
-
422
- ## Develop from source
423
-
424
- ```bash
425
- npm install # daemon deps
426
- cd web && npm install && cd ..
427
-
428
- npm run build:web # build the React UI -> src/webdist
429
- npm run start # run the daemon in dev (hot TS via tsx) -> :6996
430
-
431
- npm run build # production bundle -> dist/cli.js (web assets included)
432
- node dist/cli.js --port 6996
433
- ```
434
-
435
- Frontend hot-reload: `cd web && npm run dev` (proxies `/api` and `/v1` to the daemon on
436
- :6996).
437
-
438
- **Stack:** Node ≥22 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
439
- shadcn/ui frontend. One TypeScript codebase, shipped as an npm package.
440
-
441
- ```
442
- turbollm/
443
- bin/turbollm.mjs launcher shim (Node guard) -> dist/cli.js
444
- src/
445
- cli.ts entrypoint: wiring + graceful shutdown
446
- server.ts Hono app: CORS, API, gateway, embedded SPA
447
- engines/ provisioning, probe, registry, lifecycle state machine
448
- api/routes.ts /api/v1/* handlers
449
- gateway/ /v1/* OpenAI + Anthropic gateway
450
- models/ · chat/ · hf/ · bench/ · downloads/
451
- web/ React + TS + Tailwind + shadcn frontend (own package.json)
452
- ```
453
-
454
- ---
455
-
456
- ## License
457
-
458
- Source-available under the **Functional Source License 1.1 (Apache-2.0 future grant)** — SPDX
459
- **`FSL-1.1-ALv2`**. Free for personal use, internal business use, education, and research; the
460
- only restriction is shipping a competing product. Each release converts to Apache-2.0 two
461
- years after it's published. Full text: [LICENSE.md](https://github.com/mohitsoni48/Turbo-LLM/blob/main/turbollm/LICENSE.md).
462
-
463
- <p align="center"><sub>Built for people who refuse to wait for the mainstream to bless the fast path. ⚡</sub></p>
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/turbollm/web/public/brand/turbollm-icon-512.jpeg?v=2" width="92" height="92" alt="TurboLLM" />
3
+ </p>
4
+
5
+ <h1 align="center">TurboLLM</h1>
6
+
7
+ <p align="center">
8
+ <strong>Run <em>any</em> local LLM engine, auto-tuned to your GPU — with a polished web UI
9
+ and an OpenAI/Anthropic-compatible API.</strong><br/>
10
+ Bring your own llama.cpp fork. No compiling. No Electron. No Python. Point Claude Code at
11
+ your own machine in one command — fully offline.
12
+ </p>
13
+
14
+ <p align="center">
15
+ <a href="https://www.npmjs.com/package/turbollm"><img src="https://img.shields.io/npm/v/turbollm.svg?color=e2552e" alt="npm version" /></a>
16
+ <a href="https://www.npmjs.com/package/turbollm"><img src="https://img.shields.io/npm/dm/turbollm.svg?color=e2552e" alt="npm downloads" /></a>
17
+ <img src="https://img.shields.io/badge/node-%E2%89%A522-3c873a.svg" alt="node >= 22" />
18
+ <img src="https://img.shields.io/badge/license-FSL--1.1--ALv2-blue.svg" alt="license" />
19
+ <img src="https://img.shields.io/badge/platform-Windows%20%C2%B7%20macOS%20%C2%B7%20Linux-555.svg" alt="platforms" />
20
+ </p>
21
+
22
+ <!-- Brand: shipped app icon web/public/brand/turbollm-icon-512.jpeg · high-res masters web/brand-assets/ (unshipped) · in-app mark web/src/components/Logo.tsx · favicon web/public/favicon.svg -->
23
+
24
+ ```bash
25
+ npx turbollm
26
+ ```
27
+
28
+ That one command starts a local daemon, opens a browser UI, and serves your models over an
29
+ API any tool can talk to. TurboLLM is the **performance & bleeding-edge layer for local
30
+ LLMs** — built for people who today hand-compile forks and hunt forums for the right flags.
31
+
32
+ <p align="center">
33
+ <img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/how-it-works.svg?v=2" width="860" alt="How TurboLLM works: clients -> one lightweight daemon -> any engine on your GPU" />
34
+ </p>
35
+
36
+ ---
37
+
38
+ ## Contents
39
+
40
+ - [Why TurboLLM](#why-turbollm)
41
+ - [Features](#features)
42
+ - [Quick start](#quick-start)
43
+ - [⭐ Bring any engine — the headline feature](#-bring-any-engine--the-headline-feature)
44
+ - [Models — bring your own, or browse Hugging Face](#models)
45
+ - [Auto-tuning & performance](#auto-tuning--performance)
46
+ - [Chat](#chat)
47
+ - [APIs & integrations](#apis--integrations)
48
+ - [Run Claude Code on your own GPU](#run-claude-code-on-your-own-gpu)
49
+ - [Use it from any device on your network](#use-it-from-any-device-on-your-network)
50
+ - [Share the GPU with ComfyUI](#share-the-gpu-with-comfyui)
51
+ - [Command-line reference](#command-line-reference)
52
+ - [Configuration & data](#configuration--data)
53
+ - [Requirements](#requirements)
54
+ - [Privacy](#privacy)
55
+ - [How TurboLLM compares](#how-turbollm-compares)
56
+ - [Troubleshooting](#troubleshooting)
57
+ - [Develop from source](#develop-from-source)
58
+ - [License](#license)
59
+
60
+ ---
61
+
62
+ ## Why TurboLLM
63
+
64
+ Local-LLM tools make two choices for you, and both cost you performance:
65
+
66
+ 1. **They pick the engine.** LM Studio ships one blessed runtime; Ollama hides the engine
67
+ entirely. The fastest community innovations — new quant formats, speculative decoding,
68
+ low-bit KV cache — land in **forks** first, and you can't use them without compiling.
69
+ 2. **They don't tell you what speed to expect**, and they don't tune the dozens of launch
70
+ flags (`-c`, `-ngl`, `--n-cpu-moe`, KV type, threads, flash-attn, draft models) that make
71
+ the difference between 20 and 80 tokens/sec on the *same* hardware.
72
+
73
+ TurboLLM does the opposite:
74
+
75
+ - **🔌 Any engine, including forks.** Point it at any `llama-server`-compatible binary — a
76
+ build you compiled, a community fork, or the one it auto-provisions for your GPU. It probes
77
+ the binary's real capabilities and adapts the UI to them. **This is the whole point.**
78
+ - **⚡ Auto-tuned to your hardware.** It benchmarks on load, derives fast defaults, and shows
79
+ a **VRAM-fit verdict before you load** — no more flag guessing.
80
+ - **📊 Real tokens/sec, never faked.** Speed in the model list is *measured on your machine*
81
+ from actual generation — live while you chat, and remembered per model.
82
+ - **🪶 Lightweight.** A ~0.3 MB npm package on Node — **no Electron, no bundled Chromium, no
83
+ Python**. It downloads only the engine your GPU actually needs (Vulkan ≈ 38 MB).
84
+ - **🔌 Drop-in APIs.** OpenAI **and** Anthropic-compatible — so Claude Code and every existing
85
+ tool work unchanged.
86
+ - **🔀 A gateway that loads models for you.** Name any model in your API request and TurboLLM
87
+ loads it on demand, keeping your favorites hot in a small pool — so an agent that hops between
88
+ models just works, with nothing to pre-wire.
89
+ - **🔒 Offline-first & private.** No account, no backend, no internet, **no telemetry.**
90
+
91
+ ---
92
+
93
+ ## Features
94
+
95
+ **Engines**
96
+ - Bring any `llama-server`-compatible engine — stock builds or community forks — with real capability probing
97
+ - **Hardware-aware recommendation** detects your GPU and tells you which engine/build fits; engines that can't run here are greyed with the reason
98
+ - **Curated catalog** llama.cpp, KoboldCpp, llamafile, MLX, vLLM, plus forks (ik_llama, TurboQuant) — one-click install where a prebuilt exists
99
+ - **Build-from-source guide** for source-only forks (prerequisite check + the exact commands), then add the binary via a guided folder scan
100
+ - **Honest updates** — checks the real upstream release/commit and flags *Update available* / *Rebuild available* (never a fake "you're on the latest"), with per-engine auto-update
101
+ - Auto-provision a GPU-matched `llama-server` build on first run (CUDA / ROCm / Metal / SYCL / Vulkan, CPU fallback)
102
+ - One engine dropdown, grouped pick the engine; a version dropdown appears when you have more than one build
103
+
104
+ **Models**
105
+ - Use your own local GGUF / safetensors, or browse & download from Hugging Face in-app
106
+ - Per-model load profiles (context, GPU offload, KV-cache quant, flash-attn, draft models)
107
+ - **Configurable multi-GPU per model** — tensor split / main-GPU pick (llama.cpp), tensor-parallel (vLLM)
108
+ - Auto-tune on load with a **VRAM-fit verdict before you load**
109
+ - Measured tokens/sec per model — never faked — live while you chat and remembered
110
+
111
+ **Chat**
112
+ - Streaming chat with live t/s, TTFT, context meter, and reasoning/thinking support
113
+ - **Persona picker** (8 styles, including Research) + per-chat system prompt and full sampling controls
114
+ - **Inline Unicode charts** when a comparison or trend genuinely warrants a visual
115
+ - Image and document attachments including **send an image or file with no text**
116
+
117
+ **Agentic tools**
118
+ - **Built-in tools** `web_search` (Tavily, advanced depth), `fetch_url`, and sandboxed `run_code`
119
+ - **MCP server support** — connect any MCP server (stdio or SSE) from the Customize screen; tools appear automatically in every chat
120
+ - **Research persona** — forces multi-step web search before every reply, cites sources inline
121
+ - Agentic tool loop with live tool-call cards (pending done/error) streamed in the UI
122
+
123
+ **Integrations**
124
+ - OpenAI- **and** Anthropic-compatible APIs run Claude Code on your own GPU
125
+ - **Smart gateway** name a model in any request and it auto-loads; keep up to 4 models hot (LRU)
126
+ - **Embeddings** (`/v1/embeddings`) and **structured output** (GBNF grammar / JSON-constrained)
127
+ - LAN sharing with optional API-key auth
128
+ - **Share the GPU with ComfyUI**auto-unload the model while ComfyUI renders, reload when it's done
129
+
130
+ **Platform**
131
+ - ~0.3 MB npm package on Node — no Electron, no Chromium, no Python
132
+ - Offline-first, no account, no telemetry
133
+
134
+ ---
135
+
136
+ ## Quick start
137
+
138
+ ```bash
139
+ # run without installing (recommended for first try)
140
+ npx turbollm
141
+
142
+ # or install globally
143
+ npm install -g turbollm
144
+ turbollm
145
+ ```
146
+
147
+ **On first run** the daemon:
148
+
149
+ 1. Detects your GPU and **downloads a matching `llama-server` build** (CUDA for NVIDIA, ROCm
150
+ for AMD, Metal for Apple, SYCL for Intel, Vulkan otherwise — with a CPU fallback).
151
+ 2. Starts on <http://127.0.0.1:6996> and opens your browser.
152
+ 3. Drops you on the **Chat** screen, ready to load a model.
153
+
154
+ Then open **Models**, download or pick a GGUF, click **Load**, and start chatting. Stop the
155
+ daemon any time with **Ctrl+C**.
156
+
157
+ <p align="center">
158
+ <img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/engines.png" width="860" alt="TurboLLM Engines screen: hardware-aware recommendation, a unified engine catalog (llama.cpp, KoboldCpp, llamafile, vLLM, forks), and build-from-source" />
159
+ </p>
160
+
161
+ <!--
162
+ 📸 More screenshots — drop PNGs into assets/screenshots/ and add. Suggested shots:
163
+ - chat.png : a chat mid-stream showing the live t/s + context meter
164
+ - models.png : the Models › Library with measured t/s per model
165
+ - tuning.png : the model load-params panel (ctx/ngl/NextN/VRAM verdict)
166
+ -->
167
+
168
+ ---
169
+
170
+ ## Bring any engine the headline feature
171
+
172
+ No other local-LLM app lets you run **whatever inference engine you want**. TurboLLM treats
173
+ the engine as a swappable component.
174
+
175
+ **Add a custom engine** (Engines screen → **Add engine**):
176
+
177
+ 1. Compile or download any `llama-server`-compatible binary stock
178
+ [llama.cpp](https://github.com/ggml-org/llama.cpp), a community fork, or your own build.
179
+ 2. Point TurboLLM at the **folder** it scans for the `llama-server` binary, runs a
180
+ **capability probe**, and learns exactly which flags and features that build supports.
181
+ *(Optional: paste the source repo URL so TurboLLM flags when a newer build ships.)*
182
+ 3. Activate it. The load-parameter UI **adapts to that engine** — features the build doesn't
183
+ support are hidden; ones it adds (e.g. low-bit KV cache, NextN) light up.
184
+
185
+ No prebuilt for your OS? The **build-from-source guide** checks your toolchain (git / CMake /
186
+ CUDA / MSVC), hands you the exact build commands, then drops you into the folder scan above.
187
+
188
+ **Auto-provisioned default.** Don't want to fetch anything? On first run TurboLLM downloads
189
+ the right upstream prebuilt for your GPU automatically — and a **backend picker** lets you
190
+ switch between CUDA / ROCm / Metal / SYCL / Vulkan / CPU at any time (it downloads the variant
191
+ you choose, LM Studio-style).
192
+
193
+ **Engine types.** **llama.cpp / GGUF**, **KoboldCpp** and **llamafile** (GGUF, every OS),
194
+ **MLX** (macOS), and **vLLM** (Linux + NVIDIA) are all first-class engine kinds — install from
195
+ the curated catalog, pick the right one per model, and switch from a single dropdown.
196
+
197
+ **Fully supervised.** Every engine runs under a real state machine: health-gated readiness,
198
+ graceful stop, an **idle auto-stop** watchdog, and **live logs + clear error surfacing** in
199
+ the UI when something fails to load.
200
+
201
+ > Why it matters: fork-exclusive features **speculative decoding (NextN / MTP / draft)**,
202
+ > low-bit KV cache, new quant formats are usable on day 0, with **zero compiler knowledge**
203
+ > on your part beyond producing the binary (and often not even that).
204
+
205
+ ---
206
+
207
+ ## Models
208
+
209
+ - **Use the folders you already have.** Point TurboLLM at any directory of GGUFs — your
210
+ existing LM Studio / Ollama / manual downloads **no re-downloading.** It parses GGUF
211
+ metadata (arch, params, quant, context, vision) for every file.
212
+ - **Browse & download from Hugging Face**, in-app: search, see the file tree, pick a quant,
213
+ and download with **resume + SHA-256 verification**. Gated models (Llama, Gemma) work via
214
+ your own HF token, which **never leaves your machine**.
215
+ - **Import from any URL** — not just Hugging Face. Paste a direct `.gguf` link (model-author
216
+ sites, mirrors, private servers); it disk-space-checks and downloads through the same
217
+ manager.
218
+ - **Quant recommendation per GPU** and a **VRAM-fit verdict** so you pick a quant that
219
+ actually fits before you commit.
220
+ - **Primary download folder**, real-time **measured t/s per model**, and **delete-from-disk**
221
+ full library management.
222
+
223
+ ---
224
+
225
+ ## Auto-tuning & performance
226
+
227
+ - **Auto-benchmark on load** derives fast defaults for your exact GPU.
228
+ - **Real measured tokens/sec** in the model list **live** while a model is generating,
229
+ **last-session** when it's idle (never a synthetic estimate).
230
+ - **Full load-parameter UI**, a superset of what other tools expose:
231
+ context length, GPU offload (`-ngl`), **MoE CPU-offload (`--n-cpu-moe`)**, parallel slots,
232
+ **KV-cache quant type** (incl. low-bit on supporting forks), CPU threads, flash attention,
233
+ and **speculative decoding (NextN / MTP / draft)**.
234
+ - **Fast by default:** flash attention on, NextN self-speculative decoding on for models that
235
+ carry a draft head, threads auto — best speed out of the box, safely gated to what your
236
+ engine actually accepts.
237
+ - **Multi-GPU, per model** — split a model across cards (layer/row split + main-GPU pick on
238
+ llama.cpp, tensor-parallel on vLLM). Defaults are no-ops, so single-GPU rigs are untouched and
239
+ the VRAM verdict budgets across the GPUs the split actually uses.
240
+ - **Saved per-model profiles** tune once, and it loads that way every time.
241
+
242
+ ---
243
+
244
+ ## Chat
245
+
246
+ A genuinely good chat UI, not an afterthought:
247
+
248
+ - **Streaming** with a **stop** button, **live tokens/sec**, **prompt-processing %** and
249
+ **prefill t/s**, **time-to-first-token**, **total time**, exact **token counts**, and a
250
+ **context-usage meter** (filled / max) on every reply.
251
+ - **Thinking control** toggle reasoning **off** to get a direct answer (saves time and
252
+ tokens), or leave it **on** with collapsible, timed "thought for N s" blocks.
253
+ - **Markdown + syntax-highlighted code** with one-click copy — plus **inline Unicode charts**
254
+ the model draws when a comparison, trend, or hierarchy is genuinely worth a visual.
255
+ - **Personas** — pick a style (Concise · Detailed · Blunt · Formal · Tutor · Creative · Default)
256
+ per conversation, no prompt-wrangling required.
257
+ - **Edit, regenerate, delete, copy** any message; **persistent, searchable conversations**
258
+ with rename, delete, and **auto-generated titles**.
259
+ - **Per-chat system prompt** and **per-chat sampling** overrides the full set: temperature,
260
+ top-p/k, min-p, repeat/presence/frequency penalties, and **stop strings**.
261
+ - **Image input** for vision models.
262
+ - **TurboLLM Expert** — a built-in assistant that knows the app and your hardware, for
263
+ onboarding and troubleshooting without leaving the UI.
264
+
265
+ ---
266
+
267
+ ## APIs & integrations
268
+
269
+ With a model loaded, TurboLLM serves two compatible APIs on the same port:
270
+
271
+ ```bash
272
+ # OpenAI-compatible
273
+ curl http://127.0.0.1:6996/v1/chat/completions \
274
+ -H "Content-Type: application/json" \
275
+ -d '{"model":"local","messages":[{"role":"user","content":"hello"}]}'
276
+ ```
277
+
278
+ - **OpenAI-compatible** `/v1/chat/completions`, `/v1/embeddings`, … — point any OpenAI client
279
+ or tool at it. Embedding models are auto-detected and pooled separately, so a RAG pipeline and
280
+ a chat model can stay loaded side by side.
281
+ - **Anthropic-compatible** `/v1/messages`including **tool use and streaming** which is
282
+ what powers Claude Code below. No other local host offers this.
283
+ - **Structured output** constrain any response to a **GBNF grammar** (or JSON shape) for
284
+ reliable machine-readable results.
285
+ - **API-key auth** you can require when sharing over a LAN (Settings → Network).
286
+
287
+ ### The gateway loads models for you
288
+
289
+ Most local hosts make you load a model first, then call it. TurboLLM's gateway reads the
290
+ `model` field of any incoming request, **fuzzy-matches it to your library, and loads it on the
291
+ fly** if it isn't already running — then keeps up to **four models hot** in an LRU pool so the
292
+ next switch is instant. An agent (or Claude Code) that hops between a coding model, a vision
293
+ model, and an embedder just names each one and it works — no pre-wiring, no manual swaps. Tune
294
+ it in Settings → Gateway (`autoSwap`, `keepN`).
295
+
296
+ ---
297
+
298
+ ## Run Claude Code on your own GPU
299
+
300
+ TurboLLM's Anthropic-compatible endpoint means [Claude
301
+ Code](https://www.npmjs.com/package/@anthropic-ai/claude-code) can run against whatever model
302
+ you've loaded — no cloud key, fully offline. One command wires it up:
303
+
304
+ ```bash
305
+ turbollm launch claude # opens Claude Code on your loaded model
306
+ ```
307
+
308
+ It sets Claude Code's `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` at TurboLLM and execs `claude`;
309
+ extra args are forwarded. If `claude` isn't installed, it tells you how. The in-app
310
+ **Developer** screen also shows copy-paste env snippets for any OpenAI- or Anthropic-compatible
311
+ tool (Open WebUI, Kilo Code, opencode, …).
312
+
313
+ ---
314
+
315
+ ## Use it from any device on your network
316
+
317
+ The UI runs in the browser, so any phone, tablet, or laptop on your LAN can use the model on
318
+ your GPU box:
319
+
320
+ ```bash
321
+ turbollm --addr 0.0.0.0:6996 # bind all interfaces, then open http://<your-ip>:6996
322
+ ```
323
+
324
+ Turn on **Require API key** in Settings Network when you expose it.
325
+
326
+ ---
327
+
328
+ ## Share the GPU with ComfyUI
329
+
330
+ If you run **ComfyUI** on the same GPU, an LLM holding VRAM while ComfyUI renders means both
331
+ fight for memory (and one usually OOMs). TurboLLM can hand the GPU over automatically:
332
+
333
+ - The instant ComfyUI starts a render, TurboLLM **unloads its model and pauses new loads**.
334
+ - When ComfyUI's queue drains, TurboLLM **reloads the exact model it unloaded**.
335
+
336
+ It's **push-based, not polling** ComfyUI signals TurboLLM the moment a job starts/ends, so
337
+ the handoff is immediate and deterministic (the model is gone *before* ComfyUI executes).
338
+
339
+ **One-time setup** (Settings → ComfyUI):
340
+
341
+ 1. Turn on **Pause for ComfyUI** and **Save**.
342
+ 2. Enter your ComfyUI folder (the one containing `custom_nodes`) and click **Install gate**.
343
+ TurboLLM writes a small custom node into ComfyUI, wired to this daemon.
344
+ 3. **Restart ComfyUI** once so it loads the node.
345
+
346
+ The Settings panel shows a live indicator (rendering / idle / connected). To undo it, click
347
+ **Remove** in the same panel.
348
+
349
+ ---
350
+
351
+ ## Command-line reference
352
+
353
+ ```bash
354
+ turbollm # start on :6996, open browser
355
+ turbollm --port 9000 # listen on a specific port
356
+ turbollm --no-open # start without opening a browser
357
+ turbollm --addr 0.0.0.0:6996 # bind all interfaces (LAN sharing)
358
+ turbollm launch claude # start Claude Code against the loaded model
359
+ ```
360
+
361
+ | Flag | Description |
362
+ |------|-------------|
363
+ | `--port <n>` | Listen on a specific port (default: `6996`) |
364
+ | `--addr <host:port>` | Full host:port override, e.g. `0.0.0.0:6996` for LAN sharing |
365
+ | `--no-open` | Start without opening a browser window |
366
+ | `--config <file>` | Path to a custom config file |
367
+ | `--help`, `-h` | Show usage and exit |
368
+
369
+ ---
370
+
371
+ ## Configuration & data
372
+
373
+ Everything lives under **`~/.turbollm/`** on every OS`config.json`, the SQLite chat
374
+ database, downloaded engines, models cache, and logs. Back it up or delete it to reset.
375
+ Use `--config <file>` to point at an alternate config (its directory becomes the data dir).
376
+
377
+ ---
378
+
379
+ ## Requirements
380
+
381
+ - **Node.js 22 or newer** enforced at startup with a clear message. <https://nodejs.org>
382
+ - **Windows, macOS, or Linux.**
383
+ - A GPU is recommended but **not required** — a CPU build is provisioned as a fallback.
384
+ - On Windows, the first time the auto-downloaded `llama-server` runs, SmartScreen/Defender may
385
+ prompt (it's an upstream binary). Allow it once.
386
+
387
+ ---
388
+
389
+ ## Privacy
390
+
391
+ TurboLLM is **offline-first**: core local use needs no account, no backend, and no internet.
392
+ **No analytics or telemetry are collected.** Your prompts, chats, files, and keys never leave
393
+ your machine.
394
+
395
+ ---
396
+
397
+ ## How TurboLLM compares
398
+
399
+ Focused on the differences that matter all four are good tools.
400
+
401
+ | | **TurboLLM** | LM Studio | Ollama | Open WebUI |
402
+ |---|:---:|:---:|:---:|:---:|
403
+ | Run **any engine / community forks** | ✅ | one runtime | hidden | |
404
+ | **Auto-tune** launch flags to your GPU | ✅ | ❌ | ❌ | ❌ |
405
+ | **Measured** t/s in the model list | | | ◐ | ❌ |
406
+ | **Anthropic** API (tool use) → Claude Code | ✅ | ❌ | ❌ | ❌ |
407
+ | OpenAI-compatible API | ✅ | ✅ | ✅ | ◐ proxy |
408
+ | **Auto-load the requested model** (hot-swap pool) | ✅ | ❌ | ◐ | ❌ |
409
+ | Use existing model folders (no re-download) | ✅ | ◐ | ❌ | ❌ |
410
+ | Speculative decoding (NextN / MTP / draft) | ✅ | ◐ draft | ❌ | ❌ |
411
+ | Web UI from any LAN device | | ❌ | ❌ | ✅ |
412
+ | **Lightweight** (no Electron / no Python) | npm | Electron | Go | ❌ Python |
413
+ | Offline-first · no telemetry | | | | |
414
+
415
+ Prefer Open WebUI's chat breadth? It works great pointed at TurboLLM's OpenAI endpoint.
416
+
417
+ ---
418
+
419
+ ## Troubleshooting
420
+
421
+ - **`TurboLLM requires Node.js 22 or newer`** — upgrade Node: <https://nodejs.org>.
422
+ - **Model won't load / OOM** — pick a smaller quant (the VRAM verdict warns you), lower GPU
423
+ offload, or close other GPU apps. Failures surface in the Engines screen with the engine log.
424
+ - **Windows Defender / SmartScreen prompt** — that's the upstream `llama-server` binary on
425
+ first run; allow it once.
426
+ - **Port already in use** `turbollm --port 9000`.
427
+ - **Slow generation** — open the model's load params; ensure GPU offload is high and flash
428
+ attention / NextN are on for supported models.
429
+
430
+ ---
431
+
432
+ ## Develop from source
433
+
434
+ ```bash
435
+ npm install # daemon deps
436
+ cd web && npm install && cd ..
437
+
438
+ npm run build:web # build the React UI -> src/webdist
439
+ npm run start # run the daemon in dev (hot TS via tsx) -> :6996
440
+
441
+ npm run build # production bundle -> dist/cli.js (web assets included)
442
+ node dist/cli.js --port 6996
443
+ ```
444
+
445
+ Frontend hot-reload: `cd web && npm run dev` (proxies `/api` and `/v1` to the daemon on
446
+ :6996).
447
+
448
+ **Stack:** Node ≥22 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
449
+ shadcn/ui frontend. One TypeScript codebase, shipped as an npm package.
450
+
451
+ ```
452
+ turbollm/
453
+ bin/turbollm.mjs launcher shim (Node guard) -> dist/cli.js
454
+ src/
455
+ cli.ts entrypoint: wiring + graceful shutdown
456
+ server.ts Hono app: CORS, API, gateway, embedded SPA
457
+ engines/ provisioning, probe, registry, lifecycle state machine
458
+ api/routes.ts /api/v1/* handlers
459
+ gateway/ /v1/* OpenAI + Anthropic gateway
460
+ models/ · chat/ · hf/ · bench/ · downloads/
461
+ web/ React + TS + Tailwind + shadcn frontend (own package.json)
462
+ ```
463
+
464
+ ---
465
+
466
+ ## Screenshots
467
+
468
+ The unified engine catalog: a hardware-aware recommendation up top, then every supported engine (llama.cpp, KoboldCpp, llamafile, vLLM, and forks) with build-from-source for the rest.
469
+
470
+ <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/engines.png" width="860" alt="TurboLLM Engines screen: hardware-aware recommendation and a unified engine catalog" /></p>
471
+
472
+ Chat mid-conversation: pinned model selector, a live context meter, streaming reply with running token count and tokens/sec.
473
+
474
+ <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/chat.png" width="860" alt="TurboLLM Chat screen: model selector, live context meter, streaming reply with tokens/sec" /></p>
475
+
476
+ The Models library: GGUF and MLX models discovered in your folders, each with measured tokens/sec and a VRAM-fit verdict, grouped by quant.
477
+
478
+ <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/models.png" width="860" alt="TurboLLM Models library: discovered models with measured tokens/sec and quant grouping" /></p>
479
+
480
+ Per-model tuning: context length, GPU layers, KV-cache type, flash attention, and speculative decoding, all with a live VRAM-fit verdict.
481
+
482
+ <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/tuning.png" width="860" alt="TurboLLM model tuning panel: context, GPU layers, KV-cache type, flash attention, VRAM-fit verdict" /></p>
483
+
484
+ Customize: pick a web-search provider and wire up MCP tool servers the model can call during conversations.
485
+
486
+ <p align="center"><img src="https://raw.githubusercontent.com/mohitsoni48/Turbo-LLM/main/assets/screenshots/customize.png" width="860" alt="TurboLLM Customize screen: web-search provider and MCP tool servers" /></p>
487
+
488
+ ---
489
+
490
+ ## License
491
+
492
+ Source-available under the **Functional Source License 1.1 (Apache-2.0 future grant)** — SPDX
493
+ **`FSL-1.1-ALv2`**. Free for personal use, internal business use, education, and research; the
494
+ only restriction is shipping a competing product. Each release converts to Apache-2.0 two
495
+ years after it's published. Full text: [LICENSE.md](https://github.com/mohitsoni48/Turbo-LLM/blob/main/turbollm/LICENSE.md).
496
+
497
+ <p align="center"><sub>Built for people who refuse to wait for the mainstream to bless the fast path. ⚡</sub></p>