LGUG2Z/komorebi · error
could not connect to komorebi.sock
Error message
could not connect to komorebi.sock
What it means
Inside the static-config file watcher, on any config Modify/Remove event komorebi forwards the new bytes over a Unix domain socket at DATA_DIR/komorebi.sock, panicking if UnixStream::connect fails. This happens when no komorebi instance is listening on the socket (komorebi not running, stale socket file, or killed process).
Source
Thrown at komorebi/src/static_config.rs:1399
#[allow(deprecated)]
match value.focus_follows_mouse {
None => WindowsApi::disable_focus_follows_mouse()?,
Some(FocusFollowsMouseImplementation::Windows) => {
WindowsApi::enable_focus_follows_mouse()?;
}
Some(FocusFollowsMouseImplementation::Komorebi) => {}
};
let bytes = SocketMessage::ReloadStaticConfiguration(path.clone()).as_bytes()?;
wm.hotwatch.watch(path, move |event| match event.kind {
// Editing in Notepad sends a NoticeWrite while editing in (Neo)Vim sends
// a NoticeRemove, presumably because of the use of swap files?
EventKind::Modify(_) | EventKind::Remove(_) => {
let socket = DATA_DIR.join("komorebi.sock");
let mut stream =
UnixStream::connect(socket).expect("could not connect to komorebi.sock");
stream
.write_all(&bytes)
.expect("could not write to komorebi.sock");
}
_ => {}
})?;
Ok(wm)
}
pub fn postload(path: &PathBuf, wm: &Arc<Mutex<WindowManager>>) -> eyre::Result<()> {
let mut value = Self::read(path)?;
let mut wm = wm.lock();
let configs_with_preference: Vec<_> =
DISPLAY_INDEX_PREFERENCES.read().keys().copied().collect();
let mut configs_used = Vec::new();
View on GitHub (pinned to e0709f02bf)
Solutions
- Start komorebi before (re)saving the config so a listener exists on the socket
- Delete the stale komorebi.sock file in DATA_DIR and restart komorebi
- Restart komorebic watch configuration after restarting komorebi
- Replace the expect with graceful error logging so the watcher survives a dead socket
Example fix
// before
UnixStream::connect(socket).expect("could not connect to komorebi.sock");
// after
if let Err(e) = UnixStream::connect(socket) {
tracing::error!("could not connect to komorebi.sock: {e}");
return;
} Defensive patterns
Strategy: validation
Validate before calling
// confirm komorebi is listening before saving config / running komorebic watch
let sock = data_dir.join("komorebi.sock");
if !sock.exists() { eprintln!("komorebi not running: {sock:?} missing"); } Prevention
- Start komorebi before komorebic watch configuration
- Delete stale komorebi.sock after unclean shutdowns
- Restart the watcher whenever you restart komorebi
When it happens
Trigger: Saving or touching the watched static config file while the socket at DATA_DIR/komorebi.sock does not exist or refuses connection — komorebi not running, crashed, or a stale .sock left behind.
Common situations: Editing komorebi.json while komorebi is stopped; a stale komorebi.sock after an unclean shutdown; the `komorebic watch` helper outliving the main process.
Understand the failure class
Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.
Related errors
- could not write to komorebi.sock
- unsupported format
- Invalid command
- there is no home directory
- $Env:KOMOREBI_CONFIG_HOME is set to '{home_path}', which is
AI-assisted analysis of LGUG2Z/komorebi@e0709f02bf (2026-09-06).
Data as JSON: /api/errors/6a3ba5c9a941636e.
Report an issue: GitHub.