Dash to Dock hidden at login by Dash to Panel

Symptom

After every login the Dash to Dock dock is missing. Disabling and re-enabling the extension brings it back, and it then stays working for the rest of the session.

Nothing appears in the journal — no JS exception, and the extension reports State: ACTIVE the whole time.

Seen on Ubuntu 26.04, GNOME Shell 50.1 (Wayland), with Dash to Panel v73 and Dash to Dock v105 both enabled.

Cause

Both extensions write to the same property — Main.overview._overview._controls.dash — and at login Dash to Dock always loses a race it can't win.

  1. GNOME enables extensions in enabled-extensions order; dash-to-panel sits ahead of dash-to-dock.
  2. Dash to Panel's enable() is async (extension.js:61) and yields at await PanelSettings.init(), which makes a D-Bus round-trip to org.gnome.Mutter.DisplayConfig.GetCurrentState (panelSettings.js:225). GNOME does not await extension enable(), so the shell moves straight on.
  3. Dash to Dock's enable() is synchronous, so it completes inside that gap — hiding the stock dash, building its dock, and reassigning overviewControls.dash = this.mainDock.dash (docking.js:2213).
  4. The D-Bus reply lands, Dash to Panel resumes → completeEnable()panelManager.enable()overview.enable()toggleDash().
  5. toggleDash() reads stockgs-keep-dash (false) and calls overviewControls.dash.hide().

By step 5 that handle points at Dash to Dock's dock, so Dash to Panel hides it.

The manual off/on toggle works because it rebuilds the dock long after Dash to Panel's enable() has finished, so nothing hides it again.

The same thing recurs on any monitors-changed event: Dash to Panel's handler is also async and calls _reset()overview.enable()toggleDash().

Fix

Flip Dash to Panel's stockgs-keep-dash so step 5 calls .show() instead of .hide().

SD=~/.local/share/gnome-shell/extensions/[email protected]/schemas
gsettings --schemadir "$SD" set org.gnome.shell.extensions.dash-to-panel stockgs-keep-dash true

The schema is extension-local, so --schemadir is required — a plain gsettings set fails with No such schema.

No visual downside: the stock GNOME dash stays hidden regardless, because Dash to Dock independently pins it via its own notify::visible handler (docking.js:2201-2209). The fix is also order-independent, so it holds whichever extension wins the race.

Alternative

Disable one of the two. Running both is unsupported — Dash to Panel even force-pushes [email protected] into disabled-extensions on startup (extension.js:~135), but has no equivalent guard for [email protected], which is exactly why this slips through.

Diagnosis tips

org.gnome.Shell.Eval is blocked unless unsafe-mode is on, so live actor inspection isn't available:

gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell \
  --method org.gnome.Shell.Eval '1+1'      # -> (false, '')

Read extension settings straight out of dconf instead, which sidesteps the schema problem:

dconf dump /org/gnome/shell/extensions/dash-to-panel/

[!note] ubuntu-dock in both extension lists is normal gsettings get org.gnome.shell enabled-extensions and disabled-extensions can both list [email protected]. That's Dash to Panel's startup guard, not corruption — disabled-extensions wins.