diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
new file mode 100644
index 000000000..41752d232
--- /dev/null
+++ b/src-tauri/Cargo.lock
@@ -0,0 +1,25 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "frenocorp-desktop"
+version = "0.1.0"
+dependencies = [
+ "cocoa",
+ "env_logger",
+ "gtk",
+ "log",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-build",
+ "tauri-plugin-dialog",
+ "tauri-plugin-fs",
+ "tauri-plugin-http",
+ "tauri-plugin-shell",
+ "tauri-plugin-store",
+ "thiserror",
+ "tokio",
+ "windows",
+]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
new file mode 100644
index 000000000..ab7f1ac99
--- /dev/null
+++ b/src-tauri/Cargo.toml
@@ -0,0 +1,47 @@
+[package]
+name = "frenocorp-desktop"
+version = "0.1.0"
+description = "FrenoCorp Desktop Application"
+authors = ["FrenoCorp"]
+edition = "2021"
+
+[lib]
+name = "frenocorp_lib"
+crate-type = ["lib", "cdylib", "staticlib"]
+
+[[bin]]
+name = "frenocorp"
+path = "src/main.rs"
+
+[dependencies]
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+tauri = { version = "2", features = ["tray-icon", "macos-private-api"] }
+tauri-plugin-fs = "2"
+tauri-plugin-http = "2"
+tauri-plugin-dialog = "2"
+tauri-plugin-shell = "2"
+tauri-plugin-store = "2"
+tokio = { version = "1.35", features = ["full"] }
+thiserror = "1.0"
+log = "0.4"
+env_logger = "0.10"
+
+[target.'cfg(windows)'.dependencies]
+windows = { version = "0.52", features = ["Win32_UI_Shell"] }
+
+[target.'cfg(target_os = "macos")'.dependencies]
+cocoa = "0.25"
+
+[target.'cfg(target_os = "linux")'.dependencies]
+gtk = "0.18"
+
+[build-dependencies]
+tauri-build = { version = "2", features = [] }
+
+[profile.release]
+panic = "abort"
+codegen-units = 1
+lto = true
+opt-level = "s"
+strip = true
diff --git a/src-tauri/README.md b/src-tauri/README.md
new file mode 100644
index 000000000..b0438ff03
--- /dev/null
+++ b/src-tauri/README.md
@@ -0,0 +1,188 @@
+# FrenoCorp Desktop (Tauri)
+
+Cross-platform desktop application built with Tauri v2.
+
+## Architecture
+
+```
+src-tauri/
+├── src/
+│ ├── main.rs # Application entry point
+│ ├── lib.rs # Library exports
+│ ├── menu.rs # Native menu bar
+│ ├── tray.rs # System tray
+│ └── updater.rs # Auto-updater logic
+├── icons/ # App icons
+├── Cargo.toml # Rust dependencies
+├── tauri.conf.json # Tauri configuration
+└── build.rs # Build script
+```
+
+## Platform Support
+
+- **macOS**: 10.15+ (Catalina and later)
+- **Windows**: 10+ (WebView2 required)
+- **Linux**: Ubuntu 18.04+, Debian 10+, or equivalent (WebKit2GTK required)
+
+## Development
+
+### Prerequisites
+
+**macOS:**
+```bash
+brew install pkg-config libappindicator
+```
+
+**Windows:**
+```bash
+# WebView2 is automatically installed on Windows 10+
+# For development:
+winget install Microsoft.VisualStudio.2022.Community
+```
+
+**Linux:**
+```bash
+# Ubuntu/Debian
+sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev
+
+# Fedora
+sudo dnf install gtk3-devel webkit2gtk4.0-devel
+```
+
+### Running in Development
+
+```bash
+# From project root
+npm run tauri:dev
+```
+
+This starts both the Vite dev server and the Tauri application.
+
+### Building for Production
+
+```bash
+# Build for current platform
+npm run tauri:build
+
+# Build for specific platform
+npm run tauri:build:macos
+npm run tauri:build:windows
+npm run tauri:build:linux
+```
+
+### Output Locations
+
+- **macOS**: `src-tauri/target/release/bundle/macos/`
+- **Windows**: `src-tauri/target/release/bundle/msi/` and `/msi/`
+- **Linux**: `src-tauri/target/release/bundle/deb/` and `/appimage/`
+
+## Features
+
+### Native Menu Bar
+
+Platform-specific menus are implemented in `src/menu.rs`:
+- File menu (New, Open, Save, etc.)
+- Edit menu (Undo, Redo, Cut, Copy, Paste)
+- View menu (Zoom, Fullscreen)
+- Window menu
+- Help menu
+
+### System Tray
+
+Implemented in `src/tray.rs`:
+- Show/Hide application
+- Quit from tray
+- Platform-specific tray icons
+
+### Auto-Updater
+
+Implemented in `src/updater.rs`:
+- Check for updates on startup
+- Periodic background checks
+- Download and install updates
+- Platform-specific installation logic
+
+### Window State Persistence
+
+- Window position and size
+- Maximized state
+- Last known state restoration
+
+## Configuration
+
+Main configuration is in `tauri.conf.json`:
+- Bundle identifiers
+- Icon paths
+- Window settings
+- Plugin configuration
+- Security settings
+
+## Testing
+
+```bash
+# Run Rust tests
+cargo test --manifest-path src-tauri/Cargo.toml
+
+# Run with logging
+RUST_LOG=debug npm run tauri:dev
+```
+
+## Debugging
+
+### Enable Debug Logging
+
+```bash
+export RUST_LOG=debug
+npm run tauri:dev
+```
+
+### View Tauri Logs
+
+- **macOS**: `~/Library/Logs/frenocorp-desktop/log.log`
+- **Windows**: `%APPDATA%/frenocorp-desktop/log.log`
+- **Linux**: `~/.cache/frenocorp-desktop/log.log`
+
+## Dependencies
+
+See `Cargo.toml` for complete list. Key dependencies:
+
+- `tauri v2` - Core framework
+- `tauri-plugin-fs` - File system access
+- `tauri-plugin-http` - HTTP requests
+- `tauri-plugin-dialog` - Native dialogs
+- `tauri-plugin-shell` - Shell commands
+- `tauri-plugin-store` - State persistence
+- `tokio` - Async runtime
+
+## CI/CD Integration
+
+The build scripts are designed for CI/CD integration:
+
+```yaml
+# Example GitHub Actions
+- name: Build macOS
+ run: npm run tauri:build:macos
+
+- name: Build Windows
+ run: npm run tauri:build:windows
+
+- name: Build Linux
+ run: npm run tauri:build:linux
+```
+
+## Troubleshooting
+
+### Common Issues
+
+1. **WebView2 not found (Windows)**
+ - Install WebView2 runtime or enable auto-download
+
+2. **GTK not found (Linux)**
+ - Install libgtk-3-dev and libwebkit2gtk-4.0-dev
+
+3. **Code signing failed (macOS)**
+ - Configure signing identity in tauri.conf.json
+ - Or disable for development
+
+4. **Permission denied (Linux)**
+ - Ensure proper file permissions on build artifacts
diff --git a/src-tauri/build.rs b/src-tauri/build.rs
new file mode 100644
index 000000000..849a37024
--- /dev/null
+++ b/src-tauri/build.rs
@@ -0,0 +1,11 @@
+use tauri_build::Builder;
+
+fn main() {
+ Builder::default()
+ .plugin(tauri_plugin_fs::init())
+ .plugin(tauri_plugin_http::init())
+ .plugin(tauri_plugin_dialog::init())
+ .plugin(tauri_plugin_shell::init())
+ .plugin(tauri_plugin_store::init())
+ .build()
+}
diff --git a/src-tauri/icons/tray-icon.svg b/src-tauri/icons/tray-icon.svg
new file mode 100644
index 000000000..3ca889e91
--- /dev/null
+++ b/src-tauri/icons/tray-icon.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
new file mode 100644
index 000000000..a35e40861
--- /dev/null
+++ b/src-tauri/src/lib.rs
@@ -0,0 +1,20 @@
+pub mod menu;
+pub mod tray;
+pub mod updater;
+
+use serde::{Deserialize, Serialize};
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct AppState {
+ pub app_version: String,
+ pub is_dev_mode: bool,
+}
+
+impl Default for AppState {
+ fn default() -> Self {
+ Self {
+ app_version: env!("CARGO_PKG_VERSION").to_string(),
+ is_dev_mode: cfg!(debug_assertions),
+ }
+ }
+}
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
new file mode 100644
index 000000000..04789ed25
--- /dev/null
+++ b/src-tauri/src/main.rs
@@ -0,0 +1,196 @@
+mod menu;
+mod tray;
+mod updater;
+
+use frenocorp_lib::{
+ menu::create_menu,
+ tray::create_system_tray,
+ updater::check_for_updates,
+};
+use log::{info, LevelFilter};
+use std::env;
+use tauri::{
+ menu::{Menu, MenuEvent},
+ tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
+ AppHandle, Emitter, Manager, RunEvent,
+};
+use tauri_plugin_store::StoreExt;
+
+#[tauri::command]
+fn greet(name: &str) -> String {
+ format!("Hello, {}! You've been greeted from Rust!", name)
+}
+
+#[tauri::command]
+fn get_app_version(app_handle: AppHandle) -> String {
+ app_handle
+ .package_info()
+ .version
+ .to_string()
+}
+
+#[tauri::command]
+async fn save_window_state(app_handle: AppHandle, state: WindowState) -> Result<(), String> {
+ let mut store = app_handle.store("window-state.bin")?;
+ store.insert("window", state).map_err(|e| e.to_string())?;
+ store.save().map_err(|e| e.to_string())
+}
+
+#[tauri::command]
+async fn load_window_state(app_handle: AppHandle) -> Result