PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.10
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.10
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
← All changes | README.md +49 -28 0.9.51.1.10 View file →
@@ -1,11 +1,11 @@
1 -# WP Desktop Mode
1 +# WP OpenStation
2 2
3 3 A WordPress plugin that reimagines `/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. Purely opt-in per user — the classic admin stays untouched for everyone else, and deactivating the plugin restores vanilla Core exactly.
4 4
5 5 Zero Core patches. Every feature is wired through public WordPress hooks.
6 6
7 -[![Active Installs](https://img.shields.io/wordpress/plugin/installs/desktop-mode?logo=wordpress&logoColor=%23fff&label=Active%20Installs&labelColor=%2323282D&color=%2323282D)](https://wordpress.org/plugins/desktop-mode/) [![Playground Demo Link](https://img.shields.io/wordpress/plugin/v/desktop-mode?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQ2IDI2IDUxIDUyIiBmaWxsPSJ3aGl0ZSI%2BPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01My43MTE3IDQ1LjQ4MzlDNTIuNjY1IDQ2LjkyNzcgNTIuMTEyNyA0OC43MDE3IDUyLjAyMzkgNTAuNjUxM0M1Mi4wMDk2IDUwLjk2NjcgNTIuMDA3MyA1MS4yODY2IDUyLjAxNzEgNTEuNjEwNUM1Mi4xNDk0IDU1Ljk5NjUgNTQuNDgxMyA2MS4xMDUxIDU4LjY4NzkgNjUuMzExOEM2NS4xMjU4IDcxLjc0OTYgNzMuNjc2MSA3My43OTY2IDc4LjUxNiA3MC4yODgxQzc2LjQ4MDIgNjkuODA4NCA3NC40MjA2IDY5LjA2MDcgNzIuMzkyNiA2OC4wNjMzQzcxLjg3MiA2OC4wNDA1IDcxLjMxMTkgNjcuOTcyNiA3MC43MTE2IDY3Ljg1MjZDNjkuNjg1MiA2Ny42NDczIDY4LjU5OTggNjcuMjk0OSA2Ny40OTQxIDY2Ljc5MzZDNjcuNDk0MSA2Ni43OTM1IDY3LjQ5NCA2Ni43OTMzIDY3LjQ5NCA2Ni43OTMxQzY1LjQ3MTkgNjUuODc2NSA2My4zODE4IDY0LjQ2MjIgNjEuNDU5NiA2Mi41NEM1OS41Mzc2IDYwLjYxOCA1OC4xMjM0IDU4LjUyODEgNTcuMjA2OCA1Ni41MDYzQzU3LjIwNjcgNTYuNTA2MiA1Ny4yMDY2IDU2LjUwNjIgNTcuMjA2NSA1Ni41MDYyQzU2LjcwNTMgNTUuNDAwNCA1Ni4zNTI4IDU0LjMxNSA1Ni4xNDc1IDUzLjI4ODRDNTYuMDI3NSA1Mi42ODgzIDU1Ljk1OTYgNTIuMTI4MyA1NS45MzY4IDUxLjYwNzhDNTQuOTM5MyA0OS41Nzk3IDU0LjE5MTQgNDcuNTE5OSA1My43MTE3IDQ1LjQ4MzlaTTQ5LjY3OTUgNTcuNjkwNkM0OS44MjYgNTcuNTQ0MSA0OS45Nzk3IDU3LjQwNzQgNTAuMTQwMSA1Ny4yODA1QzUwLjYxMTcgNTguNjU3IDUxLjIzNCA2MC4wMzAzIDUxLjk5NjggNjEuMzczNEM1MS44OTQyIDYxLjgyNiA1MS44NzI2IDYyLjQ0NiA1Mi4wMzg4IDYzLjI3NzFDNTIuMzY4NyA2NC45MjY5IDUzLjM5NzYgNjYuOTUyMiA1NS4yMjI5IDY4Ljc3NzVDNTcuMDQ4MiA3MC42MDI4IDU5LjA3MzUgNzEuNjMxNiA2MC43MjMyIDcxLjk2MTZDNjEuNTU0NiA3Mi4xMjc5IDYyLjE3NDcgNzIuMTA2MSA2Mi42MjczIDcyLjAwMzVDNjMuOTcwNCA3Mi43NjYyIDY1LjM0MzcgNzMuMzg4NCA2Ni43MjAxIDczLjg1OTlDNjYuNTkzMSA3NC4wMjA0IDY2LjQ1NjQgNzQuMTc0MyA2Ni4zMDk3IDc0LjMyMDlDNjMuMjQ4MiA3Ny4zODI1IDU3LjA0MzUgNzYuMTQxNSA1Mi40NTEyIDcxLjU0OTJDNDcuODU4OSA2Ni45NTY5IDQ2LjYxNzkgNjAuNzUyMiA0OS42Nzk1IDU3LjY5MDZaTTY0LjkyMzkgNTkuMDc1OEM3NC4xMDg2IDY4LjI2MDUgODYuNTE4IDcwLjc0MjQgOTIuNjQxMSA2NC42MTkzQzk0Ljg1NSA2Mi40MDUzIDk1Ljk0MzkgNTkuMzY5NiA5NS45OTc5IDU1Ljk2MTZDOTYuMDkzMSA0OS45NDQxIDkyLjk2MTMgNDIuNzY2MSA4Ny4wOTc2IDM2LjkwMjRDNzcuOTEzIDI3LjcxNzcgNjUuNTAzNiAyNS4yMzU5IDU5LjM4MDUgMzEuMzU5QzU3LjE2MzYgMzMuNTc1OCA1Ni4wNzQ3IDM2LjYxNjcgNTYuMDIzNSA0MC4wMzAzQzU1LjkzMzIgNDYuMDQ1IDU5LjA2NDcgNTMuMjE2NiA2NC45MjM5IDU5LjA3NThaTTc3Ljg1ODYgNjAuNzA1NkM3OC4wMjkyIDYxLjU1ODQgNzguMDk0NCA2Mi4zMzAxIDc4LjA3NDcgNjMuMDIyNEM3NC42MjU1IDYxLjgyMTggNzAuOTcwMiA1OS41Nzg5IDY3LjY5NTYgNTYuMzA0NEM2NC40MjExIDUzLjAyOTggNjIuMTc4MiA0OS4zNzQ1IDYwLjk3NzYgNDUuOTI1NEM2MS42NyA0NS45MDU2IDYyLjQ0MTcgNDUuOTcwOSA2My4yOTQ1IDQ2LjE0MTVDNjYuMTk4MSA0Ni43MjIyIDY5LjU3MzEgNDguNDgwMiA3Mi41NDY1IDUxLjQ1MzZDNzUuNTE5OCA1NC40MjcgNzcuMjc3OSA1Ny44MDE5IDc3Ljg1ODYgNjAuNzA1NlpNNjIuMTUyMiAzNC4xMzA3QzYwLjQ5MjcgMzUuNzkwMiA1OS42MDcyIDM4LjQ4OTUgNjAuMDUzMyA0Mi4wNjA4QzY0Ljc0ODMgNDEuNjA0NCA3MC42MDA1IDQzLjk2NDIgNzUuMzE4MiA0OC42ODE5QzgwLjAzNTkgNTMuMzk5NiA4Mi4zOTU3IDU5LjI1MTcgODEuOTM5MiA2My45NDY4Qzg1LjUxMDYgNjQuMzkyOCA4OC4yMDk4IDYzLjUwNzMgODkuODY5MyA2MS44NDc4QzkxLjcxNTggNjAuMDAxMyA5Mi42MDQgNTYuODY3NyA5MS43NjYxIDUyLjY3NzdDOTAuOTM0NSA0OC41MjAxIDg4LjQ0NzQgNDMuNzk1NSA4NC4zMjU5IDM5LjY3NDFDODAuMjA0NSAzNS41NTI2IDc1LjQ3OTkgMzMuMDY1NSA3MS4zMjIzIDMyLjIzMzlDNjcuMTMyMyAzMS4zOTU5IDYzLjk5ODcgMzIuMjg0MiA2Mi4xNTIyIDM0LjEzMDdaIi8%2BPC9zdmc%2B&logoColor=%23fff&label=Playground%20Demo&labelColor=%233858e9&color=%233858e9)](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/WordPress/desktop-mode/refs/heads/trunk/.wordpress-org/blueprints/blueprint.json) [![Studio Demo Link](https://img.shields.io/wordpress/plugin/v/desktop-mode?logo=wordpress&logoColor=%23fff&label=Open%20in%20WordPress%20Studio&labelColor=%2323282D&color=%2323282D)](https://wp.com/open?deep_link=add-site%3Fblueprint_url%3Dhttps%253A%252F%252Fraw.githubusercontent.com%252FWordPress%252Fdesktop-mode%252Frefs%252Fheads%252Ftrunk%252F.wordpress-org%252Fblueprints%252Fblueprint.json)
7 +[![Active Installs](https://img.shields.io/wordpress/plugin/installs/desktop-mode?logo=wordpress&logoColor=%23fff&label=Active%20Installs&labelColor=%2323282D&color=%2323282D)](https://wordpress.org/plugins/desktop-mode/) [![Playground Demo Link](https://img.shields.io/wordpress/plugin/v/desktop-mode?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQ2IDI2IDUxIDUyIiBmaWxsPSJ3aGl0ZSI%2BPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01My43MTE3IDQ1LjQ4MzlDNTIuNjY1IDQ2LjkyNzcgNTIuMTEyNyA0OC43MDE3IDUyLjAyMzkgNTAuNjUxM0M1Mi4wMDk2IDUwLjk2NjcgNTIuMDA3MyA1MS4yODY2IDUyLjAxNzEgNTEuNjEwNUM1Mi4xNDk0IDU1Ljk5NjUgNTQuNDgxMyA2MS4xMDUxIDU4LjY4NzkgNjUuMzExOEM2NS4xMjU4IDcxLjc0OTYgNzMuNjc2MSA3My43OTY2IDc4LjUxNiA3MC4yODgxQzc2LjQ4MDIgNjkuODA4NCA3NC40MjA2IDY5LjA2MDcgNzIuMzkyNiA2OC4wNjMzQzcxLjg3MiA2OC4wNDA1IDcxLjMxMTkgNjcuOTcyNiA3MC43MTE2IDY3Ljg1MjZDNjkuNjg1MiA2Ny42NDczIDY4LjU5OTggNjcuMjk0OSA2Ny40OTQxIDY2Ljc5MzZDNjcuNDk0MSA2Ni43OTM1IDY3LjQ5NCA2Ni43OTMzIDY3LjQ5NCA2Ni43OTMxQzY1LjQ3MTkgNjUuODc2NSA2My4zODE4IDY0LjQ2MjIgNjEuNDU5NiA2Mi41NEM1OS41Mzc2IDYwLjYxOCA1OC4xMjM0IDU4LjUyODEgNTcuMjA2OCA1Ni41MDYzQzU3LjIwNjcgNTYuNTA2MiA1Ny4yMDY2IDU2LjUwNjIgNTcuMjA2NSA1Ni41MDYyQzU2LjcwNTMgNTUuNDAwNCA1Ni4zNTI4IDU0LjMxNSA1Ni4xNDc1IDUzLjI4ODRDNTYuMDI3NSA1Mi42ODgzIDU1Ljk1OTYgNTIuMTI4MyA1NS45MzY4IDUxLjYwNzhDNTQuOTM5MyA0OS41Nzk3IDU0LjE5MTQgNDcuNTE5OSA1My43MTE3IDQ1LjQ4MzlaTTQ5LjY3OTUgNTcuNjkwNkM0OS44MjYgNTcuNTQ0MSA0OS45Nzk3IDU3LjQwNzQgNTAuMTQwMSA1Ny4yODA1QzUwLjYxMTcgNTguNjU3IDUxLjIzNCA2MC4wMzAzIDUxLjk5NjggNjEuMzczNEM1MS44OTQyIDYxLjgyNiA1MS44NzI2IDYyLjQ0NiA1Mi4wMzg4IDYzLjI3NzFDNTIuMzY4NyA2NC45MjY5IDUzLjM5NzYgNjYuOTUyMiA1NS4yMjI5IDY4Ljc3NzVDNTcuMDQ4MiA3MC42MDI4IDU5LjA3MzUgNzEuNjMxNiA2MC43MjMyIDcxLjk2MTZDNjEuNTU0NiA3Mi4xMjc5IDYyLjE3NDcgNzIuMTA2MSA2Mi42MjczIDcyLjAwMzVDNjMuOTcwNCA3Mi43NjYyIDY1LjM0MzcgNzMuMzg4NCA2Ni43MjAxIDczLjg1OTlDNjYuNTkzMSA3NC4wMjA0IDY2LjQ1NjQgNzQuMTc0MyA2Ni4zMDk3IDc0LjMyMDlDNjMuMjQ4MiA3Ny4zODI1IDU3LjA0MzUgNzYuMTQxNSA1Mi40NTEyIDcxLjU0OTJDNDcuODU4OSA2Ni45NTY5IDQ2LjYxNzkgNjAuNzUyMiA0OS42Nzk1IDU3LjY5MDZaTTY0LjkyMzkgNTkuMDc1OEM3NC4xMDg2IDY4LjI2MDUgODYuNTE4IDcwLjc0MjQgOTIuNjQxMSA2NC42MTkzQzk0Ljg1NSA2Mi40MDUzIDk1Ljk0MzkgNTkuMzY5NiA5NS45OTc5IDU1Ljk2MTZDOTYuMDkzMSA0OS45NDQxIDkyLjk2MTMgNDIuNzY2MSA4Ny4wOTc2IDM2LjkwMjRDNzcuOTEzIDI3LjcxNzcgNjUuNTAzNiAyNS4yMzU5IDU5LjM4MDUgMzEuMzU5QzU3LjE2MzYgMzMuNTc1OCA1Ni4wNzQ3IDM2LjYxNjcgNTYuMDIzNSA0MC4wMzAzQzU1LjkzMzIgNDYuMDQ1IDU5LjA2NDcgNTMuMjE2NiA2NC45MjM5IDU5LjA3NThaTTc3Ljg1ODYgNjAuNzA1NkM3OC4wMjkyIDYxLjU1ODQgNzguMDk0NCA2Mi4zMzAxIDc4LjA3NDcgNjMuMDIyNEM3NC42MjU1IDYxLjgyMTggNzAuOTcwMiA1OS41Nzg5IDY3LjY5NTYgNTYuMzA0NEM2NC40MjExIDUzLjAyOTggNjIuMTc4MiA0OS4zNzQ1IDYwLjk3NzYgNDUuOTI1NEM2MS42NyA0NS45MDU2IDYyLjQ0MTcgNDUuOTcwOSA2My4yOTQ1IDQ2LjE0MTVDNjYuMTk4MSA0Ni43MjIyIDY5LjU3MzEgNDguNDgwMiA3Mi41NDY1IDUxLjQ1MzZDNzUuNTE5OCA1NC40MjcgNzcuMjc3OSA1Ny44MDE5IDc3Ljg1ODYgNjAuNzA1NlpNNjIuMTUyMiAzNC4xMzA3QzYwLjQ5MjcgMzUuNzkwMiA1OS42MDcyIDM4LjQ4OTUgNjAuMDUzMyA0Mi4wNjA4QzY0Ljc0ODMgNDEuNjA0NCA3MC42MDA1IDQzLjk2NDIgNzUuMzE4MiA0OC42ODE5QzgwLjAzNTkgNTMuMzk5NiA4Mi4zOTU3IDU5LjI1MTcgODEuOTM5MiA2My45NDY4Qzg1LjUxMDYgNjQuMzkyOCA4OC4yMDk4IDYzLjUwNzMgODkuODY5MyA2MS44NDc4QzkxLjcxNTggNjAuMDAxMyA5Mi42MDQgNTYuODY3NyA5MS43NjYxIDUyLjY3NzdDOTAuOTM0NSA0OC41MjAxIDg4LjQ0NzQgNDMuNzk1NSA4NC4zMjU5IDM5LjY3NDFDODAuMjA0NSAzNS41NTI2IDc1LjQ3OTkgMzMuMDY1NSA3MS4zMjIzIDMyLjIzMzlDNjcuMTMyMyAzMS4zOTU5IDYzLjk5ODcgMzIuMjg0MiA2Mi4xNTIyIDM0LjEzMDdaIi8%2BPC9zdmc%2B&logoColor=%23fff&label=Playground%20Demo&labelColor=%233858e9&color=%233858e9)](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/WordPress/openstation/refs/heads/trunk/.wordpress-org/blueprints/blueprint.json) [![Studio Demo Link](https://img.shields.io/wordpress/plugin/v/desktop-mode?logo=wordpress&logoColor=%23fff&label=Open%20in%20WordPress%20Studio&labelColor=%2323282D&color=%2323282D)](https://wp.com/open?deep_link=add-site%3Fblueprint_url%3Dhttps%253A%252F%252Fraw.githubusercontent.com%252FWordPress%252Fopenstation%252Frefs%252Fheads%252Ftrunk%252F.wordpress-org%252Fblueprints%252Fblueprint.json)
8 8
9 9 ## Demo
10 10
11 11 <video src="https://github.com/user-attachments/assets/590aacc2-e9d7-4213-889e-b91e060e1bd8" controls width="720"></video>
@@ -29,64 +29,70 @@
29 29 ---
30 30
31 31 ## Current State
32 32
33 +- **Station Home**
34 + Native, role-aware replacement for the ordinary WordPress Dashboard inside OpenStation: recent personal work, four live site instruments, an actionable attention queue, and quick paths to create, upload, view the site, open WP Explorer, or deliberately return to the Classic Dashboard.
35 +
33 36 - **Per-user opt-in**
34 - Admin-bar toggle sets the `desktop_mode_mode` user meta. A dedicated `/desktop-mode/` portal URL auto-enables desktop mode for first-time visitors (gated by `desktop_mode_portal_auto_enable`) and the `admin_init` redirect sends opted-in users from `/wp-admin/` to the portal (`desktop_mode_admin_redirect_to_portal`).
37 + Admin-bar toggle sets the `desktop_mode_mode` user meta. A dedicated `/openstation/` portal URL auto-enables OpenStation for first-time visitors (gated by `openstation_portal_auto_enable`) and the `admin_init` redirect sends opted-in users from `/wp-admin/` to the portal (`openstation_admin_redirect_to_portal`).
35 38
36 39 - **Desktop shell**
37 - Fixed-viewport desktop that overlays `/wp-admin`: wallpaper area, unified dock (placement picked in OS Settings — left / right / bottom, default bottom), right-column widget layer, and full windowing system. `desktop_mode_mode_init`, `desktop_mode_shell_before` / `_after`, and the `desktop_mode_shell_config` filter are the main extension points.
40 + Fixed-viewport desktop that overlays `/wp-admin`: wallpaper area, unified dock (placement picked in OpenStation Preferences — left / right / bottom, default bottom), right-column widget layer, and full windowing system. `openstation_mode_init`, `openstation_shell_before` / `_after`, and the `openstation_shell_config` filter are the main extension points.
38 41
39 42 - **Window system — iframe + native**
40 - Iframe windows load admin pages with `?desktop_mode_chromeless=1` (chromeless mode). Native windows render directly in the parent DOM via `desktop_mode_register_window()` / `wp.desktop.registerWindow()` — multi-tab native windows are supported through `desktop_mode_register_window_tab()`. Both types share drag, resize, minimize, maximize, close, fullscreen, and detach-to-new-tab.
43 + Iframe windows load admin pages with `?openstation_chromeless=1` (chromeless mode). Native windows render directly in the parent DOM via `openstation_register_window()` / `wp.os.registerWindow()` — multi-tab native windows are supported through `openstation_register_window_tab()`. Both types share drag, resize, minimize, maximize, close, fullscreen, and detach-to-new-tab.
41 44
42 45 - **Dock**
43 - One unified rail hosting every admin menu — core and plugin alike — plus shell-level system tiles. Placement (left / right / bottom) is the user's OS Settings preference. Core menus are ordered before plugin menus; per-item hiding via `desktop_mode_dock_placement` (`'hidden'`). Per-item multi-window support via `desktop_mode_dock_item_multi`. Letter-badge icon fallback for plugins without icon art.
46 + One unified rail hosting every admin menu — core and plugin alike — plus shell-level system tiles. Placement (left / right / bottom) is a user preference in OpenStation Preferences. Core menus are ordered before plugin menus; per-item hiding via `openstation_dock_placement` (`'hidden'`). Per-item multi-window support via `openstation_dock_item_multi`. Letter-badge icon fallback for plugins without icon art.
44 47
45 48 - **Virtual desktops (“Spaces”)**
46 49 Multiple desktops per user, each with its own window set. Overview grid (zoom-out view) surfaces the Spaces switcher, thumbnails, and create/close controls.
47 50
48 51 - **Arrange & snap**
49 - Admin-bar Arrange menu: Cascade, Tile, Overview, Snap to grid. Plugins contribute custom entries via `desktop_mode_arrange_menu_items` and react to clicks via `desktop-mode.arrange.custom-action`. Tile grid dimensions and snap cell size are both filterable.
52 + Admin-bar Arrange menu: Cascade, Tile, Overview, Snap to grid. Plugins contribute custom entries via `openstation_arrange_menu_items` and react to clicks via `os.arrange.custom-action`. Tile grid dimensions and snap cell size are both filterable.
50 53
51 54 - **Wallpaper registry**
52 - Server- and client-side registration (`desktop_mode_register_wallpaper()` / `wp.desktop.registerWallpaper()`). CSS presets + canvas (WebGL/2D) wallpapers with collision-aware surface data (`wp.desktop.getWallpaperSurfaces()`) for snow/rain/physics effects. In-panel `renderEditor` callback for custom controls, shared vendor-module loader (`pixijs` pre-registered).
55 + Server- and client-side registration (`openstation_register_wallpaper()` / `wp.os.registerWallpaper()`). CSS presets + canvas (WebGL/2D) wallpapers with collision-aware surface data (`wp.os.getWallpaperSurfaces()`) for snow/rain/physics effects. In-panel `renderEditor` callback for custom controls, shared vendor-module loader (`pixijs` pre-registered).
53 56
54 57 - **Widgets**
55 - Right-column floating cards, optionally draggable / resizable outside the column. `desktop_mode_register_widget()` / `wp.desktop.registerWidget()`. Built-in clock. User placement persists per-user in `localStorage`.
58 + Right-column floating cards, optionally draggable / resizable outside the column. `openstation_register_widget()` / `wp.os.registerWidget()`. Built-in clock. User placement persists per-user in `localStorage`.
56 59
57 60 - **Desktop icons**
58 - Wallpaper-layer shortcuts via `desktop_mode_register_icon()` — targets a registered native window or an admin URL.
61 + Wallpaper-layer shortcuts via `openstation_register_icon()` — targets a registered native window or an admin URL.
59 62
60 63 - **AI Assistant + slash commands**
61 - Cmd+K palette backed by an OpenAI agentic loop whose `search_posts` / `search_pages` / `search_comments` tools run WordPress's native keyword search. Admin-configured API key + model picker. The only automatic AI analysis is comment spam scoring (on comment save), which feeds the comments-window spam score; posts, pages, and terms are not analyzed. `wp.desktop.registerCommand()` adds slash commands with autocomplete (`suggest()`), confirm dialogs (`ctx.confirm()`), and full lifecycle hooks (`before-run` / `after-run` / `error`). Built-in `/open [window]` is extensible via `desktop-mode.open-command.items`.
64 + Cmd+K palette backed by an OpenAI agentic loop whose `search_posts` / `search_pages` / `search_comments` tools run WordPress's native keyword search. Admin-configured API key + model picker. No content is analyzed in the background: every AI call is one a user asked for. `wp.os.registerCommand()` adds slash commands with autocomplete (`suggest()`), confirm dialogs (`ctx.confirm()`), and full lifecycle hooks (`before-run` / `after-run` / `error`). Built-in `/open [window]` is extensible via `os.open-command.items`.
62 65
63 66 - **Palette registry**
64 - Cmd+K cycles through all registered palettes (`wp.desktop.registerPalette()`) — the AI assistant is palette 0 by default; additional plugin overlays share the shortcut.
67 + Cmd+K cycles through all registered palettes (`wp.os.registerPalette()`) — the AI assistant is palette 0 by default; additional plugin overlays share the shortcut.
65 68
66 69 - **Cross-frame drag bridge**
67 70 Media-library attachments drag across iframe boundaries via coordinated postMessage. Site-wide toggle through the Extended Options REST endpoint.
68 71
69 72 - **Toast notifications**
70 - Shell-level toasts rendered via the `<wpd-toast>` component. Plugins register their own tone/icon via the `desktop_mode_toast_types` filter. Iframe pages raise a toast through the `desktop-mode-notification` bridge message — it survives the iframe's own lifecycle.
73 + Shell-level toasts rendered via the `<os-toast>` component. Plugins register their own tone/icon via the `openstation_toast_types` filter. Iframe pages raise a toast through the `os-notification` bridge message — it survives the iframe's own lifecycle.
71 74
72 -- **OS Settings**
73 - Native-window settings panel: wallpaper picker (with HD-only media filter), accent color swatches + custom gradient editor, dock size slider, AI platform config, and per-user default-on-startup window. Persisted via `/desktop-mode/v1/os-settings`.
75 +- **OpenStation Preferences**
76 + The settings window, an App Framework app (`apps/os-settings/`): wallpaper picker (with HD-only media filter), accent color swatches + custom gradient editor, desktop layout and dock controls, themes, window effects, navigation placement, feature switches and the component reference. Persisted via `/desktop-mode/v1/os-settings`.
74 77
75 78 - **Session persistence**
76 79 Full window stack (including desktops, focus, state) is debounce-saved to `/desktop-mode/v1/session` and restored without layout flicker. Viewport-shrink clamping keeps off-screen windows reachable.
77 80
81 +- **Mobile — the phone layer**
82 + Below 768px the same window manager renders a phone: a home screen of the navigation's tiles with search, one full-screen app at a time under a slim top bar, a swipeable app switcher, a five-slot tab bar, edge-swipe Back. `wp.os.mode` reports `desktop | tablet | mobile`; a head stamp makes the first paint right; a phone restores one window and hands the desktop its session back untouched. Lazy bundle, wallpaper suspended, widgets skipped. See [`docs/mobile.md`](./docs/mobile.md).
83 +
78 84 - **postMessage bridge**
79 85 Typed messages for title changes, navigation (same-origin validated), focus, color-scheme sync, screen-meta panels (Screen Options / Help), external-link capture, iframe-ready handshake, and observability (`iframe-error`, `iframe-network`).
80 86
81 87 - **UI component library**
82 - ~25 `<wpd-*>` web components (`wpd-button`, `wpd-menu`, `wpd-panel`, `wpd-range-field`, `wpd-swatch`, `wpd-toast`, `wpd-tabs`, …) available to plugin authors — rendered server-side via `desktop_mode_component()` or imported in TS.
88 + ~25 `<os-*>` web components (`os-button`, `os-menu`, `os-panel`, `os-range-field`, `os-swatch`, `os-toast`, `os-tabs`, …) available to plugin authors — rendered server-side via `openstation_component()` or imported in TS.
83 89
84 90 - **i18n**
85 91 Full gettext coverage across PHP and TypeScript; Spanish translation shipped. Strings go through `wp.i18n` (`__`, `_x`, `_n`, `sprintf`) directly — no shell-specific re-export.
86 92
87 93 - **Component registration API**
88 - Stable `desktop_mode_register_*` functions for windows, widgets, wallpapers, icons, and window tabs. All return `true` / `WP_Error` with documented error codes.
94 + Stable `openstation_register_*` functions for windows, widgets, wallpapers, icons, and window tabs. All return `true` / `WP_Error` with documented error codes.
89 95
90 96 - **Public hook API**
91 97 Comprehensive PHP and JS hook surface — dock items, placement, multi-window, native-window lifecycle, widget lifecycle, wallpaper lifecycle + surfaces, window lifecycle, iframe observability, arrange actions, virtual-desktop transitions, palette registration, command lifecycle, batch close, AI prompt + model + post-type filters, accents, toast types, default wallpaper. See [`docs/hooks-reference.md`](./docs/hooks-reference.md) and [`docs/javascript-reference.md`](./docs/javascript-reference.md).
92 98
@@ -93,10 +99,10 @@
93 99 ---
94 100
95 101 ## Still ahead
96 102
97 -- **Mobile (phone OS)** — purpose-built home-screen grid, full-screen apps, app switcher, gesture nav, bottom tab bar.
98 -- **Tablet hybrid** — split view, slide-over, horizontal dock. `wp.desktop.mode = 'desktop' | 'tablet' | 'mobile'` surface.
103 +- **Mobile, the next pass** — the phone layer ships (`docs/mobile.md`: home-screen grid, full-screen apps, app switcher, edge-swipe back, bottom tab bar, `wp.os.mode`); still ahead are pull-to-refresh and a pass on real devices.
104 +- **Tablet hybrid** — split view, slide-over, horizontal dock, on the `wp.os.mode` primitive that already reports `'tablet'`.
99 105 - **Cross-window drag & drop (the North Star)** — extend the current drag bridge to Media → Gutenberg block insertion, with pluggable mime-type negotiation.
100 106 - **Polish** — color-scheme-aware variables across all shell surfaces, View Transitions API animations, full a11y audit (ARIA, focus traps, keyboard nav).
101 107 - **…and a whole lot more hooks, filters, and actions** — every new surface lands with its own extension points, so this list keeps growing.
102 108
@@ -116,10 +122,22 @@
116 122 │ ├── os-settings.php extended-options.php
117 123 │ ├── accents.php wallpapers.php toast-types.php
118 124 │ ├── media-query.php
119 125 │ └── ai-copilot/ # AI assistant (OpenAI client, analysis, search, jobs)
126 +├── apps/ # App Framework apps: <name>.os.php (window, state, actions,
127 +│ # data) + optional <name>.os.ts (client view) + <name>.css;
128 +│ # Code Blue lives here — see docs/app-framework.md
120 129 ├── assets/ # hand-authored CSS + JS build output
121 130 │ ├── css/ desktop.css, windows.css, dock.css, chromeless.css, variables.css
131 +│ │ variables.css carries the OpenStation palette — every design
132 +│ │ token the shell and the <os-*> kit read, declared once
133 +│ ├── fonts/ Geist + Geist Mono (variable, SIL OFL 1.1)
134 +│ ├── wallpapers/ the four brand desks: galaxy (default), space,
135 +│ │ holomesh, pulsemesh
136 +│ ├── desktop-themes/legacy/
137 +│ │ the built-in "Desktop Mode (Legacy)" theme — a frozen snapshot of
138 +│ │ every token at its pre-brand value; never regenerated.
139 +│ │ Zip it with npm run package:legacy-theme
122 140 │ └── js/ Vite bundles (gitignored; regenerate with npm run build) — only
123 141 │ admin-bar.js and media-library-enhanced.js are hand-written and tracked
124 142 ├── src/ # TypeScript source — compiled by Vite
125 143 │ ├── desktop.ts / dock.ts / hooks.ts / commands.ts / palette-registry.ts
@@ -128,10 +146,10 @@
128 146 │ ├── window/ # Window class — DOM, pointer, tabs, iframe bridge
129 147 │ ├── window-manager/ # stack, desktops, arrange, snap, overview
130 148 │ ├── wallpapers/ # registry, layer, surfaces, server sync, vendor loader
131 149 │ ├── widgets/ # registry, layer, frame, picker, storage
132 -│ ├── settings/ # OS Settings panel sections
133 -│ ├── ui/ # <wpd-*> web components
150 +│ ├── settings/ # OpenStation Preferences panel sections
151 +│ ├── ui/ # <os-*> web components
134 152 │ ├── modules/ # vendor-script lazy-loader
135 153 │ └── plugins/ # built-in demos (animated-logo-wallpaper)
136 154 ├── docs/ # developer-facing docs (source of truth for plugin authors)
137 155 ├── extensions/ # bundled sibling plugins (see "Bundled extensions" below)
@@ -147,12 +165,14 @@
147 165 ---
148 166
149 167 ## Bundled extensions
150 168
151 -The `extensions/` directory hosts sibling plugins that build on Desktop Mode's public APIs. Each one is a standalone WordPress plugin (`Requires Plugins: desktop-mode`) installed from its own zip — run `./bin/package-extensions.sh` to build one `<slug>.zip` per extension under `dist/`; see [`docs/RELEASE.md`](./docs/RELEASE.md#packaging-extensions) for the full packaging steps. (`extensions/base/` is a shared base library for extension authors, not an installable plugin.)
169 +The `extensions/` directory hosts sibling plugins that build on OpenStation's public APIs. Each one is a standalone WordPress plugin (`Requires Plugins: desktop-mode`) installed from its own zip — run `./bin/package-extensions.sh` to build one `<slug>.zip` per extension under `dist/`; see [`docs/RELEASE.md`](./docs/RELEASE.md#packaging-extensions) for the full packaging steps. (`extensions/base/` is a shared base library for extension authors, not an installable plugin.)
152 170
153 171 - **Code Editor** (`desktop-mode-code-editor`) — a Monaco-backed Code editor native window for browsing and editing files inside `wp-content`. Editing requires the `edit_plugins` capability and is disabled entirely when `DISALLOW_FILE_EDIT` is set.
154 172 - **Cron Manager** (`desktop-mode-cron-manager`) — a Cron Jobs native window for browsing, editing, deleting, and running WP-Cron events. Gated by `manage_options`.
173 +- **Popup Siege** (`desktop-mode-popup-siege`) — a 90-second Breakout-style archive rescue game with OpenStation leaderboards, play-time tracking, and score-to-beat challenges. The deterministic game runtime is lazy-loaded on first play.
174 +- **SOL Inbound Monologue** (`desktop-mode-feed-buddy`) — an AIM-era RSS/Atom reader with a movable buddy-list widget, a native conversation-style reader window, per-user subscriptions and unread state, safe server-side feed discovery, and optional synthesized chimes.
155 175 - **phpMyAdmin** (`desktop-mode-phpmyadmin`) — embeds a bundled phpMyAdmin install as a native window. **Local environments only**: the window registers solely when `wp_get_environment_type()` is `'local'`, because the bundled phpMyAdmin runs with `auth_type=config` and reuses the WordPress DB credentials — any visitor who finds the URL gets full DB access. The `manage_options` check only hides the shortcut from lower-privilege users; it does **not** gate the underlying URL.
156 176
157 177 ---
158 178
@@ -161,9 +181,9 @@
161 181 ### Quick install
162 182
163 183 Just want to try it? Grab the pre-built zip and upload it to any WordPress — [Studio by WordPress.com](https://developer.wordpress.com/studio/), [`wp-env`](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-env/), or a hosted site. No Node, no build step.
164 184
165 -1. Download [`desktop-mode.zip`](https://github.com/WordPress/desktop-mode/releases/latest/download/desktop-mode.zip) from the latest release (or pick a specific version from the [releases page](https://github.com/WordPress/desktop-mode/releases)).
185 +1. Download [`openstation.zip`](https://github.com/WordPress/openstation/releases/latest/download/openstation.zip) from the latest release (or pick a specific version from the [releases page](https://github.com/WordPress/openstation/releases)).
166 186 2. In WP Admin: **Plugins → Add New → Upload Plugin**, choose the zip, and activate.
167 187 3. Click the **desktop** icon in the admin bar's top-right corner. The admin reloads inside the desktop shell. Click the same icon again to return to classic admin.
168 188
169 189 ### Development setup
@@ -188,11 +208,10 @@
188 208
189 209 Writes one `assets/js/<target>.js` / `.min.js` pair per target, including:
190 210
191 211 - `assets/js/desktop.js` / `.min.js` — main shell bundle (loaded based on `SCRIPT_DEBUG`).
192 -- `assets/js/iframe-bridge.js` / `.min.js` — opt-in bridge that gives any same-origin iframe access to `wp.desktop.iframe.*`.
193 -- `assets/js/recycle-bin.js` / `.min.js` — Recycle Bin native window.
194 -- `assets/js/posts-window.js` / `.min.js` — Native Posts window (the `<wpd-table>` replacement for the `edit.php` iframe; opt-in per user via OS Settings → Features).
212 +- `assets/js/iframe-bridge.js` / `.min.js` — opt-in bridge that gives any same-origin iframe access to `wp.os.iframe.*`.
213 +- `assets/js/posts-window.js` / `.min.js` — Native Posts window (the `<os-table>` replacement for the `edit.php` iframe; opt-in per user via OpenStation Preferences → Features).
195 214
196 215 **Development watch** — auto-recompiles the unminified bundle on save:
197 216
198 217 ```bash
@@ -210,8 +229,10 @@
210 229 Run `npm run package` to build a zip from `HEAD` (with correct 0644 / 0755 permissions), then follow the [Quick install](#quick-install) steps 2–3 to upload and activate it. Re-package and re-upload after each change.
211 230
212 231 > If you changed source, run `npm run build` before `npm run package` — the Vite output is gitignored, and `bin/package.sh` splices the built files into the zip from your working tree.
213 232
233 +> `npm run package:legacy-theme` builds `dist/desktop-mode-legacy-theme.zip` — the built-in [Legacy desktop theme](./docs/desktop-themes.md#the-legacy-theme--start-here) as an installable theme ZIP. The plugin registers Legacy from code either way; the zip is for handing it to someone else or forking it into a theme of your own.
234 +
214 235 ##### Clone `wordpress-develop` and symlink
215 236
216 237 Gives you the full dev loop: `npm run dev` rebuilds on save, a browser refresh picks it up.
217 238
@@ -243,9 +264,9 @@
243 264 - PHP **7.4+**
244 265
245 266 ## For plugin authors
246 267
247 -**This plugin is built to be extended.** Every significant behavior is hookable — drop an icon on the desktop, add 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.
268 +**This plugin is built to be extended.** Every significant behavior is hookable — drop an icon on the desktop, add a dock item, gate OpenStation by role, react to window events, or register a native window, all from your own plugin with zero patches here.
248 269
249 270 **See [`docs/`](./docs/README.md) — the developer documentation index.**
250 271
251 272 Quick links:
@@ -252,9 +273,9 @@
252 273
253 274 - [Getting Started](./docs/getting-started.md) — the five-minute tour for plugin authors.
254 275 - [Architecture](./docs/architecture.md) — how the pieces fit together.
255 276 - [Hooks Reference](./docs/hooks-reference.md) — every action and filter we fire, with signatures and examples.
256 -- [JavaScript Reference](./docs/javascript-reference.md) — CustomEvents, `window.wp.desktop` API, and the iframe `postMessage` bridge.
277 +- [JavaScript Reference](./docs/javascript-reference.md) — CustomEvents, `window.wp.os` API, and the iframe `postMessage` bridge.
257 278 - [Examples](./docs/examples/) — copy-paste recipes.
258 279
259 280 ## License
260 281