diff --git a/Cargo.lock b/Cargo.lock
index cfcee9b60b6a6ca085468b80076080ff18249e31..67cd460b2018f35b41578a957f34e586abb38dde 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -114,15 +114,6 @@ dependencies = [
  "winit",
 ]
 
-[[package]]
-name = "addr2line"
-version = "0.24.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
-dependencies = [
- "gimli",
-]
-
 [[package]]
 name = "adler2"
 version = "2.0.0"
@@ -445,21 +436,6 @@ version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
 
-[[package]]
-name = "backtrace"
-version = "0.3.74"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
-dependencies = [
- "addr2line",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
- "windows-targets 0.52.6",
-]
-
 [[package]]
 name = "base64"
 version = "0.21.7"
@@ -829,6 +805,27 @@ dependencies = [
  "crypto-common",
 ]
 
+[[package]]
+name = "directories"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.59.0",
+]
+
 [[package]]
 name = "dispatch"
 version = "0.2.0"
@@ -1445,12 +1442,6 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
-[[package]]
-name = "gimli"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
-
 [[package]]
 name = "gl_generator"
 version = "0.14.0"
@@ -2145,17 +2136,6 @@ version = "0.5.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff"
 
-[[package]]
-name = "mio"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
-dependencies = [
- "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "naga"
 version = "24.0.0"
@@ -2535,21 +2515,18 @@ dependencies = [
  "objc2-foundation 0.2.2",
 ]
 
-[[package]]
-name = "object"
-version = "0.36.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
-dependencies = [
- "memchr",
-]
-
 [[package]]
 name = "once_cell"
 version = "1.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
 
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
 [[package]]
 name = "orbclient"
 version = "0.3.48"
@@ -2897,6 +2874,17 @@ dependencies = [
  "bitflags 2.9.0",
 ]
 
+[[package]]
+name = "redox_users"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
+dependencies = [
+ "getrandom 0.2.15",
+ "libredox",
+ "thiserror 2.0.12",
+]
+
 [[package]]
 name = "regex"
 version = "1.11.1"
@@ -3002,12 +2990,6 @@ version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
 
-[[package]]
-name = "rustc-demangle"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-
 [[package]]
 name = "rustc-hash"
 version = "1.1.0"
@@ -3091,6 +3073,7 @@ name = "segs"
 version = "0.1.0"
 dependencies = [
  "anyhow",
+ "directories",
  "eframe",
  "egui",
  "egui_extras",
@@ -3111,7 +3094,6 @@ dependencies = [
  "strum",
  "strum_macros",
  "thiserror 2.0.12",
- "tokio",
  "tracing",
  "tracing-appender",
  "tracing-subscriber",
@@ -3373,16 +3355,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "socket2"
-version = "0.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "spin"
 version = "0.9.8"
@@ -3643,20 +3615,6 @@ dependencies = [
  "zerovec",
 ]
 
-[[package]]
-name = "tokio"
-version = "1.44.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
-dependencies = [
- "backtrace",
- "libc",
- "mio",
- "pin-project-lite",
- "socket2",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "toml_datetime"
 version = "0.6.8"
diff --git a/Cargo.toml b/Cargo.toml
index 819e571068083cb0aa8e10b32407d5a394cda88c..637f0ee4f9eb30581e4a71fc2b1dba36e69ba518 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,43 +2,40 @@
 name = "segs"
 version = "0.1.0"
 # if you're a contributor, you should add your name here
-authors = ["Federico Lolli <federico.lolli@skywarder.eu>"]
+authors = [
+    "Federico Lolli <federico.lolli@skywarder.eu>",
+    "Niccolò Betto <niccolo.betto@skywarder.eu>",
+]
 edition = "2024"
 description = "Skyward Enhanced Ground Software"
 license = "MIT"
 
 [dependencies]
-# ======= GUI & Rendering =======
+anyhow = "1.0"
+directories = "6.0.0"
 egui_tiles = "0.12"
 eframe = { version = "0.31", features = ["persistence"] }
 egui = { version = "0.31", features = ["log", "mint"] }
 egui_extras = { version = "0.31", features = ["svg"] }
 egui_plot = "0.31"
 egui_file = "0.22"
-# =========== Asynchronous ===========
-tokio = { version = "1.41", features = ["rt-multi-thread", "net", "sync"] }
-# =========== Mavlink ===========
-serialport = "4.7.0"
-# ========= Persistency =========
+enum_dispatch = "0.3"
+glam = { version = "0.29", features = ["serde", "mint"] }
+itertools = "0.14.0"
+mint = "0.5.9"
+profiling = { version = "1.0", features = ["profile-with-tracy"] }
+ring-channel = "0.12.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-# =========== Tracing and profiling ===========
+serialport = "4.7.0"
+thiserror = "2.0.7"
+strum = "0.26"
+strum_macros = "0.26"
 tracing = "0.1"
+tracing-appender = "0.2"
 tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
 tracing-tracy = "0.11.4"
-profiling = { version = "1.0", features = ["profile-with-tracy"] }
-tracing-appender = "0.2"
-# =========== Utility ===========
-# for dynamic dispatch
-enum_dispatch = "0.3"
-strum = "0.26"
-strum_macros = "0.26"
-anyhow = "1.0"
-ring-channel = "0.12.0"
-thiserror = "2.0.7"
 uuid = { version = "1.12.1", features = ["serde", "v7"] }
-glam = { version = "0.29", features = ["serde", "mint"] }
-mint = "0.5.9"
 
 [dependencies.skyward_mavlink]
 git = "https://git.skywarder.eu/avn/swd/mavlink/mavlink-skyward-lib.git"
@@ -52,3 +49,18 @@ features = ["serde"]
 
 [dev-dependencies]
 rand = "0.9.0"
+
+[package.metadata.packager]
+product-name = "SEGS"
+description = "Skyward Enhanced Ground Software"
+version = "0.1.0"
+authors = [
+    "Federico Lolli <federico.lolli@skywarder.eu>",
+    "Niccolò Betto <niccolo.betto@skywarder.eu>",
+]
+identifier = "skywarder.eu"
+category = "DeveloperTool"
+license-file = "LICENSE"
+before-packaging-command = "cargo build --release"
+resources = ["assets/icon_*.png", "LICENSE", "README.md"]
+icons = ["assets/icon_*.png"]
diff --git a/README.md b/README.md
index bfc83583fcc148f8c4dffb340b80db7547936687..88499c607a092e3bdcb2c001560f780e4bfe686b 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 <div align="center">
-  <img src="./assets/logo.png" alt="Logo" width="400"/>
+  <img src="./assets/segs_banner.png" alt="Logo" width="400"/>
   <br>
   <img src="https://img.shields.io/badge/version-v0.1.0-blue.svg?logo=rust">
   <img src="https://img.shields.io/badge/development-alpha-red">
diff --git a/assets/icon_128x128.png b/assets/icon_128x128.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e37d3455a4ec4f1d5596b5bdfe20233e503c72d
Binary files /dev/null and b/assets/icon_128x128.png differ
diff --git a/assets/icon_32x32.png b/assets/icon_32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c2f279daa2b6a73ea4528364cf26aa6590e51bf
Binary files /dev/null and b/assets/icon_32x32.png differ
diff --git a/assets/icon_512x512.png b/assets/icon_512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb3ed23d070fe7ad213fed6084dc60723f6edb2b
Binary files /dev/null and b/assets/icon_512x512.png differ
diff --git a/assets/logo.png b/assets/logo.png
deleted file mode 100644
index 313cbfa398a58fcdbd959de23963e0a1c9ebc8ac..0000000000000000000000000000000000000000
Binary files a/assets/logo.png and /dev/null differ
diff --git a/assets/segs_banner.png b/assets/segs_banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd3a2c0c1f4f4386abce46ce5b1a8789ffdffca5
Binary files /dev/null and b/assets/segs_banner.png differ
diff --git a/justfile b/justfile
index f537b2ebde3647d48e89f8c9074c4958475ef967..1105a0d055afa507d0d2ab7ea2a88fe0079a7435 100644
--- a/justfile
+++ b/justfile
@@ -11,5 +11,8 @@ test *ARGS:
 run LEVEL="debug":
     RUST_BACKTRACE=full RUST_LOG=segs={{LEVEL}} cargo r
 
+package:
+    cargo packager --release
+
 doc:
     cargo doc --no-deps --open
diff --git a/src/main.rs b/src/main.rs
index 87495b96d8d51d8b6e7ece615f396ab1cef08fbb..61bca34a472d3a861dc26c2b134ed4168877a4dc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,12 +9,11 @@ mod message_broker;
 mod ui;
 mod utils;
 
-use std::sync::LazyLock;
+use std::{fs::create_dir_all, sync::LazyLock};
 
-use tokio::runtime::Runtime;
+use error::ErrInstrument;
 use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt, util::SubscriberInitExt};
 
-use error::ErrInstrument;
 use mavlink::reflection::ReflectionContext;
 use ui::App;
 
@@ -26,21 +25,28 @@ static APP_NAME: &str = "segs";
 fn main() -> Result<(), eframe::Error> {
     // Set up logging (USE RUST_LOG=debug to see logs)
     let env_filter = EnvFilter::builder().from_env_lossy();
-    let file_appender = tracing_appender::rolling::daily("logs/", "segs.log");
-    let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
-    tracing_subscriber::registry()
+    let registry = tracing_subscriber::registry()
         .with(tracing_subscriber::fmt::layer().with_filter(env_filter))
-        .with(
+        .with(tracing_tracy::TracyLayer::default());
+
+    // Create the logs directory if it doesn't exist and add to the registry
+    if let Some(base_dirs) = directories::BaseDirs::new() {
+        let local_dir = base_dirs.data_local_dir();
+        let logs_dir = local_dir.join("logs");
+        create_dir_all(&logs_dir).log_expect("Failed to create logs directory");
+
+        let file_appender = tracing_appender::rolling::daily(logs_dir, "segs.log");
+        let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
+        let registry = registry.with(
             tracing_subscriber::fmt::layer()
                 .json()
                 .with_writer(non_blocking),
-        )
-        .with(tracing_tracy::TracyLayer::default())
-        .init();
-
-    // Start Tokio runtime (TODO: decide whether to use Tokio or a simpler thread-based approach)
-    let rt = Runtime::new().log_expect("Unable to create Tokio Runtime");
-    let _enter = rt.enter();
+        );
+        // Initialize the logger
+        registry.init();
+    } else {
+        registry.init();
+    }
 
     let native_options = eframe::NativeOptions {
         // By modifying the viewport, we can change things like the windows size