designpaca/packages/skill/references/galleries.md
Yun Chan 4e1e5f0073
All checks were successful
ci / build (push) Successful in 25s
release / release (push) Successful in 46s
feat: 브리프 인터뷰 단계와 브라우저 도구를 넣고 온보딩 말투를 고친다
세 가지를 고친다. 전부 실제 사용에서 드러난 것이다.

1) 0단계에서 가정으로 채우던 것을 인터뷰로 바꾼다

   "꽃집 사이트 만들어보자"를 받고 업종 성격·목표 행동·톤·이름을 혼자 정했다.
   물어보니 넷 중 넷이 달랐다(일상 구독 → 하이엔드 스튜디오, 문의 하나 → 넷 다,
   톤 미정 → 에디토리얼, 이름 지어냄 → 목요일의 화원).
   그대로 갔으면 레퍼런스 세 개를 전부 틀린 방향에서 골랐다.

   SKILL.md 0단계에 질문 도구로 한 번에 묻는 절차를 넣었다. 무엇을 묻고
   무엇을 묻지 않는지, 답이 모순될 때 어떻게 정리하는지까지 적었다.

2) 레퍼런스가 막히면 브라우저를 띄운다

   Aesop(403) → Kinto(404) → Hasami(DNS) → MUJI(타임아웃)로 네 번 왕복하고
   톤 레퍼런스를 하나도 못 얻었다. 좋은 레퍼런스일수록 봇을 막는다.
   galleries.md 에 headed 브라우저로 직접 열어 스크린샷과 실측값을 받는
   방법을 넣고, 접근 실패 2회면 바로 전환하도록 규칙을 세웠다.

   Playwright 를 선택 의존성으로 잡았다(core/tools.ts).
   - 온보딩 마지막에 설치 여부를 묻는다. 건너뛰어도 스킬은 동작한다
   - `designpaca tools` 로 상태 확인, `--yes` 로 설치
   - 수백 MB 라 --yes 없이는 상태만 보여준다
   - MCP 서버는 설치만 하고 등록 명령은 안내만 한다(에이전트 설정을
     대신 건드리지 않는다)

3) 온보딩 말투

   "이제 브리프를 던져라", "설치해라", "건너뛴다" — 사용자를 향한 문구가
   명령조였다. 스킬 문서의 단정한 반말은 의도지만 CLI UI 는 다르다.
   전부 존댓말로 바꾸고, 각 단계가 왜 필요한지 설명을 붙였다.
   명령조가 다시 섞이지 않도록 검사하는 테스트를 넣었다(테스트 22 → 25개).
2026-08-21 03:05:06 +09:00

11 KiB

galleries.md — 어디를 볼 것인가

레퍼런스 조사 단계에서 갤러리를 고르는 표다. 브리프를 표에 대입해 3곳을 정하고, 거기서 원본 사이트 URL을 확보한다.


1. 브리프 → 갤러리 라우팅

R1은 구조, R2는 톤, R3는 디테일을 가져올 소스다. R2는 반드시 R1과 다른 업종에서 고른다.

두 행에 동시에 걸리면 청중을 기준으로 고른다. "개발자용 API 모니터링 SaaS"는 SaaS · B2B개발자 도구 양쪽에 해당한다. 보는 사람이 엔지니어면 개발자 도구 행이다.

갤러리에서 원본 URL을 못 뽑으면 경쟁사·인접 제품을 직접 지목해도 된다. 갤러리는 발견 수단이지 목적이 아니다. 1단계 검증 조건은 "원본 사이트 URL을 확보했는가"이지 "갤러리를 경유했는가"가 아니다. 접근 실패로 왕복을 세 번 넘기지 마라 — §5를 먼저 확인하고, 막히면 바로 우회해라.

브리프 R1 구조 R2 톤 (다른 업종) R3 디테일
SaaS · B2B 랜딩 Land-book The Brand Identity Codrops
개발자 도구 · API 문서 Refero Klim Codrops
개인 · 스튜디오 포트폴리오 Godly Typographic Posters Eyecandy
에이전시 · 브랜드 사이트 SiteInspire Mindsparkle Mag Eyecandy
이커머스 · D2C ecomm.design Visuelle Details Matter
모바일 앱 Mobbin Handheld.design Spotted in Prod
대시보드 · 웹앱 내부 Webframe Data Viz Project UI Sources
미니멀 · 정보량 적음 Minimal Gallery Httpster Design Spells
개성 강한 · 실험적 Hover States Brutalist Websites Codrops
이메일 · 뉴스레터 Really Good Emails Email Love
온보딩 · 결제 플로우 Page Flows UX Bites Mobbin
타이포 주도 (텍스트가 주인공) Awwwards Typography Fonts In Use Typewolf
리디자인 (개편) Rebrand Gallery (현행 사이트 자체) Design Spells
한국어 사이트 노트폴리오 디비컷 GDWeb

국소 브리프 (한 섹션만 다시 짤 때)

대상 소스
히어로 Supahero
내비게이션 Navbar Gallery
푸터 Footer.design
요금제 Pricing Pages
404 · 빈 상태 404s.design
후기 · 신뢰 요소 Social Proof Examples
OG · 공유 이미지 OG Image Gallery

2. 경고 — 갤러리마다 편향이 있다

Awwwards 구조를 SaaS에 이식하지 마라. 2026 Q1 SOTD 47건의 업종 분포는 럭셔리 패션 28% · 자동차 22% · 건축 18% · 문화기관 14%, 테크/SaaS는 5% 미만이다. 수상작의 전면 3D·풀스크린 인트로·스크롤 서사는 "제품을 팔지 않는 사이트"의 문법이다. Awwwards는 타이포 완성도와 야심의 상한선으로만 쓰고, 섹션 구조는 Land-book·Refero에서 가져온다.

그 밖의 편향:

갤러리 편향 대응
Dribbble 구현 불가능한 "샷"이 다수 색·타이포 발상만. 구조 참고 금지
Collect UI Daily UI 과제 기반이라 비현실적 컴포넌트 아이디어만
Pinterest 출처 추적 불가 + AI 이미지 오염 최후순위. 가급적 쓰지 마라
Lapa Ninja 실무 평균값 → 슬롭 패턴이 섞여 있음 볼 때 antipatterns.md를 옆에 둬라
Dark Mode Design / dark.design 다크가 전제 브리프가 다크를 요구할 때만

3. 텍스트로 읽히는 소스 (기본 경로)

에이전트는 이미지를 못 보는 것이 기본값이다. 갤러리 카드는 이미지라 정보가 없다. 아래는 말로 설명해주는 소스다. 폰트·색·모션은 여기서 확보한다.

소스 URL 얻는 것
Typewolf https://www.typewolf.com 특정 사이트가 실제로 쓴 폰트 이름 + 무료 대체 폰트
Typewolf Google Fonts https://www.typewolf.com/google-fonts 구글폰트 베스트 40, 본문용/디스플레이용 구분
Fonts In Use https://fontsinuse.com 폰트의 산업·시대별 톤
Eyecandy https://eyecannndy.com 모션 기법에 붙은 이름 (displacement, kinetic type 등)
Codrops https://tympanus.net/codrops/ 효과의 소스 코드 그 자체
UI Sources https://www.uisources.com 인터랙션을 문장으로 분해한 해설
UX Bites https://builtformars.com/ux-bites 특정 앱 UX가 왜 좋은지 서술
DesignSystems.one https://www.designsystems.one/design-systems 실사용 디자인 시스템 88개 + 토큰 원문(design.md) 다운로드
DESIGN.md https://designmd.app 에이전트용으로 정제된 디자인 시스템 정의 561개
Happy Hues https://www.happyhues.co 색을 역할(배경/텍스트/강조)로 서술한 팔레트
Branding Style Guides https://brandingstyleguides.com 실제 브랜드 가이드 문서
Rebrand Gallery https://rebrand.gallery 리브랜딩 before/after — "왜 바꿨나"를 학습 가능

브라우저 도구(Chrome DevTools MCP / Playwright)를 쓸 수 있으면 원본 사이트의 computed style을 직접 읽어라. 뽑을 값: font-family font-size line-height letter-spacing color background-color border-radius box-shadow padding gap max-width transition.


4. 카테고리별 대표

라우팅 표에서 못 찾았을 때만 본다.

종합 어워드

미니멀 · 에디토리얼

브루탈 · 실험

SaaS · 랜딩 · 웹앱

모바일 · 플로우

타이포 · 폰트

컬러

모션 · 코드

브랜딩 (웹 밖에서 톤 가져오기)

국내


5. 자동 접근 불가 목록

아래는 WebFetch로 못 읽는다. 조사 계획에서 제외하거나 대체 소스를 잡아라.

사이트 상태 대체
land-book.com 403 봇 차단. 브라우저로 열어도 카드에 외부 URL 이 없다 Httpster, Lapa Ninja
refero.design SPA — WebFetch 가 제목만 반환 Mobbin, Screenlane
siteinspire.com 429 간헐 차단 Httpster, Minimal Gallery
cssdesignawards.com 403 봇 차단 Awwwards
uncut.wtf Cloudflare 차단 Fontshare, Fontesk
refs.gallery 429 Godly
unsplash.com 401 Pexels
adfolio.design 429 Love The Work More
commercecream.com HTTPS 연결 거부 (방치 상태) ecomm.design로 대체. 쓰지 마라

막히면 갤러리를 갈아타지 말고 브라우저로 직접 들어가라

위 표는 "대체 소스"를 적어뒀지만, 그건 차선책이다. 보려던 그 사이트를 봐야 한다. 403·404·타임아웃을 만나면 대체 갤러리를 찾아 헤매지 말고 실제 브라우저를 띄워라. 실측에서 Aesop(403) → Kinto(404) → Hasami(DNS 실패) → MUJI(타임아웃)로 네 번 왕복하고도 톤 레퍼런스를 하나도 못 얻었다. 브라우저를 열었으면 첫 번째에 끝났다.

// playwright 가 없으면: npm i -g playwright && npx playwright install chromium
const path = require('path');
const { chromium } = require(path.join(process.env.PW_ROOT, 'playwright'));
const b = await chromium.launch({ headless: false });   // headed 여야 봇 차단을 덜 받는다
const p = await b.newPage({ viewport: { width: 1440, height: 900 } });
await p.goto(url, { waitUntil: 'networkidle', timeout: 45000 });
await p.screenshot({ path: 'ref-1.png', fullPage: true });

스크린샷은 텍스트 요약보다 낫다. WebFetch 는 마크다운으로 바꾸면서 여백·비율·크기 대비를 전부 버린다 — 6축 중 절반이 그 정보다. 그림을 보고 나서 재라: 히어로가 첫 화면의 몇 %인지, 제목이 몇 px 인지, 칼럼이 몇 개인지.

// 눈으로 보지 말고 숫자로 받아라
await p.evaluate(() => {
  const h1 = document.querySelector('h1');
  return {
    h1px: h1 && getComputedStyle(h1).fontSize,
    h1가족: h1 && getComputedStyle(h1).fontFamily.split(',')[0],
    본문px: getComputedStyle(document.body).fontSize,
    배경: getComputedStyle(document.body).backgroundColor,
    첫화면_이미지비율: (() => {
      const im = [...document.querySelectorAll('img,video,canvas')]
        .filter(e => e.getBoundingClientRect().top < innerHeight);
      const a = im.reduce((s, e) => { const r = e.getBoundingClientRect(); return s + r.width * r.height; }, 0);
      return (a / (innerWidth * innerHeight) * 100).toFixed(0) + '%';
    })(),
  };
});

headed 로 띄우는 이유: 헤드리스는 Cloudflare·Akamai 봇 판정에 자주 걸린다. 그래도 막히면 그때 대체 소스로 간다 — 순서가 반대다.

규칙: 접근 실패 2회 → 브라우저를 띄운다. 대체 갤러리 탐색은 브라우저도 막힌 뒤의 일이다.


근거: research/references/01-gallery-catalog.md, 03-trends-2026.md (조사일 2026-08-20)