ClaudeMods
☰
KO
● 0 명 접속 중 · 조회 0 회
후원프로젝트 제출
GitHub 저장소 · 작성자 henrik-thevibe

fables

Claude Fables: 에이전트가 하는 일을 Sonnet 또는 Haiku가 프롬프트 위의 작은 애니메이션 만화로 실시간 보여 줍니다.

번역 완료

이 mod 소개

<p align="center"> <img src="assets/styles.gif" alt="11가지 스타일인 Pixel Art, the Original, Cave Painting, Blueprint, Mosaic, Frutiger Aero, Copperplate Engraving, Millefleur Tapestry, Golden Age Comic, Ukiyo-e, Kamon으로 코딩 장면을 연기하는 작은 주황색 생명체 Claude" width="960"> </p> <h1 align="center">Claude Fables</h1> <p align="center"> <b>Claude가 코드를 작성하는 동안, 당신의 작업을 만화로 들려줍니다.</b><br> 데스크톱 앱용 Claude Code 플러그인으로, 프롬프트 위 밴드에서 짧은 애니메이션 이야기를 재생합니다. </p> <p align="center"> <img alt="Claude Code mod" src="https://img.shields.io/badge/Claude_Code-mod-d97757"> <img alt="데스크톱 앱" src="https://img.shields.io/badge/runs_in-the_desktop_app-3b3a36"> <img alt="11 styles" src="https://img.shields.io/badge/styles-11-6a5acd"> <img alt="20 actions" src="https://img.shields.io/badge/actions-20-2e8b57"> <img alt="7 scenes" src="https://img.shields.io/badge/scenes-7-c46a2a"> </p> <p align="center"> <a href="#quick-start">빠른 시작</a> · <a href="#how-it-works">작동 방식</a> · <a href="#use">사용</a> · <a href="#the-scenes">장면</a> · <a href="#captions">캡션</a> · <a href="#styles">스타일</a> · <a href="#develop">개발</a> </p>

[!NOTE] Claude Fables는 전부 Claude Code 클라우드 환경에서 개발되었고 데스크톱 앱에서도 로컬 테스트를 거쳤습니다. 그래도 버그와 다듬어지지 않은 부분이 있을 수 있습니다. Issues와 풀 리퀘스트를 환영합니다.

Claude가 작업하는 동안 Fables는 모든 도구 호출과 Claude가 말하는 모든 줄을 지켜봅니다. 몇 초마다 Sonnet(또는 원하면 Haiku)에게 가장 최근 순간을 장면으로 다시 들려 달라고 요청합니다. 버그를 찾는 일은 자연 다큐멘터리가 되고, 나쁜 정규식은 열차 경찰에게 단속됩니다. Claude는 이야기 속을 걷고, 살금살금 움직이고, 날아다니는 작은 주황색 생명체로 나타납니다. 턴이 끝나면 마무리 장면이 나오고 30초 동안 남아 있습니다.

  • 몇 초마다 한 장면: Claude의 각 도구 호출과 발화가 이야기 속 한 순간이 됩니다.
  • 20가지 동작: 작업에 맞춰 걷기, 살금살금 움직이기, 파기, 넘어지기, 어깨 으쓱하기, 자기, 축하하기 등을 합니다.
  • 손으로 조명한 7가지 장면: 숲, 우주, 도시, 사막, 화산, 실험실, 밤의 마을입니다.
  • 11가지 스타일: 픽셀 아트부터 우키요에까지 모든 요소를 해당 매체로 다시 그립니다.
  • 터미널처럼 읽히는 캡션: 파일, 함수, 숫자, 실패와 성공을 각각 구분해 보여 줍니다.
  • 안전한 설계: 모델은 코드가 아니라 데이터만 작성하며, 잘못된 응답은 조용히 건너뜁니다.

빠른 시작

<p align="center"><img src="assets/install.gif" alt="상자를 든 Claude가 사막을 가로지릅니다: ~/code/Claude-Fables로 이동 중..." width="960"></p>
  1. 이 저장소를 예를 들어 ~/code/Claude-Fables 같은 영구적인 위치에 클론합니다.

  2. ~/.claude/settings.json 의 env 블록에 추가합니다.

    {
      "env": {
        "CLAUDE_CODE_PLUGIN_DIRS": "/Users/you/code/Claude-Fables"
      }
    }
    

    핫 리로드로 플러그인을 개발하려면 "CLAUDE_CODE_PLUGIN_DIR_WATCH": "1" 도 추가합니다.

  3. 데스크톱 앱을 다시 시작하고 Code 탭에서 Claude에게 작업을 맡깁니다. 몇 초 후 프롬프트 위에 만화가 나타납니다.

터미널에서 한 세션 동안만 시험하려면 claude --plugin-dir ~/code/Claude-Fables 를 실행합니다. 터미널에서는 이 플러그인이 감시만 하고 아무것도 그리지 않는다는 점에 유의하세요.

작동 방식

<p align="center"><img src="assets/how-it-works.gif" alt="한밤중 실험실에서 활동 로그를 살펴보는 Claude" width="960"></p>
tool calls, Claude's own words ──► activity log (last 14 lines)
                                         │  as each scene is read, ≥5s apart
                                         ▼
        Sonnet or Haiku ($.model.complete) ──► JSON scene ──► parseScene (validate + clamp)
                                                                  │
                                                                  ▼
                                    sceneToSvg ──► one self-animating SVG (SMIL)
                                                                  │
                                                                  ▼
                                        <Svg isInteractive/> in the AbovePrompt band
  • 모델은 코드가 아니라 데이터를 작성합니다. 각 장면은 배경, Claude의 동작, 파티클, 캡션, 분위기를 담은 작은 선언형 JSON 객체입니다. hooks/scene.ts 가 엄격하게 검증하여 알 수 없는 필드는 버리고, 숫자는 범위 안으로 제한하고, 문자열은 평탄화해 잘라 내며, 색상은 3자리 또는 6자리 십육진수만 허용합니다. 잘못된 응답은 아무것도 망가뜨리지 않고 표시되지 않을 뿐입니다.
  • 애니메이션은 SVG 안에서 실행됩니다. hooks/svg.ts 는 장면을 SMIL로 스스로 애니메이션하는 하나의 SVG 문서로 컴파일합니다. 걷기 주기, 상하 움직임, 스크롤하는 기차, 반짝이는 별, 스스로 글자를 입력하는 말풍선이 들어 있습니다. 장면을 그린 뒤에는 데스크톱이 다시 그릴 필요가 없습니다.
  • 모든 줄을 끝까지 읽습니다. 장면은 큐에서 하나씩 재생됩니다. 말풍선의 글자가 모두 입력되고 읽을 만큼 충분히 화면에 남을 때까지 유지됩니다. 캡션이 길수록 더 오래 걸립니다. 실패도, 턴의 종료도, 다음 프롬프트도 끼어들지 않습니다. 내레이터는 모델의 응답 속도에 맞춰 현재 장면을 다 읽기 조금 전에 다음 장면을 요청하므로 제때 준비됩니다. 일찍 돌아온 장면은 큐에서 기다립니다. 소식(실패나 턴 종료)은 즉시 요청되어 현재 장면 뒤에 들어갑니다. 내레이터는 주인공이 방금 한 말도 전달받으므로 소식이 화면에 불쑥 나타나는 대신 이야기 안에서 “잠깐—”, “어!”처럼 끼어듭니다. 새 프롬프트가 들어와도 현재 장면은 끝까지 읽고, 진행 중인 마무리 장면도 새 이야기가 시작되기 전에 재생합니다. 턴이 끝나면 마지막 장면이 30초 동안 남았다가 밴드가 지워집니다.
<details> <summary><b>내부 동작:</b> 큐잉, 부드러운 전환, 캡션 맞춤, 제한, 크기</summary>
  • 전환은 부드럽습니다. 새로운 배경의 장면은 이전 장면에서 페이드인하고, 같은 배경이면 바로 이어집니다. 각 장면은 한 번만 그려서 보관하므로 데스크톱이 끝까지 재생할 수 있습니다. 속성이 바뀔 때마다 데스크톱은 밴드를 다시 그리고, 턴이 끝날 때도 속성이 반드시 바뀝니다. 그래서 표시 중인 장면을 다시 그릴 때(턴 종료, 크기 조절, 새 스타일) 장면 자체의 시계에 맞춥니다. 캡션이 입력된 위치와 Claude의 진행 위치가 그대로 유지됩니다.
  • 캡션은 말풍선에 맞습니다. 내레이터에게는 최대 70자로 요청합니다. 하드 리밋은 80자이며, 말풍선이 네 줄 안에 온전히 보여 줄 수 있는 최대 길이입니다. 더 긴 캡션은 마지막 완전한 문장 뒤에서 자르고, 그렇지 않으면 단어가 끝난 뒤 줄임표를 붙여 자릅니다. 단어 중간에서는 자르지 않습니다. 말풍선은 받은 모든 단어를 항상 표시합니다.
  • 제한이 있습니다. 한 번에 실행되는 모델 요청은 하나뿐이며, 장면 사이에는 최소 5초를 둡니다. 오류 뒤에는 지수 백오프로 최대 60초까지 기다립니다. 프롬프트에는 항상 한도가 있어(최근 활동 14줄과 최근 장면 4개) 긴 세션에서도 컨텍스트 창이 넘치지 않습니다.
  • 창에 맞습니다. 밴드에는 항상 밴드와 같은 너비, 높이 192 px인 만화가 들어갑니다. 창이 넓어지면 더 많은 장면이 보일 뿐 그림과 글자가 커지지는 않습니다. 창 크기를 바꾸면 다시 그립니다.
  • 데스크톱 전용입니다. 터미널에서는 엔진이 그린 그대로 밴드를 둡니다.
</details> <details> <summary><b>파일</b></summary>

| 파일 | 역할 | | --- | --- | | hooks/register.tsx | 훅: 도구 호출, 응답, 턴을 감시하고 밴드를 그리며 /fables 를 처리 | | hooks/narrator.ts | 내레이터 시스템 프롬프트, 프롬프트 구성, 응답 파싱, 백오프 | | hooks/director.ts | 내레이터 루프: 기억할 것, 요청할 때, 응답 처리. 플러그인과 뷰어가 같은 루프를 사용 | | hooks/activity.ts | 각 도구 호출을 읽기 쉬운 한 줄로 요약 | | hooks/scene.ts | 장면 형식과 검증기 | | hooks/sprites.ts | 픽셀 아트 라이브러리: 걷기 프레임 2개의 Claude와 30개 이상의 소품 | | hooks/svg.ts | 장면 → 애니메이션 SVG: 배경, 파티클, 소품, 주인공, 캡션 | | hooks/looks.ts | 외형: Pixel Art, the Original, 스타일 레지스트리 | | hooks/styles/*.ts | 9가지 갤러리 스타일. 잉크, 각 요소를 그리는 방식, Claude, 캡션, 태그, 프레임을 정의한 아트 바이블 | | hooks/art/roles.ts、hooks/art/painter.ts、hooks/art/ink.ts | 장면이 요소를 그릴 때 쓰는 역할과 스타일이 다시 그릴 때 쓰는 페인터 | | hooks/grade.ts | 그리드 스타일이 그려진 무대에 적용하는 매체: 테세라 또는 직조 | | hooks/clawd3d.ts | 3D Claude: 상자 모델, 움직임, 투영(갤러리에서 포팅) | | hooks/hero3d.ts | 포즈를 취한 3D 모델을 SMIL이 차례로 재생하는 SVG 프레임으로 구워 냄 | | hooks/scenery.ts | 제작된 7가지 장면: 라이트맵, 재질, 반사 | | types/index.d.ts | 장면 타입과 플러그인의 $.state 계약 |

</details>

사용

<p align="center"><img src="assets/use.gif" alt="숲에서 손을 흔드는 Claude: /fables on, 안녕하세요!" width="960"></p>
  • /fables: 플러그인을 켜거나 끕니다. /fables on 과 /fables off 도 작동하며 설정은 세션 사이에 기억됩니다.
  • /fables style <name>: 아래 스타일 중 하나로 모든 장면을 그립니다. 예를 들어 /fables style ukiyo-e 또는 /fables style golden age 입니다. /fables style 은 목록을 보여 주고 /fables style off 는 기본 Pixel Art로 돌아갑니다. 이 선택도 세션 사이에 기억됩니다.
  • /fables pixel off 와 /fables pixel on 도 여전히 작동합니다. 부드럽게 그린 원래 모습과 픽셀 아트 사이를 전환합니다.
  • /fables model haiku 와 /fables model sonnet: 이야기를 쓸 모델을 고릅니다. 기본값은 Sonnet으로 더 재치 있는 장면을 씁니다. Haiku는 약 1초 만에 응답하고 비용이 적지만 캡션이 더 담백하고 가끔 더 자주 미끄러집니다(잘못된 응답은 건너뜁니다). /fables model 은 현재 선택을 보여 줍니다. 선택은 세션 사이에 유지되고 설정 메뉴의 Scene model(pluginConfigs.fables.model)이 기본값을 정합니다.

장면 하나마다 작은 모델 요청이 하나씩 필요하므로 Claude가 작업하는 동안 분당 몇 번의 요청이 발생합니다.

장면

<p align="center"><img src="assets/scenes.gif" alt="7가지 장면 둘러보기: 숲, 우주, 도시, 사막, 화산, 실험실, 밤의 마을" width="960"></p>

Claude는 갤러리의 3D 모델로 그려집니다. 같은 상자 몸체와 팔, 다리, 알약 모양 눈을 갖고 조명과 깊이 순서가 적용됩니다. 밴드 프레임은 스크립트를 실행하지 않으므로 모델을 실시간으로 그릴 수 없습니다. hooks/clawd3d.ts 가 동작마다 6~12개의 포즈를 만들고 hooks/hero3d.ts 가 각 포즈를 평면 SVG 다각형으로 구워 내면, 장면이 SMIL로 차례로 넘겨집니다. 커서를 따라가거나 드래그할 수는 없습니다. 그런 기능에는 라이브 엔진이 필요합니다.

내레이터는 각 장면에서 작업 종류와 연결된 20가지 동작 중 하나를 고릅니다.

| 재생 방식 | 동작 | | --- | --- | | from 에서 to 로 무대를 가로지름 | walk, run, fly, carry(파일 이동), sneak(버그 찾기), jump, tumble(장애물, 재시도) | | 제자리에서 반복 | dig(검색), inspect(코드 읽기와 편집), think, point(찾았다), peek, spin(리팩터링), wave(인사), sleep(긴 대기), panic(오류), dance, celebrate(마일스톤) | | 제자리에서 한 번 | trip(테스트 실패), shrug(찾은 것 없음) |

장면은 then 으로 두 번째 동작을 연결할 수 있습니다. 첫 동작이 끝난 자리에서 sneak 다음 peek, trip 다음 shrug, jump 다음 celebration처럼 이어집니다. 두 번째 동작이 없으면 Claude는 무대를 건넌 뒤나 한 번짜리 동작 뒤에 대기합니다. 대기 중인 Claude는 주변을 둘러보고 눈을 깜빡이고 무게중심을 옮기며 몸을 폅니다. 그 사이 눈을 크게 뜨거나 집중하며 가늘게 뜨고, 어지러우면 교차시키고, 눈썹 아래로 걱정하는 표정을 짓습니다.

hooks/scenery.ts 의 7가지 배경은 각각 짧은 설명, 광원 하나, 작은 팔레트를 가진 제작 장면입니다.

| 배경 | 장면 | | --- | --- | | forest | 오래된 숲의 새벽. 갈색 줄기의 전나무 두 줄 뒤에 낮은 해가 있고, 나무 사이로 안개가 흐릅니다. 빛이 줄기를 이루며 내려와 빈터에 고이고, 양쪽 가장자리는 큰 나무 두 그루가 감쌉니다 | | space | Earthri

설치

먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.

claude plugin marketplace add henrik-thevibe/Claude-Fables
claude plugin install fables
원문 / README
<p align="center"> <img src="assets/styles.gif" alt="Claude, the little orange critter, playing out coding moments in all eleven styles: Pixel Art, the Original, Cave Painting, Blueprint, Mosaic, Frutiger Aero, Copperplate Engraving, Millefleur Tapestry, Golden Age Comic, Ukiyo-e and Kamon" width="960"> </p> <h1 align="center">Claude Fables</h1> <p align="center"> <b>Your work, told as a cartoon while Claude codes.</b><br> A Claude Code mod for the desktop app that plays a small animated story in the band above the prompt. </p> <p align="center"> <img alt="Claude Code mod" src="https://img.shields.io/badge/Claude_Code-mod-d97757"> <img alt="Desktop app" src="https://img.shields.io/badge/runs_in-the_desktop_app-3b3a36"> <img alt="11 styles" src="https://img.shields.io/badge/styles-11-6a5acd"> <img alt="20 actions" src="https://img.shields.io/badge/actions-20-2e8b57"> <img alt="7 scenes" src="https://img.shields.io/badge/scenes-7-c46a2a"> </p> <p align="center"> <a href="#quick-start">Quick start</a> · <a href="#how-it-works">How it works</a> · <a href="#use">Use</a> · <a href="#the-scenes">The scenes</a> · <a href="#captions">Captions</a> · <a href="#styles">Styles</a> · <a href="#develop">Develop</a> </p>

[!NOTE] Claude Fables was developed entirely in Claude Code cloud environments and tested locally in the desktop app as well. Still, there may be bugs and rough edges. Issues and pull requests are very welcome.

While Claude works, Fables watches each tool call it makes and each line it says. Every few seconds it asks Sonnet (or Haiku, if you prefer) to retell the latest moment as a scene. Bug hunts turn into nature documentaries and bad regexes get pulled over by the train police. Claude appears as a small orange critter walking, sneaking or flying through the story. When the turn ends there is a closing scene, and it stays up for 30 seconds.

  • A scene every few seconds: each tool call and line Claude says becomes a moment in a story.
  • 20 actions: Claude walks, sneaks, digs, trips, shrugs, sleeps and celebrates, matched to the work.
  • 7 hand-lit scenes: forest, space, city, desert, volcano, lab and night village.
  • 11 styles: from pixel art to ukiyo-e, every element redrawn in the medium.
  • Captions that read like a terminal: files, functions, numbers, failures and successes each set apart.
  • Safe by design: the model writes data, never code, and a bad reply is simply skipped.

Quick start

<p align="center"><img src="assets/install.gif" alt="Claude carrying a box across the desert: Moving into ~/code/Claude-Fables..." width="960"></p>
  1. Clone this repo somewhere permanent, for example ~/code/Claude-Fables.

  2. Add it to the env block in ~/.claude/settings.json:

    {
      "env": {
        "CLAUDE_CODE_PLUGIN_DIRS": "/Users/you/code/Claude-Fables"
      }
    }
    

    To work on the mod with hot reload, also add "CLAUDE_CODE_PLUGIN_DIR_WATCH": "1".

  3. Restart the desktop app and give Claude a task in the Code tab. The cartoon appears above the prompt after the first few seconds.

To try it from the terminal for one session instead, run claude --plugin-dir ~/code/Claude-Fables. Note that in the terminal the mod only watches and draws nothing.

How it works

<p align="center"><img src="assets/how-it-works.gif" alt="Claude inspecting the activity log in a late-night lab" width="960"></p>
tool calls, Claude's own words ──► activity log (last 14 lines)
                                         │  as each scene is read, ≥5s apart
                                         ▼
        Sonnet or Haiku ($.model.complete) ──► JSON scene ──► parseScene (validate + clamp)
                                                                  │
                                                                  ▼
                                    sceneToSvg ──► one self-animating SVG (SMIL)
                                                                  │
                                                                  ▼
                                        <Svg isInteractive/> in the AbovePrompt band
  • The model writes data, not code. Each scene is a small declarative JSON object: a backdrop, Claude's action, particles, a caption and its tone. hooks/scene.ts validates it strictly: unknown fields are dropped, numbers clamped, strings flattened and cut, and colors must be 3- or 6-digit hex. A bad reply can't break anything; it just doesn't show.
  • The animation runs inside the SVG. hooks/svg.ts compiles a scene into one SVG document that animates itself with SMIL: walk cycles, bobbing, scrolling trains, twinkling stars, and a speech bubble that types itself out. Once the scene is drawn, the desktop needs no redraws for it.
  • Every line gets read. Scenes play from a queue, one at a time. Each one stays up until its bubble has typed out and been on screen long enough to read, which takes longer for a longer caption. Nothing cuts in: not a failure, not the end of the turn, not the next prompt. The narrator asks for the next scene a little before the current one is read, timed to how quickly the model has been answering, so it is ready on time. A scene that comes back early waits in the queue. News (a failure, the turn ending) is asked for straight away and joins the queue behind the current scene. The narrator is told what the hero has just said, so the news breaks in within the story ("Wait-", "Oh!") rather than on screen. When a new prompt comes in, the scene that is up is still read through, and a closing scene still on its way plays before the new story starts. Once a turn is over, its last scene stays up for 30 seconds, then the band clears.
<details> <summary><b>Under the hood:</b> queueing, smooth changes, caption fit, limits, sizing</summary>
  • Changes are smooth. A scene in a new setting fades in from the last one; one in the same setting carries straight on. Each scene is drawn once and kept, so the desktop plays it through. The desktop draws the band again whenever its props change, and the end of a turn always changes them. So every redraw of a scene that is up (the turn ending, a resize, a new style) is set to the scene's own clock: the caption is exactly as far typed as it was, and Claude is exactly as far along.
  • Captions fit the bubble. The narrator is asked for at most 70 characters. The hard limit is 80, the most the bubble shows whole in four lines. A longer caption is cut after its last full sentence, or else after a whole word with an ellipsis, never mid-word. The bubble always shows every word it is given.
  • It has limits. Only one model request runs at a time, scenes come at least 5 seconds apart, and after errors it backs off exponentially, up to 60 seconds. The prompt is always bounded (the last 14 activity lines and the last 4 scenes), so a long session can't outgrow the context window.
  • It fits the window. The band always gets a cartoon as wide as it is and 192 px tall. A wider window shows more of the scene, not a bigger one, so the art and the text stay the same size. Resizing the window redraws it.
  • Desktop only. In the terminal the band is left exactly as the engine draws it.
</details> <details> <summary><b>The files</b></summary>

| File | What it does || --- | --- | | hooks/register.tsx | The hooks: watches tool calls, replies and turns; draws the band; handles /fables | | hooks/narrator.ts | The narrator's system prompt, prompt building, reply parsing, backoff | | hooks/director.ts | The narrator's loop: what it remembers, when it asks, what it does with a reply. The plugin and the viewer run the same one | | hooks/activity.ts | Boils each tool call down to one readable line | | hooks/scene.ts | The scene format and its validator | | hooks/sprites.ts | The pixel-art library: Claude in two walk frames, plus 30+ props | | hooks/svg.ts | Scene → animated SVG: backdrops, particles, props, hero, caption | | hooks/looks.ts | The looks: Pixel Art, the Original, and the registry of styles | | hooks/styles/*.ts | The nine gallery styles, each an art bible: inks, how each kind of element is drawn, Claude, caption, tag, frame | | hooks/art/roles.ts, hooks/art/painter.ts, hooks/art/ink.ts | The roles scenes paint their elements under, and the painter a style redraws them with | | hooks/grade.ts | The medium a grid style sets the drawn stage into: tesserae or a weave | | hooks/clawd3d.ts | The 3D Claude: the box model, its motions and its projection (ported from the gallery) | | hooks/hero3d.ts | Bakes the posed 3D model into SVG frames that SMIL plays in turn | | hooks/scenery.ts | The seven authored scenes: light maps, materials, reflections | | types/index.d.ts | The scene types and the mod's $.state contract |

</details>

Use

<p align="center"><img src="assets/use.gif" alt="Claude waving in the forest: /fables on, and hello!" width="960"></p>
  • /fables: toggle the mod on or off. /fables on and /fables off also work. The setting is remembered across sessions.
  • /fables style <name>: draw every scene in one of the styles below, for example /fables style ukiyo-e or /fables style golden age. /fables style lists them, and /fables style off goes back to the default, Pixel Art. It is remembered across sessions.
  • /fables pixel off and /fables pixel on still work: they switch between the original look drawn smooth and its pixel art.
  • /fables model haiku and /fables model sonnet: pick who writes the story. Sonnet is the default and writes wittier scenes; Haiku answers in about a second and costs less, but writes plainer captions and slips a little more often (a bad reply is simply skipped). /fables model shows which one is on. The choice is remembered across sessions; the config menu's Scene model (pluginConfigs.fables.model) sets the default.

Every scene is one small model request, so this costs a few requests per minute while Claude is working.

The scenes

<p align="center"><img src="assets/scenes.gif" alt="A tour of the seven scenes: forest, space, city, desert, volcano, lab and night village" width="960"></p>

Claude is drawn as the gallery's 3D model: the same box body, arms, legs and pill eyes, lit and depth-sorted. The band's frame runs no script, so the model can't be drawn live. hooks/clawd3d.ts poses it 6 to 12 times per motion, hooks/hero3d.ts bakes each pose into flat SVG polygons, and the scene flips through them with SMIL. The model can't follow the cursor or be dragged; those need the live engine.

The narrator picks one of 20 actions for each scene, each tied to a kind of work:

| plays | actions | |---|---| | crossing the stage, from from to to | walk, run, fly, carry (moving files), sneak (bug hunts), jump, tumble (obstacles, retries) | | in place, looping | dig (searching), inspect (reading and editing code), think, point (found it), peek, spin (refactors), wave (hello), sleep (long waits), panic (errors), dance, celebrate (milestones) | | in place, once | trip (a test fails), shrug (nothing found) |

A scene can chain a second action with then, played in place where the first one ends: a sneak then a peek, a trip then a shrug, a jump then a celebration. Without one, Claude stands idle after crossing or after a one-off, and an idle Claude looks about, blinks, shifts its weight and stretches. Along the way its eyes go wide, narrow in focus, cross when it's dizzy and worry under a brow.

Each of the seven backdrops in hooks/scenery.ts is an authored scene with one brief, one light source and a small palette:

| Backdrop | The scene | | --- | --- | | forest | Dawn in an old forest: a low sun behind two rows of firs on brown trunks, mist between them, light falling through in shafts and pooling in a clearing, two great trunks framing the edges | | space | Earthrise over a lunar outpost: a low sun rakes the regolith, so every swell has a lit crest, every crater a black bowl and a bright far wall, every rock a long shadow | | city | Blue hour after rain: towers with lit west edges and dark east faces, offices lit a floor at a time, a spire, an elevated train, and the whole skyline mirrored in the wet street | | desert | Mesa sunset: the sun sets in a notch the ranges leave clear, so they face us in violet shade with their sunward sides burning, and their shadows fan toward us across the sand | | volcano | A night eruption: the crater lights its own ash column from beneath, lava runs down a gullied cone, and a stream crosses a black crust crazed with glowing cracks | | lab | Working late: an architect's lamp warms the board-formed concrete and the bench, dust turns in its cone, rain beads on the window over a city opened into bokeh, and the polished floor mirrors the room | | night | A sleeping village: hills under a high moon, cottages with one lit window and a thread of smoke, a great oak framing the view, fireflies |

<details> <summary><b>How they are lit</b></summary>

Every surface is painted twice. First as light: a warm key where the light source reaches, cool shade facing away, deep tones where surfaces meet. Then that light map is multiplied by a material, built in an SVG filter from seeded noise cut into a small palette of related colors: needles, bark, grass, basalt, sandstone, sand, regolith, concrete, wood, asphalt. Light that has to brighten a dark material (shafts, lava glow, lamp pools) is added on top with a screen blend instead. Glows bloom, far layers sit slightly out of focus, rims of light appear only where the light can actually reach, and a lens pass adds fine grain and a vignette over the whole frame, Claude included.

Wet and polished floors reflect: the city's skyline and the lab's room are drawn once, then placed again upside down, blurred and broken by ripples, strongest in the puddles.

Depth comes from atmospheric perspective: further layers are lighter and nearer the sky's color. Focal points sit off the middle, so the middle of the stage, where Claude and the caption are, stays calm. Silhouettes come from smooth noise rather than repeated tiles, so there is no seam at any width. Everything is clipped to the stage, and motion is slow and belongs to the story.

The band's frame takes at most 131,072 characters, so repeated things are drawn once and placed many times: the firs, the grass clumps and the furthest tree line are templates. A scene that would still run over is redrawn leaner, then without particles, and as a last resort on the flat stage.

</details>

Captions

<p align="center"><img src="assets/captions.gif" alt="Claude pointing at a caption that reads: npm test on dates.ts: 42/42 passed, 0 failed" width="960"></p>

The story is told in words. Props aren't drawn on the scene, so nothing competes with Claude and the caption.

The caption is one standard bubble of cartoon paper with a tail pointing at Claude, set in Monocraft by Idrees Hassan (SIL Open Font License, fonts/Monocraft-OFL.txt), embedded as a 5 KB subset so it reads the same everywhere. It stays with Claude and never covers it: it takes a spot just beside, above or (for a flying Claude) below, checked against Claude's whole path, jumps and sways included. While Claude walks, the bubble walks along at the same distance, so its tail always points at Claude. Above Claude, it can sit anywhere along Claude's head, and a narrower wrap is tried, to find a spot the stage's edges never hold back. When a walk is too long for any spot, the bubble waits unseen until Claude is far enough in, then appears beside Claude and walks on with it. That wait is added to the scene's reading time. Inside it, kinds of words are set apart, so a caption reads like a terminal:

| Kind | Example | Looks like | | --- | --- | --- | | code and commands (in backticks, or a known command) | npm test | teal | | files and paths | dates.ts, src/auth | blue | | functions | daysInMonth() | purple | | numbers and timings | 312, 2.41s, 42/42 | orange, bold | | failures | failed, TypeError, N+1 | red, bold | | successes | passed, clean, green | green, bold | | ASCII faces and symbols | ^^ >< \o/ -> [OK] | warm accent |

The narrator also picks a tone for the moment. Trouble leads the caption with a red ✗ and a milestone with a green ✓; a celebration is a milestone unless it says otherwise. The narrator is asked to write like a developer, with backticks around code and the odd ASCII face.

<details> <summary><b>The pixel-art pass</b></summary>

In the Pixel Art look (the default), the whole stage, scenery and Claude together, goes through a pixelizer: one SVG filter that samples the drawing at the middle of every two-unit square and spreads each sample over its square, so everything reads as pixel art without any of it being redrawn, and no blur washes the colors out. The grid starts at the stage's corner, so the pixels line up. Claude gets a sprite filter of its own on the same grid: its body sampled crisp, its eyes (finer than a pixel) found by their darkness and thickened just enough to land on whole pixels, and a one-pixel dark outline round it, as a pixel-art character would have. The caption sits above it all, already in pixel type, so it stays sharp. In the Original look, scenes are drawn smooth and the scenery takes a slight blur instead, so Claude and the caption read first.

</details>

Styles

<p align="center"><img src="assets/styles-grid.png" alt="One still of each of the eleven styles, each labelled with its /fables style command" width="960"></p>

Two looks draw the authored scenes as they are: Pixel Art (pixel, the default) and the Original (original), the same scenes drawn smooth.

Nine more styles, from the Claude Mascot Style Gallery, are artworks of their own. Each one redraws every element of every scene, Claude, the caption bubble, the chapter tag and the frame in its own medium, translated from the gallery's original plate. They are cosmetic only: the story, the scenery's composition and Claude's path stay as they are, and nothing is added to a scene.

| Style | /fables style … | The artwork | | --- | --- | --- | | Cave Painting | cave | Ochre, soot and pale earth rubbed thin on torch-lit limestone; no sky, only the wall; broken soot outlines; Claude in red ochre | | Blueprint | blueprint | White line work on a cyanotype sheet; shade section-hatched, air and light as phantom lines; Claude as a patent drawing with hidden edges dashed | | Mosaic | mosaic | Laid in the floor's stones and set as tesserae in grout, outlined in rows of dark stones; a meander border | | Frutiger Aero | aero | Glossy gradients with a white rim on every surface, after the Vista and 7 wallpapers: an azure sky with a sun flare, Bliss-green grass, aqua glass towers, pearl rooms; Frutiger Aurora at night with teal meadows, moonlit clouds and bokeh stars; Claude as tangerine jelly | | Copperplate Engraving | engraving | One sepia ink on laid paper, every tone cut as hatching along the grain of what it is; a plate mark | | Millefleur Tapestry | tapestry | Woven in madder, woad, weld and walnut wool on the loom's grid; grass becomes the field of a thousand flowers | | Golden Age Comic | golden | Flat newsprint inks, shade in Ben-Day dots, heavy keylines; a lettered balloon | | Ukiyo-e | ukiyoe | Flat woodblock inks over a key line, bokashi skies, kasumi mist, a vermilion sun; a cartouche and seal | | Kamon | kamon | Cream planes on black silk parted by cuts of one width; Claude as a crest; the vermilion hanko |

<details> <summary><b>How a style redraws a scene</b></summary>

Every element of a scene is handed to a painter under a role that says what it is and how deep it stands (hooks/art/roles.ts): a fir, a mist bank, a mesa, the lamp's cone, the wet street. The original looks keep the lit, photographic painting. A style's painter (hooks/art/painter.ts, hooks/styles/*.ts) reads that painting for its shapes and tones and draws it again:

  • the lit look's blooms, materials and lens are left out;
  • each lit color becomes one of the style's inks, wools, stones or threads, chosen by the element's family and depth;
  • shapes take the style's line;
  • what has no edge in the art form (sun and moon, mist, light, water) is redrawn by the style's own conventions.

Claude is drawn by each style's hero painter, from the 3D model's faces, its parts' outline hulls and its edges, which are classed as outline, crease or hidden as in the gallery's engine. A style made on a grid (Mosaic, Tapestry) names that grid as its medium: the drawn stage is set into tesserae or a weave, and its grout or the weave's ribs are laid over it. The narrator hears each style's voice, so a caption can sound like a 1938 comic or a woodblock print while still being about the real work.

The styles draw as fast as the original look or faster, since they leave out the lit look's material filters, and every one fits the band's size limit at every width.

</details>

Develop

<p align="center"><img src="assets/develop.gif" alt="Claude digging by an erupting volcano: Digging through scripts/rehearse.ts" width="960"></p>
claude plugin validate .              # manifest, hooks and state contract
claude plugin test .                  # unit tests plus engine tests (stubbed Sonnet)
bun scripts/preview.ts > gallery.html # render sample scenes to a page in the browser
bun scripts/preview.ts --look all > styles.html # every look

scripts/scenarios.ts holds seven whole sessions: the prompt, each tool call and its result, Claude's words, and what Sonnet and what Haiku write back each time the narrator asks, as raw text, quirks included (code fences, a word of chatter, a missing caption, an empty answer). scripts/rehearse.ts plays a session through the narrator's own loop on a clock of its own, so the asks land when the plugin would make them, see exactly the prompt it would send, and bad replies are skipped and backed off from the same way. The viewer's Sessions tab shows it side by side: Claude Code's activity, the narrator's asks (with each prompt) and the model's replies (with each raw reply and the validator's verdict), the band, and a box to paste a reply of your own and see what the plugin would make of it. A test rehearses every session with both models. bun scripts/preview.ts my-scenes.json renders your own scenes, which is handy for tuning sprites or trying out what Sonnet sent back.

The mod API is early access and may change between Claude Code releases. This mod was built against Claude Code 2.1.287. If something stops drawing, run claude --debug: the log line will name what the engine refused.

The images in this README are drawn by the mod itself: bun scripts/readme-gifs.ts renders them to assets/. The launch video is made the same way; see video/.

Built in the cloud

<p align="center"><img src="assets/cloud.gif" alt="Claude flying over the moon: Built entirely in the cloud. Bugs may lurk." width="960"></p>

Claude Fables was developed entirely in Claude Code cloud environments: the mod, its tests, the scenes and styles, this README's images and the launch video. It was also tested locally in the desktop app, but there may still be bugs, and some may only show up on your setup. If something looks off, run claude --debug and open an issue with what the log says.

Credits

  • Claude's 3D model and its projection are ported from the gallery's engine by ChetasLua, under the MIT License.
  • The nine gallery styles come from the Claude Mascot Style Gallery.
  • Captions are set in Monocraft by Idrees Hassan, under the SIL Open Font License (fonts/Monocraft-OFL.txt).

비슷한 프로젝트