{"record":{"id":"46caea47389bf3f0","repo":"BloopAI/vibe-kanban","slug":"os-didn-t-give-us-a-home-directory","errorCode":null,"errorMessage":"OS didn't give us a home directory","messagePattern":"OS didn't give us a home directory","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/utils/src/assets.rs","lineNumber":26,"sourceCode":"        std::path::PathBuf::from(PROJECT_ROOT).join(\"../../dev_assets\")\n    } else {\n        prod_asset_dir_path()\n    };\n\n    // Ensure the directory exists\n    if !path.exists() {\n        std::fs::create_dir_all(&path).expect(\"Failed to create asset directory\");\n    }\n\n    path\n    // ✔ macOS → ~/Library/Application Support/MyApp\n    // ✔ Linux → ~/.local/share/myapp   (respects XDG_DATA_HOME)\n    // ✔ Windows → %APPDATA%\\Example\\MyApp\n}\n\npub fn prod_asset_dir_path() -> std::path::PathBuf {\n    ProjectDirs::from(\"ai\", \"bloop\", \"vibe-kanban\")\n        .expect(\"OS didn't give us a home directory\")\n        .data_dir()\n        .to_path_buf()\n}\n\npub fn config_path() -> std::path::PathBuf {\n    asset_dir().join(\"config.json\")\n}\n\npub fn profiles_path() -> std::path::PathBuf {\n    asset_dir().join(\"profiles.json\")\n}\n\npub fn credentials_path() -> std::path::PathBuf {\n    asset_dir().join(\"credentials.json\")\n}\n\npub fn trusted_keys_path() -> std::path::PathBuf {\n    asset_dir().join(\"trusted_ed25519_public_keys.json\")","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/BloopAI/vibe-kanban/blob/4deb7eca8f381f7cbc1f9d15515a9ab8f8009053/crates/utils/src/assets.rs#L8-L44","documentation":"prod_asset_dir_path() calls directories::ProjectDirs::from(\"ai\", \"bloop\", \"vibe-kanban\") and unwraps with expect(\"OS didn't give us a home directory\"). ProjectDirs::from returns None when it cannot determine a home directory from the OS (e.g. $HOME unset and no passwd entry on Linux; missing profile env vars on Windows). The panic message is misleading — the problem is a missing home directory, not a bad OS.","triggerScenarios":"Calling prod_asset_dir_path() (directly or via asset_dir(), or read_execution_logs_for_execution which reaches it) on a system where directories::ProjectDirs::from returns None — typically $HOME is unset/empty on Linux or the equivalent base-dir env vars are missing.","commonSituations":"Running under systemd with a stripped environment, cron jobs without HOME, Docker containers running as non-root with no passwd entry, SSH with env_reset, headless CI runners with minimal env.","solutions":["Ensure $HOME is set to a writable directory in the environment (export HOME=/home/user or HOME=/tmp for CI).","Set $XDG_DATA_HOME explicitly so the data dir can be resolved.","When running as a service, set the HOME env var in the unit file/container spec (Environment=HOME=...).","Refactor prod_asset_dir_path() to return Option/Result and fall back to std::env::temp_dir() or an explicit config value instead of panicking."],"exampleFix":"// before\nProjectDirs::from(\"ai\", \"bloop\", \"vibe-kanban\")\n    .expect(\"OS didn't give us a home directory\")\n    .data_dir()\n    .to_path_buf()\n// after\nProjectDirs::from(\"ai\", \"bloop\", \"vibe-kanban\")\n    .map(|d| d.data_dir().to_path_buf())\n    .unwrap_or_else(|| {\n        std::env::var_os(\"XDG_DATA_HOME\")\n            .map(PathBuf::from)\n            .unwrap_or_else(|| std::env::temp_dir().join(\"vibe-kanban\"))\n    })","handlingStrategy":"validation","validationCode":"// run before any call that touches prod_asset_dir_path()/asset_dir()\nfn ensure_home_resolvable() -> Result<(), String> {\n    let has_home = std::env::var_os(\"HOME\").map(|v| !v.is_empty()).unwrap_or(false);\n    let has_xdg = std::env::var_os(\"XDG_DATA_HOME\").is_some();\n    if has_home || has_xdg {\n        Ok(())\n    } else {\n        Err(\"HOME and XDG_DATA_HOME are unset; set HOME before running\".into())\n    }\n}","typeGuard":null,"tryCatchPattern":"let dir = std::panic::catch_unwind(prod_asset_dir_path)\n    .unwrap_or_else(|_| std::env::temp_dir().join(\"vibe-kanban\"));","preventionTips":["Never launch the binary with an empty environment (env -i) without setting HOME.","Add Environment=HOME=%h (systemd) or env: HOME (Docker/compose) for service deployments.","Create the container user in /etc/passwd so home-dir resolution works.","Warn early at startup if HOME is missing rather than failing deep in a path helper."],"tags":["filesystem","panic","environment","rust"],"backgroundTag":"home-directory-not-found","analyzedSha":"4deb7eca8f381f7cbc1f9d15515a9ab8f8009053","analyzedAt":"2026-08-29T09:24:13.446Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}