deer-flow/app
andershsueh d66bf564fc fix(app): change bundle identifier to com.deerflow.desktop
Fixes Tauri build warning: identifier ending with ".app" conflicts
with the macOS application bundle extension. No functional impact —
the app has no sandboxing, Keychain, or iCloud dependencies.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 05:49:41 +08:00
..
src feat(app): add Tauri desktop wrapper for DeerFlow 2026-03-24 05:18:32 +08:00
src-tauri fix(app): change bundle identifier to com.deerflow.desktop 2026-03-24 05:49:41 +08:00
init.sh feat(app): add Tauri desktop wrapper for DeerFlow 2026-03-24 05:18:32 +08:00
README.md docs(app): add Linux font installation note to README 2026-03-24 05:21:31 +08:00

DeerFlow Desktop App

A Tauri wrapper that packages DeerFlow into a native desktop application for macOS, Linux, and Windows. The app window loads the DeerFlow workspace directly — no browser required.

How It Works

┌──────────────────────────────────────┐
│  Tauri Window (native desktop app)   │
│  └── WebView → localhost:2026        │
└──────────────────────────────────────┘
                    │
                    ▼
┌──────────────────────────────────────┐
│  DeerFlow services (local)           │
│  ├── nginx          :2026 (unified)  │
│  ├── Next.js        :3000            │
│  ├── Gateway API    :8001            │
│  └── LangGraph      :2024            │
└──────────────────────────────────────┘

The Tauri shell is intentionally thin — it provides a native window, titlebar, and OS integration while all application logic remains in the existing DeerFlow stack. No code duplication, and every DeerFlow update is automatically reflected in the desktop app.

Directory Structure

app/
├── src/
│   └── index.html        # WebView entry: loads localhost:2026/workspace
├── src-tauri/
│   ├── Cargo.toml
│   ├── tauri.conf.json   # productName, window size, devUrl
│   └── src/
│       ├── main.rs
│       └── lib.rs
├── init.sh               # Start / restart all DeerFlow backend services
└── README.md

Prerequisites

  • Rust 1.77.2+
  • All DeerFlow prerequisites: Node.js 22+, pnpm, uv, nginx (see root README)

Getting Started

1. Start the backend services

From the app/ directory:

./init.sh

This starts LangGraph, Gateway API, Frontend, and nginx (or restarts them if already running). Wait until you see the services ready message before launching the desktop window.

2. Development mode (hot-reload)

cd app/src-tauri
source "$HOME/.cargo/env"
cargo tauri dev

The Tauri window opens and loads http://localhost:2026/workspace directly. Changes to the frontend are reflected live.

3. Build a release bundle

cd app/src-tauri
source "$HOME/.cargo/env"
cargo tauri build

Output locations:

Platform Path
macOS src-tauri/target/release/bundle/macos/Asuka.app
Linux src-tauri/target/release/bundle/appimage/asuka_*.AppImage
Windows src-tauri/target/release/bundle/msi/Asuka_*.msi

The app bundles only the Tauri shell. DeerFlow backend services still need to be running locally when you launch the app.

Updating DeerFlow

Pull the latest code and rebuild:

git pull
make install          # reinstall frontend + backend deps if needed
cd app/src-tauri
cargo tauri build

Troubleshooting

Blank window — Backend services are not running. Run ./init.sh first.

Build fails — Make sure the full Rust toolchain is installed:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Linux also needs:
sudo apt-get install -y build-essential libwebkit2gtk-4.1-dev libssl-dev

Port conflict — If any of the ports (2024, 2026, 3000, 8001) are in use, stop existing services with make stop from the project root.

Chinese text or emoji not rendering correctly on Linux — The WebView relies on system fonts. Install the required CJK and emoji fonts:

sudo apt-get install -y fonts-noto-cjk
sudo apt-get install -y fonts-noto-color-emoji fonts-symbola

Acknowledgements

This desktop wrapper is built on top of DeerFlow by ByteDance, an open-source super agent harness licensed under MIT. All core agent logic, frontend, and backend code belong to the DeerFlow project and its contributors.

Author

Anders Hsueh