Skip to main content

Desktop App

ClawDesk ships a native desktop application built with Tauri 2.0. The app runs the full Rust gateway in-process—no separate server needed. It provides a system tray icon, native notifications, global shortcuts, and a polished UI for managing channels, conversations, and settings.

Architecture

Key Design Decisions

AspectChoiceRationale
FrameworkTauri 2.0Native performance, small binary, cross-platform
CoreIn-process RustNo IPC overhead, shared memory, single binary
UIWebView (React)Rich UI capabilities, familiar development
TrayNative system trayAlways accessible, minimal footprint
UpdatesSparkle/WinSparkleAuto-update support

Supported Platforms

PlatformStatusMin VersionNotes
macOS11.0 (Big Sur)Universal binary (Intel + Apple Silicon)
LinuxUbuntu 20.04+AppImage, .deb, .rpm
WindowsWindows 10+MSI installer, portable .exe
iOS🧪 BetaiOS 16+Via Tauri 2.0 mobile support
Android🧪 BetaAndroid 8.0+Via Tauri 2.0 mobile support

Installation

macOS

# Download the latest release
curl -L https://github.com/clawdesk/clawdesk/releases/latest/download/ClawDesk_aarch64.dmg -o ClawDesk.dmg

# Or install via Homebrew
brew install --cask clawdesk

Open the .dmg and drag ClawDesk to Applications. On first launch, you may need to approve the app in System Preferences → Privacy & Security.

Linux

# AppImage (universal)
curl -L https://github.com/clawdesk/clawdesk/releases/latest/download/ClawDesk_amd64.AppImage -o ClawDesk.AppImage
chmod +x ClawDesk.AppImage
./ClawDesk.AppImage

# Debian/Ubuntu
sudo dpkg -i ClawDesk_amd64.deb

# Fedora/RHEL
sudo rpm -i ClawDesk_x86_64.rpm

Windows

Download the MSI installer from the releases page and run it. Windows SmartScreen may show a warning on first run—click "More info" → "Run anyway".

Building from Source

# Prerequisites
# - Rust 1.75+
# - Node.js 18+
# - Platform-specific deps (see Tauri docs)

# Clone the repository
git clone https://github.com/clawdesk/clawdesk.git
cd clawdesk

# Install frontend dependencies
cd crates/ui && npm install && cd ../..

# Build and run in development mode
cd crates/clawdesk-tauri
cargo tauri dev

# Build release binary
cargo tauri build
tip

On macOS, if you get code signing errors during development, use:

cargo tauri dev -- -- --no-sandbox

First Launch

On first launch, ClawDesk opens a setup wizard:

  1. Welcome: Overview and terms
  2. Provider Setup: Enter API keys for your preferred providers
  3. Model Selection: Choose default model
  4. Channel Setup: Connect your first channel (or skip)
  5. Security: Set allowlist mode and admin identity
  6. Ready: Launch the gateway

You can revisit any of these settings later in Settings (⌘,).


User Interface

Main Window

The main window has four primary areas:

┌─────────────────────────────────────────────────────────┐
│ ClawDesk ─ □ ✕ │
├──────────┬──────────────────────────────┬───────────────┤
│ │ │ │
│ Sidebar │ Conversation View │ Detail Panel │
│ │ │ │
│ • Chats │ ┌────────────────────────┐ │ • Session │
│ • Chan- │ │ User: Hello! │ │ Info │
│ nels │ │ │ │ • Tools │
│ • Tools │ │ Agent: Hi! How can I │ │ Used │
│ • Cron │ │ help you today? │ │ • Provider │
│ • Logs │ │ │ │ Stats │
│ │ │ User: What's the │ │ • Memory │
│ │ │ weather like? │ │ Context │
│ │ │ │ │ │
│ │ │ Agent: Let me check... │ │ │
│ │ └────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────────────┐ │ │
│ │ │ Type a message... ⏎ │ │ │
│ │ └────────────────────────┘ │ │
└──────────┴──────────────────────────────┴───────────────┘
SectionDescription
ChatsActive conversations across all channels
ChannelsConnected channels with status indicators
ToolsAvailable tools and their enable/disable toggles
CronScheduled tasks with next-run times
LogsReal-time gateway logs with filtering

Keyboard Shortcuts

ShortcutAction
⌘/Ctrl + NNew conversation
⌘/Ctrl + KQuick command palette
⌘/Ctrl + ,Open settings
⌘/Ctrl + LClear conversation
⌘/Ctrl + Shift + TToggle system tray mode
⌘/Ctrl + 1-9Switch between sidebar sections
⌘/Ctrl + EnterSend message
⌘/Ctrl + Shift + EnterSend with specific model
EscClose current panel

System Tray

ClawDesk runs as a system tray application. The tray icon provides quick access to common functions:

┌───────────────────────────┐
│ 🤖 ClawDesk │
├───────────────────────────┤
│ ✅ Gateway Running │
│ 📡 3 Channels Active │
│ 💬 12 Active Sessions │
├───────────────────────────┤
│ Quick Message... ⌘M │
│ Open Dashboard ⌘D │
│ Pause All Channels ⌘P │
├───────────────────────────┤
│ Settings... ⌘, │
│ Check for Updates... │
│ Quit ClawDesk ⌘Q │
└───────────────────────────┘

Tray Icon States

Icon StateMeaning
🟢 Green dotGateway running, all channels connected
🟡 Yellow dotGateway running, some channels have warnings
🔴 Red dotGateway running, critical errors present
⚪ Gray dotGateway stopped

Minimize to Tray

[desktop]
close_to_tray = true # minimize to tray on window close
start_minimized = false # start in tray without showing window
show_notifications = true # show native notifications for messages

Notifications

ClawDesk sends native OS notifications for important events:

[desktop.notifications]
enabled = true

# Notification types
[desktop.notifications.types]
new_message = true # new messages from channels
channel_error = true # channel disconnection/errors
cron_complete = true # cron task completion
cron_error = true # cron task failures
provider_error = true # provider failures
security_alert = true # security-related events
update_available = true # new version available

# Quiet hours
[desktop.notifications.quiet_hours]
enabled = false
start = "22:00"
end = "08:00"
timezone = "America/New_York"
info

On macOS, ClawDesk uses UNUserNotificationCenter for native notifications. On Linux, it uses libnotify. On Windows, it uses Windows Toast notifications. Grant notification permissions when prompted on first launch.


Settings

The Settings panel (⌘,) provides a GUI for all configuration options:

General

SettingDescription
Launch at LoginStart ClawDesk when you log in
Close to TrayMinimize to tray instead of quitting
Start MinimizedLaunch directly to the system tray
ThemeLight / Dark / System
LanguageUI language (English, 中文, 日本語, ...)

Providers

Add, edit, and test provider configurations through the UI. API keys are stored encrypted in the system keychain.

Channels

Visual channel management with status indicators, test buttons, and log viewers.

Security

Configure allowlists, ACLs, and scanning rules through a guided interface.

Advanced

Direct TOML config editor with syntax highlighting and validation.


In-Process Gateway

The desktop app runs the ClawDesk gateway in-process. This means:

  • No separate server to start or manage
  • Shared memory between the UI and the gateway
  • Lower latency for local interactions
  • Single binary distribution

The gateway starts automatically when the app launches and stops when it quits.

// Simplified Tauri setup
fn main() {
tauri::Builder::default()
.setup(|app| {
// Start the gateway in-process
let config = load_config()?;
let gateway = Gateway::new(config)?;

tauri::async_runtime::spawn(async move {
gateway.start().await.expect("Gateway failed to start");
});

Ok(())
})
.invoke_handler(tauri::generate_handler![
send_message,
list_channels,
get_sessions,
get_config,
update_config,
])
.system_tray(build_tray())
.run(tauri::generate_context!())
.expect("error while running application");
}

Tauri Commands

The frontend communicates with the Rust backend through Tauri commands:

#[tauri::command]
async fn send_message(
state: State<'_, AppState>,
message: String,
session_id: Option<String>,
provider: Option<String>,
model: Option<String>,
) -> Result<MessageResponse, String> {
let runner = state.agent_runner.lock().await;
let response = runner.handle_message(/* ... */).await
.map_err(|e| e.to_string())?;
Ok(response.into())
}

#[tauri::command]
async fn list_channels(
state: State<'_, AppState>,
) -> Result<Vec<ChannelStatus>, String> {
let registry = state.channel_registry.lock().await;
Ok(registry.list_with_status().await)
}

Frontend usage (TypeScript):

import { invoke } from '@tauri-apps/api/core';

// Send a message
const response = await invoke('send_message', {
message: 'Hello!',
provider: 'anthropic',
model: 'claude-sonnet-4-20250514',
});

// List channels
const channels = await invoke('list_channels');

Gateway API Access

Even when running as a desktop app, the gateway's HTTP API is available on localhost:

[desktop.gateway]
expose_api = true
port = 1420 # local API port
bind = "127.0.0.1" # only localhost by default

This allows external tools and scripts to interact with the running desktop instance:

# Send a message via the local API
curl -X POST http://localhost:1420/api/v1/message \
-H "Content-Type: application/json" \
-d '{"text": "Hello from curl!"}'

# Check health
curl http://localhost:1420/api/v1/health
warning

The gateway API is bound to 127.0.0.1 by default, making it accessible only from the local machine. Changing this to 0.0.0.0 exposes the API to the network—only do this in trusted environments with proper security configuration.


Auto-Updates

ClawDesk checks for updates automatically (configurable):

[desktop.updates]
auto_check = true
check_interval_hours = 24
auto_install = false # if true, installs without prompting
channel = "stable" # "stable" | "beta" | "nightly"

Update channels:

ChannelDescription
stableStable releases, recommended for most users
betaPre-release versions with new features
nightlyBleeding edge, built from main branch

Data Locations

PlatformConfigDataLogs
macOS~/Library/Application Support/com.clawdesk.app/config.toml~/Library/Application Support/com.clawdesk.app/data/~/Library/Logs/com.clawdesk.app/
Linux~/.config/clawdesk/config.toml~/.local/share/clawdesk/data/~/.local/share/clawdesk/logs/
Windows%APPDATA%\ClawDesk\config.toml%APPDATA%\ClawDesk\data\%APPDATA%\ClawDesk\logs\

Performance

Resource Usage

MetricIdleActive (1 channel)Active (5 channels)
Memory~60 MB~120 MB~200 MB
CPU<1%2-5%5-10%
Disk~30 MB (app)+50 MB (data)+100 MB (data)

Optimization Tips

[desktop.performance]
# Reduce memory usage
max_cached_sessions = 50 # default: 100
max_session_history = 100 # messages per session in memory

# Reduce CPU usage
ui_refresh_rate_ms = 100 # default: 50
log_buffer_size = 500 # default: 1000

# Reduce disk usage
auto_compact_sessions = true
compact_after_messages = 200

Troubleshooting

Common Issues

ProblemSolution
App won't startCheck logs in the data directory, try --log-level debug
Blank windowWebView issue — update your OS, check GPU drivers
High CPU usageCheck for reconnection loops in channels, reduce refresh rate
Notifications not showingCheck OS notification permissions
Tray icon missingRestart the app, check OS tray settings
Build failsEnsure Tauri 2.0 prerequisites are installed
Apple Silicon performanceEnsure you're using the aarch64 build, not Rosetta

Debug Mode

# Launch with debug logging
CLAWDESK_LOG=debug /Applications/ClawDesk.app/Contents/MacOS/ClawDesk

# Or on Linux
CLAWDESK_LOG=debug /usr/bin/clawdesk

# Or on Windows (PowerShell)
$env:CLAWDESK_LOG="debug"; .\ClawDesk.exe

Reset to Defaults

# macOS
rm -rf ~/Library/Application\ Support/com.clawdesk.app/

# Linux
rm -rf ~/.config/clawdesk/ ~/.local/share/clawdesk/

# Windows (PowerShell)
Remove-Item -Recurse "$env:APPDATA\ClawDesk"
warning

Resetting deletes all configuration, conversation history, memory data, and plugins. Export your config first with clawdesk config export.