Skip to main content
The OpenFang Desktop App is a native application built with Tauri 2.0 that packages the entire Agent OS into a single installable application. Run OpenFang with system tray integration, OS notifications, and automatic updates — no CLI required.

Installation

Windows

1

Download the installer

Download the .msi or .exe installer from GitHub Releases.
2

Run the installer

Double-click the installer and follow the setup wizard.
Windows SmartScreen may show a warning. Click “More info” → “Run anyway” until code signing is enabled.
3

Launch OpenFang

The app starts automatically after installation. Find the OpenFang icon in the system tray.
System Requirements:
  • Windows 10/11
  • WebView2 (included in Windows 10/11)

macOS

1

Download the disk image

Download the .dmg file from GitHub Releases.
2

Install the app

  1. Open the .dmg file
  2. Drag OpenFang.app to the Applications folder
  3. Eject the disk image
3

First launch

Right-click OpenFang in Applications → Open.
macOS Gatekeeper will block unsigned apps. Click “Open” in the dialog to allow.
System Requirements:
  • macOS 12.0 (Monterey) or later
  • Intel or Apple Silicon

Linux

# Download AppImage
wget https://github.com/RightNow-AI/openfang/releases/latest/download/openfang.AppImage

# Make executable
chmod +x openfang.AppImage

# Run
./openfang.AppImage
AppImages are self-contained and work on any Linux distribution.
System Requirements:
  • Debian 11+, Ubuntu 20.04+, Fedora 35+, or equivalent
  • libwebkit2gtk-4.1, libappindicator3

Features

System Tray Integration

The system tray provides quick access without opening the main window:
Menu ItemBehavior
Show WindowOpens/focuses the main window
Open in BrowserOpens http://127.0.0.1:{port} in default browser
Agents: N runningInfo only — shows active agent count
Status: Running (uptime)Info only — shows uptime
Launch at LoginToggle OS-level auto-start
Check for Updates…Manually check for updates
Open Config DirectoryOpens ~/.openfang/ in file manager
Quit OpenFangExit the application
Tip: Left-click the tray icon to show the main window.

Single Instance Enforcement

OpenFang prevents multiple instances from running simultaneously. If you try to launch a second instance:
  • The existing instance’s window is shown and focused
  • The second launch exits immediately
  • No duplicate processes or port conflicts
This ensures only one kernel and API server is active at a time.

Hide to Tray on Close

Closing the main window does not quit the application — it hides to the tray and continues running in the background. To fully quit:
  • Right-click the tray icon → Quit OpenFang
  • Or use Cmd+Q (macOS) / Alt+F4 (Windows/Linux) when the window is focused

Native OS Notifications

The app shows native notifications for critical kernel events:
EventNotification
Agent crashes”Agent Crashed”
Agent {id} crashed: {error}
Agent spawned”Agent Started”
Agent "{name}" is now running
Health check failed”Health Check Failed”
Agent {id} unresponsive for {secs}s
Update available”OpenFang Updating…”
Downloading update...
Notifications respect OS-level Do Not Disturb settings.

Automatic Updates

The desktop app checks for updates automatically:
  • 10 seconds after startup — Silent check, downloads/installs if available
  • Manual check — Via system tray → “Check for Updates…”
When an update is found:
1

Download

Update is downloaded in the background. A notification shows progress.
2

Install

The update is verified using the Ed25519 signature from tauri.conf.json.
3

Restart

The app automatically restarts to the new version.
Updates are signed and verified — unsigned updates are rejected.

Launch at Login

Enable auto-start via:
  • System tray → “Launch at Login”
  • Settings (if exposed in UI)
How it works:
  • macOS: Adds to Login Items via launchd
  • Windows: Adds registry key to HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  • Linux: Creates ~/.config/autostart/openfang.desktop

Architecture

The desktop app runs the full OpenFang kernel in-process:
┌─────────────────────────────────────────┐
│  Tauri 2.0 Process                      │
│                                         │
│  ┌───────────┐    ┌─────────────────┐  │
│  │  WebView  │    │ Background      │  │
│  │  Window   │◄───┤ Thread          │  │
│  │           │    │ "openfang-srv" │  │
│  │  System   │    │                 │  │
│  │  Tray     │    │ tokio runtime   │  │
│  └───────────┘    │ axum API        │  │
│                   │ OpenFang Kernel │  │
│                   └─────────────────┘  │
│        │                   │           │
│        └── http://127.0.0.1:{port} ────┘
└─────────────────────────────────────────┘
Key components:
  1. Main Thread: Runs the Tauri event loop, WebView, system tray
  2. Background Thread: Runs a dedicated tokio runtime with the OpenFang kernel and axum API server
  3. IPC Bridge: Tauri commands connect the WebView to the kernel

Startup Sequence

1

Tracing initialization

Configured with RUST_LOG, defaults to openfang=info,tauri=info
2

Kernel boot

OpenFangKernel::boot(None) loads config from ~/.openfang/config.toml
3

Port binding

Binds to 127.0.0.1:0 (OS-assigned random port) to avoid conflicts
4

Server thread spawn

Dedicated OS thread named "openfang-server" runs:
  • kernel.start_background_agents()
  • run_embedded_server() with axum router
5

Tauri app launch

WebView window loads http://127.0.0.1:{port} to render the dashboard

Configuration

The desktop app uses the same config file as the CLI:
~/.openfang/config.toml
All configuration options apply. See Configuration Reference.

Environment Variables

VariableEffectDefault
RUST_LOGLog verbosityopenfang=info,tauri=info
OPENFANG_HOMEOpenFang home directory~/.openfang
All LLM API keysSame as CLI

Quick Configuration via UI

The desktop app provides a settings interface accessible from the dashboard. Changes are written to config.toml automatically.

IPC Commands

The WebView can call Tauri IPC commands via invoke():
CommandReturnsDescription
get_portu16API server port
get_status{status, port, agents, uptime_secs}Runtime status
get_agent_countusizeNumber of registered agents
import_agent_tomlStringOpens file picker, imports agent
import_skill_fileStringOpens file picker, imports skill
get_autostartboolCheck if launch-at-login is enabled
set_autostart()Toggle launch-at-login
check_for_updates{available, version, body}Check for updates
install_updateRestarts appDownload and install update
open_config_dir()Open ~/.openfang/ in file manager
open_logs_dir()Open ~/.openfang/logs/ in file manager
Example:
import { invoke } from '@tauri-apps/api/core';

const port = await invoke<number>('get_port');
const status = await invoke<{status: string, agents: number}>('get_status');

Global Shortcuts

The desktop app registers global keyboard shortcuts:
ShortcutAction
Ctrl+Shift+OShow main window
Ctrl+Shift+NCreate new agent (if UI supports)
Ctrl+Shift+COpen config directory
Shortcuts work even when the app is in the background.

Building from Source

Prerequisites

  • Rust: stable toolchain
  • Tauri CLI v2: cargo install tauri-cli --version "^2"
  • Platform dependencies:
  • WebView2 (included in Windows 10/11)
  • Visual Studio Build Tools

Development Build

cd crates/openfang-desktop
cargo tauri dev
This launches the app with:
  • Hot reload for Rust changes
  • Console window visible (debug builds)
  • Unoptimized binary

Production Build

cd crates/openfang-desktop
cargo tauri build
Outputs:
  • Windows: .msi and .exe in target/release/bundle/
  • macOS: .dmg and .app in target/release/bundle/
  • Linux: .deb, .rpm, .AppImage in target/release/bundle/
The release binary:
  • Suppresses console window (Windows)
  • Is fully optimized
  • Includes all assets and dependencies

Plugins

The desktop app uses these Tauri 2.0 plugins:
PluginPurpose
tauri-plugin-notificationNative OS notifications
tauri-plugin-shellShell/process access from WebView
tauri-plugin-dialogNative file picker for agent/skill import
tauri-plugin-single-instancePrevent multiple instances (desktop only)
tauri-plugin-autostartLaunch at OS login (desktop only)
tauri-plugin-updaterSigned auto-updates from GitHub Releases (desktop only)
tauri-plugin-global-shortcutCtrl+Shift+O/N/C shortcuts (desktop only)

Security

Content Security Policy

The app enforces a strict CSP that only allows connections to the local embedded server:
default-src 'self' http://127.0.0.1:* ws://127.0.0.1:*;
img-src 'self' data: blob: http://127.0.0.1:*;
style-src 'self' 'unsafe-inline';
script-src 'self' 'unsafe-inline' 'unsafe-eval';
This blocks external resource loading while permitting the WebView to communicate with the localhost API.

Update Verification

All updates are signed with an Ed25519 key. The public key is embedded in the app binary:
"pubkey": "dW50cnVzdGVkIGNvb..."
Unsigned or tampered updates are rejected before installation.

Subprocess Sandboxing

Skill execution uses environment isolation — see Security Architecture for details.

Troubleshooting

App won’t start

Windows:
  • Check Event Viewer → Application logs
  • Ensure WebView2 is installed
macOS:
  • Check Console.app for crash logs
  • Grant permissions in Security & Privacy settings
Linux:
  • Run from terminal to see errors: ./openfang.AppImage
  • Check missing dependencies: ldd openfang.AppImage

Update fails

  • Signature mismatch: Verify pubkey in tauri.conf.json matches the signing key
  • Network error: Check firewall/proxy settings
  • Insufficient permissions: Run as administrator (Windows) or grant write access to app bundle (macOS)

High CPU usage

Check the number of running agents:
curl http://localhost:$(cat ~/.openfang/port)/api/agents | jq 'length'
Stop unused agents via the dashboard.

Port already in use

The app binds to a random port (127.0.0.1:0). If startup fails:
  1. Kill existing OpenFang processes
  2. Check for stale lockfiles in ~/.openfang/

Next Steps

Docker Deployment

Run OpenFang in containers

Production Guide

Production deployment checklist

Build docs developers (and LLMs) love