=== Desktop Mode ===
Contributors: automattic, allterraindeveloper, epeicher
Tags: desktop, admin, ui, productivity, ai
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 0.9.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Reimagines the WordPress admin as a desktop OS with draggable windows and a dock. Per-user opt-in. By Automattic.

== Description ==

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.

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.

= Highlights =

* **Per-user opt-in.** An admin-bar toggle flips a user-meta flag; nobody else sees any change.
* **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.
* **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.
* **Virtual desktops ("Spaces").** Multiple desktops per user, each with its own window set. Overview grid surfaces the Spaces switcher and thumbnails.
* **Arrange & snap.** Cascade, Tile, Overview, Snap-to-grid. Plugins contribute custom entries.
* **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.
* **Desktop icons.** Wallpaper-layer shortcuts that open native windows or admin URLs.
* **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.
* **Slash commands & palettes.** Public registration APIs for plugin authors.
* **Cross-frame drag bridge.** Media-library attachments drag across iframe boundaries.
* **Session persistence.** Window stack (including desktops, focus, state) restored across reloads.
* **i18n.** Full gettext coverage across PHP and TypeScript; Spanish translation shipped.

= For plugin authors =

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.

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).

= External services =

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.

When the AI Copilot is enabled and a user invokes it (via Cmd+K or the slash-command palette):

* **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`) run WordPress's native keyword search and 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.
* **When it is sent:** on user-initiated AI requests, and (if enabled) on comment-save hooks for spam analysis. Comment spam analysis runs server-side as part of the comment-insert flow. Posts, pages, and taxonomy terms are not sent automatically.
* **Why it is sent:** to obtain model completions and tool-call decisions that drive the AI Copilot.
* **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/).

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.

No other external services are contacted by this plugin.

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/`, or install via **Plugins → Add New → Upload Plugin**.
2. Activate the plugin through the **Plugins** screen in WordPress.
3. Click the **desktop** icon in the admin bar's top-right corner. The admin reloads inside the desktop shell.
4. Click the same icon again at any time to return to the classic admin.

= Optional: enable the AI Copilot =

1. Open **Settings → AI** inside desktop mode.
2. Paste an OpenAI API key and pick a model.
3. Press **Cmd+K** (or **Ctrl+K**) anywhere in desktop mode to open the AI palette.

== Frequently Asked Questions ==

= Does this change anything for users who don't opt in? =

No. The classic admin is untouched until a user toggles desktop mode on for themselves. Deactivating the plugin restores vanilla Core exactly.

= Does the plugin require an external service to function? =

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.

= Does it patch WordPress core? =

No. Every feature is wired through public WordPress actions and filters.

= How do I disable desktop mode for my user? =

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.

= Where is the developer documentation? =

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.

== Screenshots ==

1. The desktop shell — wallpaper, dock, taskbar, and a window with the admin loaded inside it.
2. Multiple windows open across virtual desktops (Spaces).
3. The AI Copilot Cmd+K palette in action.
4. Custom wallpapers and widgets registered by a plugin.
5. The Arrange menu — Cascade, Tile, Overview, Snap to grid.

== Credits ==

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).

= Third-party libraries =

The plugin bundles the following third-party JavaScript library, loaded on demand only when a feature that needs it is in use:

* **[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.

== Changelog ==

= 0.9.2 =
* Persist welcome-dialog dismissal when Desktop Mode is disabled
* Welcome dialog reappears on every page when the admin is served from an origin that differs from `site_url`

= 0.9.1 =
* Make native list windows opt-in (Beta) instead of opt-out
* Scope AI to comment spam + native-search assistant
* Feat/unfocus window effects
* Fix placement, gear/Help, and dock⇄desktop visibility bugs
* Fix Guidelines-experiment 404 noise, duplicate welcome dialog, and unused-preload warnings
* Add "View activity footprint" row action in Users list

= 0.9.0 =
* Gate per-user REST routes on desktop mode enabled
* Refine recycle bin badge styling and sync on stop
* Clear comments selection after applying action
* Don't let a failing sync block the agent
* Make the AI-disabled error link to AI Settings

= 0.8.9 =
* Improve drag-and-drop handling in chromeless bridge and iframe bridge
* The whole shell loads faster, especially the first time you open wp-admin
* Open an app from the wallpaper or from the dock — it's the same window now (no more two copies floating around)
* Minimize a window and the dock icon shows it's minimized — even if you opened it from the desktop icon
* Click "+ New" twice and you get two editors. Drafting a post and want to start another? Just click again
* "Switch to Desktop Mode" always takes you to the dashboard, so you know where you're starting from
* Resizing a window and accidentally letting go over the desktop no longer minimizes everything
* WooCommerce: the "Add Order" button is back on the Orders page
* "Add New" buttons (Add Post, Add Order, Add anything) stay visible inside every plugin page
* After we ship a fix, you get it on your next page load — no more "try refreshing twice"

= 0.8.8 =
* Align dock badge with in-window update count
* Make every dock scrollable, keep system tiles pinned
* No more flash when you create, move, or delete a file or shortcut on the desktop
* Trashing a folder that contained other folders now works (used to silently fail)
* Drag an image from the Media Library straight into a Gutenberg post, it now inserts
* Edit User screen: the form is centered instead of pinned to the left
* Title-bar icons (Help, etc.) are now visually centered
* Sticky notes powered by WP Guidelines

= 0.8.7 =
* Bump Tested up to WordPress 7.0
* Fix plugins window stale-nonce 'Cookie check failed' on long-running sessions
* Fix plugin .zip drop routing to Media Library uploader
* Add server-side search to entity list views
* Rename Browse tab to Add Plugin
* Drag and drop improvements

= 0.8.6 =
* Light indicators for native-window-target dock icons
* Additional fixes and polish
* Add compatibility layer for Divi script dependencies and tests
* Show plugin icons
* Open off-site menu items in a new browser tab

= 0.8.6-rc1 =
* Tag cloud & category mindmap: search, clustering, server cache
* Drag & Drop from local desktop
* Implement loading skeletons and staggered animations for file tiles
* Arrow-key shortcuts + Overview-from-Show-Desktop fix
* Shortcuts popover, dock-style tooltips, reorder
* Add Featured Plugins View and Ribbon Component
* Add "Automatic Updates" column and related functionality to Plugins window
* Add window notices feature with persistent dismissal and server sync
* Polish four framework surfaces for plugin authors
* Disable focus on other window actions
* Add Media section to "My WordPress" + uniform preview-pane hook surface
* Refactor My WordPress to use `<wpd-tile>` + add post status ribbons
* Allow deactivating plugins in CMO desktop & dock
* OS-file drop — progress UI, live refresh, cancel cleanup, CMO
* Group-by selector + click-to-deselect + focused-icon centering
* Test against PHP 8.3 and 8.4
* Enhance minimize/restore behavior to preserve pre-minimize state and add cross-state transition tests

= 0.8.5 =
* Shared folders, heartbeat widget, and heartbeat-pipeline hardening
* Recycle Bin: show item type badges inline next to title
* Plugins window: expandable rows with rich plugin details
* Remember native window size across opens
* Fix blank plugin icons in the Plugins window
* Restore "Show desktop on wallpaper click" as an opt-in setting
* Fix plugin update refresh, dock badge, and stuck-row failures
* Trash bin polish: URL badge, live placement badge, no media auto-trash
* Throw on empty REST body to avoid TypeError after self-replace
* Hide Media filter tab when MEDIA_TRASH is off
* Sequence openCurrentPage after restoreSession to avoid duplicate windows
* Fix window refresh issue on new sessions

= 0.8.4 =
* Faster Desktop Mode, main bundle cut by 59 %
* "Edit Post" from the front-end admin bar opens nothing
* Cross-page admin-link clicks: state, destructive actions, referer hint
* Warn loudly when a `<wpd-*>` tag is used without being imported
* Support re-uploading existing plugins, add post-install Activate panel
* Restore the full WordPress command palette inside Cmd+K

= 0.8.3 =
* Feat comments as native windows
* Chrome <111 titlebars + duplicate-placement REST 500s
* SW navigation interception caused window-in-window after core update
* Open each post as its own window from the Posts window
* Fix Users window data + live-refresh, plus per-window REST clients
* Session-expiry cascade + Plugins window sync
* Narrow scope to /wp-admin/ and throttle SW reloads
* Plugins window: real updates, not just a phantom badge
* Support plain permalinks for REST URL construction
* Hide registered icons from desktop instead of trashing

= 0.8.2 =
* Many fixes and new features
* Add unit test to ensure bridge script skips core AJAX update buttons
* Native Plugins window + `<wpd-card>`
* Appearance window polish + dock-peek fixes
* Fix upload theme
* Implement favicon resolver and associated tests for desktop mode
* Auto-inject X-WP-Nonce for REST API requests
* Enhance user management functionality in WordPress REST API
* Fix user role updates
* Fix plugin native issues
* Enhance color scheme preview functionality by adding shell scheme flipping
* Fix rearrange icons out of desktop
* Open each post in its own window
* Add item visibility and dock order settings
* Add first-run welcome dialog for Desktop Mode
* Fix dock management
* Refetch desktop placements on Recycle Bin restore

= 0.8.1 =
* Framework rework and stability improvements — significant internals refactor, smoother window lifecycle, and more reliable bridging between iframe and native windows.
* Drag and drop reworked end-to-end: calmer pointer behavior, more accurate hit-testing, and reliable handoff across windows.
* 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.
* New Content Graph tool — an interactive map of how your content links together. Pan, zoom, and focus a node to explore its neighborhood.
* Cross-page admin link routing in the chromeless bridge so links across the admin stay inside the desktop shell.
* Many bug fixes across the admin bar, Fullscreen toggle, resize handles over iframes, real-time icon refresh on plugin activation, and the PWA shell.

= 0.5.1 =
* Code editor and framework improvements.
* Enhanced AI provider integration: third-party providers may register through `desktop_mode_register_ai_provider()`.
* Title-bar button registry with icon painting for plugin authors.
* OS Settings tabs are now extensible via `desktop_mode_register_settings_tab_script()` / `desktop_mode_register_settings_tab()`.
* AI Copilot extensibility: server-side tool registry (`desktop_mode_register_ai_tool()`) and client-side `wp.desktop.ai.ask()` programmatic entry point.
* UI component kit expansion (~25 `<wpd-*>` web components).
* Backtick hotkey to cycle window focus.
* Unified command palettes via the palette registry.
* OS Settings Help tab.

= 0.5.0 =
* Command registration APIs (`desktop_mode_register_command_script()` / `desktop_mode_register_command()`) with live install/activate refresh.
* Media-library enhancement enabled by default, with opt-out.
* Dock CSS selectors updated; overflow handling improved.

See the [GitHub releases page](https://github.com/WordPress/desktop-mode/releases) for the full history.

== Upgrade Notice ==

= 0.8.1 =
Framework and stability rework, reworked drag and drop, native Posts/Pages/Users windows, and a new Content Graph tool. Backwards-compatible.

= 0.5.1 =
Adds AI Copilot extensibility (server-side tools, multi-provider support) and a title-bar button registry. Backwards-compatible.
