Skip to content

Add application/page intent type (create, edit) - #17

Open
NguyenQuangHuy-Harry wants to merge 3 commits into
Shopify:mainfrom
NguyenQuangHuy-Harry:add-application-page-intent-type
Open

Add application/page intent type (create, edit)#17
NguyenQuangHuy-Harry wants to merge 3 commits into
Shopify:mainfrom
NguyenQuangHuy-Harry:add-application-page-intent-type

Conversation

@NguyenQuangHuy-Harry

@NguyenQuangHuy-Harry NguyenQuangHuy-Harry commented Aug 17, 2026

Copy link
Copy Markdown

Proposed type

  • Type: application/page
  • Actions: both create and edit
  • One-line summary: A merchant-authored storefront page — content and layout that an app builds and publishes to the online store.

Why this type

Real merchant asks this captures:

  1. "Build me a landing page for the summer collection launch" — the canonical page-builder ask, and today there's nothing in the catalog to route it to.
  2. "Add a testimonials section to my Black Friday page" — an edit that currently means finding the right app, the right page, and the right insertion point by hand.
  3. "Spin up a landing page for this ad campaign" — the destination step after an application/ad intent, where the two types compose.

Storefront page building is a mature, multi-vendor App Store category and currently the largest one with no way to register an intent.

Who would register intents for it

  • PageFly (ours) would register both actions.
  • The page-builder category maps cleanly onto the same artifact: GemPages, Shogun, Replo, EComposer, Zipify Pages, LayoutHub. Theme-section and template marketplaces that publish pages on a merchant's behalf fit the same shape.

The design constraint I worked to: two page builders will never agree on a component tree, but they can agree on "a page titled X, for surface Y, featuring products Z, roughly these sections."

Schema sketch

Full draft is inline in types/application-page.md in this PR. Shape summary: id, title, handle, page_type (home/product/collection/blog_post/page/password), goal, sections[] (type, heading, body, media_url), products[]/collections[] GIDs, status, seo.

Deliberately excluded, as app document-model concerns rather than merchant-facing ones: element and component trees, style objects, breakpoints, template file bindings, revision history.

Confirmed:

  • inputSchema does not declare required fields
  • Field names are consistent with neighboring types in types/ — snake_case for multi-word fields, matching the fields proposed on application/email (body_html, reply_to, template_id)
  • For application/*, the schema refs the canonical application schema (TOML example $refs the would-be canonical URL; draft inline pending publication)
  • For shopify/* — n/a

Prior art

  • shopify/product with import covers "build a page for this product", which is real and useful. It can't express a page with no single anchoring resource — an About page, a campaign landing page, a multi-product comparison — and it carries no page-level intent (title, handle, outline, goal).
  • application/campaign describes the campaign's schedule, audience, and channels. A page is usually the campaign's destination, and most pages have no campaign behind them at all.
  • application/faq already covers the case where the page is an FAQ, and should keep doing so. The shapes differ: question-and-answer versus section outline.
  • application/theme-edit-task (proposed in discussions) targets theme code; this targets a merchant-authored page.

Anything else

Three things I'd rather have your read on than guess at:

  1. Is sections too app-specific to carry? It's the field most likely to vary between builders. Dropping it and letting goal carry the whole intent is a legitimate alternative, at the cost of structure Sidekick could otherwise pre-fill. Related: every published application/* schema except email is currently id plus additionalProperties: true, so if the house style is to ship minimal and let apps extend, I'm happy to cut this draft back a long way.
  2. Closed enum or open string for page_type? Closed is safer for routing; open avoids a schema revision each time a new storefront surface appears.
  3. Is a publish action out of scope? Every application/* type in types/ declares exactly create and edit, so I've followed that — but "publish the page I made yesterday" is a plausible merchant ask, and it's a state transition rather than an edit. Happy to leave it out if the omission across the catalog is deliberate.

Two small conventions I diverged on, both easy to revert if you'd rather I matched the existing files:

  • The draft schema uses https://json-schema.org/draft/2020-12/schema and a "Page Schema" title, matching what's actually published at extensions.shopifycdn.com today. types/application-email.md shows draft-07 in its example, so the two are inconsistent and I followed the published artifact.
  • The TOML example uses type = "admin_link" with target = "admin.app.intent.link", since page building is long-running and visual enough that navigating into the app's editor beats an inline surface. Note that types/application-email.md currently shows target = "admin.intent.render", which doesn't appear in the current docs — the render target is documented as admin.app.intent.render. Happy to open that as a separate fix if useful.

Glad to iterate on any of it, and happy to move this to an RFC discussion if you'd rather shape it there first.

@NguyenQuangHuy-Harry

Copy link
Copy Markdown
Author

I have signed the CLA!

- snake_case multi-word fields (page_type, media_url, blog_post)
- draft 2020-12 and '<Name> Schema' title, matching published schemas
- move draft schema ahead of the field table, matching application-email.md
- move rationale into the PR body per the repo PR template
@adambarrus

Copy link
Copy Markdown
Collaborator

Hi @NguyenQuangHuy-Harry, thank you for an excellent proposal. The merchant asks you anchored this in are real ones, and the composition story with application/ad is a nice bonus.

Initial reactions on your three questions:

  1. sections: keep it in the draft. The pre-fill structure is where Sidekick adds value over a bare goal string, and you've drawn the merchant-facing vs app-document-model line correctly. Expect this field to get the most scrutiny in review.
  2. page_type: closed enum. Routing safety wins, and new storefront surfaces arrive rarely enough that a schema revision is acceptable.
  3. publish: out of scope. "Publish the page" is an edit where status transitions to active; keeping actions to create/edit keeps the routing model simple.

One ask: consider a more specific type name. application/page is generic enough to collide with future surfaces (admin pages, checkout pages, docs). Our suggestion is application/storefront-page, which matches how your page_type enum is already scoped; open to alternatives if you have a better fit.

On the two convention divergences: good catches, both. The draft-07 example in application-email.md and the admin.intent.render target look like doc bugs rather than intent, and you followed the published artifacts correctly. A separate fix PR would be very welcome.

No need to move to an RFC; this PR is the right venue. We're reviewing the open type proposals (this and #14) and will come back with consolidated schema-level feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants