---
name: "ydotool"
section: "1"
platform: "linux"
package: "ydotool"
version: "1.0.4-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/ydotool"
---

# ydotool(1)

command-line /dev/uinput automation tool

## NAME

ydotool - command-line */dev/uinput* automation tool

## SYNOPSIS

**ydotool** **cmd** *args*

**ydotool** **cmd** --help

## DESCRIPTION

**ydotool** lets you programmatically (or manually) simulate keyboard input and mouse activity, etc. The [**ydotoold**(8)](/ydotoold/8.md) daemon must be running.

Currently implemented command(s):

**type**

Type a string

**key**

Press keys

**mousemove**

Move mouse pointer to absolute position

**click**

Click on mouse buttons

## KEYBOARD COMMANDS

**key** \[**-d**,**--key-delay** *\<ms\>*\] \[*\<KEYCODE:PRESSED\>* ...\]

Type a given keycode.

e.g. 28:1 28:0 means pressing on the Enter button on a standard US keyboard. (where :1 for pressed means the key is down and then :0 means the key is released)

42:1 38:1 38:0 24:1 24:0 38:1 38:0 42:0 - "LOL"

Non-interpretable values, such as 0, aaa, l0l, will only cause a delay.

See \`/usr/include/linux/input-event-codes.h' for available key codes (KEY\_\*).

You can find the key name/number your keyboard is sending to libinput by running \`sudo libinput record\` and then selecting your keyboard from the list it will show you the libinput proper key name and number for each key you press.

Options: **-d**,**--key-delay** *\<ms\>*

Delay time between keystrokes. Default 12ms.

**type** \[**-D**,**--next-delay** *\<ms\>*\] \[**-d**,**--key-delay** *\<ms\>*\] \[**-f**,**--file** *\<filepath\>*\] "*text*"

Types text as if you had typed it on the keyboard.

Options:

**-d**,**--key-delay** *\<ms\>*

Delay time between key events (up/down each). Default 12ms.

**-D**,**--next-delay** *\<ms\>*

Delay between strings. Default 0ms.

**-f**,**--file** *\<filepath\>*

Specify a file, the contents of which will be typed as if passed as an argument. The filepath may also be '-' to read from stdin.

Example: to type 'Hello world!' you would do:

ydotool type 'Hello world!'

## MOUSE COMMANDS

**mousemove** \[**-a**,**--absolute**\] *\<x\> \<y\>*

Move the mouse to the relative X and Y coordinates on the screen.

Options: **--absolute**

Use absolute position

Example: to move the cursor to absolute coordinates (100,100):

ydotool mousemove --absolute 100 100

**click** \[**-d**,**--next-delay** *\<ms\>*\] \[**-r**,**--repeat** *N* \] \[*button* ...\]

Send a click.

Options: **-d**,**--next-delay** *\<ms\>*

Delay between input events (up/down, a compete click means doubled time). Default 25ms.

**-r**,**--repeat** *N*

Repeat entire sequence N times

all mouse buttons are represented using hexadecimal numeric values, with an optional bit mask to specify if mouse up/down needs to be omitted.

- •

  0x00 - LEFT

- •

  0x01 - RIGHT

- •

  0x02 - MIDDLE

- •

  0x03 - SIDE

- •

  0x04 - EXTR

- •

  0x05 - FORWARD

- •

  0x06 - BACK

- •

  0x07 - TASK

- •

  0x40 - Mouse down

- •

  0x80 - Mouse up

Examples:

- •

  0x00: chooses left button, but does nothing (you can use this to implement extra sleeps)

- •

  0xC0: left button click (down then up)

- •

  0x41: right button down

- •

  0x82: middle button up

The '0x' prefix can be omitted if you want.

## YDOTOOL SOCKET

The socket to write to for [**ydotoold**(8)](/ydotoold/8.md) can be changed by the environment variable YDOTOOL\_SOCKET.

## AUTHOR

ydotool was written by ReimuNotMoe.

This manpage was written by bob.hepple@gmail.com but updated since.

## LICENCE

AGPLv3

## SEE ALSO

[**ydotoold**(8)](/ydotoold/8.md)

Project site: \<https://github.com/ReimuNotMoe/ydotool\>
