A secure, native desktop application for working with multiple LLM providers (DeepSeek, Gemini, Claude) featuring chat, RAG, canvas workspace, and code editing capabilities.
- 🔐 Secure API Key Storage: API keys are encrypted using ChaCha20Poly1305 and stored in OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service)
- 💬 Multi-Provider Chat: Supports DeepSeek, Google Gemini, and Anthropic Claude with streaming responses
- 📚 RAG (Retrieval-Augmented Generation): Per-project document indexing, vector search, and context injection
- 🎨 Canvas Workspace: Visual notebook for organizing conversations, notes, and code snippets
- 💻 Code Editor: Monaco-powered editor with syntax highlighting (ESLint integration TODO)
- ⚡ Native Performance: Built with Tauri (Rust backend, React frontend) for fast, lightweight execution
- Desktop Framework: Tauri 1.5
- Backend: Rust
- Encryption: ChaCha20Poly1305
- Database: SQLite (via sqlx)
- HTTP Client: reqwest
- Keychain: keyring
- Frontend: React 18 + TypeScript + Vite
- State: Zustand
- Styling: TailwindCSS
- Editor: Monaco Editor
- Canvas: React Flow
- Master Key Generation: On first run, a random 256-bit key is generated and stored in OS keychain
- Config Encryption: Provider configs (including API keys) are serialized and encrypted with ChaCha20Poly1305
- Storage: Encrypted config saved to
~/.config/llm-workbench/config.enc - Runtime: API keys decrypted only in Rust backend, never exposed to frontend
- Operating System: Windows, macOS, or Linux
- Node.js: >= 18.0.0
- pnpm: >= 8.0.0
- Rust: >= 1.70 (installed automatically by Tauri)
xcode-select --install# Debian/Ubuntu
sudo apt update
sudo apt install libwebkit2gtk-4.0-dev \
build-essential \
curl \
wget \
file \
libssl-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libsqlite3-dev
# Fedora
sudo dnf install webkit2gtk4.0-devel \
openssl-devel \
curl \
wget \
file \
libappindicator-gtk3-devel \
librsvg2-devel \
sqlite-devel
# Arch
sudo pacman -Syu
sudo pacman -S webkit2gtk \
base-devel \
curl \
wget \
file \
openssl \
appmenu-gtk-module \
gtk3 \
libappindicator-gtk3 \
librsvg \
sqlitegit clone <repository-url>
cd fictional-octo-winner# Install pnpm if not already installed
npm install -g pnpm
# Install all dependencies (frontend + Tauri CLI)
pnpm install
# Install frontend dependencies
cd frontend
pnpm install
cd ..# Run in development mode (hot reload enabled)
pnpm tauri devThis will:
- Compile the Rust backend
- Start the Vite dev server
- Launch the desktop application with dev tools enabled
# Build production bundle
pnpm tauri buildOutput locations:
- macOS:
src-tauri/target/release/bundle/dmg/ - Windows:
src-tauri/target/release/bundle/msi/ - Linux:
src-tauri/target/release/bundle/deb/orappimage/
- Configure Providers: Go to Settings → Select a provider (Claude, DeepSeek, or Gemini)
- Enter API Key: Paste your API key (it will be encrypted immediately)
- Set Base URL & Model: Configure endpoint and default model
- Test Connection: Click "Test Connection" to verify setup
- Select provider and model from the header
- Adjust temperature (0-2)
- Type message and press Enter (Shift+Enter for new line)
- Streaming responses appear in real-time
- Toggle RAG mode to use document context (requires project selection)
- Create Project: Canvas view → "New Project"
- Add Documents: Use Chat view with RAG enabled
// In future UI: Upload .txt/.md files via file picker // For now: Programmatically via rag_commands
- Query with Context: Enable RAG toggle in Chat, select project, and ask questions
- Select or create a project
- Add nodes with "+ Add Node"
- Drag nodes to arrange
- Connect nodes by dragging from edge
- Save canvas with "Save" button
- Select language (JavaScript, TypeScript, Python, Rust, JSON)
- Write code in Monaco editor
- Syntax highlighting and IntelliSense enabled
- TODO: Linting integration (requires ESLint Tauri command)
- Config Location:
~/.config/llm-workbench/(macOS/Linux) or%APPDATA%\llm-workbench\(Windows) - config.enc: Encrypted provider configurations
- rag.db: SQLite database for RAG projects/documents/chunks
Obtain API keys from:
- Anthropic Claude: https://console.anthropic.com/
- DeepSeek: https://platform.deepseek.com/
- Google Gemini: https://aistudio.google.com/app/apikey
fictional-octo-winner/
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── main.rs # Entry point
│ │ ├── security/ # Encryption + keychain
│ │ ├── config/ # Config store
│ │ ├── llm_providers/ # LLM clients
│ │ ├── rag/ # RAG system
│ │ └── commands/ # Tauri IPC handlers
│ ├── Cargo.toml
│ └── tauri.conf.json
├── frontend/ # React app
│ ├── src/
│ │ ├── views/ # Main views
│ │ ├── components/ # Reusable components
│ │ ├── store/ # Zustand state
│ │ └── api/ # Tauri command wrappers
│ ├── package.json
│ └── vite.config.ts
└── package.json # Workspace root
- Create
src-tauri/src/llm_providers/your_provider.rs - Implement
LlmProvidertrait - Add to
create_provider()match inllm_providers/mod.rs - Update frontend Settings with new provider metadata
# Rust backend tests
cd src-tauri
cargo test
# Frontend tests (if configured)
cd frontend
pnpm test- Backend Logs: Use
RUST_LOG=debug pnpm tauri devfor verbose Rust logging - Frontend DevTools: Press
Cmd+Opt+I(macOS) orCtrl+Shift+I(Windows/Linux) in dev mode - IPC Inspection: Check browser console for Tauri command invocations
- macOS: Ensure Keychain Access is not blocking the app
- Linux: Install
gnome-keyringorkwallet - Windows: Run as user with access to Credential Manager
- Ensure all system dependencies are installed (see Prerequisites)
- Clear Tauri cache:
pnpm tauri clean - Rebuild:
pnpm tauri build
- Check provider API key is valid
- Verify network connectivity
- Review Rust logs for HTTP errors
- Advanced RAG: HNSW index for large document sets (currently in-memory cosine similarity)
- Code Linting: ESLint integration via Tauri command + Node.js subprocess
- Multi-modal: Image input for Gemini/Claude vision models
- Export: Conversation export as Markdown/PDF
- Prompt Library: Save and reuse prompt templates
- Cost Tracking: Monitor API usage and costs
- Conversation History: Persistent chat storage in SQLite
- Token Counting: Accurate token estimation per provider
- Dark Mode Toggle: UI theme switcher
- ✅ Casual disk inspection (config encrypted)
- ✅ Config file theft (requires OS keychain access)
- ✅ Accidental exposure in backups (keys not in plaintext)
- ❌ Memory dumps of running process
- ❌ OS-level keyloggers
- ❌ Malicious code execution on the same machine
- Keep OS and keychain software updated
- Use full-disk encryption (FileVault, BitLocker, LUKS)
- Don't share API keys in config files or screenshots
- Rotate API keys regularly
MIT License - see LICENSE file for details
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make changes with tests
- Submit a pull request
- Issues: https://github.com/yourusername/llm-workbench/issues
- Discussions: https://github.com/yourusername/llm-workbench/discussions
- Tauri: For excellent Rust + Web framework
- Anthropic, DeepSeek, Google: For LLM APIs
- Open Source Community: For all the amazing libraries used
Built with ❤️ using Tauri, Rust, and React