Waybar disappeared on external monitor

waybar disappeared on external monitor after swtiching back to extend from mirror mode

I have my monitor presets like this in my hyprland.conf

monitor=eDP-1,1920x1200@60,0x0,1 # main monitor
monitor=HDMI-A-2,1920x1080@75,1920x0,1 # external monitor (extend)
# monitor=HDMI-A-2,1920x1080@75,auto,1,mirror,eDP-1 # external monitor (mirror)

If I want to swtiching back and forth between extend and mirror mode I just comment and uncomment the other.

The problem is when I switch to mirror mode and switch back to extend mode. Waybar won’t show on my external monitor anymore.

This is some additional information that could be related to the problem:

  • Output of hyprctl monitors
Monitor eDP-1 (ID 0):
	[email protected] at 0x0
	description: KDB 0x0717
	make: KDB
	model: 0x0717
	serial: 
	active workspace: 2 (2)
	special workspace: 0 ()
	reserved: 0 35 0 0
	scale: 1.00
	transform: 0
	focused: no
	dpmsStatus: 1
	vrr: false
	solitary: 0
	activelyTearing: false
	directScanoutTo: 0
	disabled: false
	currentFormat: XRGB8888
	mirrorOf: none
	availableModes: [email protected] [email protected] 

Monitor HDMI-A-2 (ID 1):
	[email protected] at 1920x0
	description: AOC 24B2W1 0x00001888
	make: AOC
	model: 24B2W1
	serial: 0x00001888
	active workspace: 4 (4)
	special workspace: 0 ()
	reserved: 0 0 0 0
	scale: 1.00
	transform: 0
	focused: yes
	dpmsStatus: 1
	vrr: false
	solitary: 0
	activelyTearing: false
	directScanoutTo: 0
	disabled: false
	currentFormat: XRGB8888
	mirrorOf: none
	availableModes: [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] 
  • Output of WAYBAR_OUTPUT=1 waybar -l trac
➜  ~ WAYBAR_OUTPUT=1 waybar -l trace

[2025-08-29 22:35:56.625] [debug] Try expanding: $XDG_CONFIG_HOME/waybar/config
[2025-08-29 22:35:56.625] [debug] Try expanding: $XDG_CONFIG_HOME/waybar/config.jsonc
[2025-08-29 22:35:56.625] [debug] Try expanding: $HOME/.config/waybar/config
[2025-08-29 22:35:56.625] [debug] Try expanding: $HOME/.config/waybar/config.jsonc
[2025-08-29 22:35:56.625] [debug] Found config file: /home/weerawatw/.config/waybar/config.jsonc
[2025-08-29 22:35:56.625] [info] Using configuration file /home/weerawatw/.config/waybar/config.jsonc
[2025-08-29 22:35:56.630] [debug] Try expanding: $XDG_CONFIG_HOME/waybar/style.css
[2025-08-29 22:35:56.630] [debug] Try expanding: $HOME/.config/waybar/style.css
[2025-08-29 22:35:56.630] [debug] Found config file: /home/weerawatw/.config/waybar/style.css
[2025-08-29 22:35:56.630] [info] Using CSS file /home/weerawatw/.config/waybar/style.css
[2025-08-29 22:35:56.637] [debug] Output detection done: eDP-1 (KDB 0x0717 )
[2025-08-29 22:35:56.645] [warning] module sway/workspaces: Disabling module "sway/workspaces", Socket path is empty
[2025-08-29 22:35:56.646] [warning] 'swap-icon-label' must be a bool.
[2025-08-29 22:35:56.652] [warning] module sway/window: Disabling module "sway/window", Socket path is empty
[2025-08-29 22:35:56.652] [debug] window-rewrite is not defined or is not an object, using default rules.
[2025-08-29 22:35:56.652] [info] Hyprland IPC starting
[2025-08-29 22:35:56.653] [trace] Current monitor ID: 0
[2025-08-29 22:35:56.653] [debug] Initializing workspaces
[2025-08-29 22:35:56.653] [trace] Extending orphans with workspace 4
[2025-08-29 22:35:56.653] [debug] Initializing persistent workspaces
[2025-08-29 22:35:56.653] [info] Loading persistent workspaces from Hyprland workspace rules
[2025-08-29 22:35:56.653] [warning] 'swap-icon-label' must be a bool.
[2025-08-29 22:35:56.655] [trace] Adding solo class: firefox
[2025-08-29 22:35:56.661] [debug] network: new default route via 10.0.0.1 on if2 metric 600
[2025-08-29 22:35:56.661] [debug] network: wlo1, new addr 10.0.0.216/24
[2025-08-29 22:35:56.661] [debug] network: wlo1, new addr 10.0.0.216/24
[2025-08-29 22:35:56.666] [debug] battery: worker interval is 1
[2025-08-29 22:35:56.672] [trace] Sink name alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI3__sink Running:[false] Idle:[false]
[2025-08-29 22:35:56.672] [trace] Sink name alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI2__sink Running:[false] Idle:[false]
[2025-08-29 22:35:56.672] [trace] Sink name alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__HDMI1__sink Running:[false] Idle:[false]
[2025-08-29 22:35:56.672] [trace] Sink name alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Headphones__sink Running:[false] Idle:[false]
[2025-08-29 22:35:56.676] [debug] GTK widget tree:
window#waybar.background.top.eDP-1..mode-default.solo.firefox:dir(ltr)
  decoration:dir(ltr)
  box.horizontal:dir(ltr)
    box.horizontal.modules-left:dir(ltr)
      widget:dir(ltr)
        box#workspaces.horizontal.module:dir(ltr)
      widget:dir(ltr)
        box#window.horizontal.module:dir(ltr)
          image:dir(ltr)
          label:dir(ltr)
      widget:dir(ltr)
        box#tray.horizontal.module:dir(ltr)
    box.horizontal.modules-center:dir(ltr)
      widget:dir(ltr)
        label#clock.module:dir(ltr)
    box.horizontal.modules-right:dir(ltr)
      widget:dir(ltr)
        label#network.module:dir(ltr)
      widget:dir(ltr)
        label#disk.module:dir(ltr)
      widget:dir(ltr)
        label#cpu.module:dir(ltr)
      widget:dir(ltr)
        label#backlight.module:dir(ltr)
      widget:dir(ltr)
        label#custom-memory.module:dir(ltr)
      widget:dir(ltr)
        label#pulseaudio.module:dir(ltr)
      widget:dir(ltr)
        label#battery.module:dir(ltr)

[2025-08-29 22:35:56.676] [debug] Received SIGCHLD in signalThread
[2025-08-29 22:35:56.676] [debug] Received SIGCHLD in signalThread
[2025-08-29 22:35:56.677] [debug] Creating workspace 1
[2025-08-29 22:35:56.678] [debug] Creating workspace 2
[2025-08-29 22:35:56.680] [trace] Selecting icon for workspace 1
[2025-08-29 22:35:56.680] [trace] Selecting icon for workspace 2
[2025-08-29 22:35:56.684] [debug] Cmd exited with code 0

** (waybar:10054): WARNING **: 22:35:56.792: Status Notifier Item with bus name ':1.6' and object path '/org/ayatana/NotificationItem/nm_applet' is already registered
[2025-08-29 22:35:56.802] [trace] Set tray item property: :1.6.AttentionAccessibleDesc = ''
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.AttentionIconName = ''
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.Category = 'SystemServices'
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.IconAccessibleDesc = 'Wi-Fi network connection “TopTel@AP” active: TopTel@AP (100%)'
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.IconName = 'nm-signal-75'
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.IconThemePath = ''
[2025-08-29 22:35:56.803] [trace] Set tray item property: :1.6.Id = 'nm-applet'
[2025-08-29 22:35:56.803] [debug] SNI tray id: nm-applet
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.Menu = '/org/ayatana/NotificationItem/nm_applet/Menu'
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.Status = 'Active'
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.Title = 'Network'
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.XAyatanaLabel = ''
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.XAyatanaLabelGuide = ''
[2025-08-29 22:35:56.803] [trace] Set tray item property: nm-applet.XAyatanaOrderingIndex = 0
[2025-08-29 22:35:56.813] [debug] Received SIGCHLD in signalThread
[2025-08-29 22:35:56.815] [warning] Requested height: 20 is less than the minimum height: 30 required by the modules
[2025-08-29 22:35:56.815] [info] Bar configured (width: 1910, height: 30) for output: eDP-1
[2025-08-29 22:35:56.819] [debug] hyprland IPC received openlayer>>waybar
^C[2025-08-29 22:35:58.459] [info] Quitting.
[2025-08-29 22:35:58.465] [info] Hyprland IPC stopping...
[2025-08-29 22:35:58.465] [trace] Shutting down socket
[2025-08-29 22:35:58.465] [trace] Closing socket
[2025-08-29 22:35:58.467] [debug] Hyprland IPC stopped
  • waybar config.jsonc
{
  "layer": "top",
  "height": 20,
  "spacing": 5,
  "margin-top" :5,
  "margin-right" :5,
  "margin-left" :5,
  "output": ["eDP-1", "HDMI-A-2"],

  "modules-left": [
    "sway/workspaces",
    "sway/window",
    "hyprland/workspaces",
    "hyprland/window",
    "tray",
  ],

  "modules-center": ["clock"],

  "modules-right": [
    "network",
    "disk",
    "cpu",
    "backlight",
    "custom/memory",
    "pulseaudio",
    "battery",
  ],

  "hyprland/workspaces": {
    "disable-scroll": true,
    "active-only": false,
    "warp-on-scroll": false,
    "format": "{icon}",
    "format-icons": {
      "1": "<span></span>",
      "2": "<span>󰈹</span>",
      "3": "<span></span>",
      "4": "<span></span>",
      "5": "<span></span>",
      "6": "<span>󰊗</span>",
    }
  },

  "hyprland/window": {
    "format": "<span color='#202020' bgcolor='#d3869b' >  </span> {class}",
    "separate-outputs": true,
    "icon":false,
    "tooltip": false
  },

  "tray": {
    "icon-size": 15,
    "spacing": 8
  },

  "disk": {
    "format": "<span color='#202020' bgcolor='#ea6962' >  </span> {free}",
    "interval": 20
  },

  "cpu": {
    "format": "<span color='#202020' bgcolor='#e78a4e' >  </span> {usage}%",
    "tooltip": false,
    "interval": 1
  },

  "backlight": {
    "format": "<span color='#202020' bgcolor='#f6c657' > 󰞏 </span> {percent}%",
    "tooltip": false,
  },

  "custom/memory": {
    "exec": "~/.config/waybar/scripts/memory_usage.sh",
    "interval": 2,
    "return-type": "json",
    "format": "<span color='#202020' bgcolor='#458588' >  </span> {}"
  },

  "pulseaudio": {
    // "scroll-step": 1, // %, can be a float
    "format": "<span color='#202020' bgcolor='#83a598' >  </span> {volume}%",
    "format-muted": "<span color='#202020' bgcolor='#ea6962' >  </span> {volume}%",
    "format-bluetooth": "<span color='#202020' bgcolor='#83a598' > 󰂰 </span> {volume}%",
    "format-bluetooth-muted": "<span color='#202020' bgcolor='#ea6962' > 󰂲 </span> {volume}%",
    "format-source": "{volume}% ",
    "on-click": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
    "on-click-right": "pavucontrol",
    "tooltip": false,
    "max-volume": 130
  },

  "battery#bat2": {
    "bat": "BAT2"
  },

  "battery": {
    "interval": 1,
    "states": {
      "good": 99,
      "warning": 30,
      "critical": 20
    },
    "format-icons": ["󰂎","󰁺","󰁻","󰁽","󰁾","󰁿","󰂀","󰂁","󰂂","󰁹"],
    "format": "<span color='#202020' bgcolor='#689d6a' > {icon} </span> {capacity}%",
    "format-critical": "<span color='#202020' bgcolor='#cc241d' > {icon} </span> {capacity}%!!",
    "format-warning": "<span color='#202020' bgcolor='#e78a4e' > {icon} </span> {capacity}%",
    "format-full": "<span color='#202020' bgcolor='#689d6a' > {icon} </span> {capacity}%",
    "format-charging": "<span color='#202020' bgcolor='#689d6a' > 󰂅 </span> {capacity}%",
    "format-charging-warning": "<span color='#202020' bgcolor='#e78a4e' > 󰢝 </span> {capacity}%",
    "format-charging-critical": "<span color='#202020' bgcolor='#cc241d' > 󰢜 </span> {capacity}%",
    "format-plugged": "<span color='#202020' bgcolor='#689d6a' > 󰂅 </span> {capacity}%",
    "format-alt": "<span color='#202020' bgcolor='#689d6a' > 󱧥 </span> {time}",
    "tooltip": false
  },

  "network": {
    "interval": 2,
    "format": "<span color='#202020' bgcolor='#d3869b'> 󱘖 </span> {bandwidthDownBits}",
    "format-wifi": "<span color='#202020' bgcolor='#d3869b'> {icon} </span> {bandwidthDownBits}",
    "format-ethernet": "<span color='#202020' bgcolor='#d3869b'> 󰈀 </span> {bandwidthDownBits}",
    "format-icons": ["󰤫", "󰤟", "󰤢", "󰤥", "󰤨"],
    "tooltip": false,
    "states": {
      "normal": 25,
    },
  },

  "clock": {
    "format": "<span color='#202020' bgcolor='#8ec07c' >  </span> {:%a %d | %H:%M}",
    "tooltip": false,
    "interval":1,
  }
}

Thank you for your help. If you need any additional information from me, feel free to ask.

monitor eDP-1 is 16:10
monitor HDMI-A-2 is 16:9

Read this in the wiki because I think this is where the problem lies.

I would suggest a keybind to a bash script in order to grab the active monitors and reset them by means of disabling the extended one and redefining either one you prefer to switch back.
It would also make sense to avoid editing the .conf file just for the monitor-switch purpose.