CROSS-PLATFORM AUDIT:
- Linux x86_64 (Fedora 43, KDE Wayland): HIGH confidence (the dev target)
- Linux other distros / X11: MEDIUM (tested patterns, untested distros)
- Windows 10/11: LOW — theoretically supported via Tauri + CPAL + whisper.cpp
+ tauri-plugin-global-shortcut (the custom evdev hotkey is no-op on
Windows); has had zero hands-on testing
- macOS Apple Silicon / Intel: LOW — same; macOS Info.plist needs
NSMicrophoneUsageDescription for the bundled app, and the path bug
fixed in this commit
REAL BUG FIXED — macOS app_data_dir was Unix-style:
crates/storage/src/file_storage.rs::app_data_dir() previously fell into
the "Unix" branch on macOS and wrote to ~/.kon/, which violates Apple
guidelines and confuses install/uninstall tooling. Now correctly:
- Windows: %LOCALAPPDATA%/kon (unchanged)
- macOS: ~/Library/Application Support/Kon/
- Linux: $XDG_DATA_HOME/kon or ~/.local/share/kon (XDG Base Directory),
with legacy ~/.kon/ fallback so existing installs keep working
- Other Unix: ~/.kon/ (unchanged)
OS DETECTION LAYER:
- New get_os_info Tauri command in commands/diagnostics.rs returns:
{os, arch, family, usesCmd, isWayland, customHotkeyBackend,
primaryModifierLabel}
- New src/lib/utils/osInfo.js helper:
- async loadOsInfo() warms a cache, called once at root layout mount
- then isMac() / isWindows() / isLinux() / modKeyLabel() / isWayland()
are synchronous
- browser-preview fallback reads navigator.platform
- Lets components localise hotkey labels (Cmd vs Ctrl), file-picker
copy ("Open Finder" vs "Open Explorer"), etc, without recomputing in
every place.
cargo check -p kon-storage clean. Updated HANDOVER-2026-04-17.md with
a per-platform confidence table.
80 lines
2.7 KiB
Rust
80 lines
2.7 KiB
Rust
use std::path::PathBuf;
|
|
|
|
/// Resolve the per-user app data directory, following each OS's convention:
|
|
///
|
|
/// - Windows: `%LOCALAPPDATA%\kon\` e.g. `C:\Users\Jake\AppData\Local\kon`
|
|
/// - macOS: `~/Library/Application Support/Kon/`
|
|
/// - Linux: `$XDG_DATA_HOME/kon` or `~/.local/share/kon` (XDG Base Directory),
|
|
/// with a fallback to the legacy `~/.kon/` if it already exists, so
|
|
/// existing installs keep working.
|
|
/// - Other Unix: `~/.kon/`
|
|
///
|
|
/// TODO: Consolidate with `crates/transcription/src/model_manager.rs::dirs_path()`
|
|
/// into a shared helper in `crates/core/` to avoid duplicating platform-specific
|
|
/// path logic across crates.
|
|
pub fn app_data_dir() -> PathBuf {
|
|
#[cfg(target_os = "windows")]
|
|
{
|
|
let local_app_data = std::env::var("LOCALAPPDATA").unwrap_or_else(|_| ".".to_string());
|
|
return PathBuf::from(local_app_data).join("kon");
|
|
}
|
|
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
|
|
return PathBuf::from(home)
|
|
.join("Library")
|
|
.join("Application Support")
|
|
.join("Kon");
|
|
}
|
|
|
|
#[cfg(target_os = "linux")]
|
|
{
|
|
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
|
|
|
|
// Honour the legacy ~/.kon/ if it exists on disk so existing
|
|
// installs are not orphaned. New installs follow XDG.
|
|
let legacy = PathBuf::from(&home).join(".kon");
|
|
if legacy.exists() {
|
|
return legacy;
|
|
}
|
|
|
|
// XDG Base Directory: $XDG_DATA_HOME/kon or default ~/.local/share/kon
|
|
if let Ok(xdg) = std::env::var("XDG_DATA_HOME") {
|
|
if !xdg.is_empty() {
|
|
return PathBuf::from(xdg).join("kon");
|
|
}
|
|
}
|
|
return PathBuf::from(home).join(".local").join("share").join("kon");
|
|
}
|
|
|
|
#[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))]
|
|
{
|
|
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
|
|
PathBuf::from(home).join(".kon")
|
|
}
|
|
}
|
|
|
|
/// Path to the SQLite database file.
|
|
pub fn database_path() -> PathBuf {
|
|
app_data_dir().join("kon.db")
|
|
}
|
|
|
|
/// Directory for saved audio recordings.
|
|
pub fn recordings_dir() -> PathBuf {
|
|
app_data_dir().join("recordings")
|
|
}
|
|
|
|
/// Directory for crash dumps written by the Rust panic hook.
|
|
/// Each crash is a single text file: `<unix-ts>-<short-id>.crash`.
|
|
/// Used by the diagnostic-report bundler in Settings → About.
|
|
pub fn crashes_dir() -> PathBuf {
|
|
app_data_dir().join("crashes")
|
|
}
|
|
|
|
/// Directory for the rolling Rust log file (kon.log + rotated kon.log.1, etc).
|
|
/// Subscribers configured in src-tauri/src/lib.rs at startup.
|
|
pub fn logs_dir() -> PathBuf {
|
|
app_data_dir().join("logs")
|
|
}
|