Mockup Prototype
End-to-end workflow for creating, iterating, and sharing interactive HTML mockups using Copilot CLI.
When to Use This Skill
- User asks to "create a mockup" or "prototype a UI"
- User wants to compare design alternatives side by side
- User asks to "deploy" or "share" a mockup with colleagues
- User wants a quick visual exploration of a feature idea
Phase 1: Generate
Ask where this mockup belongs
Before creating the file, ask the user which repo to work in. The mockup file lives in the repo's local clone from the start - no copying later.
- Ask: "Which repo should this mockup live in?" (e.g.,
acme/feature-explorer, contoso/design-lab)
- Find the local clone (check
~/GitHub/<org>/<repo> or ~/GitHub/<repo>)
- Look for existing folder conventions:
docs/mockups/, considerations/, designs/, proposals/. If none exist, use docs/mockups/.
- Create the mockup at
<repo>/docs/mockups/<feature-name>/mockup.html
Create the mockup
Create a single self-contained HTML file with all CSS inline. No external dependencies, no build steps.
Style guide
Match the visual style of the product being mocked up. If the user specifies a product or brand, replicate its look (colors, spacing, typography). If no specific product is mentioned, use a clean dark theme as a sensible default:
| Token |
Value |
| Background (page) |
#0d1117 |
| Background (surface) |
#161b22 |
| Background (overlay) |
#21262d |
| Text (primary) |
#e6edf3 |
| Text (secondary) |
#9198a1 |
| Text (muted) |
#7d8590 |
| Border |
#30363d |
| Blue |
#4493f8 |
| Green |
#3fb950 |
| Red |
#f85149 |
| Yellow |
#d29922 |
| Purple |
#a371f7 |
| Font stack |
-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif |
Use inline SVGs for icons. Do not reference external icon libraries or CDNs.
Comparing multiple options
When showing alternatives, use a tabbed layout:
<!-- Sticky nav -->
<div class="option-nav">
<button class="option-btn active" Option name</button>
<button class="option-btn" Option name</button>
</div>
<!-- Each option in its own section -->
<div class="mockup-section active" id="section-a">
<!-- mockup content -->
<!-- pros/cons narrative INSIDE this div -->
</div>
<div class="mockup-section" id="section-b">
<!-- mockup content -->
<!-- pros/cons narrative INSIDE this div -->
</div>
<script>
function show(id) {
document.querySelectorAll('.mockup-section').forEach(s => s.classList.remove('active'));
document.querySelectorAll('.option-btn').forEach(b => b.classList.remove('active'));
document.getElementById('section-' + id).classList.add('active');
event.target.classList.add('active');
}
</script>
Key rules:
- Narrative blocks (pros/cons) go inside each
.mockup-section, not outside
- Only one section visible at a time via CSS (
display:none / display:block)
- Use realistic data, not placeholder text
Preview locally
After creating the file, always open it in the browser automatically:
open <repo-path>/docs/mockups/<feature-name>/mockup.html # macOS
xdg-open <repo-path>/docs/mockups/<feature-name>/mockup.html # Linux
Phase 2: Iterate
All changes stay local. Do not push to the remote until the user explicitly asks to deploy or push.
- Edit the HTML file based on user feedback
- Always re-open in browser after each change so the user can see updates immediately
- Common iteration patterns:
- Adding/removing/reordering options
- Adding pros/cons narrative below each option
- Tweaking layout, spacing, colors
- Fixing visual bugs reported via screenshots
Important: Do not git commit, git push, or create PRs during this phase. The user will tell you when they are ready.
Phase 3: Deploy for sharing
Only start this phase when the user explicitly asks to deploy, push, or share.
Confirm public visibility
Before deploying, remind the user:
This will deploy the mockup to a public URL. Confirm the content is safe to share externally (see the Security section above).
If the user has not acknowledged this, ask for confirmation before proceeding.
Choose a deployment target
Ask the user where to deploy:
- GitHub Pages (default): deploys via the repo's Pages site. Requires merging to main.
- Vercel: deploys instantly via
vercel deploy --prod. No PR or merge required.
If the user has already stated a preference (e.g., "deploy to Vercel"), skip the prompt.
Option A: GitHub Pages
Ensure GitHub Pages is enabled on the target repo:
gh api repos/<owner>/<repo>/pages --jq '.html_url'
# If not enabled:
gh api repos/<owner>/<repo>/pages -X POST -f source='{"branch":"main","path":"/"}'
Add a README.md in the mockup directory with a summary of the states/options.
Create branch, commit, push, PR, and merge in one flow:
git checkout -b <user>/mockup-<feature-name>
git add docs/mockups/<feature-name>/
git commit -m "Add <feature-name> mockup"
git push origin <user>/mockup-<feature-name>
gh pr create --title "<Feature> mockup" --body "..."
# Wait for checks, then merge
gh pr merge <number> --squash --delete-branch
The merge to main is required for Pages to deploy. Do not leave the PR open.
Open the live URL in the browser after merge:
PAGES_URL=$(gh api repos/<owner>/<repo>/pages --jq '.html_url')
open "${PAGES_URL}docs/mockups/<feature-name>/mockup.html"
Option B: Vercel
Ensure the Vercel CLI is installed and authenticated:
vercel --version || npm install -g vercel
vercel whoami # confirm logged in
Prepare the deploy directory. Vercel serves index.html by default. Copy the mockup file so it works at the root URL:
cp <repo-path>/docs/mockups/<feature-name>/mockup.html \
<repo-path>/docs/mockups/<feature-name>/index.html
Deploy from the mockup directory:
cd <repo-path>/docs/mockups/<feature-name>
vercel deploy --prod --yes
Clean up the temporary index.html (keep mockup.html as the source of truth):
rm <repo-path>/docs/mockups/<feature-name>/index.html
Open the live URL in the browser. Vercel prints the production URL and alias on deploy. Open the alias URL (e.g., https://<project>.vercel.app).
Optionally commit and push the mockup to the repo for project history. This is separate from the Vercel deploy and follows the same branch/PR/merge flow as GitHub Pages. Only do this if the user asks.
Security
Public visibility
Both GitHub Pages and Vercel deploy content to publicly accessible URLs by default. Before deploying, confirm the mockup does not contain:
- Real user data, PII, or production database content
- API keys, tokens, secrets, or credentials
- Internal-only URLs, hostnames, or infrastructure details
- Proprietary business logic or unreleased feature specifics that should stay confidential
Content guidelines
- Use synthetic, fictional data in all mockups (fake usernames, placeholder repos, made-up org names)
- Do not embed real screenshots of internal tools unless cleared for public sharing
- Do not reference external CDNs, scripts, or stylesheets. All assets must be inline. This prevents supply-chain risks and ensures the file works offline.
Credential hygiene
- The skill uses
gh CLI and vercel CLI, which rely on locally stored auth tokens. These tokens are never written into mockup files.
- Do not hardcode tokens, passwords, or auth headers in any HTML, CSS, or JS within the mockup.
Guidelines
- Single self-contained HTML file. No build tools, no npm, no frameworks.
- Save the mockup directly in the target repo's local clone from the start.
- Do not maintain two copies of the mockup (e.g., Desktop + repo). One file, one location.
- Do not push changes during iteration. Local only until the user says to deploy.
- Always auto-open the local file in browser during iteration.
- Always auto-open the live Pages URL after deploy.
- Use descriptive file and folder names (e.g.,
user-profile-card, not mockup-1).
1---2name: mockup-prototype3description: Generate interactive HTML mockups from a description, iterate on them, and deploy to GitHub Pages or Vercel for sharing. Use this skill when the user wants to create a mockup, prototype, UI exploration, or design comparison, or when they want to deploy or share one.4---56# Mockup Prototype78End-to-end workflow for creating, iterating, and sharing interactive HTML mockups using Copilot CLI.910## When to Use This Skill1112- User asks to "create a mockup" or "prototype a UI"13- User wants to compare design alternatives side by side14- User asks to "deploy" or "share" a mockup with colleagues15- User wants a quick visual exploration of a feature idea1617## Phase 1: Generate1819### Ask where this mockup belongs2021Before creating the file, ask the user which repo to work in. The mockup file lives in the repo's local clone from the start - no copying later.22231. Ask: "Which repo should this mockup live in?" (e.g., `acme/feature-explorer`, `contoso/design-lab`)242. Find the local clone (check `~/GitHub/<org>/<repo>` or `~/GitHub/<repo>`)253. Look for existing folder conventions: `docs/mockups/`, `considerations/`, `designs/`, `proposals/`. If none exist, use `docs/mockups/`.264. Create the mockup at `<repo>/docs/mockups/<feature-name>/mockup.html`2728### Create the mockup2930Create a **single self-contained HTML file** with all CSS inline. No external dependencies, no build steps.3132### Style guide3334Match the visual style of the product being mocked up. If the user specifies a product or brand, replicate its look (colors, spacing, typography). If no specific product is mentioned, use a clean dark theme as a sensible default:3536| Token | Value |37|-------|-------|38| Background (page) | `#0d1117` |39| Background (surface) | `#161b22` |40| Background (overlay) | `#21262d` |41| Text (primary) | `#e6edf3` |42| Text (secondary) | `#9198a1` |43| Text (muted) | `#7d8590` |44| Border | `#30363d` |45| Blue | `#4493f8` |46| Green | `#3fb950` |47| Red | `#f85149` |48| Yellow | `#d29922` |49| Purple | `#a371f7` |50| Font stack | `-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif` |5152Use inline SVGs for icons. Do not reference external icon libraries or CDNs.5354### Comparing multiple options5556When showing alternatives, use a tabbed layout:5758```html59<!-- Sticky nav -->60<div class="option-nav">61 <button class="option-btn active" onclick="show('a')">A. Option name</button>62 <button class="option-btn" onclick="show('b')">B. Option name</button>63</div>6465<!-- Each option in its own section -->66<div class="mockup-section active" id="section-a">67 <!-- mockup content -->68 <!-- pros/cons narrative INSIDE this div -->69</div>70<div class="mockup-section" id="section-b">71 <!-- mockup content -->72 <!-- pros/cons narrative INSIDE this div -->73</div>7475<script>76function show(id) {77 document.querySelectorAll('.mockup-section').forEach(s => s.classList.remove('active'));78 document.querySelectorAll('.option-btn').forEach(b => b.classList.remove('active'));79 document.getElementById('section-' + id).classList.add('active');80 event.target.classList.add('active');81}82</script>83```8485Key rules:86- Narrative blocks (pros/cons) go **inside** each `.mockup-section`, not outside87- Only one section visible at a time via CSS (`display:none` / `display:block`)88- Use realistic data, not placeholder text8990### Preview locally9192After creating the file, always open it in the browser automatically:9394```bash95open <repo-path>/docs/mockups/<feature-name>/mockup.html # macOS96xdg-open <repo-path>/docs/mockups/<feature-name>/mockup.html # Linux97```9899## Phase 2: Iterate100101All changes stay local. Do not push to the remote until the user explicitly asks to deploy or push.1021031. Edit the HTML file based on user feedback1042. **Always re-open in browser after each change** so the user can see updates immediately1053. Common iteration patterns:106 - Adding/removing/reordering options107 - Adding pros/cons narrative below each option108 - Tweaking layout, spacing, colors109 - Fixing visual bugs reported via screenshots110111**Important:** Do not `git commit`, `git push`, or create PRs during this phase. The user will tell you when they are ready.112113## Phase 3: Deploy for sharing114115Only start this phase when the user explicitly asks to deploy, push, or share.116117### Confirm public visibility118119Before deploying, remind the user:120121> This will deploy the mockup to a **public URL**. Confirm the content is safe to share externally (see the Security section above).122123If the user has not acknowledged this, ask for confirmation before proceeding.124125### Choose a deployment target126127Ask the user where to deploy:128129- **GitHub Pages** (default): deploys via the repo's Pages site. Requires merging to main.130- **Vercel**: deploys instantly via `vercel deploy --prod`. No PR or merge required.131132If the user has already stated a preference (e.g., "deploy to Vercel"), skip the prompt.133134### Option A: GitHub Pages1351361. **Ensure GitHub Pages is enabled** on the target repo:137 ```bash138 gh api repos/<owner>/<repo>/pages --jq '.html_url'139 # If not enabled:140 gh api repos/<owner>/<repo>/pages -X POST -f source='{"branch":"main","path":"/"}'141 ```1421432. **Add a README.md** in the mockup directory with a summary of the states/options.1441453. **Create branch, commit, push, PR, and merge** in one flow:146 ```bash147 git checkout -b <user>/mockup-<feature-name>148 git add docs/mockups/<feature-name>/149 git commit -m "Add <feature-name> mockup"150 git push origin <user>/mockup-<feature-name>151 gh pr create --title "<Feature> mockup" --body "..."152 # Wait for checks, then merge153 gh pr merge <number> --squash --delete-branch154 ```155156 The merge to main is required for Pages to deploy. Do not leave the PR open.1571584. **Open the live URL** in the browser after merge:159 ```bash160 PAGES_URL=$(gh api repos/<owner>/<repo>/pages --jq '.html_url')161 open "${PAGES_URL}docs/mockups/<feature-name>/mockup.html"162 ```163164### Option B: Vercel1651661. **Ensure the Vercel CLI is installed and authenticated:**167 ```bash168 vercel --version || npm install -g vercel169 vercel whoami # confirm logged in170 ```1711722. **Prepare the deploy directory.** Vercel serves `index.html` by default. Copy the mockup file so it works at the root URL:173 ```bash174 cp <repo-path>/docs/mockups/<feature-name>/mockup.html \175 <repo-path>/docs/mockups/<feature-name>/index.html176 ```1771783. **Deploy from the mockup directory:**179 ```bash180 cd <repo-path>/docs/mockups/<feature-name>181 vercel deploy --prod --yes182 ```1831844. **Clean up the temporary index.html** (keep `mockup.html` as the source of truth):185 ```bash186 rm <repo-path>/docs/mockups/<feature-name>/index.html187 ```1881895. **Open the live URL** in the browser. Vercel prints the production URL and alias on deploy. Open the alias URL (e.g., `https://<project>.vercel.app`).1901916. **Optionally commit and push** the mockup to the repo for project history. This is separate from the Vercel deploy and follows the same branch/PR/merge flow as GitHub Pages. Only do this if the user asks.192193## Security194195### Public visibility196197Both GitHub Pages and Vercel deploy content to **publicly accessible URLs** by default. Before deploying, confirm the mockup does not contain:198199- Real user data, PII, or production database content200- API keys, tokens, secrets, or credentials201- Internal-only URLs, hostnames, or infrastructure details202- Proprietary business logic or unreleased feature specifics that should stay confidential203204### Content guidelines205206- Use **synthetic, fictional data** in all mockups (fake usernames, placeholder repos, made-up org names)207- Do not embed real screenshots of internal tools unless cleared for public sharing208- Do not reference external CDNs, scripts, or stylesheets. All assets must be inline. This prevents supply-chain risks and ensures the file works offline.209210### Credential hygiene211212- The skill uses `gh` CLI and `vercel` CLI, which rely on locally stored auth tokens. These tokens are never written into mockup files.213- Do not hardcode tokens, passwords, or auth headers in any HTML, CSS, or JS within the mockup.214215## Guidelines216217- Single self-contained HTML file. No build tools, no npm, no frameworks.218- Save the mockup directly in the target repo's local clone from the start.219- Do not maintain two copies of the mockup (e.g., Desktop + repo). One file, one location.220- Do not push changes during iteration. Local only until the user says to deploy.221- Always auto-open the local file in browser during iteration.222- Always auto-open the live Pages URL after deploy.223- Use descriptive file and folder names (e.g., `user-profile-card`, not `mockup-1`).