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.
- GNOME enables extensions in
enabled-extensionsorder;dash-to-panelsits ahead ofdash-to-dock. - Dash to Panel's
enable()isasync(extension.js:61) and yields atawait PanelSettings.init(), which makes a D-Bus round-trip toorg.gnome.Mutter.DisplayConfig.GetCurrentState(panelSettings.js:225). GNOME does not await extensionenable(), so the shell moves straight on. - Dash to Dock's
enable()is synchronous, so it completes inside that gap — hiding the stock dash, building its dock, and reassigningoverviewControls.dash = this.mainDock.dash(docking.js:2213). - The D-Bus reply lands, Dash to Panel resumes →
completeEnable()→panelManager.enable()→overview.enable()→toggleDash(). toggleDash()readsstockgs-keep-dash(false) and callsoverviewControls.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-dockin both extension lists is normalgsettings get org.gnome.shell enabled-extensionsanddisabled-extensionscan both list[email protected]. That's Dash to Panel's startup guard, not corruption —disabled-extensionswins.