WordPress, plus this plugin.
Boots the app, enforces the CSP, owns auth, runs the bridge. The same role Chrome plays for extensions.
Typed bridge to real WP data. App-Password auth that takes ten seconds. Atomic deploy with one CLI command. Choose iframe mode for untrusted bundles, or inline mode when you want native SEO and site-owned routes.
How to think about it
DesignSetGo Apps is one WordPress plugin. The apps you ship through it are not plugins. They are sandboxed static bundles (HTML, JS, CSS, WASM) plus a dsgo-app.json manifest. The runtime loads them, sandboxes them, and feeds them WordPress data through a typed bridge. The app never sees a REST token.
Boots the app, enforces the CSP, owns auth, runs the bridge. The same role Chrome plays for extensions.
Whatever your build emits, plus dsgo-app.json declaring permissions. No PHP, no shared process. Lives at /apps/{slug}.
The app asks for posts, pages, the current user, storage, abilities. The runtime enforces what each app is allowed to see.
The shift in one line: anything you used to ship as a WordPress plugin with full trust (a calculator, a portal, a dashboard, an AI tool) becomes a sandboxed bundle with declared permissions instead. The category survives. The security model flips.
The loop
The CLI scaffolds a minimal starter by default, or an Astro starter with --astro for multi-page apps. Any static bundle works. It authenticates with a WordPress Application Password and pushes the bundle; each subsequent deploy is an atomic update at the same app id.
A single index.html, a dsgo-app.json wired up, and an AGENTS.md (plus a CLAUDE.md import) documenting the bridge surface. No build step required, deploys as-is. Add --astro for the multi-page starter (booking flows, member portals, intake wizards).
designsetgo apps init my-app Uses WordPress Application Passwords, built into core, scoped, revocable. Credentials are stored at ~/.config/designsetgo/credentials.json with 0600 permissions.
designsetgo apps login Bundles the directory, shows you the capability diff, and atomically replaces the bundle on the site. Re-run as often as you like, same app id, no downtime. For the Astro starter, pass --build so the CLI runs npm run build first.
designsetgo apps deploy The bridge client
The @designsetgo/app-client package gives you typed access to your WordPress site. Same surface in inline mode (same window) and iframe mode (cross-frame); the transport is auto-selected.
// Read posts, pages, the current user, and per-app storage.
// The bridge handles auth + REST behind the scenes.
import { dsgo } from "@designsetgo/app-client";
await dsgo.ready;
// Site context
const site = await dsgo.site.info();
// Real posts, filtered by what the current user can see
const { posts } = await dsgo.posts.list({
type: "recipe",
orderby: "date",
order: "desc",
per_page: 10,
});
// Logged-in user, and what they're allowed to do
const me = await dsgo.user.current();
if (await dsgo.user.can("edit_posts")) {
// show the editor-only UI
}
// Per-app, per-user persistent storage; survives reloads
await dsgo.storage.user.set("favourites", [42, 88]); What your AI agent sees
The starter ships a full extension manual at the project root. AGENTS.md is the vendor-neutral canonical file; Codex, Cursor, Aider, and any tool that follows the agents.md convention read it directly. CLAUDE.md is a one-line @-import of AGENTS.md so Claude Code picks up the same content without duplication or drift.
Reads CLAUDE.md automatically, which @-imports AGENTS.md. designsetgo apps init + open in Claude Code is the path of least resistance.
Reads AGENTS.md as project context; that's the convention Codex's project memory uses. Already in place, nothing to rename.
Both follow the AGENTS.md convention out of the box; the same file feeds them too.
Pass AGENTS.md as additional context. The bridge spec is vendor-neutral; there's no Anthropic-specific coupling in the runtime.
Agent skills pack
AGENTS.md answers the agent once it is inside a DSGo project. The DSGo skills pack answers it on the way in: installed at the user level, so the agent already knows the manifest schema, every dsgo.* method, and the CLI loop before apps init runs.
npx skills add DesignSetGo/skills
building-dsgo-apps Scaffolding, the inline-vs-iframe choice, project layout. dsgo-manifest Every field of dsgo-app.json: routes, permissions, secrets, scheduled jobs, webhooks. dsgo-bridge-api Every dsgo.* method, its permission gate, its error code shape. deploying-dsgo-apps The @designsetgo/cli loop, preview deploys, CI with env-var auth. dsgo-abilities Publishing abilities back to the site, consuming abilities, dsgo.ai.prompt tool calling. Isolation modes
Same bundle format, same bridge, different rendering. Apps declare which they want in the manifest. See How it works for the deeper trade-off.
Renders at /apps/{slug}/{route} with multi-page routes via routes, per-request CSP nonces, install-time sanitization, optional theme header/footer wrap, and automatic sitemap inclusion. Pick this for content-heavy apps.
App renders inside an <iframe sandbox> without allow-same-origin, giving it an opaque origin. Single-page, not crawlable, ideal for drop-in Claude artifacts and bundles you want the strongest isolation guarantee on.
License + price
The bridge client (@designsetgo/app-client) and CLI (@designsetgo/cli) are MIT-licensed on GitHub. The plugin runtime is one zip; the CLI deploy flow gates on Pro ($149.99/yr, 3 sites) or Studio ($499/yr, unlimited sites). Free hosts uploaded bundles but not CLI pushes. See pricing →
Three commands
The starter ships with the typed bridge wired up and an AGENTS.md documenting every method. designsetgo apps init --astro adds Astro for multi-page apps.
$ npm i -g @designsetgo/cli $ designsetgo apps init my-mortgage --astro ✓ scaffolded · 12 files · 5 kB $ designsetgo apps login --site example.com ✓ stored credentials $ designsetgo apps deploy --site example.com ✓ live at example.com/apps/my-mortgage └ permissions: read_content, send_messages