Skill
Use when someone wants to visually review or capture their running web app across many pages at once — for design QA, a pre-launch or pre-demo look-over, a redesign or restyle check, or handing screens to a designer for feedback. Triggers on requests to screenshot, capture, or grab shots of every route/page/view/screen of a site or app (Next.js, Remix, React Router, SvelteKit, Astro, Vite, or a monorepo of apps) and collect them into one scrollable gallery to browse and comment on — typically full-page, at desktop and mobile widths, including dynamic routes and auth-gated pages. Not for single-page screenshots, component/Storybook shots, native iOS/Android/Expo app captures, Figma exports, terminal captures, or visual-diff regression tests.From its SKILL.md
npx -y skills add JanKups/screen-list --skill skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.5 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
screen-list
Detect a web project's shape, screenshot its rendering routes (auth included, two viewports, optional interaction states), and generate a self-contained comment-review gallery.
Mode selection (do this first)
Glob for **/screenshots.config.jsonc (depth ≤ 3, skip node_modules).
- Found → the project is already set up → Capture mode.
- Not found → Setup mode.
Setup mode
Discover, propose, and confirm at each step — never assume. Ask questions in one batch where noted.
- Detect project shape. Monorepo if the root
package.jsonhasworkspaces, orpnpm-workspace.yaml/turbo.json/lerna.jsonexists → expand workspace globs. A package is a candidate part iff itspackage.jsonhas adevorstartscript AND a web-framework dep (next,@remix-run/*/react-router,@sveltejs/kit,astro, orvite+ anindex.html). A single app is one part. Detect each part's port from its dev script (-p/--port/PORT=) else the framework default (next 3000, vite 5173, astro 4321, remix 3000, sveltekit 5173); conflicts across parts → ask. Zero candidates → say what you looked for and ask for the app dir. - Ask which part(s) if more than one candidate (multi-select).
- Crawl routes for each chosen part per references/route-discovery.md.
- ONE batched question: list every dynamic route with a suggested sample
value, plus the proposed non-rendering exclusions (
api/,*callback*, redirect-only routes, etc.) pre-checked. User supplies/edits sample values and unchecks any exclusion to keep. - Auth probe + setup per references/auth-setup.md:
probe each part for an auth wall, then run the strategy Q&A (
none/credentials/manual-session/header). Ask for env-var names, never the secret values themselves. Write a.screenshots-auth/secrets.envtemplate with the named keys left blank (SR_WEB_PASSWORD=) and have the user fill in the actual values — never solicit or type a secret into the config or your own output. - Propose the output location (default
screenshots/at repo root) and confirm before creating it. - Scaffold the folder by copying everything from
assets/into it —capture.mjs,generate.mjs,package.json,README.md,screenshots.config.jsonc, andgitignorerenamed to.gitignoreon copy. - Fill the config from what you discovered (parts, servers, routes, params, auth). Field reference: references/config-reference.md.
npm installinside the output folder (Playwright installs local to it; the host lockfile is never touched).- Log in as part of the same flow for any
manual-sessionpart: runnode capture.mjs --login <part>yourself with the Bash tool in the background — never ask the user to open a second terminal. It opens a headed browser and exits on its own: with asuccess/gateSignalconfigured it detects the logged-in page and saves the session automatically; otherwise the user closes the browser window when done (the session is snapshotted continuously, so a window close never loses it). Tell the user a browser window has opened and to complete the login there, wait for the command to exit, then continue straight to the next step. - CONFIRM with the user before the first capture. This is mandatory.
- Capture:
node capture.mjs(it runsgenerate.mjsautomatically). - Report the gallery path and how to open it (
open screenshots/gallery.html).
Capture mode
- Read the config.
- Drift check (before every run): re-crawl routes for the parts in config and
diff by route
pathonly.- Added routes → propose appending each with the next
NNand an auto-generated name (dynamic ones get the sample-value question). - Removed routes → flag and propose removal; never auto-delete.
- User-owned fields (
name,params,states,settle,auth, order) are never touched — the diff is on route existence only. - User declines → proceed with the config as-is and note the skipped drift in the report.
- Added routes → propose appending each with the next
- Resolve the conversational target to
capture.mjsflags:- "re-shoot admin" →
--part admin - "just the /dashboard subtree" →
--route "/dashboard/**" - "only mobile" →
--viewport mobile; "only the modal-open state" →--state modal-open - refresh an expired login →
--login <part>(run it in the background yourself as in Setup step 10, then rerun the capture — one flow) No target → runnode capture.mjs(everything). Partial runs merge into the existing manifest, so the gallery keeps every route.
- "re-shoot admin" →
- Run
node capture.mjs [flags](regenerates the gallery unless--no-gallery). - Report captured / gated / errored counts and the gallery path.
Hard rules
- Discover, then confirm — never assume.
- Never clobber user edits to the config; drift updates are offered, applied only on approval.
- Secrets never go in the config file — only env-var names. Secrets live in
.screenshots-auth/(gitignored). - Never handle secret values yourself. Ask only for env-var names; write a
blank-valued
secrets.envtemplate and have the user fill in the actual values. A password must never pass through your output or the conversation. - Stop only servers this run started.
- Unconfigured auth gate → capture the public routes, flag the gated ones in the gallery; never silently drop them.
- Storybook detected → say it's out of scope for v1 and continue with the app routes.
What ships with it: 9 files
109.7 KB alongside SKILL.md, 2 of them executable
assets/
- capture.mjsruns47.4 KB
- generate.mjsruns33.1 KB
- gitignore684 B
- package.json330 B
- README.md3.5 KB
- screenshots.config.jsonc5.5 KB
references/
- auth-setup.md7.5 KB
- config-reference.md8.2 KB
- route-discovery.md3.5 KB