A simple, privacy-first web chat interface for local and cloud AI models from Ollama, LM Studio, OpenAI, Anthropic, HuggingFace, and Google, plus direct integration with the Aider, Goose, and OpenCode CLIs. Comes with 15 ice cream-themed color schemes.
npm startOpen http://localhost:2051 in your browser.
- Running Ollama/LM Studio — make sure Ollama is running (
ollama serve), or start the LM Studio local server (Developer tab → Local Server → Start Server).
Gelectron Build — lightweight with a bundled Ollama runtime:
-
Auto-install everything —
./run-this-first.shclones and builds Gelectron + gelectron-ollama, installs dependencies, and runs the app. Options:--run(install then launch),--no-build(reuse an existing Gelectron binary). -
Run Gelectron app binary —
npm start -- -g
Electron Build — heavier with no bundled Ollama runtime:
npm start -- -ePick a provider in Settings → AI Model and paste your API key.
- Real-time streaming — responses appear token-by-token via SSE
- Web search — toggle it in the composer or Settings; your question is searched (DuckDuckGo by default, optional Brave API key) and cited results are injected into the response
- Multi-provider — Ollama, LM Studio, OpenAI, Anthropic, HuggingFace, Google, and the Aider / Goose / OpenCode CLIs
- Compare models — run the same prompt against multiple models side by side
- Conversation management — create, switch, rename, regenerate, export (Markdown/JSON/HTML), and delete chats
- Branching edits — edit an earlier prompt without losing the original path, then move between branches
- HuggingFace installer — search GGUF models and import them into Ollama from the UI
- Custom system prompts — global default plus per-conversation override
- Auto-naming — smart chat titles generated locally via Ollama
- Themes — 15 ice cream color schemes (vanilla, strawberry, mint, lemon, lime, peach, raspberry, lavender, dragonfruit, dreamsicle, blue-moon, chocolate, monochrome, aurora, plum) plus custom JSON themes that can replace colors, accent, logo, mascot, app name, and CSS. Authoring guide:
/themes/themes.html - Settings UI — organized tabs (General, AI Model, Chat, Appearance, Shortcuts, Data & Privacy) with pickers for theme, density, text size, accent, and more
- Persistent customization — device-wide settings API plus a theme-independent custom browser/desktop icon
- Voice input — browser-native dictation
- File uploads — attach images and files with OCR/image understanding
- Native vision messages — uploaded images are translated into Ollama, Anthropic, and OpenAI-compatible multimodal formats
- Privacy — all data stays local, nothing leaves your machine unless you use a cloud provider
These are the canonical accent, background, and text colors used by the built-in themes. Full palettes, including surfaces, borders, and message colors, live in themes/.
| Theme | Accent | Background | Text |
|---|---|---|---|
| Aurora | #5CC8D7 |
#10151B |
#EDF3F5 |
| Blue Moon | #4F7EAE |
#F3F7FA |
#202830 |
| Chocolate | #D69A6D |
#1C1816 |
#F4ECE6 |
| Dragonfruit | #B93F78 |
#FAF6F8 |
#30242A |
| Dreamsicle | #D56D38 |
#FBF6F1 |
#312720 |
| Lavender | #7568B2 |
#F7F6FA |
#292732 |
| Lemon | #A98218 |
#FAF8F0 |
#2E2A20 |
| Lime | #5F934D |
#F5F8F3 |
#252C22 |
| Mint | #3D876D |
#F2F7F5 |
#222B27 |
| Monochrome | #A1A1A6 |
#121214 |
#F4F4F5 |
| Peach | #C66C59 |
#FBF5F2 |
#302622 |
| Plum | #85607E |
#F8F4F7 |
#2D272C |
| Raspberry | #A63F63 |
#FAF5F7 |
#30242A |
| Strawberry | #C84E68 |
#FAF5F6 |
#302426 |
| Vanilla | #8A6845 |
#F7F5EF |
#28251F |
- Node.js 18+
- For local models (if using the web interface or Electron): Ollama and/or LM Studio running locally
- For CLI tools: Aider, Goose, or OpenCode installed and on your PATH
- For cloud providers: an API key from the respective service
Open Settings ⌘+, — the UI is organized into sections:
- Account — your display name
- AI Model — provider and model selection, HuggingFace model installer
- Providers & API keys — enable optional providers/tools (LM Studio, Aider, Goose, OpenCode) and manage keys; LM Studio includes a connection check
- Chat — global custom system prompt
- UI — theme, density, text size, message accent, and assistant logo position
- Keyboard shortcuts / Preferences / Export / Uninstall
vanilla-sh/
├── server.js Express server entry point
├── start.js Launcher (web, Gelectron, Electron)
├── src/
│ ├── routes.js API route definitions
│ ├── storage.js File-based conversation persistence
│ ├── upload.js File/OCR upload handling
│ ├── titles.js Auto-naming titles
│ ├── system.js System stats (CPU/RAM/GPU)
│ ├── providers/ Provider adapters
│ │ ├── ollama.js Ollama
│ │ ├── lmstudio.js LM Studio (OpenAI-compatible, local)
│ │ ├── openai.js OpenAI + base OpenAI-compatible client
│ │ ├── anthropic.js Anthropic Claude
│ │ ├── huggingface.js HuggingFace Inference
│ │ ├── gemini.js Google Gemini
│ │ ├── cli.js CLI tool base
│ │ ├── aider.js Aider CLI
│ │ ├── goose.js Goose CLI
│ │ └── opencode.js OpenCode CLI
│ └── ...
├── public/
│ ├── index.html Single-page web UI
│ ├── app.js UI logic
│ └── styles.css
├── gelectron/ Gelectron desktop wrapper (bundled Ollama)
├── electron/ Electron desktop wrapper
├── themes/ JSON color themes + themes.html authoring guide
├── docs/ Historical design/task notes
├── CONTRIBUTING.md Contributor guide
├── data/
│ └── conversations/ Saved conversations (JSON)
└── config/
└── default.json Server configuration
| Endpoint | Description |
|---|---|
GET /api/health |
Health check |
GET /api/settings |
Fetch persistent, non-secret user settings |
PUT /api/settings |
Update persistent user settings |
GET /api/icon / PUT /api/icon |
Fetch or set the theme-independent app icon |
GET /api/tools |
Discover model-callable tools and their JSON schemas |
POST /api/tools/execute |
Execute a named tool with JSON arguments |
GET /api/providers |
List configured providers |
GET /api/models?provider=… |
List available models for a provider |
GET /api/system/stats |
CPU/RAM/GPU usage stats |
GET /api/conversations |
List saved conversations |
POST /api/conversations |
Create a new conversation |
GET /api/conversations/:id |
Get conversation messages |
DELETE /api/conversations/:id |
Delete a conversation |
POST /api/conversations/import |
Import conversations from Markdown/JSON |
POST /api/conversations/:id/name |
Rename a conversation |
POST /api/conversations/:id/regenerate |
Regenerate the last response |
POST /api/conversations/:id/branches/:branchId/activate |
Switch to a saved conversation branch |
POST /api/conversations/:id/erase-last-response |
Erase the last response |
POST /api/chat/stream |
Send a message and stream the response (SSE); optional search / searchBackend / searchApiKey fields enable web-search injection |
POST /api/chat/stop/:conversationId |
Stop an in-progress stream |
POST /api/chat/compare |
Run a prompt against multiple models |
POST /api/chat/compare-stop/:id |
Stop an in-progress comparison |
GET /api/search |
Search conversations |
GET /api/websearch?q=&backend=&key= |
Web search (duckduckgo or brave) — test endpoint |
GET /api/themes |
List available JSON themes |
GET /api/names/prewarm |
Preload the auto-naming model |
GET /api/hf/search |
Search HuggingFace GGUF models |
GET /api/hf/repo |
Inspect a HuggingFace repo |
POST /api/hf/install |
Download a GGUF model into Ollama |
POST /api/upload |
Upload a file (image/audio/document) |
POST /api/uninstall |
Uninstall the app |
Server settings live in config/default.json:
port: server port (default2051)defaultProvider: default provider (defaultollama)providers: per-provider settings such ashost,baseUrl,apiKey,defaultModel, andrequestTimeout. Cloud API keys can also be entered in the app UI and are stored locally in your browser.
The fonts used in this project are subject to their respective licenses. Please consult the font files included in the repository or their upstream sources for specific license details and attribution requirements.
This project is currently distributed under the Diskette Labs Temporary Development License.
The source code is publicly available for transparency, learning, evaluation, testing, and authorized development. However, it may not be modified, forked, redistributed, republished, sold, sublicensed, relicensed, or used to create derivative works without express written permission from Diskette Labs.
Contributors may modify and work on the project only within the permissions granted to them through the project's contributor structure and CONTRIBUTING.md.
Diskette Labs intends to release a future version of the project under an open-source license. That future release will not automatically relicense previous versions. Versions covered by this license will remain under their existing terms and copyright unless Diskette Labs explicitly states otherwise.
See LICENSE and CONTRIBUTING.md for the complete terms and project governance.