Package structure
What's inside the ZIP MigrateTo gives you, file by file.
Top-level layout
portal-package/
├── manifest.json ← package metadata, schema version
├── web-templates/ ← reusable Liquid blocks
│ ├── header.html
│ └── footer.html
├── page-templates/ ← top-level pages
│ ├── home.html
│ └── article.html
├── content-snippets/ ← named editable strings
│ └── snippets.json
├── web-files/ ← static assets (images, fonts)
│ ├── images/...
│ └── fonts/...
├── basic-forms/ ← form definitions
│ └── ...
└── pipelines/
└── azure-devops.yml ← reference pipeline (optional)manifest.json
Schema-versioned. The Power Platform CLI reads this to determine what to upload. We pin schemaVersion: 1 for current packages.
web-templates
- One file per Figma component you marked as reusable web template in the components panel.
- Named with the kebab-case component name.
- Included from page-templates with
{% include 'header' %}.
page-templates
- One file per top-level Figma page or designated landing frame.
- Includes header/footer, runs FetchXML where you bound data, and uses Power Pages Web API for forms.
content-snippets
Any text layer marked editable on the canvas becomes a content snippet. Authors can change them in the Power Pages portal management app without redeploying.
web-files
Image fills exported from Figma plus any font files referenced by the design system. Filenames are content-hashed for cache-busting.
basic-forms
Each form frame with a bound table emits a Power Pages basic form definition with the right entity logical name and column mappings.
pipelines/azure-devops.yml
A reference pipeline that authenticates with a service connection, runs pac paportal upload, and posts the result back to your team. Edit before use — every tenant's auth flow differs.