Skip to main content
skill CX Codex

screenshot · bobmatnyc — Claude Code skill: what it does, how to install

This skill sets up screenshot checks for UI changes across desktop, tablet, and mobile. Use it when a pull request needs visible proof of the result.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add bobmatnyc/claude-mpm-skills --skill screenshot -a claude-code
Open on GitHub

What screenshot does

The skill defines a visual review flow for interface changes. It calls for screenshots at 1920x1080, 768x1024, and 375x667, with room for full-page captures, component states, and before-and-after comparisons. The workflow also records responsive behavior for pull requests.

Screenshots can come from browser DevTools or scripts built with Playwright and Puppeteer. The Playwright route runs with node screenshot.js; visual regression examples use @playwright/test. That script opens http://localhost:3000, so the page must be reachable there before capture starts.

A pull request can include the images alongside notes about layout, menus, touch targets, and interaction states. Reviewers can inspect the result without starting the project locally. The same files can document a bug fix over time.

What it helps with

  • check a UI at desktop, tablet, and mobile sizes
  • compare a layout before and after a fix
  • capture hover, active, error, and loading states
  • spot responsive overflow and breakpoint issues
  • attach visual evidence to a pull request

Example prompts for the agent

  • Check the UI at 1920x1080, 768x1024, and 375x667, then prepare screenshots for the pull request.
  • Run node screenshot.js and compare the desktop and mobile output.
  • Create a visual regression test for the homepage with @playwright/test.

How to install screenshot

1Skills CLI (Vercel)

npx skills add bobmatnyc/claude-mpm-skills --skill screenshot -a claude-code

2Manually: put the files in place

~/.claude/skills/screenshot/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/screenshot/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about screenshot

How do I install screenshot in Claude Code?

Run npx skills add bobmatnyc/claude-mpm-skills --skill screenshot -a claude-code, then use ~/.claude/skills/screenshot/SKILL.md.

What does screenshot do?

It gives the agent a screenshot-based UI verification workflow. The process covers viewport checks, interaction states, and visual evidence for pull requests.

Which viewport sizes does it use?

The workflow uses 1920x1080 for desktop, 768x1024 for tablet, and 375x667 for mobile.

Source text

SKILL.md · MIT
---
name: screenshot
description: "Visual verification workflow for UI changes to accelerate code review and catch ..."
user-invocable: false
disable-model-invocation: true
version: 1.0.0
tags: []
progressive_disclosure:
  entry_point:
    summary: "Visual verification workflow for UI changes to accelerate code review and catch ..."
    when_to_use: "When working with screenshot or related functionality."
    quick_start: "1. Review the core concepts below. 2. Apply patterns to your use case. 3. Follow best practices for implementation."
---
# Screenshot-Based UI Verification

Visual verification workflow for UI changes to accelerate code review and catch responsive design issues early.

## When to Use This Skill

Use this skill when:
- Making any UI changes (components, styling, layout)
- Implementing responsive design
- Creating pull requests with visual changes
- Want to demonstrate UI behavior without reviewers running code locally
- Need to document visual state before/after bug fixes

## Why Screenshot Verification Matters

### Benefits
- **Faster Reviews**: Reviewers see changes instantly without local setup
- **Documents Design**: Creates visual record of design decisions
- **Visual Changelog**: Historical record of UI evolution
- **Catches Responsive Issues**: Early detection of mobile/tablet problems
- **Reduces Communication**: Less back-and-forth about visual changes
- **Quality Gate**: Forces conscious review of visual output

### Problems It Solves
- ❌ "I can't reproduce the layout issue locally"
- ❌ "What does this look like on mobile?"
- ❌ "Is this the intended design?"
- ❌ "How does this compare to the old version?"
- ✅ All answered with screenshots in PR

## Required Screenshots

For any PR that changes UI, capture all three viewport sizes:

### 1. Desktop View (1920x1080)
- Full page screenshot
- Key component close-ups if needed
- Before and after comparisons (for fixes/refactors)
- Different states (default, hover, active, error, loading)

### 2. Tablet View (768x1024)
- Portrait orientation
- Verify responsive breakpoints
- Touch interaction targets visible
- Menu/navigation in tablet mode

### 3. Mobile View (375x667)
- Portrait orientation (iPhone 8/SE size - common minimum)
- Touch target sizes visible (minimum 44x44px)
- Scrolling behavior documented
- Mobile menu states

## How to Capture Screenshots

### Browser DevTools Method

**Chrome/Edge DevTools**:
1. Open DevTools (F12 or Cmd+Option+I)
2. Toggle device toolbar (Cmd+Shift+M or Ctrl+Shift+M)
3. Select device preset or custom dimensions:
   - Desktop: 1920 x 1080
   - Tablet: 768 x 1024
   - Mobile: 375 x 667
4. Capture screenshot:
   - Full page: Cmd+Shift+P → "Capture full size screenshot"
   - Viewport only: Cmd+Shift+P → "Capture screenshot"

**Firefox DevTools**:
1. Open DevTools (F12)
2. Toggle Responsive Design Mode (Cmd+Option+M)
3. Set dimensions
4. Click screenshot icon in toolbar

### CLI Screenshot Tools

**Using Playwright** (recommended for CI):
```javascript
// screenshot.js
const { chromium } = require('playwright');

async function captureScreenshots(url) {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  await page.goto(url);

  // Desktop
  await page.setViewportSize({ width: 1920, height: 1080 });
  await page.screenshot({
    path: 'screenshots/desktop.png',
    fullPage: true
  });

  // Tablet
  await page.setViewportSize({ width: 768, height: 1024 });
  await page.screenshot({
    path: 'screenshots/tablet.png',
    fullPage: true
  });

  // Mobile
  await page.setViewportSize({ width: 375, height: 667 });
  await page.screenshot({
    path: 'screenshots/mobile.png',
    fullPage: true
  });

  await browser.close();
}

captureScreenshots('http://localhost:3000');
```

Run: `node screenshot.js`

**Using Puppeteer**:
```javascript
// screenshot.js
const puppeteer = require('puppeteer');

async function captureScreenshots(url) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto(url, { waitUntil: 'networkidle2' });

  // Desktop
  await page.setViewport({ width: 1920, height: 1080 });
  await page.screenshot({
    path: 'screenshots/desktop.png',
    fullPage: true
  });

  // Tablet
  await page.setViewport({ width: 768, height: 1024 });
  await page.screenshot({
    path: 'screenshots/tablet.png',
    fullPage: true
  });

  // Mobile
  await page.setViewport({ width: 375, height: 667 });
  await page.screenshot({
    path: 'screenshots/mobile.png',
    fullPage: true
  });

  await browser.close();
}

captureScreenshots('http://localhost:3000');
```

## PR Description Template

Use this template to document visual changes:

```markdown
## Visual Changes

### Desktop (1920x1080)
![Desktop view](./screenshots/desktop.png)

**Key changes**:
- Updated header navigation layout
- Improved spacing between sections
- Added hover states to buttons

### Tablet (768x1024)
![Tablet view](./screenshots/tablet.png)

**Key changes**:
- Stacked layout for sidebar
- Touch-friendly button sizes (48x48px)
- Adjusted typography for readability

### Mobile (375x667)
![Mobile view](./screenshots/mobile.png)

**Key changes**:
- Hamburger menu replaces horizontal nav
- Single column layout
- Bottom sticky CTA button

### Before/After Comparison

#### Before (Bug)
![Before fix](./screenshots/before-mobile.png)

**Issue**: Text overflowing container on mobile

#### After (Fixed)
![After fix](./screenshots/after-mobile.png)

**Fix**: Applied word-wrap and max-width constraints

### Interaction States

#### Default State
![Default](./screenshots/state-default.png)

#### Hover State
![Hover](./screenshots/state-hover.png)

#### Active/Selected State
![Active](./screenshots/state-active.png)

#### Error State
![Error](./screenshots/state-error.png)

#### Loading State
![Loading](./screenshots/state-loading.png)

## Responsive Design Notes
- Breakpoints: 768px (tablet), 375px (mobile)
- All touch targets > 44x44px
- Text remains readable at all sizes (min 16px body)
- No horizontal scrolling on any viewport
- Images scale proportionally

## Accessibility Checks
- [ ] Keyboard navigation works
- [ ] Focus states visible
- [ ] Color contrast meets WCAG AA (4.5:1)
- [ ] Alt text on images
- [ ] ARIA labels where needed
```

## Automated Screenshot Testing

### Using Playwright Test

```javascript
// tests/visual.spec.js
const { test, expect } = require('@playwright/test');

test.describe('Visual Regression', () => {
  test('homepage looks correct on desktop', async ({ page }) => {
    await page.goto('http://localhost:3000');
    await page.setViewportSize({ width: 1920, height: 1080 });
    await expect(page).toHaveScreenshot('homepage-desktop.png');
  });

  test('homepage looks correct on mobile', async ({ page }) => {
    await page.goto('http://localhost:3000');
    await page.setViewportSize({ width: 375, height: 667 });
    await expect(page).toHaveScreenshot('homepage-mobile.png');
  });
});
```

Run: `npx playwright test --update-snapshots` (first time to generate baselines)

### Using Storybook + Chromatic

For component-level visual testing:

1. **Setup Storybook**:
```javascript
// Button.stories.jsx
export default {
  title: 'Components/Button',
  component: Button,
};

export const Primary = () => <Button variant="primary">Click me</Button>;
export const Secondary = () => <Button variant="secondary">Click me</Button>;
```

2. **Integrate Chromatic**:
```bash
npm install --save-dev chromatic
npx chromatic --project-token=<token>
```

3. **CI Integration** (GitHub Actions):
```yaml
# .github/workflows/chromatic.yml
name: Chromatic
on: push
jobs:
  chromatic:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx chromatic --project-token=${{ secrets.CHROMATIC_TOKEN }}
```

## Screenshot Checklist

Before submitting PR with UI changes:

### Capture Requirements
- [ ] Desktop screenshot (1920x1080) captured
- [ ] Tablet screenshot (768x1024) captured
- [ ] Mobile screenshot (375x667) captured
- [ ] All screenshots uploaded to PR
- [ ] Before/after comparison included (for bug fixes)

### Quality Checks
- [ ] Screenshots show full page (not cut off)
- [ ] No localhost URLs visible in screenshots
- [ ] No sensitive data in screenshots (PII, keys, etc.)
- [ ] Screenshots are clear and readable
- [ ] File names are descriptive (e.g., `desktop-homepage.png`)

### Documentation
- [ ] Key changes listed for each viewport
- [ ] Responsive behavior described
- [ ] Accessibility notes included
- [ ] Interaction states documented (if applicable)

## Common Issues and Solutions

### Issue: Screenshots Too Large
**Problem**: Screenshots are 5MB+ and slow to load in PR
**Solution**: Compress images before uploading
```bash
# Using ImageMagick
convert input.png -quality 85 output.png

# Using pngquant
pngquant input.png --output output.png
```

### Issue: Dynamic Content Changes Between Screenshots
**Problem**: Timestamps, random data make screenshots inconsistent
**Solution**: Mock data or freeze time in tests
```javascript
// Mock Date
const mockDate = new Date('2025-01-01T00:00:00Z');
jest.useFakeTimers();
jest.setSystemTime(mockDate);

// Or in Playwright
await page.addInitScript(() => {
  Date.now = () => 1704067200000; // Fixed timestamp
});
```

### Issue: Screenshot Diffs Show Font Rendering Differences
**Problem**: Same code renders differently on different OS
**Solution**: Use Docker for consistent environment
```dockerfile
FROM mcr.microsoft.com/playwright:v1.40.0-jammy
WORKDIR /app
COPY . .
RUN npm ci
CMD ["npm", "run", "screenshot"]
```

## Screenshot Organization

### Directory Structure
```
screenshots/
├── desktop/
│   ├── homepage.png
│   ├── product-list.png
│   └── checkout.png
├── tablet/
│   ├── homepage.png
│   ├── product-list.png
│   └── checkout.png
└── mobile/
    ├── homepage.png
    ├── product-list.png
    └── checkout.png
```

### Naming Convention
- Use descriptive names: `desktop-homepage-logged-in.png`
- Include state if relevant: `mobile-form-error-state.png`
- Version comparisons: `before-header-fix.png`, `after-header-fix.png`

## Integration with CI/CD

### GitHub Actions Example
```yaml
name: Visual Testing
on: pull_request

jobs:
  screenshots:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Build app
        run: npm run build

      - name: Start app
        run: npm start &

      - name: Wait for app
        run: npx wait-on http://localhost:3000

      - name: Capture screenshots
        run: node scripts/screenshot.js

      - name: Upload screenshots
        uses: actions/upload-artifact@v4
        with:
          name: screenshots
          path: screenshots/
```

## Best Practices

### Do's
- ✅ Capture all three viewport sizes
- ✅ Include before/after for bug fixes
- ✅ Document interaction states (hover, active, error)
- ✅ Compress large images
- ✅ Use descriptive file names
- ✅ Annotate screenshots with key changes

### Don'ts
- ❌ Skip mobile screenshots ("desktop only" is rare)
- ❌ Upload screenshots with sensitive data
- ❌ Use random viewport sizes (stick to standards)
- ❌ Forget to document responsive breakpoints
- ❌ Rely solely on screenshots (still need code review)

## Related Skills

- `universal-verification-pre-merge` - Pre-merge verification checklist
- `universal-testing-webapp-testing` - Web application testing patterns
- `toolchains-javascript-testing-playwright` - Playwright testing framework
- `universal-debugging-verification-before-completion` - Verification workflows

© bobmatnyc · MIT · bobmatnyc/claude-mpm-skills

Similar skills

Everything for Frontend and UI →

screenshot by other authors comes first.

screenshot nexu-io Captures app windows or pixel regions across operating systems. Useful for bug reports and design reviews. CX Codex +1 2,700installs screenshot zernie This skill renders local pages in Chromium and saves full-page desktop and mobile captures. Use it to inspect a landing page, report, or local dev server. CX Codex +1 337installs frontend-design official anthropics This skill guides intentional visual design for new interfaces and redesigns. Use it when a generic generated UI is not enough. 1,025,790installs design-taste-frontend Leonxlnx This skill directs the design of public pages and work screens, then checks the result in a browser through screenshots. Use it when an interface feels generic or unfinished. CX Codex +1 678,700installs prototype Matt Pocock Creates throwaway prototypes for checking state logic or exploring UI before committing the decision to the main codebase. 986,201installs hyperframes heygen-com Instructs coding agents on creating, validating, and rendering HTML-based videos using the HyperFrames framework and CLI. CX Codex +1 1,200,000installs hyperframes-cli heygen-com Controls HyperFrames video workflows from the CLI: audits layouts and contrast, edits timeline clips, captures snapshots, and renders locally or in cloud runtimes. CX Codex +1 1,300,000installs webapp-testing official anthropics This skill tests local web apps with Playwright, helping agents debug UI behavior, capture screenshots, and inspect browser logs. 186,758installs

From the same set97

kysely A skill that teaches your agent Kysely: types from schema to query result, migrations, transactions. Useful when an ORM gets in the way but untyped raw SQL is worse. CX Codex +1 389installs kubernetes A Kubernetes operations playbook for your agent: safe rollouts, health probes, resource sizing and fast kubectl triage. CX Codex +1 383installs systematic-debugging This skill guides an agent from reproducing a bug to checking the fix. Use it when an error or unexpected behavior has no clear cause. CX Codex +1 382installs vue A Vue 3 skill for your coding agent: Composition API, reactivity, single-file components, Vue Router, Pinia, TypeScript and Vite. Useful when the agent writes Vue frontend code. CX Codex +1 381installs api-documentation A set of rules that tells the agent how to write docstrings, JSDoc, Godoc and endpoint descriptions. Useful when several agents each carry their own copy of the same guidance. CX Codex +1 379installs root-cause-tracing This skill follows a failure up the call chain to its original trigger. Use it when a stack trace is long or the source of a value is unclear. CX Codex +1 373installs software-patterns Compares tradeoffs between architectural patterns and points to the one that fits your problem: coupling, resilience, service boundaries. Useful when code resists testing. CX Codex +1 373installs nextjs-v16 A skill that walks a project through the Next.js 16 migration: async request APIs, opt-in caching with "use cache", Turbopack. Useful when upgrading an existing app. CX Codex +1 371installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor