update readme, deps and instructions

This commit is contained in:
lone-cloud 2026-04-18 22:24:09 -07:00
parent f568194ba7
commit 0929e30f82
4 changed files with 63 additions and 37 deletions

View file

@ -5,3 +5,31 @@
- Never add explicit return types to functions - rely on TypeScript inference - Never add explicit return types to functions - rely on TypeScript inference
- Never create tests, docs, or GitHub workflows - Never create tests, docs, or GitHub workflows
- Move helper functions out of component files into separate utility files - Move helper functions out of component files into separate utility files
## What Gerbil Is
Gerbil is an Electron desktop app that acts as a launcher and GUI for [KoboldCpp](https://github.com/LostRuins/koboldcpp). It is **not** a new LLM backend — it wraps KoboldCpp and makes it usable without touching the terminal.
**The problem it solves**: KoboldCpp is an excellent all-in-one local LLM backend (text gen, image gen, multimodal, agents) but its own launcher UI is bad. Gerbil replaces and significantly improves that launcher.
**Gerbil vs Ollama**: Ollama is simpler but far more limited. Gerbil targets users who want KoboldCpp's power (image gen, 80+ config options, SillyTavern/OpenWebUI integration) without fighting a bad UI or memorizing CLI flags.
**Gerbil vs KoboldCpp's launcher**: Gerbil adds auto binary download, GPU auto-detection (CUDA/ROCm/Vulkan/Metal), image gen presets (FLUX, Chroma, Z-Image, Qwen), HuggingFace model search/download, SillyTavern and OpenWebUI auto-launch, config save/load, real-time system monitoring, Cloudflare tunnel support, and a proper desktop experience.
## User Base
- People who want to run LLMs locally with real control over the backend
- SillyTavern users (roleplay/character AI) — Gerbil auto-launches ST alongside KoboldCpp
- Image generation users — Gerbil has first-class image gen with 4 presets
- Power users who want GPU acceleration configured correctly without guesswork
## Key Technical Facts
- Stack: Electron 41, React 19, Zustand 5, Mantine 9, pnpm, TypeScript, oxlint
- Screens flow: Welcome → Download → Launch (tabs: General/Performance/Advanced/Image Gen/Network/Config) → Interface (tabs: Terminal/Chat-Text/Chat-Image)
- Supported GPUs: CUDA, ROCm (via YellowRoseCx fork), Vulkan, Metal (macOS), CPU fallback
- Frontends: KoboldAI Lite, llama.cpp (embedded in KoboldCpp), SillyTavern (localhost:3000, needs Node.js), OpenWebUI (localhost:8080, needs uv)
- Image gen presets: FLUX.1-dev, Chroma-unlocked, Z-Image-Turbo, Qwen2.5-VL-7B (image edit)
- Default model: gemma-3-4b-it Q8_0 from HuggingFace
- CLI mode: headless binary execution — requires prior GUI setup to configure binary path
- No telemetry, fully local after initial binary download

View file

@ -4,21 +4,19 @@
# Gerbil # Gerbil
**The simplest way to run Large Language Models on your own hardware** **Local text and image generation, on your own hardware**
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)](https://github.com/lone-cloud/gerbil/releases) [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)](https://github.com/lone-cloud/gerbil/releases)
[![GitHub stars](https://img.shields.io/github/stars/lone-cloud/gerbil)](https://github.com/lone-cloud/gerbil/stargazers) [![GitHub stars](https://img.shields.io/github/stars/lone-cloud/gerbil)](https://github.com/lone-cloud/gerbil/stargazers)
[![AUR version](https://img.shields.io/aur/version/gerbil)](https://aur.archlinux.org/packages/gerbil) [![AUR version](https://img.shields.io/aur/version/gerbil)](https://aur.archlinux.org/packages/gerbil)
[Download](https://github.com/lone-cloud/gerbil/releases/latest) • [Features](#features) • [Screenshots](#demo--screenshots) • [Installation](#installation) [Download](https://github.com/lone-cloud/gerbil/releases/latest) • [Screenshots](#demo--screenshots) • [Installation](#installation)
</div> </div>
<!-- markdownlint-enable MD033 --> <!-- markdownlint-enable MD033 -->
Gerbil is a GUI for running Large Language Models locally.
## Features ## Features
- **Run LLMs locally** - Powered by [KoboldCpp](https://github.com/LostRuins/koboldcpp), a fork of [llama.cpp](https://github.com/ggml-org/llama.cpp) - **Run LLMs locally** - Powered by [KoboldCpp](https://github.com/LostRuins/koboldcpp), a fork of [llama.cpp](https://github.com/ggml-org/llama.cpp)
@ -132,7 +130,7 @@ https://github.com/user-attachments/assets/9e7ecfb3-3576-443c-8cef-a14e06ab5b60
## Advanced Configuration ## Advanced Configuration
The Launch screen's Advanced tab exposes 80+ KoboldCpp arguments with descriptions, defaults, and examples for when you need more than the GUI covers. The Launch screen's Advanced tab exposes 80+ KoboldCpp arguments with descriptions, defaults, and examples, for when you need more than the GUI covers.
<div align="center"> <div align="center">
<img src="assets/screenshot-cli-args.webp" alt="Command Line Arguments Modal" width="800"> <img src="assets/screenshot-cli-args.webp" alt="Command Line Arguments Modal" width="800">

View file

@ -1,6 +1,6 @@
{ {
"name": "gerbil", "name": "gerbil",
"version": "1.23.0", "version": "1.23.1",
"description": "Run Large Language Models locally", "description": "Run Large Language Models locally",
"keywords": [ "keywords": [
"ai", "ai",
@ -41,7 +41,7 @@
"@codemirror/commands": "^6.10.3", "@codemirror/commands": "^6.10.3",
"@codemirror/search": "^6.6.0", "@codemirror/search": "^6.6.0",
"@codemirror/theme-one-dark": "^6.1.3", "@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "^6.41.0", "@codemirror/view": "^6.41.1",
"@fontsource/geist": "^5.2.8", "@fontsource/geist": "^5.2.8",
"@huggingface/gguf": "^0.4.2", "@huggingface/gguf": "^0.4.2",
"@mantine/core": "^9.0.2", "@mantine/core": "^9.0.2",

60
pnpm-lock.yaml generated
View file

@ -40,8 +40,8 @@ importers:
specifier: ^6.1.3 specifier: ^6.1.3
version: 6.1.3 version: 6.1.3
'@codemirror/view': '@codemirror/view':
specifier: ^6.41.0 specifier: ^6.41.1
version: 6.41.0 version: 6.41.1
'@fontsource/geist': '@fontsource/geist':
specifier: ^5.2.8 specifier: ^5.2.8
version: 5.2.8 version: 5.2.8
@ -71,7 +71,7 @@ importers:
version: 2.10.3 version: 2.10.3
'@uiw/react-codemirror': '@uiw/react-codemirror':
specifier: ^4.25.9 specifier: ^4.25.9
version: 4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) version: 4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.1)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@vitejs/plugin-react': '@vitejs/plugin-react':
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.0.1(vite@8.0.8(@types/node@25.6.0)(jiti@2.6.1)) version: 6.0.1(vite@8.0.8(@types/node@25.6.0)(jiti@2.6.1))
@ -246,8 +246,8 @@ packages:
'@codemirror/theme-one-dark@6.1.3': '@codemirror/theme-one-dark@6.1.3':
resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==}
'@codemirror/view@6.41.0': '@codemirror/view@6.41.1':
resolution: {integrity: sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==} resolution: {integrity: sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==}
'@colors/colors@1.6.0': '@colors/colors@1.6.0':
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
@ -530,8 +530,8 @@ packages:
'@lezer/highlight@1.2.3': '@lezer/highlight@1.2.3':
resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
'@lezer/lr@1.4.9': '@lezer/lr@1.4.10':
resolution: {integrity: sha512-mF6irshW4nRJEhdR0HOAxxTDGss+rQFqA0nLRlZsPh14q+DB9Fqp0YbOvyRSOeKPLfUL/w5wPQAcETvkQ1VApg==} resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==}
'@malept/cross-spawn-promise@2.0.0': '@malept/cross-spawn-promise@2.0.0':
resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==}
@ -1079,8 +1079,8 @@ packages:
babel-plugin-react-compiler: babel-plugin-react-compiler:
optional: true optional: true
'@xmldom/xmldom@0.8.12': '@xmldom/xmldom@0.8.13':
resolution: {integrity: sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==} resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
abbrev@3.0.1: abbrev@3.0.1:
@ -1163,8 +1163,8 @@ packages:
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
baseline-browser-mapping@2.10.19: baseline-browser-mapping@2.10.20:
resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
hasBin: true hasBin: true
@ -3247,35 +3247,35 @@ snapshots:
dependencies: dependencies:
'@codemirror/language': 6.12.3 '@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@codemirror/commands@6.10.3': '@codemirror/commands@6.10.3':
dependencies: dependencies:
'@codemirror/language': 6.12.3 '@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@codemirror/language@6.12.3': '@codemirror/language@6.12.3':
dependencies: dependencies:
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.9 '@lezer/lr': 1.4.10
style-mod: 4.1.3 style-mod: 4.1.3
'@codemirror/lint@6.9.5': '@codemirror/lint@6.9.5':
dependencies: dependencies:
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
crelt: 1.0.6 crelt: 1.0.6
'@codemirror/search@6.6.0': '@codemirror/search@6.6.0':
dependencies: dependencies:
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
crelt: 1.0.6 crelt: 1.0.6
'@codemirror/state@6.6.0': '@codemirror/state@6.6.0':
@ -3286,10 +3286,10 @@ snapshots:
dependencies: dependencies:
'@codemirror/language': 6.12.3 '@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3 '@lezer/highlight': 1.2.3
'@codemirror/view@6.41.0': '@codemirror/view@6.41.1':
dependencies: dependencies:
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
crelt: 1.0.6 crelt: 1.0.6
@ -3576,7 +3576,7 @@ snapshots:
dependencies: dependencies:
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
'@lezer/lr@1.4.9': '@lezer/lr@1.4.10':
dependencies: dependencies:
'@lezer/common': 1.5.2 '@lezer/common': 1.5.2
@ -3921,7 +3921,7 @@ snapshots:
dependencies: dependencies:
'@types/node': 25.6.0 '@types/node': 25.6.0
'@uiw/codemirror-extensions-basic-setup@4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)': '@uiw/codemirror-extensions-basic-setup@4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)':
dependencies: dependencies:
'@codemirror/autocomplete': 6.20.1 '@codemirror/autocomplete': 6.20.1
'@codemirror/commands': 6.10.3 '@codemirror/commands': 6.10.3
@ -3929,16 +3929,16 @@ snapshots:
'@codemirror/lint': 6.9.5 '@codemirror/lint': 6.9.5
'@codemirror/search': 6.6.0 '@codemirror/search': 6.6.0
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@uiw/react-codemirror@4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.0)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@uiw/react-codemirror@4.25.9(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.1)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.41.1)(codemirror@6.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@codemirror/commands': 6.10.3 '@codemirror/commands': 6.10.3
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/theme-one-dark': 6.1.3 '@codemirror/theme-one-dark': 6.1.3
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
'@uiw/codemirror-extensions-basic-setup': 4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) '@uiw/codemirror-extensions-basic-setup': 4.25.9(@codemirror/autocomplete@6.20.1)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/lint@6.9.5)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)
codemirror: 6.0.2 codemirror: 6.0.2
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@ -3955,7 +3955,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-rc.7 '@rolldown/pluginutils': 1.0.0-rc.7
vite: 8.0.8(@types/node@25.6.0)(jiti@2.6.1) vite: 8.0.8(@types/node@25.6.0)(jiti@2.6.1)
'@xmldom/xmldom@0.8.12': {} '@xmldom/xmldom@0.8.13': {}
abbrev@3.0.1: {} abbrev@3.0.1: {}
@ -4051,7 +4051,7 @@ snapshots:
base64-js@1.5.1: {} base64-js@1.5.1: {}
baseline-browser-mapping@2.10.19: {} baseline-browser-mapping@2.10.20: {}
bl@4.1.0: bl@4.1.0:
dependencies: dependencies:
@ -4077,7 +4077,7 @@ snapshots:
browserslist@4.28.2: browserslist@4.28.2:
dependencies: dependencies:
baseline-browser-mapping: 2.10.19 baseline-browser-mapping: 2.10.20
caniuse-lite: 1.0.30001788 caniuse-lite: 1.0.30001788
electron-to-chromium: 1.5.340 electron-to-chromium: 1.5.340
node-releases: 2.0.37 node-releases: 2.0.37
@ -4223,7 +4223,7 @@ snapshots:
'@codemirror/lint': 6.9.5 '@codemirror/lint': 6.9.5
'@codemirror/search': 6.6.0 '@codemirror/search': 6.6.0
'@codemirror/state': 6.6.0 '@codemirror/state': 6.6.0
'@codemirror/view': 6.41.0 '@codemirror/view': 6.41.1
color-convert@2.0.1: color-convert@2.0.1:
dependencies: dependencies:
@ -5729,7 +5729,7 @@ snapshots:
plist@3.1.0: plist@3.1.0:
dependencies: dependencies:
'@xmldom/xmldom': 0.8.12 '@xmldom/xmldom': 0.8.13
base64-js: 1.5.1 base64-js: 1.5.1
xmlbuilder: 15.1.1 xmlbuilder: 15.1.1