Skip to content
macOS Tahoe: Black Wallpaper in Mission Control

macOS Tahoe: Black Wallpaper in Mission Control

A bug in macOS Tahoe (26.x) causes wallpapers to flash or remain black when transitioning between full-screen desktops via Mission Control.

Status: FIXED — macOS 27 Golden Gate (27.0+, released September 2026) resolves this bug. Upgrade to macOS 27 to fix it permanently. The workarounds below only apply to macOS Tahoe (26.x), which Apple has not patched.

Status

Reported in macOS Tahoe 26.0 (September 2025) and unfixed through 26.5.1. Apple fixed the underlying wallpaper compositor bug in macOS 27 Golden Gate (27.0, September 2026) — dynamic wallpapers and Mission Control transitions work normally after upgrading. Apple did not backport the fix to Tahoe, so Tahoe users on 26.x still need the workarounds below.

Symptoms

When using Mission Control (Ctrl+↑) and then sliding between full-screen desktops (Ctrl+←/→), the wallpaper turns solid black during the transition. It may return after the animation finishes, or stay black until you force a refresh.

Key triggers:

  • At least one app is in full-screen mode (green traffic light button)
  • Navigating spaces via Mission Control (not Ctrl+←/→ directly on the desktop level, though that can also trigger it)
  • More visible with Reduce Motion enabled (Accessibility > Display)

Scope

Detail
OS versionsmacOS Tahoe 26.0 through 26.5.1 (confirmed); fixed in macOS 27 Golden Gate (27.0+)
HardwareM1, M2, M3, M4 Macs (all Apple Silicon), also reported on Intel
First reportedSeptember 2025 (26.0 release)
Apple statusFixed in macOS 27 Golden Gate (27.0) — no Tahoe point-release fix; unacknowledged on 26.x
Community volume~200 “Me Too” clicks on Apple Community, multiple Reddit threads, MacRumors discussions

Root Cause

Community analyst kramola reverse-engineered the issue. The summary:

  1. macOS Tahoe renders wallpapers through a separate WallpaperImageExtension process, which renders images into a pluginLayer via an OffscreenWindow
  2. A LayerMultiplexer manages these layers per space/display
  3. When pluginLayer becomes stale (after sleep, display changes, or simply over time), the LayerMultiplexer falls back to errorLayer — which is pure black
  4. WallpaperImageExtension then re-renders, producing a visible black flash
  5. With Reduce Motion ON, the transition is instant — no animation to mask the re-render. With animations ON, the ~0.5s slide hides it

WallpaperAgent invalidates the layer prematurely under certain conditions, logging: "Marking shared wallpaper as inactive. Will be purged in next resolution."

The root cause of the black flash is therefore a race condition in the wallpaper compositor pipeline — the layer goes stale and the fallback to black happens before the re-render completes.

Workarounds (macOS 26 Tahoe only)

These apply only if you’re still on macOS Tahoe 26.x. Upgrade to macOS 27 Golden Gate instead — the bug is fixed there.

1. Switch to a static wallpaper (most reliable)

Go to System Settings > Wallpaper and pick a still image instead of a dynamic/rotating wallpaper. This avoids the pluginLayer degradation entirely since static wallpapers don’t go through WallpaperImageExtension the same way.

Trade-off: you lose the dynamic wallpaper feature.

2. Disable Reduce Motion

System Settings > Accessibility > Display > Reduce Motion → OFF

The black flash still happens underneath, but the transition animation masks it visually. If you don’t mind the animations, this is a zero-effort fix.

Trade-off: you get the full Mission Control slide animations back, which may feel slower.

3. Hammerspoon auto-refresh (best for keeping dynamic wallpapers)

Install Hammerspoon — a free, open-source macOS automation tool that runs as a proper GUI app with full display session access:

brew install --cask hammerspoon

Add this config to ~/.hammerspoon/init.lua:

local wallpaperDir = "/Users/YOUR_USERNAME/Pictures/wallpapers"

local function setRandomWallpaper()
    local files = {}
    local handle = io.popen('find "' .. wallpaperDir .. '" -maxdepth 1 -type f \\( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.heic" \\)')
    for file in handle:lines() do
        table.insert(files, file)
    end
    handle:close()
    if #files == 0 then return end
    local randomFile = files[math.random(#files)]
    for _, screen in ipairs(hs.screen.allScreens()) do
        screen:desktopImageURL("file://" .. randomFile)
    end
end

setRandomWallpaper()                                -- set on launch
hs.timer.doEvery(900, setRandomWallpaper)           -- repeat every 15 min

Click Reload Config in the Hammerspoon menu bar icon, and add Hammerspoon to System Settings > General > Login Items.

This keeps the wallpaper layer fresh by periodically forcing a rotation, preventing the stale-layer → black fallback.

4. Mission Control desktop reset (temporary)

  1. Press Ctrl+↑ to enter Mission Control
  2. Hover over each desktop and click the ✕ to remove it
  3. Click the + icon to add new desktops
  4. Reassign your wallpaper

This works temporarily but the bug returns after sleep or prolonged use.

Why shell scripts can’t work around it

macOS Tahoe intentionally blocks background processes from accessing the display session:

Could not switch to audit session: Operation not permitted

This breaks all approaches via cron, launchd, or shell AppleScript that try to change wallpapers from a non-GUI context. Hammerspoon works because it’s a proper GUI app that stays in the correct audit session.

What was ruled out as broken:

ApproachResult
launchd + osascript (System Events)FSFindFolder error -43
cron + osascript (Finder)Audit session blocked
launchd + osascript (Finder)Audit session blocked
defaults write com.apple.desktopmacOS Tahoe ignores this plist (uses com.apple.wallpaper instead)
cron + Swift (NSWorkspace.setDesktopImageURL)Audit session blocked

Monitoring

No longer actively monitored — the bug is fixed in macOS 27 Golden Gate and no Tahoe backport is expected. If Apple ships a 26.x fix, this page will be updated.

References