SaaS 로고은(는) 무엇을 하나요?
이 스킬이 사용하는 모든 파일은 이 SKILL.md 파일과 같은 폴더에 있으며, 경로는 해당 폴더를 기준으로 합니다. 다른 스킬이나 폴더에서 파일을 가져올 필요가 없습니다. 사용자가 다른 위치를 지정하지 않는 한, 생성된 모든 결과물은 현재 프로젝트의 out/saas-logo/ 디렉토리에 저장합니다.
하나의 심볼, 평면. 결과물은 투명 배경 위에 마크만 잘라낸 파일과, 앱 아이콘 타일에 마크가 포함된 파일 두 가지입니다. 즉시 사이트에 적용할 수 있는 파일들입니다. 이 스킬이 참고하는 마크들은 references/analysis.md에서 분석되어 있습니다. 각 11개 마크가 기하학적으로 어떤 형태인지, 모든 마크가 따르는 8가지 규칙, 그리고 5가지 패밀리에 대한 설명이 있습니다. 첫 번째 로고를 생성하기 전에 이 파일을 한 번 읽어보세요. 이것이 여기서 '진짜 SaaS 로고처럼 보인다'는 의미입니다.
이미지 모델로 보내는 프롬프트는 prompt.md에 있으며, 모델이 필요한 모든 정보(공유 규칙: 캔버스, 타일, 평면 채우기, 굵기, 색상; 참고 마크들이 속한 5개 패밀리와 각각의 규칙)를 포함합니다. 당신의 역할은 프롬프트 전에 (패밀리와 심볼 선택) 그리고 결과물을 평가하는 것입니다.
단계
1. 제품 파악하기
브리핑, README, 랜딩 페이지 카피 등 존재하는 모든 자료를 읽으세요. 한 줄로 요약하세요: "이름 — 사용자가 그것으로 무엇을 하는가, 동사 하나와 대상 하나로." "작업을 코딩 에이전트에 전달한다" → 전달하다, 작업 카드. "폴더를 사이트로 게시한다" → 게시하다, 페이지. 마크는 동사나 대상을 보여주어야 하며, 카테고리(기어, 구름, 로켓, 차트 등)를 보여주면 안 됩니다. 제품에 브랜드 색상(CSS 토큰, 파비콘)과 이니셜이 있다면 기록하세요.
2. 패밀리 선택하기
prompt.md 섹션 3에 있는 5개 패밀리와 각각의 용도:
- 단일 기본형 (Solid primitive) (Vercel, Miro): 인프라, 개발자 도구, 필연적으로 느껴져야 하는 제품. 하나의 모양이 아이디어를 전달합니다.
- 반복 기본형 (Repeated primitive) (Slack, Claude, Linear, Intercom, PostHog): 협업, 커뮤니케이션, AI, 여러 부분이 함께 움직이는 제품.
- 문자형 (Letterform) (Webflow, Miro, Notion): 제품명 자체가 브랜드이며, 이니셜이 강한 형태(A, M, N, W, K, Z, S, V)를 가질 때.
- 다면체형 (Faceted object) (Airtable, Notion의 페이지): 데이터, 저장소, 문서, 채우거나 쌓는 무언가가 있는 제품.
- 부드러운 선형 (Soft stroke) (Mintlify, Intercom): 친근한 소비자 지향 제품, 문서, 지원, 기술적이기보다는 따뜻한 느낌.
사용자가 참조 브랜드를 언급하면 패밀리가 결정됩니다: "Slack처럼" 또는 "Claude처럼" → 반복 기본형; "Vercel처럼" → 단일 기본형; "Webflow처럼" 또는 "Notion처럼" → 문자형; "Airtable처럼" → 다면체형; "Mintlify처럼" 또는 "Intercom처럼" → 부드러운 선형. 사용자가 패밀리를 직접 언급하면 그대로 사용합니다. 어떤 힌트도 없으면 컨셉을 2-3개 패밀리에 분산시킵니다; 시트가 결정합니다.
3. 3-4개 컨셉 작성하기
각 컨셉은 이미지 모델이 추측 없이 그릴 수 있는 2-3문장으로 구성합니다:
- 명사가 아닌 기하학적 형태로서의 심볼. "작업 카드"가 아니라 "더 넓은 둥근 사각형 하나, 그리고 그것보다 4분의 1 높이만큼 위 오른쪽으로 오프셋된 동일한 사각형 하나 더". "해시"가 아니라 "각각 한쪽 끝이 둥근 돌기인 네 개의 알약 모양, 중심을 기준으로 90° 회전".
- 반복 기본형의 개수와 리듬: "다섯 개의 세로 막대, 높이가 왼쪽에서 오른쪽으로 3-5-4-2-3 순서".
- 패밀리 이름, 문자형의 경우 어떤 글자와 어떤 2-3개의 획.
- 색상: 브랜드 색상이 있으면 16진수로, 아니면 "검은 타일에 흰색 마크" 또는 "금잔화 타일에 검은색 마크".
- 제외 사항: 컨셉이 부가 요소를 유발할 때 "점 없음", "막대 주위에 프레임 없음", "카운터(내부 빈 공간)는 비어 있음".
실루엣이 컨셉 간에 다르게 만드세요 (높은 것 vs 넓은 것, 하나의 덩어리 vs 흩어진 형태). 패밀리가 허용하는 기본 요소보다 더 많이 필요하거나 패밀리가 금지하는 색상을 사용하는 컨셉은 버리세요.
4. 구성하고 생성하기
각 컨셉에 대해 prompt.md를 가져와 {{input}}을 다음으로 교체하세요:
<Product> — <제품이 무엇이고 무엇을 하는지>. 동사는 <동사>; 대상은 <대상>.
브랜드 색상: <16진수 또는 "없음">. 이니셜: <글자>.
패밀리: <5개 중 하나>
컨셉: <3단계의 컨셉>
모든 컨셉을 OpenRouter를 통해 한 번에 병렬로 생성하세요 (아래 참조). 각각 하나의 이미지, 정사각형. <concept>.png 또는 .jpg로 저장하세요 (아래 스니펫이 구분합니다).
기본 모델: google/gemini-3.1-flash-lite-image (Nano Banana 2 Lite), 가장 저렴하고 빠릅니다. 평면 기하학을 충분히 잘 처리하며, 이 모델에서 실패하는 컨셉은 대개 다른 모델에서도 실패합니다. 요청이 있을 때만 업그레이드하거나, 최종 선정작이 두 번의 라운드 후에도 더 깔끔한 렌더링이 필요할 때만 google/gemini-3.1-flash-image (Nano Banana 2), 그 다음 google/gemini-3-pro-image (Nano Banana Pro)를 사용하세요. Pro 모델이 가장 깔끔한 기하학(평평한 끝, 균일한 굵기, 진정한 평면 채우기)을 그립니다.
5. 살펴보기
bash <this skill folder>/scripts/sheet.sh sheet.png a.png b.png … 명령어로 타일들을 나란히 배열하고 엽니다. 참조 이미지와 함께 보려면 bash <this skill folder>/scripts/fetch-references.sh out/saas-logo/references 명령어로 Brandfetch를 통해 11개 마크를 가져와 자체 시트를 만듭니다 (Brandfetch 클라이언트 ID 필요; 스크립트 헤더 참조). 각 타일을 분석 문서가 참조 이미지를 평가하는 방식과 동일하게 평가하세요:
- 평면 (Flat) — 각 모양당 하나의 채우기, 그라데이션, 그림자, 베벨 없음. 그 외는 재생성 대상, 선정 불가.
- 일관된 모서리 (Committed corners) — 패밀리가 지정한 대로 모두 날카롭거나 모두 둥글어야 함.
- 개수 (Count) — 컨셉이 지정한 기본 요소의 수와 정확히 일치해야 함. 추가 점, 프레임, 노치는 재생성 시 명시적으로 제외해야 함 ("막대 주위에 프레임 없음").
- 실루엣 (Silhouette) — 눈을 가늘게 뜨고 보세요. 16px에서 하나의 명확한 형태여야 하며, 우연히 다른 그림이 생성되면 안 됨: 세 개의 막대와 곡선이 얼굴이 되거나, 갈매기형과 점이 커서가 되거나, 네 개의 알약이 풍차가 되면 안 됨.
- 의미 (Meaning) — 이름 없이도 동사나 대상을 알 수 있습니까? 카테고리 아이콘으로 읽힌다면 렌더링 문제가 아니라 컨셉이 잘못된 것입니다.
- 캔버스 (Canvas) — 타일이 평평한 회색 위에 중앙에 위치하고, 그 위에 다른 것은 없으며 텍스트도 없어야 함. 타일 크기와 정확한 색상은 렌더링마다 약간 다를 수 있습니다. 이는 정상입니다. 세트가 정확히 일치해야 하는 경우 한 번에 한 모델로 모두 생성하거나 타일로 크롭하세요.
실패한 것만 재생성하되, 컨셉을 구체화하여 실패 원인을 명시하세요. 두 번의 라운드는 정상입니다. 두 번 실패하는 컨셉은 보통 모델 문제가 아니라 컨셉 자체의 문제입니다. 교체하세요.
6. 자르기
렌더링은 작업 파일입니다: 타일이 있는 회색 캔버스. 선정된 각 결과물을 실제 사용할 파일로 자릅니다:
bash <this skill folder>/scripts/cut.sh <concept>.png out/saas-logo/<product> --name <product>
이 스크립트는 <product>-mark.png (투명 배경에 마크만, 여백 없이 가장자리까지 잘림)와 <product>-tile.png (모서리가 둥근 앱 아이콘 타일, 투명 모서리)를 생성합니다. 캔버스 색상은 렌더링의 모서리에서 읽어오고 타일 색상은 타일 가장자리 안쪽 띠에서 읽어옵니다. 가장자리 픽셀은 이 색상들로부터 언믹스(unmix)되어 부드러운 가장자리를 유지하며 헤일로가 생기지 않습니다. 여러 컨셉을 제공할 때는 이름을 구분하세요 (--name relay-bars, --name relay-block). 첫 번째 실행 시 이 스킬 내 scripts/.venv에 Pillow와 NumPy가 포함된 작은 Python venv를 만듭니다. 이후에는 즉시 실행됩니다.
두 파일을 어두운 배경과 밝은 배경 위에 열어 확인하세요: 마크 가장자리를 따라 타일 색상의 프린지가 없어야 하고, 타일 모서리에 캔버스 조각이 없어야 하며, 마크가 잘려나간 부분이 없어야 합니다. 프린지가 있으면 렌더링의 타일이 평평하지 않다는 뜻입니다(그라데이션이나 비네트가 침투한 것). 패치 컷 대신 렌더링을 다시 생성하세요. 가장자리에서만 희미한 색상 틴트가 보이고 확대했을 때만 보인다면 Lite 및 Flash 모델의 JPEG 노이즈입니다. 중요한 경우 google/gemini-3-pro-image로 한 번 더 렌더링하세요. 이 모델은 PNG로 응답합니다.
7. 전달하기
마크와 타일 PNG를 out/saas-logo/<product>/에 넣습니다. 사용자가 요청할 때만 제품의 브랜드 에셋 디렉토리(public/, brand/, assets/)로 복사합니다. 렌더링 파일과 sheet.png는 그 옆에 있는 renders/ 폴더에 보관하세요. 요약에서는 권장하는 -mark.png와 -tile.png의 경로를 명시하고, 어떤 컨셉을 권장하는지 한 줄과 이유를 설명하며, 다른 컨셉을 대안으로 파일과 함께 나열하세요.
OpenRouter를 통한 생성
API 키는 OPENROUTER_API_KEY에서 가져옵니다. 설정되어 있지 않으면 중단하고 사용자에게 설정하도록 요청하세요. 다른 제공자를 추측하지 마세요.
KEY="$OPENROUTER_API_KEY"
# request.json: {"model": "google/gemini-3.1-flash-lite-image", "prompt": "<구성된 프롬프트>", "aspect_ratio": "1:1"}
curl -sS https://openrouter.ai/api/v1/images \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d @request.json > response.json
python3 - <<'PY'
import base64, json, pathlib
data = json.loads(pathlib.Path("response.json").read_text())["data"][0]
image = base64.b64decode(data["b64_json"])
# Lite와 Flash는 JPEG 바이트로, Pro는 PNG로 응답합니다. 파일 확장자를 이에 맞게 지정합니다.
ext = "png" if image.startswith(b"\x89PNG") else "jpg"
pathlib.Path(f"concept.{ext}").write_bytes(image)
PY
scripts/sheet.sh와 scripts/cut.sh는 두 형식 모두 처리할 수 있습니다.
파일
prompt.md— 프롬프트 템플릿;{{input}}이 제품 라인, 패밀리, 컨셉을 받습니다. 섹션 3에는 5개 패밀리가 있습니다.references/analysis.md— 11개 마크에 대한 분석: 각각의 기하학적 형태, 공유 규칙, 5개 패밀리.scripts/fetch-references.sh— Brandfetch의 Logo API(클라이언트 ID는BRANDFETCH_CLIENT_ID에서 가져옴)를 통해 참조 마크를 가져와 폴더와 시트로 만듭니다. 다른 참조 세트를 위해 모든 도메인 목록에서 작동합니다.scripts/sheet.sh— 타일들을 회색 캔버스에 나란히 배열합니다 (rsvg-convert필요;brew install librsvg).scripts/cut.sh,scripts/cut.py— 렌더링을 투명 마크와 타일 PNG로 잘라내어 전달합니다.