/projects/:projectId/ext/:extensionId/:pageId. With nav: true it also gets an entry in
the project navigation, with your vendor tile beside the name.
The manifest entry
tappify.extension.json instead — the
$schema line gives your editor completion and validation, and
tappify extension doctor checks the result.
The component
TapPageProps carries params, the segments under your own page’s path, keyed by position
alongside pageId and the unsplit path.
tap.nav.push("/explore/funnels/123") navigates
inside it and useTapParams() reads the segments back. See
Navigate inside your page.
What the host renders
Tappify draws the project chrome — sidebar, header, breadcrumb — and mounts your component in the content area withtap.ui.size set to page. The navigation entry shows your vendor
tile so an owner always knows whose page they are on.
An organization-scoped extension cannot declare pages, tabs, widgets or series: those are
project surfaces. Declare installScope: "project" if you need them.