This skill should be used when the user asks to "create a power pages site", "build a code site", "scaffold a website", "create a portal", "make a new site", or wants to create a new Power Pages code site (SPA) using React, Angular, Vue, or Astro.
Install with Tessl CLI
npx tessl i github:microsoft/power-platform-skills --skill create-site77
Quality
74%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Optimize this skill with Tessl
npx tessl skill review --optimize ./plugins/power-pages/skills/create-site/SKILL.mdGuide the user through creating a complete, production-quality Power Pages code site from initial concept to deployed site. Follow a systematic approach: discover requirements, scaffold and launch immediately, plan components and design, implement with design applied, validate, review, and deploy.
browser_navigate + browser_snapshot) to verify every significant change. Do NOT take screenshots — only use accessibility snapshots to check page structure and content.https://images.unsplash.com/photo-{id}?w={width}&h={height}&fit=crop URLs with specific photo IDs found via WebSearch. Never leave image placeholders or broken <img> tags pointing to nonexistent files.Constraint: Only static SPA frameworks are supported (React, Vue, Angular, Astro). NOT supported: Next.js, Nuxt.js, Remix, SvelteKit, Liquid.
Initial request: $ARGUMENTS
Goal: Understand what site needs to be built and what problem it solves
Actions:
Create todo list with all 7 phases (see Progress Tracking table)
If site purpose is clear from arguments:
If site purpose is unclear, use AskUserQuestion:
| Question | Header | Options |
|---|---|---|
| What should the site be called? (e.g., "Contoso Portal", "HR Dashboard") | Site Name | (free text — use a single generic option so the user types a custom name via "Other") |
| Which frontend framework? | Framework | React (Recommended), Vue, Angular, Astro |
| What is the site's purpose? | Purpose | Company Portal, Blog/Content, Dashboard, Landing Page |
| Who is the target audience? | Audience | Internal (employees, partners), External (public-facing customers) |
| Where should the project be created? | Location | Current directory, New folder in current directory (Recommended), Any other directory |
Resolve the project location:
<cwd>.__SITE_NAME__ inside the cwd. Project root = <cwd>/__SITE_NAME__/.After resolving, confirm: "The site will be created at <resolved path>."
Store this as PROJECT_ROOT.
From the user's answers, derive:
__SITE_NAME__ (Title Case, e.g., Contoso Portal)__SITE_SLUG__ (kebab-case derived from site name, e.g., contoso-portal)__SITE_DESCRIPTION__ (one-line description based on name + purpose)Summarize understanding and confirm with user before proceeding
Audience influences site generation:
Output: Clear statement of site purpose, framework, audience, derived naming values, and project location
Goal: Get a running site immediately so the user has something to preview while features and design are planned
The scaffold is a temporary branded loading screen — it shows a Power Pages animated "Building your site" experience with orbiting elements, status messages, and feature cards. Its only purpose is to get the dev server running quickly so the user has something to look at while you plan and build. During Phase 5 (Implementation), the entire scaffold — including theme.css, Layout, Home page, and all placeholder components — is completely replaced with the user's actual site: their chosen typography, color palette, pages, components, and navigation. Do NOT try to build on top of the loading screen; replace it entirely.
See
${CLAUDE_PLUGIN_ROOT}/references/framework-conventions.mdfor the full framework → build tool → router → output path mapping.
Actions:
${CLAUDE_PLUGIN_ROOT}is already resolved to the plugin's absolute path at runtime. Use it directly in Glob/Read paths — do NOT search for the plugin directory.
Read and copy all files from the matching asset template to the project directory:
| Framework | Asset Directory |
|---|---|
| React | ${CLAUDE_PLUGIN_ROOT}/skills/create-site/assets/react/ |
| Vue | ${CLAUDE_PLUGIN_ROOT}/skills/create-site/assets/vue/ |
| Angular | ${CLAUDE_PLUGIN_ROOT}/skills/create-site/assets/angular/ |
| Astro | ${CLAUDE_PLUGIN_ROOT}/skills/create-site/assets/astro/ |
Use Glob to discover all files in the asset directory, Read each file, then Write to the project directory preserving the relative path structure.
After copying, replace all __PLACEHOLDER__ tokens in every file. Use Edit with replace_all: true on each file.
__SITE_NAME__, __SITE_SLUG__, __SITE_DESCRIPTION__).Note: The scaffold loading screen uses hardcoded Power Pages branding colors — there are no color placeholders (
__PRIMARY_COLOR__, etc.) to replace. The user's chosen color palette is applied fresh during Phase 5 when the scaffold is completely replaced.
Rename gitignore → .gitignore in the project root (stored without dot prefix to avoid git interference in the plugin repo).
Run npm install before initializing git so that package-lock.json is included in the initial commit:
cd "<PROJECT_ROOT>"
npm installInitialize a git repo and make the first commit. This captures all template files AND package-lock.json in one clean baseline:
cd "<PROJECT_ROOT>"
git init
git add -A
git commit -m "Initial scaffold: __SITE_NAME__ (__FRAMEWORK__)"From this point, commit after every significant milestone so any breaking change can be reverted.
This MUST happen now — before any planning or customization begins. The dev server gives the user a live preview while features and design are being planned:
cd "<PROJECT_ROOT>"
npm run devRun npm run dev in the background using Bash with run_in_background: true. Note the local URL (typically http://localhost:5173 for Vite or http://localhost:4200 for Angular or http://localhost:4321 for Astro).
Immediately after the dev server starts, verify the scaffold is working:
mcp__plugin_power-pages_playwright__browser_navigate to open the dev server URLmcp__plugin_power-pages_playwright__browser_snapshot to verify the page loaded correctly (do NOT take screenshots — only use accessibility snapshots)http://localhost:5173 — open it in your browser to follow along as I build.")GATE: Do NOT proceed to Phase 3 until ALL of the following are true:
- Template files copied and placeholders replaced
- Git repo initialized with initial scaffold commit
npm installcompleted successfully- Dev server is running in the background (
npm run dev)- Playwright has opened the site and verified it loads via
browser_snapshot- The dev server URL has been shared with the user
If any of these are not done, complete them now before moving on.
Output: Running dev server with verified scaffold, URL shared with user
Goal: Determine what pages, components, and design elements the site needs — while the user previews the running scaffold
Actions:
Use AskUserQuestion to collect feature and design requirements:
| Question | Header | Options |
|---|---|---|
| Which features? (multi-select) | Features | (generate 3-4 context-aware options based on the site name, purpose, and audience from Phase 1) |
| What aesthetic direction do you want? | Aesthetic | Minimal & Clean (Recommended), Bold & Vibrant, Dark & Moody, Warm & Organic |
| What's the overall mood? | Mood | Professional & Trustworthy (Recommended), Creative & Playful, Technical & Precise, Elegant & Premium |
Feature options are NOT hardcoded. Infer relevant features from Phase 1 answers. For example:
- "HR Dashboard" + Internal → Employee Directory, Leave Requests, Announcements, Org Chart
- "Contoso Portal" + External → Contact Form, Service Catalog, Knowledge Base, FAQ
- "Partner Hub" + Internal → Document Library, Partner Directory, Deal Tracker, Notifications
Always generate options that make sense for the specific site — never reuse a fixed list.
Read the design aesthetics reference: ${CLAUDE_PLUGIN_ROOT}/skills/create-site/references/design-aesthetics.md
Map aesthetic + mood to design choices using the Aesthetic x Mood Mapping table from the design reference. Record the chosen font direction, color direction, and motion direction.
Analyze requirements and determine needed components. Present component plan to user as a table:
| Component Type | Count | Details |
|---------------------|-------|---------|
| Pages | 4 | Home, About, Services, Contact |
| Shared Components | 3 | Navbar, Footer, ContactForm |
| Design Elements | 4 | Google Fonts (Playfair Display + Source Sans Pro), Color palette (6 CSS vars), Page transitions, Gradient backgrounds |
| Routes | 4 | /, /about, /services, /contact |Use best judgement to determine the final color palette based on the chosen aesthetic + mood. These will be written fresh into a new theme.css during Implementation (Phase 5) when the scaffold loading screen is completely replaced:
| CSS Variable | Description | Value |
|---|---|---|
--color-primary | Primary hex color | (choose based on aesthetic + mood) |
--color-secondary | Complementary hex color | (choose based on aesthetic + mood) |
--color-bg | Background color | (choose based on aesthetic + mood) |
--color-surface | Surface/card color | (choose based on aesthetic + mood) |
--color-text | Main text color | (choose based on aesthetic + mood) |
--color-text-muted | Muted text color | (choose based on aesthetic + mood) |
Output: Confirmed list of pages, components, design elements, and routes to create
Goal: Get user approval on the implementation plan
Actions:
Read the design aesthetics reference: ${CLAUDE_PLUGIN_ROOT}/skills/create-site/references/design-aesthetics.md
Present the implementation plan directly to the user as a formatted message. The plan MUST have ALL of the following sections:
Section A — Design & Pages
Section B — Review & Deployment
CRITICAL: The plan is written for the user — do NOT reference internal phase numbers, tool names, or implementation details. Describe what will be built and what it will look like. The scaffold is already running — this plan covers what will be built on top of it.
Use AskUserQuestion to get approval:
| Question | Header | Options |
|---|---|---|
| Does this plan look good? | Plan | Approve and start building (Recommended), I'd like to make changes |
Output: Approved implementation plan
Goal: Build all pages, components, and design elements with the chosen aesthetic applied from the start
Prerequisite: The dev server MUST already be running and verified via Playwright (completed in Phase 2). If it is not, go back and complete Phase 2.
Design reference: Read
${CLAUDE_PLUGIN_ROOT}/skills/create-site/references/design-aesthetics.mdand apply its principles throughout this phase. All pages and components should be built with the chosen typography, color palette, motion, and backgrounds from the start — do NOT build with neutral styling first and redesign later.
Actions:
Before writing any code, use TaskCreate to create a todo for every piece of work. This gives the user full visibility into what will be built:
/contact)", "Create Dashboard page (/dashboard)"Each todo should have a clear subject, activeForm, and description that includes the file path and what the page/component does. Then work through the todos in order, marking each in_progress → completed.
The scaffold is a temporary loading screen — it must be completely replaced during this phase. Do NOT build on top of it or try to modify the loading animation into a real page. Start fresh with the user's chosen design.
theme.css (or styles.css for Angular) from scratch with the chosen color palette as CSS custom properties, Google Fonts, motion/animation utilities, and background treatments. The scaffold's loading screen CSS is discarded entirely. Commit after this step./ and /about — add all requested routes)index.html (or Layout.astro for Astro) to load the chosen Google Fonts instead of the scaffold's DM Sans + OutfitImportant: Build real, functional UI with distinctive design applied — not placeholder "coming soon" pages, and not generic unstyled markup. Every page and component should reflect the chosen aesthetic from the moment it's created. The scaffold loading screen should be completely gone after this phase — no trace of the Power Pages branded animation should remain.
Use high-quality photos from Unsplash wherever the site needs visual content. Do NOT use placeholder services (e.g., placeholder.com, placehold.co), broken <img> tags, or leave empty image slots.
How to find images:
WebSearch to search Unsplash for relevant photos (e.g., site:unsplash.com modern office workspace)https://images.unsplash.com/photo-{id}?w={width}&h={height}&fit=cropWhere to use images:
Guidelines:
w=800 for cards, w=1600 for heroes/backgrounds) to avoid slow loadsalt text to every <img> for accessibilityCommit after every individual page and component so breaking changes can be reverted. Each page and each component gets its own commit — do NOT batch multiple pages or components into a single commit.
git add -A
git commit -m "<short description of what was added/changed>"When to commit:
If something breaks, revert to the last good commit:
git revert HEADAfter each significant change (new page or component), browse the site via Playwright to ensure everything is up to the mark:
mcp__plugin_power-pages_playwright__browser_navigate to reload or navigate to the updated pagemcp__plugin_power-pages_playwright__browser_snapshot to verify the page structure and content are correct — do NOT take screenshotsThe user is previewing in their own browser via the dev server URL shared in Phase 2.7.
GATE: Do NOT proceed to Phase 6 until ALL customization is complete with design applied. The site must have distinctive typography (Google Fonts — no generic Inter/Roboto/Arial), a cohesive color palette (CSS variables), motion/animations, and all requested pages/features before moving to review.
Output: All pages, components, and design elements implemented and verified
Goal: Ensure the site meets user expectations and all pages work correctly
Actions:
browser_navigate + browser_snapshot) to verify all pages load correctly — do NOT take screenshots| Component Type | Count | Details |
|---------------------|-------|---------|
| Pages | 4 | Home (/), About (/about), Services (/services), Contact (/contact) |
| Shared Components | 3 | Navbar, Footer, ContactForm |
| Design Elements | 4 | Playfair Display + Source Sans Pro, 6 CSS variables, fade-in transitions, gradient backgrounds |
| Git Commits | 7 | scaffold + 6 feature commits |AskUserQuestion:
"The site is ready for review at
<dev server URL>. Please check it out in your browser. Would you like any changes?"
browser_snapshotOutput: User-approved site ready for deployment
Goal: Deploy the site and suggest enhancements
This phase is MANDATORY. Do NOT end the session without asking about deployment.
Actions:
Record skill usage:
Reference:
${CLAUDE_PLUGIN_ROOT}/references/skill-tracking-reference.md
Follow the skill tracking instructions in the reference to record this skill's usage. Use --skillName "CreateSite". Note: .powerpages-site may not exist for first-time sites — the script exits silently.
Use AskUserQuestion with options: Deploy now (Recommended), Skip for now:
"Would you like to deploy your site to Power Pages now?"
If the user chooses to deploy, invoke the /power-pages:deploy-site skill.
Mark all todos complete
Present a final summary:
Suggest optional enhancement skills:
/power-pages:setup-datamodel — Create Dataverse tables for dynamic content/power-pages:add-seo — Add meta tags, robots.txt, sitemap.xml, favicon/power-pages:add-tests — Add unit tests (Vitest) and E2E tests (Playwright)Output: Deployed (or deployment-ready) site with clear next steps
browser_snapshot (accessibility snapshots) to verify pages; never use browser_take_screenshot as it clutters the user's directory. Give the user the dev server URL for visual preview.Before starting Phase 1, create a task list with all phases using TaskCreate:
| Task subject | activeForm | Description |
|---|---|---|
| Discover site requirements | Discovering requirements | Collect site name, framework, purpose, audience, and project location |
| Scaffold and launch dev server | Scaffolding project | Copy template, replace placeholders with defaults, git init, npm install, start dev server, share URL |
| Plan site components | Planning components | Determine pages, components, design direction, and routes while user previews scaffold |
| Approve implementation plan | Getting plan approval | Present implementation plan covering design and pages, get user approval |
| Implement pages and components | Building site | Apply chosen design tokens, create all pages, components, routing, navigation |
| Review with user | Reviewing site | Navigate all pages, share URL, get user feedback, apply changes |
| Deploy and wrap up | Deploying site | Ask about deployment, present summary, suggest next steps |
Mark each task in_progress when starting it and completed when done via TaskUpdate. This gives the user visibility into progress and keeps the workflow deterministic.
Every site must meet these standards before completion:
"Create a partner portal for our consultants"
partner-portal in current directoryhttp://localhost:5173#1e3a5f primary, blue-gray palettehttp://localhost:5173, requested minor color adjustment/power-pages:deploy-siteBegin with Phase 1: Discovery
8ccaae8
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.