readme-screenshots
v1.0.0앱을 실제로 띄워 고정된 뷰포트·테마로 화면을 캡처하고, docs/에 저장한 뒤 README에 상대경로 + 확대 링크 형태로 삽입하거나 갱신
설치
호출 이름/readme-screenshots:readme-screenshots
readme-screenshots
앱을 실제로 띄워서 찍은 화면을 README에 붙입니다. 캡처만 하고 끝나는 게 아니라, 파일 저장 규칙과 README 삽입 형식까지 한 스킬로 끝냅니다.
뭘 하는지
- 레포의 라우트를 훑고 어떤 화면을 넣을지 먼저 물어봅니다
- dev 서버를 띄우고, 로그에서 실제 포트를 읽고, 페이지가 로딩을 끝낼 때까지 기다립니다
- 뷰포트·devicePixelRatio·테마를 고정해서 캡처합니다 (
chrome-devtoolsMCP의emulate사용) - 찍은 이미지를 직접 열어보고 실명·토큰·사내 데이터가 찍혔는지 검사합니다
docs/<화면>-<테마>.png로 저장하고, README에 상대경로 + 확대 링크 형태로 삽입합니다
왜 이렇게 설계했나
캡처 조건을 고정하지 않으면 다음 갱신 때 깨진다
창 크기에 따라가는 캡처는 매번 다른 해상도로 나옵니다. 반년 뒤 UI가 바뀌어 스크린샷만 갈아끼우면, 이미지 비율이 달라져 README 레이아웃이 틀어집니다.
그래서 resize_page 대신 emulate viewport: "1440x900x2"를 씁니다. 창 크기와 무관하게 같은 픽셀이 나오고, 조건이 문서에 문자열로 남아 다음 사람이 그대로 재현할 수 있습니다.
colorScheme을 호출한 것과 테마가 바뀐 것은 다르다
다크 모드 캡처의 실패는 대부분 여기서 납니다. prefers-color-scheme만 보는 앱이면 emulate colorScheme: "dark" 한 줄로 끝나지만, localStorage나 <html class="dark">로 테마를 관리하는 앱(Tailwind 기본 설정이 그렇습니다)에는 아무 영향이 없습니다. 호출은 성공하고 이미지는 라이트 모드로 나옵니다.
절차에 토글 클릭 → 저장소 직접 세팅 폴백 사다리를 넣고, 마지막에 이미지를 열어 눈으로 확인하는 단계를 못 박았습니다. 도구 호출의 성공을 결과의 성공으로 치지 않습니다.
스크린샷은 코드 리뷰를 안 거친다
.ts 파일에 사내 테이블 이름이 들어가면 리뷰에서 걸립니다. PNG에 그게 찍혀 있으면 아무도 못 봅니다. 그런데 레포가 공개되면 똑같이 공개되고, 이미지는 git 히스토리에서 지우기가 더 번거롭습니다.
그래서 저장 전에 검사 항목을 명시적으로 나열했습니다 — 실명, 이메일, 토큰, 사내 도메인, 티켓 ID, 그리고 의외로 자주 찍히는 /Users/<이름>/ 경로. 로그인 화면은 시드 계정으로만 찍게 했습니다.
절대경로 raw 링크는 포크에서 죽는다
GitHub 웹 에디터로 이미지를 붙이면 /owner/repo/raw/main/docs/hero.png 형태가 생깁니다. 지금은 잘 보이지만 레포 이름을 바꾸거나 누가 포크하면 원본 레포를 가리킨 채 남습니다.
./docs/hero.png 상대경로는 브랜치, 포크, 로컬 마크다운 뷰어에서 전부 동작합니다. 이미지를 같은 경로 링크로 감싸서 클릭하면 원본을 볼 수 있게 하는 것까지가 한 세트입니다.
갱신은 덮어쓰기다
UI가 바뀔 때마다 hero-v2.png, hero-new.png가 쌓이면 docs/만 봐서는 어느 게 현재 화면인지 알 수 없고, README도 매번 고쳐야 합니다. 같은 파일명에 덮어쓰면 마크다운은 손댈 필요가 없습니다.
앱이 안 뜨면 멈춘다
README의 스크린샷은 "설치하면 이렇게 나옵니다"라는 주장입니다. 앱을 못 띄웠는데 디자인 시안이나 예전 이미지로 채우면 그 주장이 거짓이 되고, 검증되지 않았다는 사실이 문서에서 사라집니다. 못 띄운 이유를 보고하고 멈춥니다.
쓰는 법
README에 스크린샷 넣어줘
화면 캡처해서 문서에 붙여줘
라이트/다크 모드 둘 다 찍어서 README 갱신해줘
UI 바뀌었으니까 스크린샷 다시 찍어줘
필요한 것
chrome-devtoolsMCP — 캡처에 씁니다. 없으면 설치 안내부터 합니다- 브라우저에서 뜨는 앱과 dev 실행 스크립트
파일
| 파일 | 역할 |
|---|---|
SKILL.md |
절차 — 화면 합의 → 기동 → 캡처 조건 고정 → 내용 검사 → 저장 → README 삽입 → 검증 |
template.md |
README 삽입 형식 — 라이트/다크 쌍, 캡션형, 데스크톱+모바일 표 |
에이전트가 읽는 절차 — SKILL.md
설치하면 Claude가 실행 중에 참조하는 실제 문서다. 아래 내용이 그대로 동작을 결정한다.
README Screenshots
Overview
돌아가는 앱을 실제로 띄워서 찍은 화면을 README에 붙인다. 목적은 "이미지가 있다"가 아니라 읽는 사람이 설치 전에 이 프로젝트가 뭔지 알게 하는 것이다.
핵심 원칙 네 가지:
- 찍기 전에 목록을 합의한다. 어떤 화면을, 몇 장, 어떤 테마로 넣을지 먼저 정한다. 다 찍고 나서 고르면 앱을 두 번 띄우게 된다.
- 캡처 조건을 고정한다. 뷰포트·devicePixelRatio·테마·스크롤 위치를 매번 같은 값으로 못 박는다. 조건이 흔들리면 다음 갱신 때 이미지 크기가 달라져 README 레이아웃이 깨진다.
- 화면에 뜬 것도 커밋되는 것이다. 스크린샷은 코드 리뷰를 안 거치고 레포에 들어간다. 실명·이메일·토큰·사내 데이터·절대 홈 경로가 찍혔으면 그대로 공개된다.
- 추가가 아니라 갱신. 이미 스크린샷이 있으면 같은 파일명으로 덮어쓴다.
hero-v2.png를 옆에 붙이면 어느 게 현재 UI인지 아무도 모른다.
When to Use
- README에 프로젝트 화면 스크린샷을 처음 넣을 때
- UI가 바뀌어서 README에 박힌 스크린샷이 낡았을 때
- 데모 링크는 있지만 README만 보고 넘어가는 사람에게 결과물을 보여줘야 할 때
Not for: UI 변경의 before/after를 PR 리뷰용으로 남기는 것(그건 문서가 아니라 증빙이다), 브라우저에서 안 돌아가는 CLI·라이브러리(대신 --help 출력이나 터미널 asciicast를 쓴다), 로그인 뒤 실데이터 화면(4단계 참고 — 시드 계정 없이 찍지 않는다).
절차
1. 넣을 화면을 먼저 정한다
레포를 훑어 라우트 목록(app/, pages/, 라우터 정의)과 테마 토글 여부를 파악한 뒤, AskUserQuestion으로 확인받는다. 넘겨짚고 다 찍지 않는다.
물어볼 것:
| 항목 | 기본값 |
|---|---|
| 찍을 화면 | 홈 1장 + 대표 상세/기능 화면 1 |
| 테마 | 다크 모드가 구현돼 있으면 라이트/다크 쌍, 아니면 1장 |
| 뷰포트 | 데스크톱 1440x900. 모바일은 반응형이 이 프로젝트의 셀링 포인트일 때만 추가 |
| 전체 페이지 여부 | 기본 뷰포트 캡처. fullPage는 세로로 길어져 README에서 읽히지 않으므로 요청이 있을 때만 |
2. 앱을 띄우고, 준비됐는지 확인하고 나서 찍는다
package.json의 dev 스크립트를 읽어 실행하고(run_in_background), 로그에서 실제 포트를 읽는다. 3000을 가정하지 않는다 — 이미 쓰이고 있으면 조용히 3001로 뜬다.
npm run dev (background) → 로그의 "Local: http://localhost:PORT" 확인
new_page로 열고, wait_for로 페이지의 실제 텍스트가 나타날 때까지 기다린다. 로딩 스피너나 빈 화면을 찍는 실패는 여기서만 막을 수 있다. list_console_messages로 치명적 에러가 없는지도 본다 — 에러난 화면을 README에 박으면 안 된다.
앱이 안 뜨면 거기서 멈춘다. 목업을 만들거나, 이전 스크린샷을 재활용하거나, 디자인 파일을 캡처해서 대신 넣지 않는다. 왜 못 띄웠는지 보고한다.
3. 캡처 조건을 고정한다
emulate로 뷰포트와 테마를 한 번에 못 박는다. 창 크기에 의존하는 resize_page보다 재현성이 높다.
emulate viewport: "1440x900x2" # 데스크톱, 2x (레티나 선명도)
emulate viewport: "390x844x3,mobile" # 모바일 (필요할 때만)
emulate colorScheme: "dark" | "light"
테마는 colorScheme 하나로 끝나지 않을 수 있다. 앱이 prefers-color-scheme만 보면 이걸로 충분하지만, localStorage나 <html class="dark">로 관리하면 반영되지 않는다. 다음 순서로 시도하고, 캡처 결과를 눈으로 확인해 실제로 테마가 바뀌었는지 검증한다.
emulate colorScheme→ 스크린샷 확인- 안 바뀌면 UI의 테마 토글 버튼을
click - 그래도 안 되면
evaluate_script로 앱이 쓰는 저장소를 직접 세팅하고 새로고침
찍기 직전에 스크롤을 맨 위로 올리고, 마우스가 얹혀 hover 상태로 남은 요소가 없는지 확인한다. 애니메이션이 있으면 끝날 때까지 기다린다 — 중간 프레임이 찍히면 흐릿한 이미지가 나온다.
4. 화면에 뜬 내용을 검사한다
캡처한 이미지를 직접 Read해서 눈으로 본다. 아래가 보이면 그 화면은 못 쓴다.
- 실명, 실제 이메일 주소, 전화번호, 프로필 사진
- 토큰·API 키·세션 값이 노출된 화면(디버그 패널, 개발자 도구 열린 상태)
- 사내 시스템 이름, 실제 테이블/버킷/큐 이름, 티켓 ID, 사내 도메인
- 브라우저 주소창이나 터미널이 함께 찍혀 나온
/Users/<이름>/경로 - 깨진 이미지 자리표시자, 로딩 스켈레톤, 에러 토스트
로그인이 필요한 화면은 시드 데이터나 데모 계정으로만 찍는다. 본인 실계정으로 찍은 화면은 README에 넣지 않는다.
5. 파일로 저장한다
- 위치:
docs/(없으면 만든다). 레포에assets/나.github/관례가 이미 있으면 그걸 따른다 - 이름:
<화면>-<테마>.png—hero-light.png,hero-dark.png,skill-detail-light.png. kebab-case, 순번(1.png) 금지 — 순서가 바뀌면 이름이 거짓말이 된다 - 형식: PNG. 스크린샷에 사진이 많이 섞였고 500KB를 넘으면
format: "webp", quality: 85로 다시 찍는다 - 용량: 장당 500KB를 넘으면 줄인다.
sips -Z 2880 docs/hero-light.png로 긴 변을 제한하는 게 가장 간단하다. 레포에 5MB짜리 PNG를 넣으면 clone 하는 모든 사람이 그 비용을 낸다
6. README에 넣는다
template.md의 골격을 따른다. 형식 규칙:
[](./docs/hero-light.png)
- 상대경로(
./docs/...)를 쓴다. GitHub 웹 에디터가 만드는/owner/repo/raw/main/...절대경로는 레포 이름이 바뀌거나 포크되면 깨진다. 상대경로는 브랜치·포크·로컬 뷰어에서 모두 산다 - 이미지를 링크로 감싼다. README 본문에서는 축소돼 보이므로, 클릭하면 원본으로 열리게 한다
- alt text는 화면 이름으로 쓴다. "스크린샷", "이미지 1"은 스크린리더 사용자에게 아무것도 알려주지 않는다
- 위치는 프로젝트 한 줄 소개 바로 다음, 설치 안내 앞. 설치법 아래로 내려가면 "설치할지 말지" 판단하는 시점에 안 보인다
- 라이트/다크 쌍은 나란히 놓는다. 마크다운에서 두 이미지를 같은 줄에 쓰면 옆으로 붙는다
7. 갱신할 때
기존 스크린샷 섹션이 있으면 파일명을 그대로 두고 이미지만 덮어쓴다. README 마크다운은 손댈 필요가 없다. 화면 구성 자체가 바뀌어 파일이 늘거나 줄 때만 마크다운을 고치고, 없어진 화면의 png는 지운다.
검증
커밋 전에 확인한다. 하나라도 못 하면 그 항목을 못 했다고 말한다.
- 저장된 png를 Read해서 실제로 열리는지, 의도한 화면·테마인지 확인했다
- 4단계 항목 중 화면에 찍힌 게 없다
- 장당 500KB 이하다 (
du -h docs/*.png) - README의 이미지 경로가 실제 파일과 일치한다 (
grep -o 'docs/[^)]*\.png' README.md | sort -u | xargs ls) - 백그라운드로 띄운 dev 서버를 종료했다
Common Mistakes
- 화면 목록을 안 정하고 다 찍는다 — 앱을 두 번 띄우게 되고, README는 스크린샷 갤러리가 된다
- 로딩 중인 화면을 찍는다 —
wait_for없이new_page직후 캡처한 결과. 스피너가 박힌 README가 나온다 - 테마가 바뀐 걸 확인 안 한다 —
emulate colorScheme을 호출했다고 앱이 반응한 건 아니다. 이미지를 봐야 안다 - 앱이 안 떠서 목업이나 옛날 이미지로 대체한다 — README의 스크린샷은 "실제로 이렇게 나온다"는 주장이다. 못 띄웠으면 못 띄웠다고 한다
- 실계정 화면을 찍는다 — 레포는 공개될 수 있고, git 히스토리에서 지우기 어렵다
- 절대경로 raw 링크를 써서 포크에서 깨지게 만든다
- 낡은 스크린샷을 지우지 않고 새 파일을 옆에 추가한다
- 최적화 없이 수 MB짜리 PNG를 커밋한다