Dashboard
A web app outside WordPress for the same work the API does: sites, the page tree, frames and data — signed in with your op_ token.
The dashboard is a single-page app at https://stagepress.bond/dashboard/. It lives outside WordPress and does not depend on any theme: it keeps no data of its own, and every screen is a call to API v1 or v2 made with your personal token. It is the first step of v2 away from wp-admin, not a second admin panel.
Signing in
The sign-in screen asks for one thing: “Paste your personal API token to continue”. This is the same op_ token you use for the API — op_ followed by 64 lowercase hex characters; anything of another shape is rejected before a request is made. How to issue a token is in Authentication. There is no login, no password and no WordPress cookie.
On sign-in the dashboard asks WordPress who you are (GET /wp-json/wp/v2/users/me?context=edit) and keeps the token in the browser’s localStorage under onpress:token. Any 401 from the main domain signs you out and returns you to /dashboard/login — that is what happens after the token is rotated, within the minute the API caches token checks. A 401 from an individual site’s domain is shown as an error inside the section instead, so one misconfigured site does not end the session.
Sections
| Section | What it shows | Writes |
|---|---|---|
| Sites | every network site you can reach: address, Yandex Metrica, GA4, Search Console and Yandex Webmaster figures, Web Vitals, content counters, tags | tags, column layout |
| Pages | the page tree of the current site with inline editing and search | title, status, slug, SEO fields, order, bulk actions |
| Frames | the frames of the current site; a row opens the frame’s markup next to the list. A frame has no address, so there is no address or link column here | nothing |
| Data | the datasets of the current site with their language variants; a row opens the dataset JSON; below the table, the list of system sources | nothing |
Sites. “Open in dashboard” makes a site current and takes you to Pages. “WP admin” opens the site’s wp-admin through a one-time login link, so you do not sign in to WordPress separately.
Pages. The tree has five views that differ by column set: Default (status, frame, path, language), SEO (keyword, SEO title and description, index, follow, canonical), Topic (keyword, topic, target and its anchor), Content (status, content, structure, character count, note) and Index (Google index status, reason, last crawl). The view and the columns live in the URL (/dashboard/pages?view=seo), so a link opens the same table. Cells edit in place. Search matches title, path, slug, keyword, topic, note and id, and shows matches together with their ancestors; drag-and-drop reordering is off while a search is active. The block editor and “Create in editor” open the site’s wp-admin in a new tab.
Frames and Data are read-only by design: no request there is anything but GET. Frames can be filtered by block and searched; frames printed on request are tagged live. How frames and datasets are written is in Frames and Data.
Where the addresses are. Every address of the site is in Pages, a landing included: a frame is a template and has none of its own. So the answer to “what does the site serve at /home/” is always a row in Pages, and the frame that prints it is in the page’s frame.
There is no template column any more: v2 has no theme templates, so the Default view shows the page’s frame instead — the slug and the name of the frame the page is printed in, and a dash for a page the theme prints itself.
Current site
Every section except Sites works on one site, picked with the switcher in the header. The choice is kept in localStorage under onpress:site; by default it is the documentation’s test site when you have access to it, otherwise the first site in your list.
What it calls
Frames and Data go to API v2: $BASE/frames, $BASE/data, $BASE/data/sources, with the site in the X-OnPress-Blog-Id header. Sites and Pages go to API v1 on the site’s own domain — /wp-json/onpress/v1/sites, /pages-tree, /pages/{id}/… — because those endpoints have not moved to v2 yet. Both accept the same op_ token: v1 takes it through the adapter in the onpress-api-keys mu-plugin, and answers cross-origin requests only for the dashboard’s own origin.
The interface is in English only; there is no translation layer.