| 1 |
=== Desktop Mode === |
| 2 |
Contributors: automattic, allterraindeveloper, epeicher |
| 3 |
Tags: desktop, admin, ui, productivity, ai |
| 4 |
Requires at least: 6.0 |
| 5 |
Tested up to: 7.0 |
| 6 |
Requires PHP: 7.4 |
| 7 |
Stable tag: 0.9.0 |
| 8 |
License: GPLv2 or later |
| 9 |
License URI: https://www.gnu.org/licenses/gpl-2.0.html |
| 10 |
|
| 11 |
Reimagines the WordPress admin as a desktop OS with draggable windows and a dock. Per-user opt-in. By Automattic. |
| 12 |
|
| 13 |
== Description == |
| 14 |
|
| 15 |
Desktop Mode renders /wp-admin as a desktop operating system. Admin screens open as draggable, resizable, minimizable windows on a desktop, with a left-edge dock built from the admin menu. The classic admin stays untouched for everyone else, and deactivating the plugin restores vanilla Core exactly. |
| 16 |
|
| 17 |
Built and maintained by [Automattic](https://automattic.com) — the company behind WordPress.com, Jetpack, WooCommerce, and Tumblr. Zero Core patches: every feature is wired through public WordPress hooks. |
| 18 |
|
| 19 |
= Highlights = |
| 20 |
|
| 21 |
* **Per-user opt-in.** An admin-bar toggle flips a user-meta flag; nobody else sees any change. |
| 22 |
* **Window system.** Iframe windows load admin pages chromelessly. Native windows render directly in the parent DOM via a public registration API. Both share drag, resize, minimize, maximize, fullscreen, and detach-to-new-tab. |
| 23 |
* **Dock + taskbar.** Left-edge dock for core menus; bottom macOS-style pill taskbar for plugin menus. Letter-badge icon fallback for plugins without icon art. |
| 24 |
* **Virtual desktops ("Spaces").** Multiple desktops per user, each with its own window set. Overview grid surfaces the Spaces switcher and thumbnails. |
| 25 |
* **Arrange & snap.** Cascade, Tile, Overview, Snap-to-grid. Plugins contribute custom entries. |
| 26 |
* **Wallpaper & widget registries.** Server- and client-side registration. CSS presets plus canvas (WebGL/2D) wallpapers with collision-aware surface data for snow/rain/physics effects. |
| 27 |
* **Desktop icons.** Wallpaper-layer shortcuts that open native windows or admin URLs. |
| 28 |
* **AI Copilot (optional).** Cmd+K palette backed by an agentic loop with built-in search tools. Disabled until you supply an API key. See "External services" below. |
| 29 |
* **Slash commands & palettes.** Public registration APIs for plugin authors. |
| 30 |
* **Cross-frame drag bridge.** Media-library attachments drag across iframe boundaries. |
| 31 |
* **Session persistence.** Window stack (including desktops, focus, state) restored across reloads. |
| 32 |
* **i18n.** Full gettext coverage across PHP and TypeScript; Spanish translation shipped. |
| 33 |
|
| 34 |
= For plugin authors = |
| 35 |
|
| 36 |
Desktop Mode is built to be extended. Every significant behavior is hookable — add a desktop icon, register a dock item, gate desktop mode by role, react to window events, or register a native window, all from your own plugin with zero patches here. |
| 37 |
|
| 38 |
Comprehensive PHP and JavaScript hook surface, plus stable `desktop_mode_register_*` functions for windows, widgets, wallpapers, icons, window tabs, commands, settings tabs, and AI tools. See the [developer docs on GitHub](https://github.com/WordPress/desktop-mode/tree/trunk/docs). |
| 39 |
|
| 40 |
= External services = |
| 41 |
|
| 42 |
This plugin's optional **AI Copilot** sends data to **OpenAI** (`https://api.openai.com/v1/responses`) when, and only when, an administrator configures an OpenAI API key in **Settings → AI**. With no key configured, no external requests are made. |
| 43 |
|
| 44 |
When the AI Copilot is enabled and a user invokes it (via Cmd+K or the slash-command palette): |
| 45 |
|
| 46 |
* **What is sent:** the user's prompt, the conversation history for the active session, the chosen model identifier (e.g. `gpt-4o-mini`), and tool-call metadata. The plugin's built-in tools (`search_posts`, `search_pages`, `search_comments`) may include excerpts of the matching posts/pages/comments in tool results, which are then sent back to OpenAI as part of the agentic loop. |
| 47 |
* **When it is sent:** on user-initiated AI requests, and (if enabled) on `save_post`, term-save, and comment-save hooks for auto-analysis. Auto-analysis runs server-side as part of the post-save flow. |
| 48 |
* **Why it is sent:** to obtain model completions and tool-call decisions that drive the AI Copilot. |
| 49 |
* **Who provides the service:** OpenAI, L.L.C. — see the [OpenAI Terms of Use](https://openai.com/policies/row-terms-of-use/) and the [OpenAI Privacy Policy](https://openai.com/policies/row-privacy-policy/). |
| 50 |
|
| 51 |
The AI Copilot's provider layer is also extensible: third-party plugins may register additional providers via `desktop_mode_register_ai_provider()`. Those providers may send data to other endpoints; review each plugin's own privacy disclosure separately. |
| 52 |
|
| 53 |
No other external services are contacted by this plugin. |
| 54 |
|
| 55 |
== Installation == |
| 56 |
|
| 57 |
1. Upload the plugin folder to `/wp-content/plugins/`, or install via **Plugins → Add New → Upload Plugin**. |
| 58 |
2. Activate the plugin through the **Plugins** screen in WordPress. |
| 59 |
3. Click the **desktop** icon in the admin bar's top-right corner. The admin reloads inside the desktop shell. |
| 60 |
4. Click the same icon again at any time to return to the classic admin. |
| 61 |
|
| 62 |
= Optional: enable the AI Copilot = |
| 63 |
|
| 64 |
1. Open **Settings → AI** inside desktop mode. |
| 65 |
2. Paste an OpenAI API key and pick a model. |
| 66 |
3. Press **Cmd+K** (or **Ctrl+K**) anywhere in desktop mode to open the AI palette. |
| 67 |
|
| 68 |
== Frequently Asked Questions == |
| 69 |
|
| 70 |
= Does this change anything for users who don't opt in? = |
| 71 |
|
| 72 |
No. The classic admin is untouched until a user toggles desktop mode on for themselves. Deactivating the plugin restores vanilla Core exactly. |
| 73 |
|
| 74 |
= Does the plugin require an external service to function? = |
| 75 |
|
| 76 |
No. The desktop shell, windowing, dock, taskbar, virtual desktops, widgets, wallpapers, and all extension APIs work entirely on-site. The AI Copilot is the only feature that contacts an external service, and it is disabled until an administrator configures an API key. See "External services" in the description. |
| 77 |
|
| 78 |
= Does it patch WordPress core? = |
| 79 |
|
| 80 |
No. Every feature is wired through public WordPress actions and filters. |
| 81 |
|
| 82 |
= How do I disable desktop mode for my user? = |
| 83 |
|
| 84 |
Click the desktop icon in the admin bar a second time to flip the toggle off. The plugin can also be deactivated globally from the Plugins screen. |
| 85 |
|
| 86 |
= Where is the developer documentation? = |
| 87 |
|
| 88 |
In `docs/` inside the plugin, and on [GitHub](https://github.com/WordPress/desktop-mode/tree/trunk/docs). The hook reference, JavaScript reference, bridge protocol, and copy-paste examples all live there. |
| 89 |
|
| 90 |
== Screenshots == |
| 91 |
|
| 92 |
1. The desktop shell — wallpaper, dock, taskbar, and a window with the admin loaded inside it. |
| 93 |
2. Multiple windows open across virtual desktops (Spaces). |
| 94 |
3. The AI Copilot Cmd+K palette in action. |
| 95 |
4. Custom wallpapers and widgets registered by a plugin. |
| 96 |
5. The Arrange menu — Cascade, Tile, Overview, Snap to grid. |
| 97 |
|
| 98 |
== Credits == |
| 99 |
|
| 100 |
Desktop Mode is brought to you by [Automattic](https://automattic.com). The plugin is open source under GPLv2-or-later; contributions are welcome on [GitHub](https://github.com/WordPress/desktop-mode). |
| 101 |
|
| 102 |
= Third-party libraries = |
| 103 |
|
| 104 |
The plugin bundles the following third-party JavaScript library, loaded on demand only when a feature that needs it is in use: |
| 105 |
|
| 106 |
* **[PixiJS](https://pixijs.com/)** (MIT License) — used by the interactive **OS Settings → About** scene, the **Content Graph** window, and built-in canvas wallpapers (e.g. the animated WordPress logo). PixiJS is loaded from the plugin's own `assets/vendor/` directory; no CDN requests are made. |
| 107 |
|
| 108 |
== Changelog == |
| 109 |
|
| 110 |
= 0.9.0 = |
| 111 |
* Gate per-user REST routes on desktop mode enabled |
| 112 |
* Refine recycle bin badge styling and sync on stop |
| 113 |
* Clear comments selection after applying action |
| 114 |
* Don't let a failing sync block the agent |
| 115 |
* Make the AI-disabled error link to AI Settings |
| 116 |
|
| 117 |
= 0.8.9 = |
| 118 |
* Improve drag-and-drop handling in chromeless bridge and iframe bridge |
| 119 |
* The whole shell loads faster, especially the first time you open wp-admin |
| 120 |
* Open an app from the wallpaper or from the dock — it's the same window now (no more two copies floating around) |
| 121 |
* Minimize a window and the dock icon shows it's minimized — even if you opened it from the desktop icon |
| 122 |
* Click "+ New" twice and you get two editors. Drafting a post and want to start another? Just click again |
| 123 |
* "Switch to Desktop Mode" always takes you to the dashboard, so you know where you're starting from |
| 124 |
* Resizing a window and accidentally letting go over the desktop no longer minimizes everything |
| 125 |
* WooCommerce: the "Add Order" button is back on the Orders page |
| 126 |
* "Add New" buttons (Add Post, Add Order, Add anything) stay visible inside every plugin page |
| 127 |
* After we ship a fix, you get it on your next page load — no more "try refreshing twice" |
| 128 |
|
| 129 |
= 0.8.8 = |
| 130 |
* Align dock badge with in-window update count |
| 131 |
* Make every dock scrollable, keep system tiles pinned |
| 132 |
* No more flash when you create, move, or delete a file or shortcut on the desktop |
| 133 |
* Trashing a folder that contained other folders now works (used to silently fail) |
| 134 |
* Drag an image from the Media Library straight into a Gutenberg post, it now inserts |
| 135 |
* Edit User screen: the form is centered instead of pinned to the left |
| 136 |
* Title-bar icons (Help, etc.) are now visually centered |
| 137 |
* Sticky notes powered by WP Guidelines |
| 138 |
|
| 139 |
= 0.8.7 = |
| 140 |
* Bump Tested up to WordPress 7.0 |
| 141 |
* Fix plugins window stale-nonce 'Cookie check failed' on long-running sessions |
| 142 |
* Fix plugin .zip drop routing to Media Library uploader |
| 143 |
* Add server-side search to entity list views |
| 144 |
* Rename Browse tab to Add Plugin |
| 145 |
* Drag and drop improvements |
| 146 |
|
| 147 |
= 0.8.6 = |
| 148 |
* Light indicators for native-window-target dock icons |
| 149 |
* Additional fixes and polish |
| 150 |
* Add compatibility layer for Divi script dependencies and tests |
| 151 |
* Show plugin icons |
| 152 |
* Open off-site menu items in a new browser tab |
| 153 |
|
| 154 |
= 0.8.6-rc1 = |
| 155 |
* Tag cloud & category mindmap: search, clustering, server cache |
| 156 |
* Drag & Drop from local desktop |
| 157 |
* Implement loading skeletons and staggered animations for file tiles |
| 158 |
* Arrow-key shortcuts + Overview-from-Show-Desktop fix |
| 159 |
* Shortcuts popover, dock-style tooltips, reorder |
| 160 |
* Add Featured Plugins View and Ribbon Component |
| 161 |
* Add "Automatic Updates" column and related functionality to Plugins window |
| 162 |
* Add window notices feature with persistent dismissal and server sync |
| 163 |
* Polish four framework surfaces for plugin authors |
| 164 |
* Disable focus on other window actions |
| 165 |
* Add Media section to "My WordPress" + uniform preview-pane hook surface |
| 166 |
* Refactor My WordPress to use `<wpd-tile>` + add post status ribbons |
| 167 |
* Allow deactivating plugins in CMO desktop & dock |
| 168 |
* OS-file drop — progress UI, live refresh, cancel cleanup, CMO |
| 169 |
* Group-by selector + click-to-deselect + focused-icon centering |
| 170 |
* Test against PHP 8.3 and 8.4 |
| 171 |
* Enhance minimize/restore behavior to preserve pre-minimize state and add cross-state transition tests |
| 172 |
|
| 173 |
= 0.8.5 = |
| 174 |
* Shared folders, heartbeat widget, and heartbeat-pipeline hardening |
| 175 |
* Recycle Bin: show item type badges inline next to title |
| 176 |
* Plugins window: expandable rows with rich plugin details |
| 177 |
* Remember native window size across opens |
| 178 |
* Fix blank plugin icons in the Plugins window |
| 179 |
* Restore "Show desktop on wallpaper click" as an opt-in setting |
| 180 |
* Fix plugin update refresh, dock badge, and stuck-row failures |
| 181 |
* Trash bin polish: URL badge, live placement badge, no media auto-trash |
| 182 |
* Throw on empty REST body to avoid TypeError after self-replace |
| 183 |
* Hide Media filter tab when MEDIA_TRASH is off |
| 184 |
* Sequence openCurrentPage after restoreSession to avoid duplicate windows |
| 185 |
* Fix window refresh issue on new sessions |
| 186 |
|
| 187 |
= 0.8.4 = |
| 188 |
* Faster Desktop Mode, main bundle cut by 59 % |
| 189 |
* "Edit Post" from the front-end admin bar opens nothing |
| 190 |
* Cross-page admin-link clicks: state, destructive actions, referer hint |
| 191 |
* Warn loudly when a `<wpd-*>` tag is used without being imported |
| 192 |
* Support re-uploading existing plugins, add post-install Activate panel |
| 193 |
* Restore the full WordPress command palette inside Cmd+K |
| 194 |
|
| 195 |
= 0.8.3 = |
| 196 |
* Feat comments as native windows |
| 197 |
* Chrome <111 titlebars + duplicate-placement REST 500s |
| 198 |
* SW navigation interception caused window-in-window after core update |
| 199 |
* Open each post as its own window from the Posts window |
| 200 |
* Fix Users window data + live-refresh, plus per-window REST clients |
| 201 |
* Session-expiry cascade + Plugins window sync |
| 202 |
* Narrow scope to /wp-admin/ and throttle SW reloads |
| 203 |
* Plugins window: real updates, not just a phantom badge |
| 204 |
* Support plain permalinks for REST URL construction |
| 205 |
* Hide registered icons from desktop instead of trashing |
| 206 |
|
| 207 |
= 0.8.2 = |
| 208 |
* Many fixes and new features |
| 209 |
* Add unit test to ensure bridge script skips core AJAX update buttons |
| 210 |
* Native Plugins window + `<wpd-card>` |
| 211 |
* Appearance window polish + dock-peek fixes |
| 212 |
* Fix upload theme |
| 213 |
* Implement favicon resolver and associated tests for desktop mode |
| 214 |
* Auto-inject X-WP-Nonce for REST API requests |
| 215 |
* Enhance user management functionality in WordPress REST API |
| 216 |
* Fix user role updates |
| 217 |
* Fix plugin native issues |
| 218 |
* Enhance color scheme preview functionality by adding shell scheme flipping |
| 219 |
* Fix rearrange icons out of desktop |
| 220 |
* Open each post in its own window |
| 221 |
* Add item visibility and dock order settings |
| 222 |
* Add first-run welcome dialog for Desktop Mode |
| 223 |
* Fix dock management |
| 224 |
* Refetch desktop placements on Recycle Bin restore |
| 225 |
|
| 226 |
= 0.8.1 = |
| 227 |
* Framework rework and stability improvements — significant internals refactor, smoother window lifecycle, and more reliable bridging between iframe and native windows. |
| 228 |
* Drag and drop reworked end-to-end: calmer pointer behavior, more accurate hit-testing, and reliable handoff across windows. |
| 229 |
* Posts, Pages, and Users now open as native desktop windows — direct DOM rendering inside the shell instead of an iframe, faster open, instant interaction, and UI tailored to the windowing model. |
| 230 |
* New Content Graph tool — an interactive map of how your content links together. Pan, zoom, and focus a node to explore its neighborhood. |
| 231 |
* Cross-page admin link routing in the chromeless bridge so links across the admin stay inside the desktop shell. |
| 232 |
* Many bug fixes across the admin bar, Fullscreen toggle, resize handles over iframes, real-time icon refresh on plugin activation, and the PWA shell. |
| 233 |
|
| 234 |
= 0.5.1 = |
| 235 |
* Code editor and framework improvements. |
| 236 |
* Enhanced AI provider integration: third-party providers may register through `desktop_mode_register_ai_provider()`. |
| 237 |
* Title-bar button registry with icon painting for plugin authors. |
| 238 |
* OS Settings tabs are now extensible via `desktop_mode_register_settings_tab_script()` / `desktop_mode_register_settings_tab()`. |
| 239 |
* AI Copilot extensibility: server-side tool registry (`desktop_mode_register_ai_tool()`) and client-side `wp.desktop.ai.ask()` programmatic entry point. |
| 240 |
* UI component kit expansion (~25 `<wpd-*>` web components). |
| 241 |
* Backtick hotkey to cycle window focus. |
| 242 |
* Unified command palettes via the palette registry. |
| 243 |
* OS Settings Help tab. |
| 244 |
|
| 245 |
= 0.5.0 = |
| 246 |
* Command registration APIs (`desktop_mode_register_command_script()` / `desktop_mode_register_command()`) with live install/activate refresh. |
| 247 |
* Media-library enhancement enabled by default, with opt-out. |
| 248 |
* Dock CSS selectors updated; overflow handling improved. |
| 249 |
|
| 250 |
See the [GitHub releases page](https://github.com/WordPress/desktop-mode/releases) for the full history. |
| 251 |
|
| 252 |
== Upgrade Notice == |
| 253 |
|
| 254 |
= 0.8.1 = |
| 255 |
Framework and stability rework, reworked drag and drop, native Posts/Pages/Users windows, and a new Content Graph tool. Backwards-compatible. |
| 256 |
|
| 257 |
= 0.5.1 = |
| 258 |
Adds AI Copilot extensibility (server-side tools, multi-provider support) and a title-bar button registry. Backwards-compatible. |
| 259 |
|