t8y2/dbx · critical

Failed to resolve app data dir

Error message

Failed to resolve app data dir

What it means

On Tauri startup the app resolves the platform-specific per-user application data directory via app.path().app_data_dir(). This fails when the underlying directory resolver cannot determine a valid path (e.g. missing XDG/HOME environment or OS API failure). The code converts the error to a string and panics with this message.

Source

Thrown at src-tauri/src/lib.rs:1494

            }
        })
        .setup(move |app| {
            let setup_start = Instant::now();
            eprintln!("[STARTUP] plugins registered in {:?}", startup_begin.elapsed());
            append_startup_probe(format!("setup entered after {:?}", startup_begin.elapsed()));

            if should_show_main_window_before_setup_tasks() {
                prepare_main_window_for_display(app.handle());
                show_main_window(app.handle());
                append_startup_probe(format!(
                    "early main window show requested; {}",
                    main_window_probe_state(app.handle())
                ));
            }

            append_startup_probe("resolving app data dir");
            let default_data_dir =
                app.path().app_data_dir().map_err(|e| e.to_string()).expect("Failed to resolve app data dir");
            let data_dir_resolution = data_dir::resolve_data_dir_with_mode(default_data_dir);
            let data_dir = data_dir_resolution.data_dir.clone();
            std::fs::create_dir_all(&data_dir).expect("Failed to create data dir");
            let data_dir_mode = startup_data_dir_mode(&data_dir_resolution.mode);
            append_startup_probe(format!("data dir ready mode={data_dir_mode}"));
            let alternative_data_dir = data_dir::alternative_data_dir(&data_dir_resolution);
            match maybe_import_user_data_db(&data_dir, alternative_data_dir.as_deref()) {
                Ok(result) => eprintln!("[STARTUP] data db fallback import: {result:?}"),
                Err(err) => eprintln!("[STARTUP] data db fallback import failed: {err}"),
            }
            let db_path = data_dir.join("dbx.db");

            let t = Instant::now();
            append_startup_probe(format!("opening storage file=dbx.db data_dir_mode={data_dir_mode}"));
            let storage = tauri::async_runtime::block_on(async {
                let s = Storage::open(&db_path).await.expect("Failed to open storage");
                eprintln!("[STARTUP]   Storage::open in {:?}", t.elapsed());
                append_startup_probe(format!("storage opened in {:?}", t.elapsed()));

View on GitHub (pinned to c0390bff16)

Solutions

  1. Ensure the process runs as a user with a valid home directory (set HOME=/path on Linux/macOS when running headless).
  2. Handle the Result from app_data_dir() instead of expect(): fall back to a configurable or temp directory.
  3. Verify platform config-dir APIs are accessible (XDG_CONFIG_HOME, Windows %APPDATA%) and not blocked by sandbox policies.

Example fix

// before
let default_data_dir = app.path().app_data_dir().map_err(|e| e.to_string()).expect("Failed to resolve app data dir");
// after
let default_data_dir = app.path().app_data_dir().unwrap_or_else(|_| std::env::temp_dir().join("dbx"));
Defensive patterns

Strategy: fallback

Validate before calling

// Rust: sanity-check the environment before startup
fn has_home() -> bool {
    std::env::var("HOME").map(|h| !h.is_empty()).unwrap_or(false)
}

Try / catch

let dir = app.path().app_data_dir().unwrap_or_else(|e| {
    eprintln!("app_data_dir failed: {e}");
    std::env::temp_dir().join("dbx")
});

Prevention

When it happens

Trigger: Calling app.path().app_data_dir() in the Tauri setup hook (lib.rs:1494) when the OS returns an error: HOME unset or invalid on Linux/macOS, corrupted user profile on Windows, or running in a sandbox/container without a user home.

Common situations: Launching the app from a systemd service or CI runner with no HOME; running inside a container as a user with no home directory; corrupted registry/profile data on Windows; AppArmor/Flatpak restrictions on config dirs.

Related errors


AI-assisted analysis of t8y2/dbx@c0390bff16 (2026-09-05). Data as JSON: /api/errors/4aa4ec5d36b381de. Report an issue: GitHub.