{"record":{"id":"4aa4ec5d36b381de","repo":"t8y2/dbx","slug":"failed-to-resolve-app-data-dir","errorCode":null,"errorMessage":"Failed to resolve app data dir","messagePattern":"Failed to resolve app data dir","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"src-tauri/src/lib.rs","lineNumber":1494,"sourceCode":"            }\n        })\n        .setup(move |app| {\n            let setup_start = Instant::now();\n            eprintln!(\"[STARTUP] plugins registered in {:?}\", startup_begin.elapsed());\n            append_startup_probe(format!(\"setup entered after {:?}\", startup_begin.elapsed()));\n\n            if should_show_main_window_before_setup_tasks() {\n                prepare_main_window_for_display(app.handle());\n                show_main_window(app.handle());\n                append_startup_probe(format!(\n                    \"early main window show requested; {}\",\n                    main_window_probe_state(app.handle())\n                ));\n            }\n\n            append_startup_probe(\"resolving app data dir\");\n            let default_data_dir =\n                app.path().app_data_dir().map_err(|e| e.to_string()).expect(\"Failed to resolve app data dir\");\n            let data_dir_resolution = data_dir::resolve_data_dir_with_mode(default_data_dir);\n            let data_dir = data_dir_resolution.data_dir.clone();\n            std::fs::create_dir_all(&data_dir).expect(\"Failed to create data dir\");\n            let data_dir_mode = startup_data_dir_mode(&data_dir_resolution.mode);\n            append_startup_probe(format!(\"data dir ready mode={data_dir_mode}\"));\n            let alternative_data_dir = data_dir::alternative_data_dir(&data_dir_resolution);\n            match maybe_import_user_data_db(&data_dir, alternative_data_dir.as_deref()) {\n                Ok(result) => eprintln!(\"[STARTUP] data db fallback import: {result:?}\"),\n                Err(err) => eprintln!(\"[STARTUP] data db fallback import failed: {err}\"),\n            }\n            let db_path = data_dir.join(\"dbx.db\");\n\n            let t = Instant::now();\n            append_startup_probe(format!(\"opening storage file=dbx.db data_dir_mode={data_dir_mode}\"));\n            let storage = tauri::async_runtime::block_on(async {\n                let s = Storage::open(&db_path).await.expect(\"Failed to open storage\");\n                eprintln!(\"[STARTUP]   Storage::open in {:?}\", t.elapsed());\n                append_startup_probe(format!(\"storage opened in {:?}\", t.elapsed()));","sourceCodeStart":1476,"sourceCodeEnd":1512,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/src-tauri/src/lib.rs#L1476-L1512","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Ensure the process runs as a user with a valid home directory (set HOME=/path on Linux/macOS when running headless).","Handle the Result from app_data_dir() instead of expect(): fall back to a configurable or temp directory.","Verify platform config-dir APIs are accessible (XDG_CONFIG_HOME, Windows %APPDATA%) and not blocked by sandbox policies."],"exampleFix":"// before\nlet default_data_dir = app.path().app_data_dir().map_err(|e| e.to_string()).expect(\"Failed to resolve app data dir\");\n// after\nlet default_data_dir = app.path().app_data_dir().unwrap_or_else(|_| std::env::temp_dir().join(\"dbx\"));","handlingStrategy":"fallback","validationCode":"// Rust: sanity-check the environment before startup\nfn has_home() -> bool {\n    std::env::var(\"HOME\").map(|h| !h.is_empty()).unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"let dir = app.path().app_data_dir().unwrap_or_else(|e| {\n    eprintln!(\"app_data_dir failed: {e}\");\n    std::env::temp_dir().join(\"dbx\")\n});","preventionTips":["Verify HOME/XDG env vars exist when launching headless (services, CI, containers).","Never expect() on path resolution; always provide a fallback directory.","Document the env requirements for sandboxed/Flatpak deployments."],"tags":["rust","tauri","filesystem","startup"],"backgroundTag":"app-data-dir-resolution-failed","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}