Desktop Trading Terminal Development
Browser-based trading terminals hit limitations: CORS prevents connecting to arbitrary WebSocket servers, no system notifications or file system access, and high network latency makes HFT trading unfeasible. A one-second delay in order execution can cost a client thousands of dollars. We develop desktop applications that bypass these restrictions — direct TCP, native notifications, auto-start, and local file access.
Why Tauri over Electron for Trading?
Electron is popular but has drawbacks: large binary size (~100 MB), high memory consumption (multiple Chromium instances), and idle CPU usage of 2–5%. For a terminal running 24/7, this matters. Tauri uses system WebView (Edge on Windows, WebKit on macOS) and Rust backend. Binary size is 3–10 MB, memory at startup is 30–80 MB, and CPU idle is 0.5–1%. Startup is 3x faster than Electron, and memory usage is up to 70% lower. For a cross-platform terminal on Windows, macOS, and Linux, Tauri is the best trade-off between performance and development time.
Case Study: Arbitrage Trading Terminal
One project required subscribing to 50+ pairs, switching between exchanges, and hotkeys. Using Tauri, we achieved startup in 0.8 seconds, memory at 45 MB, and CPU idle at 0.6%. This performance is critical for HFT terminals that operate 24/7.
// src-tauri/src/main.rs use tauri::{Manager, Window}; use tokio::sync::broadcast; #[tauri::command] async fn subscribe_market_data( symbol: String, window: Window, state: tauri::State<'_, AppState>, ) -> Result<(), String> { let mut rx = state.market_data_bus.subscribe(); tokio::spawn(async move { while let Ok(event) = rx.recv().await { if event.symbol == symbol { window.emit("market-data", &event).unwrap_or_default(); } } }); Ok(()) } #[tauri::command] async fn place_order( order: OrderRequest, state: tauri::State<'_, AppState>, ) -> Result<OrderResponse, String> { state.exchange_client .place_order(order) .await .map_err(|e| e.to_string()) } On the frontend, subscription via invoke and listen:
import { invoke } from '@tauri-apps/api/tauri'; import { listen } from '@tauri-apps/api/event'; await invoke('subscribe_market_data', { symbol: 'BTC/USDT' }); const unlisten = await listen<MarketData>('market-data', (event) => { updateOrderBook(event.payload); }); To handle connection drops, we implemented exponential backoff: on WebSocket loss, the client waits 1 s, then 2, 4, 8... up to 60 seconds. This reduced false alert triggers by 90%.
Common Performance Issues and Fixes
| Symptom | Typical Cause | Solution |
|---|---|---|
| Memory growing over time | Unsubscribed WebSocket listeners | Unsubscribe on window close |
| Delay when switching windows | Heavy calculations in UI thread | Move calculations to Web Workers or Rust commands |
| FPS drop on charts | Frequent order book updates | Set throttle to 50-100 ms |
Memory leaks often come from unsubscribed listeners. In Tauri, each window must explicitly unsubscribe via Window::close_requested. Synchronous operations like indicator calculations should be moved to separate threads. For charts, update frequency of 100 ms is sufficient for ticks.
Auto-Update Setup
Tauri's built-in updater supports signed binaries and automatic download/installation. Configuration example in tauri.conf.json:
{ "updater": { "active": true, "endpoints": ["https://releases.yourapp.com/{{target}}/{{arch}}/{{current_version}}"], "dialog": true, "pubkey": "..." } } To trigger an update, call checkUpdate() on the frontend. Steps: generate signing keys (tauri signer generate), add public key to config, set up version JSON endpoint, and call checkUpdate() on startup.
Performance Metrics Comparison
| Metric | Electron | Tauri |
|---|---|---|
| Binary size | 80–150 MB | 3–10 MB |
| Memory at startup | 150–300 MB | 30–80 MB |
| CPU idle | 2–5% | 0.5–1% |
| Startup time | 2–5 sec | 0.5–1 sec |
Tauri is 3x faster in startup and uses 70% less memory than Electron. For a 24/7 terminal, this translates to significant cost savings on infrastructure. Development cost for a basic desktop trading terminal starts from $10,000. Our team has over 10 years of blockchain development experience and provides a 1-year warranty on all projects.
Common Mistakes in Desktop Terminal Development
- Memory leak from WebSocket subscriptions: always unsubscribe channels on window close.
- Delays from synchronous calls: move heavy operations to separate threads.
- Incorrect reconnection handling: implement exponential backoff with a retry limit.
If you encounter similar issues, contact us for a consultation. We offer a prototype to validate Tauri performance with your real data.
What's Included in Terminal Development
- Requirements analysis. Discuss functionality, choose architecture (Tauri/Electron).
- UI/UX design. Custom widgets (charts, order book, trade feed).
- Backend implementation in Rust/Node.js. Exchange connections, order management.
- Native feature integration. Tray, hotkeys, notifications, auto-start.
- Performance testing. Latency measurements, load testing.
- Auto-update setup. Binary signing, release repository.
- Documentation. Architecture, build and deployment description.
Get a consultation on selecting the stack for your terminal. Order a prototype and verify Tauri's performance with real data.
Refer to official documentation for Tauri and Electron for in-depth study.







