glzr-io/glazewm · error

Unsupported IPC command.

Error message

Unsupported IPC command.

What it means

`handle_app_command` dispatches `AppCommand` variants to their handlers. The `Start` command is not supported by the IPC server (it exists only for launching the app), so any client sending it gets this bail.

Solutions

  1. Remove the `Start` command from IPC client usage; launch the WM via its executable directly
  2. Use only commands supported over IPC (focus, move, resize, subscribe, etc.)
  3. Match against the current IPC command surface in wm-ipc-client

Example fix

// before
send_command(AppCommand::Start { path: ... });
// after
spawn glazewm.exe directly instead of sending Start over IPC;
Defensive patterns

Strategy: validation

Validate before calling

if matches!(command, AppCommand::Start { .. }) {
  eprintln!("Start cannot be sent over IPC; launch the WM executable instead");
} else {
  send_ipc_command(command)?;
}

Try / catch

match send_ipc_command(cmd) {
  Err(e) if e.to_string().contains("Unsupported IPC command") => {
    eprintln!("{cmd:?} is not supported over IPC");
  }
  r => r?,
}

Prevention

When it happens

Trigger: Sending `{"commandType":"wm-disable"...}` style messages is fine, but sending `AppCommand::Start` over the IPC WebSocket — e.g. a client reusing the CLI's full command enum including `start` — hits this arm.

Common situations: Custom IPC clients or scripts constructing commands from the full `AppCommand` enum and accidentally including `start`, or outdated clients using deprecated command shapes.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of glzr-io/glazewm@5709ad0a3c (2026-09-08). Data as JSON: /api/errors/d64a3373aed79b03. Report an issue: GitHub.

Appendix: source

Thrown at packages/wm/src/ipc_server.rs:317

                }
              }
            }
          }
        });

        ClientResponseData::EventSubscribe(EventSubscribeData {
          subscription_id,
        })
      }
      AppCommand::Unsub { subscription_id } => {
        self
          .unsubscribe_tx
          .send(subscription_id)
          .context("Failed to unsubscribe from event.")?;

        ClientResponseData::EventUnsubscribe
      }
      AppCommand::Start { .. } => bail!("Unsupported IPC command."),
    };

    Ok(response_data)
  }

  fn to_client_response_msg(
    client_message: String,
    response_data: anyhow::Result<ClientResponseData>,
  ) -> anyhow::Result<Message> {
    let error = response_data.as_ref().err().map(ToString::to_string);
    let success = response_data.as_ref().is_ok();

    let message = ServerMessage::ClientResponse(ClientResponseMessage {
      client_message,
      data: response_data.ok(),
      error,
      success,
    });

View on GitHub (pinned to 5709ad0a3c)