이 레포가 무엇을 하는 물건인가.
똑같은 질문이라도 AI가 마크다운으로 답하면 글자만 줄줄이지만, HTML 한 장으로 답하면 표·SVG 다이어그램·다크모드·클릭 인터랙션까지 담긴 작품이 나온다. effective-html은 바로 그 "HTML로 답하기"를 에이전트의 기본기로 심어주는 스킬 묶음이다. 정작 레포 안에 실행 프로그램은 없다 — 잘 쓰인 지시문(SKILL.md) 3장 + 따라 할 모범답안 20개가 전부다.
effective-html은 html, html-diagram, html-plan 세 개의 에이전트 스킬을 담은 저장소다. 각 스킬은 에이전트(Claude Code 등)에게 "사용자가 원하는 것을 의존성 없는 단일 .html 파일로, 정해진 'effective HTML' 스타일에 맞춰 만들어라"라고 지시한다. 세 스킬의 차이는 의도다 — html은 범용(리포트·설명·비교·덱), html-diagram은 SVG 아키텍처 다이어그램 전용, html-plan은 계획서 페이지 전용.
이 레포의 진짜 자산은 각 스킬에 번들된 레퍼런스 코퍼스다. Thariq Shihipar가 쓴 글 "The unreasonable effectiveness of HTML(HTML의 비합리적 효과)"에 딸린 예제 20개(코드리뷰·디자인시스템·슬라이드덱·상태리포트·인시던트리포트·플로차트 등)를 통째로 넣어, 에이전트가 추상적 지시가 아니라 "잘된 결과물 20개를 보고 그 밀도·톤·정렬을 흉내"내도록 했다. 그래서 두 갈래로 읽힌다. ① 스킬 엔지니어링(에이전트 시대의 새로운 "코딩"), ② 프런트엔드 공예(빌드도 프레임워크도 없이 HTML·CSS·SVG만으로 완성도 내기).
SKILL.md 한 장 — 맨 위 frontmatter(이름·설명)는 항상 메모리에 떠 있다가, 관련 작업이 들어오면 본문과 참조 파일을 펼쳐 읽는다. 코드가 아니라 잘 쓰인 자연어 지시문 + 예시가 곧 기능이다..html 파일 안에 마크업·CSS·자바스크립트·SVG가 전부 들어 있어 빌드 단계도, 외부 의존성도, 인터넷도 필요 없는 문서. 더블클릭하면 그냥 열린다. AI 산출물에 특히 잘 맞는 포맷이다 — 메일로 보내든 사내망에 두든 그 한 파일이면 끝.트렌딩 이유 · 경쟁 접근 대비 장점.
2026년 들어 "에이전트가 마크다운으로만 답하는 건 손해다"라는 인식이 퍼졌다. 마크다운은 제목·목록·표까지가 한계지만, HTML은 같은 한 파일에 다이어그램·색·레이아웃·인터랙션·다크모드를 전부 담는다. 이 "HTML의 비합리적 효과"라는 밈을 실전 스킬로 떨어뜨린 게 effective-html이라서, 별·포크 규모(★30)는 작아도 에이전트 스킬 생태계에서 빠르게 회자됐다. 차별점은 넷이다.
| 비교 항목 | 그냥 "HTML로 만들어줘" 프롬프트 | effective-html 스킬 |
|---|---|---|
| 품질 기준 | 매번 들쭉날쭉(에이전트 기분대로) | 모범답안 20개에 정렬(밀도·톤 고정) |
| 의도 구분 | 한 덩어리 | 3개로 분리(범용/다이어그램/계획) |
| 발동 방식 | — | 명시 호출 전용(자동발동 끔) |
| 다크모드 | 보통 빠짐 | 항상 강제(toggle+저장+선적용) |
| 배포 | 복붙 | npx skills add · Claude Code 플러그인 |
SKILL.md 본문은 의외로 짧다(13~23줄). 대신 "references/html-effectiveness/ 안의 파일들을 전부 훑어보고, 그 정렬·밀도·톤에 최대한 맞춰라"라고 시킨다. 규칙을 말로 길게 적는 대신 완성품 코퍼스를 few-shot 예시로 번들한 것 — 이게 작은 모델까지 일관된 결과를 내게 하는 핵심이다.
같은 "HTML 만들기"라도 다이어그램은 산문을 걷어내고 풀스크린 SVG로 가야 하고, 계획서는 사용자가 준 문장을 거의 그대로 살려야 한다. 그래서 html-diagram/html-plan을 따로 두고, 애매한 나머지는 범용 html이 받는다. "하나의 큰 스킬"보다 "좁고 명확한 여러 스킬"이 잘 발동·잘 작동한다는 설계 철학의 사례다.
세 스킬 모두 frontmatter에 disable-model-invocation: true가 박혀 있다. 즉 모델이 "알아서" 발동하지 못하고, 사용자가 명시적으로 이 스킬을 지목해야만 켜진다. HTML 산출물은 무겁고 취향을 타므로, 원할 때만 부르게 한 의도다. "언제 자동발동을 끌 것인가"를 보여주는 좋은 교본.
레시피북 vs 요리사 매뉴얼. 보통 "HTML로 만들어줘"는 요리사에게 "맛있게 해줘"라고만 하는 것과 같다. effective-html은 대신 완성된 시그니처 요리 사진 20장(레퍼런스 코퍼스)을 보여주고 "이 플레이팅·간·양에 맞춰라"라고 한다. 말보다 사진이 정확하고, 신참 요리사(작은 모델)도 따라 한다.
스킬 레포는 "산출물 스택 / 스킬 런타임 / 배포"의 3층으로 본다.
이 레포에는 서버도 DB도 없다. 그래서 흔한 "백엔드/프론트엔드/인프라" 대신, 스킬형 저장소에 맞는 3층으로 지도를 다시 그리는 게 정확하다.
| 층 | 구성요소 | 역할 |
|---|---|---|
| ① 산출물(프런트엔드) | 순수 HTML5 · CSS(커스텀 프로퍼티) · SVG · Vanilla JS | 스킬이 만들어내는 결과물. 프레임워크·번들러·CDN 의존조차 없음 |
| ② 스킬 런타임(백엔드) | Claude Code 등 에이전트 · SKILL.md · references/ | frontmatter를 읽고 본문·예제를 펼쳐 HTML을 생성하는 "실행기" |
| ③ 배포/패키징(인프라) | skills.sh · .claude-plugin/plugin.json · skills.sh.json | 스킬을 설치·그룹화·배포하는 메타데이터 |
레퍼런스 예제와 모범 architecture-example.html은 전부 다음만 쓴다.
<style>/<script> — 한 파일에 전부. 빌드 없음.--bg, --ink, --clay…) — 라이트/다크 두 팔레트를 변수로만 스왑.:root{ --bg:#fff }처럼 선언하고 background:var(--bg)로 쓰는 사용자 정의 변수. 다크모드는 html.dark{ --bg:#141413 } 한 블록으로 모든 색을 한꺼번에 갈아끼우는 식으로 구현한다 — 색을 곳곳에 박아두지 않는 게 비결.각 SKILL.md 맨 위 YAML이 에이전트와의 계약이다. name(스킬 ID), description(언제 쓰는지 — 매칭용 항상 로드), disable-model-invocation(자동발동 여부). 본문은 평소엔 안 읽히다가 스킬이 선택돼야 펼쳐진다(점진적 공개).
skills.sh.json은 skills.sh 레지스트리용(그룹 "Effective HTML"로 3개 묶음), .claude-plugin/plugin.json은 Claude Code 플러그인용(스킬 경로 3개 등록). 같은 레포가 두 생태계에 동시에 설치된다.
# skills.sh로 설치 (npx 한 줄)
npx skills add plannotator/effective-html
npx skills add plannotator/effective-html --list
npx skills add plannotator/effective-html --skill html-diagram
스킬이 발동되는 흐름 + 모범 다이어그램의 내부.
사용자가 스킬을 지목하면, 에이전트는 frontmatter→본문→레퍼런스 순으로 "필요한 만큼만" 읽어 HTML을 만든다.
architecture-example.html 해부이 한 파일(462줄)이 html-diagram이 지향하는 "잘된 결과물"의 표본이다. 구조를 뜯어보면 4가지 기법이 보인다.
body를 flex column + overflow:hidden으로 잡고, 상단 바를 뺀 나머지를 .stage가 채운다. 그 안에 <svg viewBox="0 0 1560 980" preserveAspectRatio="xMidYMid meet">를 position:absolute; inset:0로 깔아 창 크기와 무관하게 다이어그램이 꽉 차고 비율을 유지한다.
각 박스는 <g class="node" data-k="agent">처럼 종류(class)와 키(data-k)를 달고 있다. 자바스크립트는 nodes.forEach(n => n.addEventListener('click', ...))로 클릭을 받아 강조한다. 색은 SVG 안에 hex로 박지 않고 class로만 지정 → CSS 변수가 바뀌면 다이어그램도 테마를 따라간다.
상단의 .chip[data-flow]을 누르면 setFlow()가 특정 요청 경로(예: "로그인 흐름")의 노드·간선만 차례로 불을 켜며 애니메이션한다. 정적 그림이 아니라 "이 시스템이 어떻게 동작하는지"를 단계별로 보여주는 인터랙티브 다이어그램이 되는 지점.
#themeToggle 클릭 시 html.dark를 토글하고 localStorage.setItem('theme', ...)로 저장. 그리고 <head> 최상단의 작은 스크립트가 페이지가 그려지기 전에 저장값/시스템설정을 읽어 클래스를 미리 붙인다 → 새로고침해도 흰 화면이 번쩍이지 않는다(FOUC 방지).
<rect fill="#fff">처럼 직접 칠하면 다크 팔레트로 못 바뀐다. effective-html은 "SVG는 CSS 클래스로만 스타일링, 변수로 색 지정"을 못 박는다. 다이어그램이 테마를 따라가게 하려면 이 규칙이 필수.
파일이 적다 — 그래서 하나하나가 의미를 갖는다.
세 스킬이 같은 예제 코퍼스를 각자 복제해서 들고 있다(레포 용량의 대부분, 약 1.5MB가 이 중복 예제다). 비효율로 보이지만 의도적이다 — README曰 "예제를 스킬 로컬에 두어야 스킬만 떼어 설치해도 자기완결적으로 동작"하기 때문. 배포 단위(스킬)의 독립성을 위해 중복을 감수한 트레이드오프다.
이 레포 하나로 두 분야를 동시에 챙긴다 — 스킬 설계 + HTML 공예.
가장 큰 배움은 "기능을 코드가 아니라 frontmatter + 예시로 정의"하는 법이다. 좋은 description은 "무엇을 하는가"가 아니라 "언제 이걸 골라야 하는가"를 적는다(이 레포의 description들이 전부 "Use when the user wants…" 꼴인 이유). 본문은 짧게, 깊이는 references로 — 점진적 공개.
세 SKILL.md가 똑같이 강제하는 패턴 — 이걸 손에 익히면 어떤 정적 HTML에도 쓸 수 있다.
<!-- (1) head 최상단: 그려지기 전에 테마 선적용 → FOUC 방지 -->
<script>
(function(){
const saved = localStorage.getItem('theme');
const dark = saved ? saved==='dark'
: matchMedia('(prefers-color-scheme: dark)').matches;
document.documentElement.classList.toggle('dark', dark);
})();
</script>
/* (2) CSS: 두 팔레트를 변수로만 정의 */
:root { --bg:#FAF9F5; --ink:#141413; }
html.dark { --bg:#141413; --ink:#FAF9F5; }
// (3) 토글 버튼: 클래스 토글 + localStorage 저장
themeToggle.onclick = () => {
const dark = document.documentElement.classList.toggle('dark');
localStorage.setItem('theme', dark ? 'dark' : 'light');
};
이미지 캡처가 아니라 viewBox 좌표계 위에 <g class="node">로 그리면, 텍스트 검색·테마 추종·클릭 인터랙션이 공짜로 따라온다. html-diagram의 핵심 학습 포인트.
같은 디렉토리를 skills.sh.json과 .claude-plugin/plugin.json 두 매니페스트로 노출하는 법. 자작 스킬을 남들이 npx skills add 한 줄로 받게 하는 패키징 감각을 익힌다.
무겁지 않다 — Node와 에이전트, 브라우저면 끝.
| 항목 | 요구사항 | 메모 |
|---|---|---|
| 스킬 설치기 | Node.js(npx) 또는 호환 에이전트 | npx skills add가 깃 URL을 받아 스킬 폴더에 복사 |
| 실행 에이전트 | Claude Code 등 Agent Skills 지원 툴 | SKILL.md frontmatter/본문을 읽어 실행 |
| 산출물 열람 | 모던 웹 브라우저 | 빌드·서버 불필요 — .html 더블클릭 |
| 네트워크 | 설치 시에만 필요 | 산출물은 의존성 0 → 오프라인 열람 가능 |
# 전체 설치
npx skills add plannotator/effective-html
# 먼저 어떤 스킬이 있는지 보기
npx skills add plannotator/effective-html --list
# 특정 스킬만 설치
npx skills add plannotator/effective-html --skill html-diagram
npx skills add plannotator/effective-html --skill html-plan
Claude Code 플러그인으로 쓸 땐 .claude-plugin/plugin.json이 ./skills/html, ./skills/html-diagram, ./skills/html-plan 세 경로를 등록하므로, 레포를 플러그인으로 추가하면 세 스킬이 한꺼번에 붙는다. 발동은 disable-model-invocation: true 때문에 항상 사용자가 명시해야 한다("html-diagram 스킬로 그려줘").
읽기만 하지 말고, 난이도순으로 손을 움직여 보자.
references/html-effectiveness/16-implementation-plan.html(32KB, 가장 큰 예제)를 브라우저로 열고, 다크모드 토글이 어떻게 구현됐는지 head의 선적용 스크립트부터 추적해 본다. "한 파일에 다 들어 있다"를 눈으로 확인.
스킬을 설치하고, 내가 만든 작은 프로젝트의 구조를 "html-diagram 스킬로 풀스크린 SVG 다이어그램을 그려줘"라고 시켜 본다. 나온 결과의 SVG가 hex가 아니라 class로 칠해졌는지 확인하고, 안 그랬으면 직접 고쳐 다크모드를 따라가게 만든다.
skills/html-slide/SKILL.md를 새로 만들어 "슬라이드 덱 전용" 스킬을 추가한다. frontmatter(name·description·disable-model-invocation) 작성 후 plugin.json과 skills.sh.json에도 등록해, 패키징까지 일관되게 반영해 본다.
architecture-example.html의 setFlow()를 읽고, 내 다이어그램에 "흐름 칩"을 달아 특정 요청 경로의 노드·간선만 순차 점등되게 만든다. 정적 그림을 "동작을 보여주는" 다이어그램으로 끌어올리는 연습.
영문 html-effectiveness 대신, 한국어 톤·타이포(Pretendard 등)에 맞춘 모범 HTML 예제 6~10개를 직접 만들어 references/에 번들하고 SKILL.md가 그걸 보게 한다. "예시로 가르치기"를 내 언어·취향에 맞게 재현하는 최종 단계.
4주 코스 — 스킬 설계와 HTML 공예를 번갈아 다진다.
| 주차 | 주제 | 핵심 활동 |
|---|---|---|
| 1주차 | Agent Skills 기본기 | SKILL.md 구조 · frontmatter · 점진적 공개 · disable-model-invocation 이해. 직접 미니 스킬 1개 작성(Lv1·Lv3) |
| 2주차 | 의존성 0 HTML/CSS | CSS 변수 테마 시스템 · 다크모드 3종 세트 · 시맨틱 레이아웃. 기존 페이지에 이식(Lv2) |
| 3주차 | SVG 다이어그램 | viewBox/preserveAspectRatio 좌표계 · 노드를 데이터로(class·data-*) · class 기반 테마. 정적 다이어그램 완성 |
| 4주차 | 인터랙션 + 배포 | 클릭·flow 시퀀스 애니메이션(Lv4) · skills.sh/Claude Code 두 채널 배포 · 나만의 코퍼스(Lv5) |
스킬 설계(1주)를 먼저 본 뒤 HTML 공예(2~3주)로 내려가면, "에이전트에게 무엇을 어떻게 지시해야 좋은 HTML이 나오는가"라는 지시자의 시선과 "그 HTML을 직접 짜는 법"이라는 구현자의 시선을 둘 다 갖게 된다. 이 레포의 가치가 바로 그 두 시선의 결합이다.
이 레포를 읽다 마주치는 용어들.
---로 감싼 YAML 메타데이터. SKILL.md에선 name·description·disable-model-invocation이 들어가며, 본문과 달리 항상 로드되어 스킬 선택의 기준이 된다.true면 모델이 자동으로 스킬을 발동하지 못하고 사용자가 명시적으로 호출해야만 켜진다. 무겁거나 취향을 타는 산출물(여기선 HTML)에서 오발동을 막는 장치..html에 인라인된, 빌드·의존성·서버가 필요 없는 문서. AI 산출물 포맷으로 이상적 — 그 파일 하나만 전달하면 끝.<head> 최상단의 작은 스크립트로 그려지기 전에 테마 클래스를 붙여 막는다.--name으로 선언하고 var(--name)으로 쓰는 변수. 라이트/다크 두 팔레트를 :root/html.dark 두 블록의 변수 스왑만으로 전환하는 게 핵심 활용.viewBox="0 0 1560 980"는 그 좌표 위에 도형을 배치하고, preserveAspectRatio="xMidYMid meet"는 창 크기가 변해도 가운데 정렬로 비율을 지킨다 → 풀스크린 반응형 다이어그램의 토대.--list로 스킬 목록, --skill로 개별 설치. 이 레포의 skills.sh.json이 그 메타데이터다.name과 등록할 skills 경로 배열을 담아, 레포 하나를 플러그인으로 묶어 여러 스킬을 한꺼번에 설치하게 한다.원본과 더 깊이 파고들 자료.
· GitHub 저장소: github.com/plannotator/effective-html
· 제작자 사이트: plannotator.ai
· 설치: npx skills add plannotator/effective-html
· Thariq Shihipar — html-effectiveness 갤러리: thariqs.github.io/html-effectiveness
· "The unreasonable effectiveness of HTML" — HTML을 AI 출력 포맷으로 쓰자는 원 아이디어의 출처
· Claude Code 스킬 문서: docs.claude.com/en/docs/claude-code/skills
· Anthropic — Agent Skills 소개: anthropic.com/news/skills
· skills.sh — 스킬 설치/배포 도구: skills.sh