Designed specifically with modern Linux (Wayland) in mind, this server bypasses high-level display server restrictions by communicating directly with the Linux kernel via `evdev` and `/dev/uinput` to simulate real physical hardware inputs.
- **Layout Support**: Currently supports standard US (`us`) and Slovenian (`si`) layouts out of the box, with intelligent fallback mechanisms (reading `localectl`, environment variables, or `setxkbmap`).
- **Mouse Control**: Absolute and relative cursor movement, clicking (left, right, middle), and scrolling.
- **Configurable Delays**: Adjust typing speeds and pre-action delays for smooth interactions.
Because this server simulates real hardware at the kernel level, it requires write access to the `/dev/uinput` device node. By default, regular users do not have this permission.
You have two choices on how to run this server depending on your workflow.
### Option 1: The Native Route (Recommended for background agents like Goose)
Permanently grant your standard user account access to simulate input. This allows agents to seamlessly start the server in the background without getting stuck waiting for a `sudo` password.
1. Add your user to the `input` group:
```bash
sudo usermod -aG input $USER
```
2. Create a `udev` rule to ensure the input group can write to `/dev/uinput`:
```bash
echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-uinput.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
```
3.**Reboot your computer** (or log out and back in) for the group changes to take effect.
### Option 2: The Sudo Route (Using Streamable HTTP)
If you don't want to change your user groups, you can run the server as `root` in a separate terminal using `sudo`. To prevent your AI agent from hanging on a password prompt, you can run the server over **Streamable HTTP** and have your agent connect to it over the local network.
Goose stores extensions in `~/.config/goose/config.yaml` (Linux/macOS) or `%APPDATA%\Block\goose\config\config.yaml` (Windows).
### Option A: STDIO (command) extension
Use this when Goose should start the server as a subprocess. The most reliable form is to give the absolute path to the `poetry` binary and the absolute path to the project.