Showcase capture
Use this skill when someone wants screenshots, a GIF or a WebM walkthrough of a web project. The tool runs Playwright against a local or live site, follows a declarative scenario, and writes a README and gallery.
What it produces
screens/*.pngREADME.mdwith the screenshots and captionsindex.htmlgalleryshowcase.jsonmanifest- optional
*.gif - optional
*.webm
Install
From the skill directory:
node scripts/install.mjs
From the npm package:
npx showcase-capture install
Or manually:
npm install
npm run build
npx playwright install chromium
Check the environment:
npx showcase-capture doctor
Workflow
-
Inspect the project.
- Framework and dev command.
- Build output directory for static sites.
- Routes and key screens.
- Authentication flow and test user.
- Seed or reset mechanism, usually localStorage or cookies.
- The 5 to 8 screens that best explain the product.
- One end-to-end flow for the GIF and WebM.
-
Write
showcase.config.yaml.- Use a static, command or live URL server.
- Use roles and accessible names before CSS selectors.
- Add a
resetblock so every scene starts from a known state. - Use
maskfor emails, tokens, names and payment details. - Keep the GIF flow short: 20 to 40 seconds.
-
Validate the scenario. This checks the scenes and the GIF flow.
npx showcase-capture check
- Capture.
npx showcase-capture capture
-
Review the output.
- Open
README.mdandindex.html. - Check the GIF and WebM.
- Fix missing selectors, bad crops or timing.
- Re-run with
--only <scene>while iterating.
- Open
-
Commit the config and the generated output.
Config example
name: LaunchPad
baseUrl: http://localhost:5173
outDir: docs/showcase
server:
mode: command
command: npm run dev
url: http://localhost:5173
reset:
localStorage:
- launchpad.demo.v2
context:
locale: en-ZA
timezoneId: Africa/Johannesburg
fixedTime: "2026-11-09T09:00:00+02:00"
reducedMotion: reduce
viewports:
desktop: { width: 1440, height: 900 }
mobile: { width: 390, height: 844 }
scenes:
- name: desktop
viewport: desktop
steps:
- goto: /
- waitFor: h1
- screenshot: 01-home
- goto: /login
- waitFor: form
- click:
role: button
name: Continue as test user
- waitForUrl: "#/app/dashboard"
- screenshot: 06-dashboard
- name: mobile
viewport: mobile
steps:
- goto: /login
- waitFor: form
- click:
role: button
name: Continue as test user
- waitForUrl: "#/app/dashboard"
- screenshot: 21-mobile-dashboard
gif:
viewport: { width: 1024, height: 640 }
size: { width: 960, height: 600 }
fps: 8
steps:
- goto: /
- caption: [1, Discover, "Learn, match and book in one place"]
- wait: 600
- scroll: 660
- goto: /learn
- caption: [1, "Explore six practical modules", "Built around real freelance questions"]
video:
enabled: true
size: { width: 1280, height: 720 }
Server modes
Static site:
server:
mode: static
dir: dist
spa: true
Dev server:
server:
mode: command
command: npm run dev
url: http://localhost:5173
Live URL:
server:
mode: none
baseUrl: https://example.com
Optional build step before serving:
build: npm run build
Overlay
The GIF overlay is optional. Use it to match the project brand or move the caption away from important content.
overlay:
background: "rgba(8, 20, 38, 0.93)"
accent: "#5367e8"
font: "Inter, system-ui, sans-serif"
offsetX: 24
offsetY: 24
Set overlay.enabled: false to record the GIF without captions or cursor.
Step reference
goto: /pathwaitFor: h1orwaitFor: { role: heading, name: Dashboard }click: ".selector"orclick: { role: button, name: Continue }fill: { selector: "#email", value: "[email protected]" }press: Enterhover: ".card"waitForUrl: "#/app/dashboard"orwaitForUrl: { pattern: "/app/", flags: "i" }wait: 500scroll: 600orscroll: { selector: ".footer" }screenshot: 01-homescreenshot: { name: 01-home, fullPage: true }viewport: mobilecaption: [1, "Title", "Subtitle"](GIF flow only)reset: trueeval: "localStorage.setItem('key', 'value')"run: function(TypeScript or JavaScript config only)
TypeScript config
Use a TypeScript config when the scenario needs custom logic:
import { defineShowcase } from 'showcase-capture'
export default defineShowcase({
name: 'My project',
outDir: 'docs/showcase',
server: { mode: 'static', dir: 'dist' },
scenes: [
{
name: 'desktop',
steps: [
{ goto: '/' },
{
run: async ({ page }) => {
await page.evaluate(() => localStorage.setItem('theme', 'light'))
},
},
{ waitFor: 'h1' },
{ screenshot: '01-home' },
],
},
],
})
Privacy
- Do not capture admin screens, secrets, tokens or payment details.
- Use
maskfor emails, names and account data. - Use a test account with fictional data.
- Check the GIF and WebM before publishing.
- The tool does not upload anything.
Troubleshooting
Could not launch Chromium: runnpx playwright install chromiumor setCHROME_PATH.Server did not respond: check the command, port and URL. UsereuseExisting: trueif the dev server is already running.waitFortimes out: prefergetByRoleselectors, check the page title, or add await.- GIF is too long: shorten the steps, lower
fps, or reduce the viewport. - WebM is missing: check that
video.enabledis true and agifflow exists. - Screenshots are wrong size: set the viewport in the scene or config.