Hotplug external Monitors on Linux

I am using i3 window manager which is automatically creating workspaces for new monitors.
The problem is that xrandr is not enabling my external monitors when i plug them in (or remove them when unplugging them).

xrandr --output HDMI2 --auto --left-of eDP1 for example enables your external monitor and put it left of your internal display.
eDP1 often refers to the internal laptop display.

udevadm is a tool which fires events on hardware changes like USB or HDMI hotplug.
udevadm monitor displays these events on the console.

Create a file named 95-monitor-hotplug.rules in /etc/udev/rules.d/ with the following content:

KERNEL=="card0", \
ACTION=="change", \
SUBSYSTEM=="drm", \
ENV{DISPLAY}=":0", \
ENV{XAUTHORITY}="/home/felix/.Xauthority", \

Modify the paths to fit your system.

Content of


export DISPLAY=:0
export XAUTHORITY=/home/felix/.Xauthority

function connect() {
    xrandr --output $1 --left-of eDP1 --auto
    # this moves the current workspace to the new created one from i3
    i3 move workspace to output left

function disconnect() {
    xrandr --output $1 --off

function main() {
    # list of all different HDMI ports on docking stations etc.
    for disp in 'DP2' 'HDMI2' ;
        xrandr --query | grep "$disp connected" &> /dev/null && connect $disp || disconnect $disp

    # restart window manager
    i3 restart

# start it forked so the monitor is active
# this is needed because udev activates the monitor
# AFTER this script returns
main &

If you need more explanation of some parts in more detail, let me know in the comments or via email.