{"record":{"id":"41568c2225bc1306","repo":"RightNow-AI/openfang","slug":"failed-to-start-openfang-server","errorCode":null,"errorMessage":"Failed to start OpenFang server","messagePattern":"Failed to start OpenFang server","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/openfang-desktop/src/lib.rs","lineNumber":44,"sourceCode":"    pub kernel: Arc<OpenFangKernel>,\n    pub started_at: Instant,\n}\n\n/// Entry point for the Tauri application.\n#[cfg_attr(mobile, tauri::mobile_entry_point)]\npub fn run() {\n    // Init tracing\n    tracing_subscriber::fmt()\n        .with_env_filter(\n            tracing_subscriber::EnvFilter::try_from_default_env()\n                .unwrap_or_else(|_| \"openfang=info,tauri=info\".into()),\n        )\n        .init();\n\n    info!(\"Starting OpenFang Desktop...\");\n\n    // Boot kernel + embedded server (blocks until port is known)\n    let server_handle = server::start_server().expect(\"Failed to start OpenFang server\");\n    let port = server_handle.port;\n    let kernel_for_notifications = server_handle.kernel.clone();\n\n    info!(\"OpenFang server running on port {port}\");\n\n    let url = format!(\"http://127.0.0.1:{port}\");\n\n    let mut builder = tauri::Builder::default()\n        .plugin(tauri_plugin_notification::init())\n        .plugin(tauri_plugin_shell::init())\n        .plugin(tauri_plugin_dialog::init());\n\n    // Desktop-only plugins\n    #[cfg(desktop)]\n    {\n        builder = builder.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {\n            // Another instance tried to launch — focus the existing window\n            if let Some(w) = app.get_webview_window(\"main\") {","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/RightNow-AI/openfang/blob/acf2587e46be174c10200489c9a2d23a39a98aeb/crates/openfang-desktop/src/lib.rs#L26-L62","documentation":"`run()` boots the embedded server via `server::start_server()` (crates/openfang-desktop/src/server.rs:66) and unwraps the result with `.expect(\"Failed to start OpenFang server\")`. `start_server` returns `Box<dyn Error>` and can fail at `OpenFangKernel::boot`, binding the `TcpListener` on 127.0.0.1:0, reading the local address, or spawning the server thread. Any of these aborts desktop startup with this panic.","triggerScenarios":"Kernel boot failure (bad config/secrets, provider/credential initialization errors), `TcpListener::bind(\"127.0.0.1:0\")` failing (exhausted ephemeral ports, socket restrictions, no loopback), `local_addr()` failing, or `std::thread::Builder::spawn` failing (thread creation denied).","commonSituations":"Corrupt or missing `~/.openfang/.env` / secrets.env causing kernel boot errors, sandboxed or hardened environments that forbid socket creation, resource limits (RLIMIT_NPROC / fd exhaustion), or misconfigured containers without loopback networking.","solutions":["Inspect the panic's underlying error source — `expect` prints the `Box<dyn Error>` message; fix that root cause (kernel config, secrets, port bind).","Validate `~/.openfang/.env` and secrets.env are present and parseable before launching the desktop app.","Check the environment allows binding sockets on 127.0.0.1 (firewall/seccomp/RLIMIT_NOFILE limits).","Replace `.expect` with error propagation so `run()` can return a `Result` and show a dialog instead of crashing."],"exampleFix":"// before\nlet server_handle = server::start_server().expect(\"Failed to start OpenFang server\");\n\n// after\nlet server_handle = server::start_server()\n    .map_err(|e| anyhow!(\"Failed to start OpenFang server: {e}\"))?;","handlingStrategy":"validation","validationCode":"// preflight before run()\nfn preflight() -> Result<(), String> {\n    let env_path = dirs::home_dir().ok_or(\"no home dir\")?.join(\".openfang/.env\");\n    if !env_path.exists() { return Err(format!(\"missing {}\", env_path.display())); }\n    std::net::TcpListener::bind(\"127.0.0.1:0\")\n        .map_err(|e| format!(\"cannot bind loopback: {e}\"))?;\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":"// propagate the boxed error instead of expect\nlet server_handle = server::start_server()\n    .map_err(|e| anyhow!(\"Failed to start OpenFang server: {e}\"))?;","preventionTips":["Keep ~/.openfang/.env and secrets.env valid; validate on first run","Verify loopback socket binding is permitted in sandboxed/containerized deployments","Watch file-descriptor and thread limits under load","Return Result from run() rather than expect-ing server startup"],"tags":["startup","server","network","tauri"],"backgroundTag":"server-startup-failed","analyzedSha":"acf2587e46be174c10200489c9a2d23a39a98aeb","analyzedAt":"2026-09-02T22:42:28.464Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}