-
Notifications
You must be signed in to change notification settings - Fork 42
migration station home app
The native Dashboard is now an .os.php app (apps/station-home/) driven by the App Framework instead of a PHP module plus a TypeScript bundle — and the first app with no client half at all: the body is painted on the server and morphed into the window. The window keeps its id, desktop-mode-dashboard, so the Dashboard URL remap, the per-user opt-in (stationHomeEnabled), saved sessions and every index.php entry point carry over untouched. The plugin-card registry is unchanged — same registration API, same preference meta, same hooks.
| Surface | Replacement |
|---|---|
REST route GET /desktop-mode/v1/station-home
|
There is no snapshot to fetch: the app renders its body through POST /desktop-mode/v1/apps/desktop-mode-dashboard/dispatch, and openstation_app_render( 'desktop-mode-dashboard' ) returns the whole window as a value on the server. |
REST route POST /desktop-mode/v1/station-home/cards
|
openstation_station_home_set_card_preference( $user_id, $id, $enabled ) — the one write path, which the app's Customize switches call and which still fires openstation_station_home_card_preference_updated. |
PHP functions openstation_station_home_register_window(), _render_template(), _register_assets(), _build_snapshot(), _recent_work(), _quick_actions(), _editable_post_types(), _draft_count(), _published_count(), _missing_alt_count(), _update_count(), _rest_*()
|
The app registers itself; the model lives in apps/station-home/parts/snapshot.php under OpenStation\Apps\StationHome. Tune the window through openstation_app_manifest with $id === 'desktop-mode-dashboard'. |
Constant OPENSTATION_STATION_HOME_WINDOW_ID
|
The id is the app id, desktop-mode-dashboard. |
Script handle os-station-home, bundle assets/js/station-home[.min].js, window config endpoint / cardsEndpoint
|
Nothing. The shared openstation-app-runtime bundle drives the window; the stylesheet (apps/station-home/station-home.css) is the app's, loaded on first open. |
The src/station-home/ directory |
The Dashboard URL matcher the shell still needs — matchesStationHomeUrl(), CLASSIC_DASHBOARD_FLAG — moved to src/open-targets/station-home-url.ts. |
-
openstation_register_station_home_card(),openstation_unregister_station_home_card(),openstation_station_home_get_registered_cards(),openstation_station_home_get_card_preferences(),openstation_station_home_build_cards(), theOPENSTATION_STATION_HOME_CARD_PREFERENCES_METAmeta key, the filtersopenstation_station_home_cards/openstation_station_home_card_dataand the actionsopenstation_station_home_card_registered/_preference_updated/_error. - The window id, title, size,
placement: none,readgate, the Dashboard URL remap and thedesktop_mode_classicescape, and everything the user sees.
- The greeting's hour comes from the site's clock (
wp_date) rather than the browser's. WordPress has no per-user timezone; the site's is the one it reasons in everywhere else. - Content changes anywhere on the desktop now repaint the window (
watch( '*' )), so Continue working, the instruments and the queue follow a post published or a comment moderated in another window without a manual refresh.
The window was 1,323 lines — a 632-line imperative bundle and its 47-line model, a 422-line module holding two REST routes and the snapshot builder, a 166-line registration/template module, 39 lines of asset registration and a 17-line bootstrap. As an app it is 931 lines of PHP and no JavaScript: a 115-line definition (four actions, one lifecycle handler), a 375-line snapshot model and a 441-line server view — the fetch/paint/loading/error choreography, the REST routes, the config blob and the click delegates are the framework's now. The port also gave $os->open_url() its optional third argument, $icon, so a window opened from an app keeps its glyph.
This wiki is generated from the docs/ directory — edits made here are overwritten by the next sync.
To change a page, open a pull request against docs/.
Guides
- Development guide
- Releasing openstation
- Agents security model
- API Index
- The App Framework — a window in one PHP file
- Architecture
- Bridge protocol — wiring overview
- <os-*> component reference
- Data model — where OpenStation keeps its data
- Native Desktop Host — Experimental
- Desktop themes
- Dock customization — two registries, one mental model
- The event-driven framework
- Files on the Desktop
- Folder sharing
- Getting Started
- Hooks Reference
- Icons
- JavaScript Reference
- The Living Tree — algorithm definition
- Window-scoped MIO
- Mio
- Mobile — the phone layer
- Multisite
- Native Windows & Framework Interop
- OpenStation Network
- Plugin compatibility layer
- Progressive Web App (PWA)
- Station Home
- Using openstation from your own plugin
- Workspaces
Migration notes
- Migration: built-in activity channels move to the os/ namespace
- Migration — Code Blue becomes an App Framework app
- Migration — AI comment scoring leaves core
- Migration: window, wallpaper and widget bundles load on demand
- Migration — Posts, Pages, Users, User Edit, Plugins and Comments become App Framework apps
- Migration — the navigation model
- Migration — OpenStation Preferences becomes an App Framework app
- Performance settings move to Extended options
- Presence storage migration
- Migration — the Recycle Bin becomes an App Framework app
- Migration — the shell boots from its own screen
- Migration — Station Home becomes an App Framework app
- Migration: a native window's tabs move to the window chrome
- Migration — WP Explorer becomes the my-wordpress app
- Migration — WordPress package globals are no longer ambient
More
All examples
- AI Agents — extend and invoke from a plugin
- wp.os.ai.ask() — programmatic AI Copilot
- Tune the AI model config
- App layout recipes
- Open a child window its owner can't cover
- Style a specific admin page inside the iframe
- Code Blue — register your plugin's log file
- Open a file in the Code editor (deep-link from any window)
- Connect to a window — title-bar button + iframe pub/sub
- Content changes — live-refresh every window listing your type
- Custom window chrome (Experimental)
- Register a custom unfocused-window effect
- Example: render a data table
- Real file storage — react to uploads, gate policy, share from PHP
- React to a window being set free onto the real desktop
- Cross-window devtools — instrumentation primitives
- Add a dock item with a badge
- Decorate the dock without forking the renderer
- Replace the dock rail entirely
- Retune the Drafts widget's AI writing assistant
- Edit a record with one form values map
- Gate OpenStation by role
- Iframe-initiated window opens
- Build a feed reader without the bookkeeping
- Inject data into openStationConfig
- Render a list without losing clicks — renderKeyedList()
- Example: layout primitives (body → panel → row → col)
- Use <os-*> components from a plugin that ships as a zip
- Restyle and drive Mio
- Repairable form edits with MIO
- Register a window companion
- Pin your app to the phone tab bar, and react to the mode
- Add an action that works on a whole selection
- WP Explorer — custom post types and their folder
- WP Explorer — add a column to the list view
- Add an action button to a WP Explorer preview pane
- Example: native Posts window
- Example: native window with tabs
- Native windows
- Customize note → post conversion
- Send a notification
- OAuth relay — connect to an external service
- Ship a window as an .os.php app
- OS-file drop
- <os-flyout> — window-scoped sliding card
- Plugins window — extras
- Track who's around — wp.os.presence
- Example: progress bar
- PWA install — surface your own button
- React to window events
- Example: extend the Trash
- Register a slash-command
- Register a desktop theme from a plugin
- Register a game
- Example: register a desktop icon (Jorvy)
- Register a wallpaper
- Register a widget
- Related entities — extend the title bar's "Related" menu
- The native-window render ctx
- Revisions in their own window — extend or redirect "View revisions"
- Programmatic folder sharing
- Share state across multi-bundle plugins — wp.os.createSharedStore()
- Example: loading spinner
- Add an opt-in card to Station Home
- Observe stored-file cleanup failures
- Accept drops on your desktop icon
- Give a tile two icons, one per state
- Add a row to a window's ⋯ menu
- Example: window activity & the status ring
- Window controls
- Subscribe to window lifecycle events
- Window links — relate windows and restyle the ties (Experimental)
- Window loading state — spinner overlay & ready signal
- Show a banner at the top of a window
- Pulse a window's icon — Window.requestAttention()
- Register a custom window reveal
- Window slots
- Window themes
- Native window with bundle-bound config
- Place something where the user can reach it — wp.os.workArea
- Ship a workspace template