Native Desktop-App für Claude Code (Tauri 2.0 + SvelteKit)
|
Some checks failed
Build AppImage / build (push) Has been cancelled
Bisher kamen Build-Statusmeldungen vom /deploy-Polling. Das ist redundant — die Pipeline kann selbst auf Topic vk-builds pingen, dann brauchen wir kein Claude-Polling mehr (spart Tokens, vermeidet doppelte Pings). - Notify start: grauer Hammer am Anfang - Notify success: gruener Haken (mit Versionsnummer) - Notify failure: rote Lampe + Priority high Voraussetzung: Repo-Secret NTFY_AUTH ist gesetzt (siehe globales CLAUDE.md). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| nix | ||
| pwa | ||
| scripts | ||
| src | ||
| src-tauri | ||
| vscode-extension | ||
| .gitignore | ||
| BUILD-NIXOS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| install.sh | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| ROADMAP.md | ||
| shell.nix | ||
| svelte.config.js | ||
| tools.yaml | ||
| tsconfig.json | ||
| vite.config.ts | ||
Claude Desktop
Nativer AI-Desktop-Assistent fuer Linux. Schneller und maechtiger als Codium + Claude Code Extension.
Tech-Stack: Tauri 2.0 (Rust) + SvelteKit 5 + Claude Agent SDK (Node.js) Codebase: ~24.000 Zeilen, 154 Commits, 27 Svelte-Komponenten, 18 Rust-Module
Schnellstart
# Development (Hot-Reload)
cd "/mnt/17 - Entwicklungen/20 - Projekte/ClaudeDesktop"
CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri dev"
# Produktion (AppImage)
CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri build -- --bundles appimage"
# CI: Commit mit [appimage] im Message → Forgejo Runner baut + uploaded automatisch
Architektur
┌──────────────────────────────────────────────────────────┐
│ SvelteKit Frontend │
│ 27 Svelte-Komponenten (Chat, Voice, Guard-Rails, ...) │
├──────────────────────────────────────────────────────────┤
│ Tauri IPC │
├──────────────────────────────────────────────────────────┤
│ Rust Backend │
│ 18 Module (claude.rs, db.rs, guard.rs, voice.rs, ...) │
├──────────────────────┬───────────────────────────────────┤
│ SQLite (lokal) │ Unix Domain Socket / stdio │
│ Sessions, Settings │ ↕ │
│ Memory, Audit │ Claude Bridge (Node.js) │
│ Offline-Queue │ @anthropic-ai/claude-agent-sdk │
├──────────────────────┤ ↕ │
│ MySQL (claude-db) │ Claude API (Anthropic) │
│ Wissensbasis │ + MCP-Server (6 Stueck) │
└──────────────────────┴───────────────────────────────────┘
Datenfluss
- User → Eingabe im ChatPanel (Text/Sprache/File-Drop)
- Frontend →
invoke('send_message')via Tauri IPC - Rust → Sticky Context + KB-Hints laden, an Bridge senden
- Bridge →
query()mit Claude Agent SDK, Events streamen - Claude API → Antwort + Tool-Calls (Bash, Read, Edit, MCP, ...)
- Bridge → Events via JSON-Lines an Rust zurueck
- Rust →
emit()Events ans Frontend - Frontend → Live-Rendering (Text, Tools, Subagents)
Bridge-Modi
| Modus | Beschreibung | Wann |
|---|---|---|
| UDS-Daemon | Bridge als eigenstaendiger Prozess, ueberlebt App-Neustart | Standard (bevorzugt) |
| stdio | Bridge als Child-Process mit stdin/stdout | Fallback wenn UDS fehlschlaegt |
Socket-Pfad: /tmp/claude-bridge.sock, PID-File: /tmp/claude-bridge.pid
Dateistruktur
Rust Backend (src-tauri/src/)
| Datei | Zeilen | Funktion |
|---|---|---|
lib.rs |
~340 | App-Setup, Tray-Icon, Global Hotkey (Super+C), Plugin-Init |
claude.rs |
~1000 | Kernmodul: Bridge-Kommunikation (UDS/stdio), MCP-Hub, Ollama, send_message |
db.rs |
~800 | SQLite: Sessions, Messages, Settings, Projekte, Monitor-Events, Fehler-Tracking |
knowledge.rs |
~1000 | MySQL-Wissensbasis: Suche, Cache (60s TTL), KB-Hints, Smart Hints v2 |
session.rs |
~300 | Session-CRUD, Offline-Queue (queue/flush/clear) |
guard.rs |
~250 | Guard-Rails: Safe/Moderate/Critical/Blocked, Permissions |
memory.rs |
~200 | Persistentes Gedaechtnis: Auto-Load, Patterns, Cross-Session |
context.rs |
~300 | 3-Schichten Context: Sticky/Projekt/Hints, Render fuer Prompt |
voice.rs |
~355 | Whisper STT + Piper TTS (5 deutsche Stimmen), offline |
hooks.rs |
~200 | Hook-System: SessionStart, PreToolUse, PostToolUse |
audit.rs |
~150 | Audit-Log: Alle Aktionen mit Timestamp + Risk-Level |
programs.rs |
~300 | D-Bus Aktionen, Screenshot-Capture, Xvfb |
ide.rs |
~200 | VSCodium-Extension Bridge (WebSocket Port 7890) |
clipboard.rs |
~150 | Clipboard-Watch: Code/URL/Fehler erkennen |
teaching.rs |
~150 | Praesentations-/Schulungsmodus (separates Fenster) |
chat_window.rs |
~100 | Chat-Detach: Separates Fenster herausloesen/zurueckholen |
update.rs |
~250 | Auto-Updater: Forgejo Package Registry, Lock-Datei |
commands.rs |
~100 | Slash-Command Registry (scannt ~/.claude/commands/) |
Frontend (src/lib/components/)
| Komponente | Funktion |
|---|---|
ChatPanel.svelte |
Hauptkomponente: Nachrichtenliste, Eingabe, File-Drop, Modus-Indikator |
SessionList.svelte |
Sidebar: Sessions, Projekt-Wechsel, Suche |
ActivityPanel.svelte |
Live-Aktivitaet: Tool-Calls, Agent-Status |
AgentView.svelte |
Subagent-Hierarchie als Baumansicht |
MonitorPanel.svelte |
System-Monitor: API/Tool/Error Events |
PerformancePanel.svelte |
Token-/Kosten-Statistiken |
GuardRailsPanel.svelte |
3-Tab: Live-Feed / Regeln / Blockiert |
VoicePanel.svelte |
Push-to-Talk, Gespraechsmodus, TTS-Wiedergabe |
ContextPanel.svelte |
Sticky Context anzeigen/editieren |
MemoryPanel.svelte |
Persistentes Gedaechtnis CRUD |
KnowledgePanel.svelte |
Wissensbasis durchsuchen |
HooksPanel.svelte |
Hook-Verwaltung |
SettingsPanel.svelte |
VS-Code-artiges Settings mit Suche/Kategorien |
ProgramsPanel.svelte |
D-Bus Aktionen, Screenshot, Xvfb |
IdePanel.svelte |
VSCodium-Verbindung Status |
AuditLog.svelte |
Audit-Eintraege durchsuchen |
QuickActions.svelte |
Ctrl+K Kommandopalette |
CommandPalette.svelte |
Slash-Command Autocomplete (/-Eingabe) |
CodeBlock.svelte |
Syntax-Highlighting + Copy-Button |
DiffView.svelte |
Diff-Anzeige fuer Code-Aenderungen |
MermaidDiagram.svelte |
Mermaid-Diagramme rendern |
StopButton.svelte |
Abbruch-Button waehrend Agent laeuft |
UpdateDialog.svelte |
Auto-Update Bestaetigungsdialog |
FilePreview.svelte |
Datei-Vorschau (Text/Bild) |
AnimatedCode.svelte |
Code-Tipp-Animation fuer Praesentation |
AutoCorrectionModal.svelte |
Fehler-Pattern Vorschlag |
Bridge (scripts/claude-bridge.js)
~1100 Zeilen Node.js. Zentrale Datei fuer die Claude-Kommunikation:
- query() via
@anthropic-ai/claude-agent-sdk— streamt Events - Multi-Agent-Modi: Solo / Handlanger (Haiku-Worker) / Experten (4 spezialisierte Agents) / Auto
- Subagent-Tracking: Map mit toolUseId → agentId/type/depth
- MCP-Server Injection: Configs von Rust empfangen, in queryOptions injizieren
- Ollama-Integration: Auto-Detect beim Start, local-query fuer einfache Tasks
- Auto-Retry: 3x Backoff bei Rate-Limit/5xx/Netzwerkfehler
- Session-Resume: Stale Session-ID → automatisch neue Session starten
- UDS-Server-Modus:
--socket /tmp/claude-bridge.sockfuer Daemon-Betrieb
Stores (src/lib/stores/)
| Store | Inhalt |
|---|---|
app.ts |
activeSession, activeProject, agentMode, chatDetached, processingPhase |
events.ts |
Event-Handler fuer alle Bridge-Events (text, result, tool-start/end, ...) |
updateTrigger.ts |
Reactive Trigger fuer Panel-Updates |
Features komplett
Phase 1-2 (v0.1.0 — 14.04.2026)
- Tauri 2.0 + SvelteKit 5 Grundgeruest
- 4-Panel Layout, Claude Bridge (stdio), Guard-Rails
- SQLite + Session-Management, Claude-DB Integration
- 3-Schichten Context, Multi-Agent-Modi, Hook-System
- VSCodium-Extension, Programm-Steuerung (D-Bus, Xvfb)
- Praesentationsmodus, System-Monitor, Subagent-Hierarchie
- Auto-Updater, Slash-Commands, KB-Hints, Error-Patterns
Phase 3: Performance (22.04.2026)
- KB-Cache (RAM, 60s TTL), Bridge Warm-Start, Lazy Panel-Load
- Session-Resume Fix, Auto-Retry (3x Backoff), Heartbeat
- FIFO Message Queue, Bridge-Daemon (UDS), Unix Socket IPC
Phase 4: Codium-Killer Features
- Projekt-Wechsel (Ein-Klick), MCP-Hub nativ (6 Server)
- Guard-Rails UI (3 Tabs), Persistent Memory, Quick-Actions (Ctrl+K)
- Voice (Whisper + Piper, offline), Settings-Panel, Chat-Detach
- Aktivitaets-Phasen (Denkt/Streamt/Tool/Subagent)
Phase 5: Lokale KI + Offline
- Whisper.cpp + Piper-TTS (komplett offline, 5 deutsche Stimmen)
- Ollama-Integration (Auto-Detect, local-query)
- Offline-Queue (SQLite, flush bei Reconnect)
Phase 6: Desktop-Integration
- D-Bus Actions (10 Aktionen), Clipboard-Watch, File-Drop
- Screenshot-Analyse, Global Hotkey (Super+C)
MCP-Server (6 Stueck, automatisch geladen)
| Name | Funktion | Transport |
|---|---|---|
forgejo |
Git: Repos, Issues, PRs, Releases | stdio |
claude-db |
MySQL Wissensbasis: Suche, CRUD | SSE (MCP-Hub) |
playwright |
Browser-Automatisierung | stdio |
context7 |
Library-Dokumentation | stdio |
portainer |
Docker-Container-Management | stdio |
homeassistant |
Smart-Home Steuerung | stdio |
Configs in ~/.claude.json → werden beim Bridge-Start automatisch injiziert.
CI/CD
Workflow: .forgejo/workflows/build-appimage.yml
Runner: 16-Forgejo-Runner-AppImage (Debian Bookworm)
Trigger: [appimage] in Commit-Message auf main
- Commit mit
[appimage]→ Push - Forgejo Runner baut AppImage (~8-10 Min)
- Upload in Forgejo Package Registry
- Ntfy-Notification (Topic:
vk-builds) - App zieht Update beim naechsten Start (Auto-Updater)
NixOS: AppImage hat WebKit2GTK/Mesa ABI-Konflikt → lokaler Build mit shell.nix noetig. Nix-Wrapper in ~/.local/bin/claude-desktop.
Tastenkuerzel
| Kuerzel | Aktion |
|---|---|
Super+C |
Claude-Eingabe von ueberall oeffnen |
Ctrl+K |
Quick-Actions Palette |
Ctrl+Enter |
Nachricht senden |
Escape |
Quick-Actions/Autocomplete schliessen |
/ |
Slash-Command Autocomplete |
Wissensbasis-Referenzen
| KB-ID | Thema |
|---|---|
| #248 | Tauri 2.0 + SvelteKit auf NixOS shell.nix |
| #311 | CI/CD Pipeline (Workflow-Tricks) |
| #371 | Debian Forgejo-Runner Setup |
| #381 | NixOS WebKit2GTK EGL-Crash |
| #382 | Cargo auf SMB → CARGO_TARGET_DIR |
| #384 | Custom-AppRun + linuxdeploy-Hook |
Nicht geplant
- Multi-User / Team-Features
- Cloud-Sync
- Plugin-System (overkill fuer 1-User-App)
- Electron-Port (Tauri bleibt)