본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

pretext

글자 위치를 미리 계산해 움직이는 도형을 피하는 문장, 클릭하면 흩어지는 글자, 단어 게임과 여러 줄 글에 맞는 카드를 단일 HTML로 만듭니다.

원문원문 설명 보기

Build creative browser demos with DOM-free text layout.

AI 평가90점/ 100설치 방법 보기

이럴 때 유용합니다

  • 움직이는 도형을 피하는 글을 만듭니다
  • 클릭하면 글자가 흩어지게 합니다
  • 단어나 글자로 게임을 만듭니다
  • 여러 줄 글에 꼭 맞는 카드를 만듭니다

한국어 소개

할 수 있는 일

pretext는 글자를 활용한 동적인 브라우저 데모를 만듭니다. @chenglou/pretext로 줄바꿈 위치, 줄 너비, 글자별 좌표를 그리기 전에 계산합니다. 이를 활용해 움직이는 도형을 피해 흐르는 문장이나 클릭하면 글자가 흩어지는 효과를 만듭니다. 단어를 블록으로 쓰는 게임과 여러 줄의 글에 꼭 맞는 카드도 다룹니다. 기본 구성은 Canvas 2D와 단일 HTML 파일이며 빌드 작업은 필요하지 않습니다.

이럴 때 유용합니다

웹페이지에 글 자체를 활용한 시각 효과를 더하거나 사용자 조작에 반응하는 타이포그래피를 실험할 때 적합합니다. 제공되는 템플릿에서 시작해 글 내용, 서체, 색상, 움직임과 조작 방식을 구체화합니다.

사용 예시

  • “드래그하는 공을 피해 글이 흐르는 데모를 만들어 주세요.”
  • “클릭하면 시의 글자가 흩어지는 효과를 만들어 주세요.”
  • “단어를 블록으로 쓰는 게임을 단일 HTML 파일로 만들어 주세요.”

주의 사항

라이브러리는 esm.sh를 통해 불러옵니다. 측정할 때와 그릴 때의 글꼴 설정을 일치시켜야 합니다. 일반적인 정적 레이아웃이나 범용 서식 있는 텍스트 편집에는 적합하지 않습니다. 스킬의 라이선스는 MIT입니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

객관 평가

AI가 SKILL.md의 내용만을 근거로 4가지 관점에서 판정했습니다. 스타 수나 인기도는 판정에 넣지 않았습니다.

지시의 명확성언제 쓰고 무엇을 하는지 알 수 있는가
A양호동적인 타이포그래피와 문자 게임에 사용하며 정적 레이아웃은 제외한다고 명시합니다.
절차의 구체성절차·입출력·예시가 구체적으로 적혀 있는가
A양호단일 HTML 구성, API 코드 예시, 효과별 구현 패턴을 제공합니다.
안전성전송·삭제·명령 실행 등을 명시하고 있는가
B일부 부족esm.sh에서 코드를 불러오고 버전을 고정하지만 받은 코드를 검증하는 절차는 없습니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
A양호빌드가 필요 없는 단일 HTML 구성이며 CDN에서 불러오는 예시를 제공합니다.

총점은 각 항목을 A=25점, B=15점, C=5점으로 더한 값입니다. 2026년 10월 20일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(4)

  • SKILL.md13.7 KB
  • references/patterns.md10.2 KB
  • templates/donut-orbit.html52.0 KB
  • templates/hello-orb-flow.html3.4 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Pretext Creative Demos

Overview

@chenglou/pretext is a 15KB zero-dependency TypeScript library by Cheng Lou (React core, ReasonML, Midjourney) for DOM-free multiline text measurement and layout. It does one thing: given (text, font, width), return the line breaks, per-line widths, per-grapheme positions, and total height — all via canvas measurement, no reflow.

That sounds like plumbing. It is not. Because it is fast and geometric, it is a creative primitive: you can reflow paragraphs around a moving sprite at 60fps, build games whose level geometry is made of real words, drive ASCII logos through prose, shatter text into particles with exact per-grapheme starting positions, or pack shrink-wrapped multiline UI without any getBoundingClientRect thrash.

This skill exists so Hermes can make cool demos with it — the kind people post to X. See pretext.cool and chenglou.me/pretext for the community demo corpus.

When to Use

Use when the user asks for:

  • A "pretext demo" / "cool pretext thing" / "text-as-X"
  • Text flowing around a moving shape (hero sections, editorial layouts, animated long-form pages)
  • ASCII-art effects using real words or prose, not monospace rasters
  • Games where the playfield / obstacles / bricks are made of text (Tetris-from-letters, Breakout-of-prose)
  • Kinetic typography with per-glyph physics (shatter, scatter, flock, flow)
  • Typographic generative art, especially with non-Latin scripts or mixed scripts
  • Multiline "shrink-wrap" UI (smallest container width that still fits the text)
  • Anything that would require knowing line breaks before rendering

Don't use for:

  • Static SVG/HTML pages where CSS already solves layout — just use CSS
  • Rich text editors, general inline formatting engines (pretext is intentionally narrow)
  • Image → text (use ascii-art / ascii-video skills)
  • Pure canvas generative art with no text role — use p5js

Creative Standard

This is visual art rendered in a browser. Pretext returns numbers; you draw the thing.

  • Don't ship a "hello world" demo. The hello-orb-flow.html template is the starting point. Every delivered demo must add intentional color, motion, composition, and one visual detail the user didn't ask for but will appreciate.
  • Dark backgrounds, warm cores, considered palette. Classic amber-on-black (CRT / terminal) works, but so do cold-white-on-charcoal (editorial) and desaturated pastels (risograph). Pick one and commit.
  • Proportional fonts are the point. Pretext's whole vibe is "not monospaced" — lean into it. Use Iowan Old Style, Inter, JetBrains Mono, Helvetica Neue, or a variable font. Never default sans.
  • Real source/text, not lorem ipsum. The corpus should mean something. Short manifestos, poetry, real source code, a found text, the library's own README — never lorem ipsum.
  • First-paint excellence. No loading states, no blank frames. The demo must look shippable the instant it opens.

Stack

Single self-contained HTML file per demo. No build step.

LayerToolPurpose
Core@chenglou/pretext via esm.sh CDNText measurement + line layout
RenderHTML5 Canvas 2DGlyph rendering, per-frame composition
SegmentationIntl.Segmenter (built-in)Grapheme splitting for emoji / CJK / combining marks
InteractionRaw DOM eventsMouse / touch / wheel — no framework
<script type="module">
import {
  prepare, layout,                   // use-case 1: simple height
  prepareWithSegments, layoutWithLines,  // use-case 2a: fixed-width lines
  layoutNextLineRange, materializeLineRange, // use-case 2b: streaming / variable width
  measureLineStats, walkLineRanges,  // stats without string allocation
} from "https://esm.sh/@chenglou/pretext@0.0.6";
</script>

Pin the version. @0.0.6 at time of writing — check npm for the latest if demo behavior is off.

The Two Use Cases

Almost everything reduces to one of these two shapes. Learn both.

Use-case 1 — measure, then render with CSS/DOM

const prepared = prepare(text, "16px Inter");
const { height, lineCount } = layout(prepared, 320, 20);

You still let the browser draw the text. Pretext just tells you how tall the box will be at a given width, without a DOM read. Use for:

  • Virtualized lists where rows contain wrapping text
  • Masonry with precise card heights
  • "Does this label fit?" dev-time checks
  • Preventing layout shift when remote text loads

Keep font and letterSpacing exactly in sync with your CSS. The canvas ctx.font format (e.g. "16px Inter", "500 17px 'JetBrains Mono'") must match the rendered CSS, or measurements drift.

Use-case 2 — measure and render yourself

const prepared = prepareWithSegments(text, FONT);
const { lines } = layoutWithLines(prepared, 320, 26);
for (let i = 0; i < lines.length; i++) {
  ctx.fillText(lines[i].text, 0, i * 26);
}

This is where the creative work lives. You own the drawing, so you can:

  • Render to canvas, SVG, WebGL, or any coordinate system
  • Substitute per-glyph transforms (rotation, jitter, scale, opacity)
  • Use line metadata (width, grapheme positions) as geometry

For variable-width-per-line flow (text around a shape, text in a donut band, text in a non-rectangular column):

let cursor = { segmentIndex: 0, graphemeIndex: 0 };
let y = 0;
while (true) {
  const lineWidth = widthAtY(y);  // your function: how wide is the corridor at this y?
  const range = layoutNextLineRange(prepared, cursor, lineWidth);
  if (!range) break;
  const line = materializeLineRange(prepared, range);
  ctx.fillText(line.text, leftEdgeAtY(y), y);
  cursor = range.end;
  y += lineHeight;
}

This is the most important pattern in the whole library. It's what unlocks "text flowing around a dragged sprite" — the demo that went viral on X.

Helpers worth knowing

  • measureLineStats(prepared, maxWidth) → { lineCount, maxLineWidth } — the widest line, i.e. multiline shrink-wrap width.
  • walkLineRanges(prepared, maxWidth, callback) — iterate lines without allocating strings. Use for stats/physics over graphemes when you don't need the characters.
  • @chenglou/pretext/rich-inline — the same system but for paragraphs mixing fonts / chips / mentions. Import from the subpath.

Demo Recipe Patterns

The community corpus (see references/patterns.md) clusters into a handful of strong patterns. Pick one and riff — don't invent a new category unless asked.

PatternKey APIExample idea
Reflow around obstaclelayoutNextLineRange + per-row width functionEditorial paragraph that parts around a dragged cursor sprite
Text-as-geometry gamelayoutWithLines + per-line collision rectsBreakout where each brick is a measured word
Shatter / particleswalkLineRanges → per-grapheme (x,y) → physicsSentence that explodes into letters on click
ASCII obstacle typographylayoutNextLineRange + measured per-row obstacle spansBitmap ASCII logo, shape morphs, and draggable wire objects that make text open around their actual geometry
Editorial multi-columnlayoutNextLineRange per column + shared cursorAnimated magazine spread with pull quotes
Kinetic typelayoutWithLines + per-line transform over timeStar Wars crawl, wave, bounce, glitch
Multiline shrink-wrapmeasureLineStatsQuote card that auto-sizes to its tightest container

See templates/donut-orbit.html and templates/hello-orb-flow.html for working single-file starters.

Workflow

  1. Pick a pattern from the table above based on the user's brief.
  2. Start from a template:
    • templates/hello-orb-flow.html — text reflowing around a moving orb (reflow-around-obstacle pattern)
    • templates/donut-orbit.html — advanced example: measured ASCII logo obstacles, draggable wire sphere/cube, morphing shape fields, selectable DOM text, and dev-only controls
    • write_file to a new .html in ~/.hermes/cache/scratch/ or the user's workspace.
  3. Swap the corpus for something intentional to the brief. Real prose, 10-100 sentences, no lorem.
  4. Tune the aesthetic — font, palette, composition, interaction. This is the work; don't skip it.
  5. Verify locally:
    cd <dir-with-html> && python -m http.server 8765
    # then open http://localhost:8765/<file>.html
    
  6. Check the console — pretext will throw if prepareWithSegments is called with a bad font string; Intl.Segmenter is available in every modern browser.
  7. Show the user the file path, not just the code — they want to open it.

Performance Notes

  • prepare() / prepareWithSegments() is the expensive call. Do it once per text+font pair. Cache the handle.
  • On resize, only rerun layout() / layoutWithLines() — never re-prepare.
  • For per-frame animations where text doesn't change but geometry does, layoutNextLineRange in a tight loop is cheap enough to do every frame at 60fps for normal-length paragraphs.
  • When rendering ASCII masks per frame, keep a cell buffer (Uint8Array/typed arrays), derive measured per-row obstacle spans from the cells or projected geometry, merge spans, then feed those spans into layoutNextLineRange before drawing text.
  • Keep visual animation and layout animation coupled. If a sphere morphs into a cube, tween both the rendered cell buffer and the obstacle spans with the same value; otherwise the demo looks painted-on instead of physically reflowed.
  • For fades, prefer layer opacity over changing glyph intensity or obstacle scale. Put transient ASCII sprites on their own canvas and fade the canvas with CSS/GSAP opacity so geometry does not appear to shrink.
  • Canvas ctx.font setting is surprisingly slow; set it once per frame if font doesn't vary, not per fillText call.

Common Pitfalls

  1. Drifting CSS/canvas font strings. ctx.font = "16px Inter" measured, but CSS says font-family: Inter, sans-serif; font-size: 16px. Fine if Inter loads. If Inter 404s, CSS falls back to sans-serif and measurements drift by 5-20%. Always preload the font or use a web-safe family.

  2. Re-preparing inside the animation loop. Only layout* is cheap. Re-calling prepare every frame will tank perf. Keep the prepared handle in module scope.

  3. Forgetting Intl.Segmenter for grapheme splits. Emoji, combining marks, CJK — "é".split("") gives you two chars. Use new Intl.Segmenter(undefined, { granularity: "grapheme" }) when sampling individual visible glyphs.

  4. break: 'never' chips without extraWidth. In rich-inline, if you use break: 'never' for an atomic chip/mention, you must also supply extraWidth for the pill padding — otherwise chip chrome overflows the container.

  5. Using @chenglou/pretext from unpkg with TypeScript-only entry. Use esm.sh — it compiles the TS exports to browser-ready ESM automatically. unpkg will 404 or serve raw TS.

  6. Monospace fallbacks silently erasing the whole point. Users seeing monospace-looking output often have a CSS font-family that fell through to monospace. Verify the actual rendered font via DevTools.

  7. Skipping rows vs adjusting width when flowing around a shape. If the corridor on this row is too narrow to fit a line, skip the row (y += lineHeight; continue;) rather than passing a tiny maxWidth to layoutNextLineRange — pretext will return one-grapheme lines that look broken.

  8. Shipping a cold demo. The default first-paint looks tutorial-grade. Add: vignette, subtle scanline, idle auto-motion, one carefully chosen interactive response (drag, hover, scroll, click). Without these, "cool pretext demo" lands as "intern repro of the README."

Verification Checklist

  • Demo is a single self-contained .html file — opens by double-click or python -m http.server
  • @chenglou/pretext imported via esm.sh with pinned version
  • Corpus is real prose, not lorem ipsum, and matches the demo's concept
  • Font string passed to prepare matches the CSS font exactly
  • prepare() / prepareWithSegments() called once, not per frame
  • Dark background + considered palette — not the default white canvas
  • At least one interactive response (drag / hover / scroll / click) or idle auto-motion
  • Tested locally with python -m http.server and confirmed no console errors
  • 60fps on a mid-tier laptop (or graceful degradation documented)
  • One "extra mile" detail the user didn't ask for

Reference: Community Demos

Clone these for inspiration / patterns (all MIT-ish, linked from pretext.cool):

  • Pretext Breaker — breakout with word-bricks — github.com/rinesh/pretext-breaker
  • Tetris × Pretext — github.com/shinichimochizuki/tetris-pretext
  • Dragon animation — github.com/qtakmalay/PreTextExperiments
  • Somnai editorial engine — github.com/somnai-dreams/pretext-demos
  • Bad Apple!! ASCII — github.com/frmlinn/bad-apple-pretext
  • Drag-sprite reflow — github.com/dokobot/pretext-demo
  • Alarmy editorial clock — github.com/SmisLee/alarmy-pretext-demo

Official playground: chenglou.me/pretext — accordion, bubbles, dynamic-layout, editorial-engine, justification-comparison, masonry, markdown-chat, rich-note.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

1password

무료요약 있음AI 평가 100점

1Password에 저장한 비밀번호와 API 키를 명령과 설정 템플릿에 사용합니다. CLI 설치와 인증부터 비밀 값 조회 및 환경 변수 전달까지 안내합니다.

  • 1Password CLI 설치와 설정
  • 저장된 API 키로 명령 실행
  • 설정 템플릿에 비밀 값 삽입
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

3-statement-model

무료요약 있음AI 평가 90점

손익계산서·재무상태표·현금흐름표를 수식으로 연결한 Excel 모델을 만듭니다. 실적과 예측 가정을 입력하고 시나리오를 비교하며 세 재무제표의 일관성을 단계별로 확인합니다.

  • 재무 템플릿에 실적 입력
  • 세 재무제표가 연동되는 예측 작성
  • 기본·상향·하향 시나리오 비교
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

accelerate

무료요약 있음AI 평가 80점

기존 PyTorch 학습 코드를 적은 수정으로 여러 GPU나 컴퓨터에 맞게 구성합니다. 혼합 정밀도, 메모리 절약 설정과 학습 실행 방법을 안내합니다.

  • 단일 GPU 학습을 여러 GPU로 옮깁니다
  • 혼합 정밀도 학습을 설정합니다
  • DeepSpeed나 FSDP로 메모리를 절약합니다
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

actual-setup

무료요약 있음AI 평가 100점

Hermes에서 Actual Computer로 자신의 기기에 AI 모델을 실행하도록 연결을 설정합니다. 중계 서비스와 로컬 연결, 모델 선택, 응답 확인 및 오류 점검을 다룹니다.

  • Actual 키로 Hermes를 연결합니다
  • 자신의 기기에서 모델을 실행합니다
  • 로컬 모델을 찾아 내려받고 불러옵니다
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

adversarial-ux-test

무료요약 있음AI 평가 80점

기술에 익숙하지 않고 쉽게 불만을 느끼는 사용자로 앱을 시험합니다. 혼란스러운 조작과 이탈 원인을 찾고, 개선 과제와 개인적 불만을 나눠 수정안을 정리합니다.

  • 출시나 시연 전에 사용성을 확인합니다
  • 신규 사용자의 경험을 점검합니다
  • 가입과 결제 과정의 어려움을 찾습니다
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

agent-merge-conflict-arbiter

무료요약 있음AI 평가 100점

두 에이전트가 각각 수정한 브랜치의 Git 충돌을 양쪽 변경 내용과 의도에 따라 중립적으로 해결합니다. 충돌별 판단 이유를 기록하고 빌드나 테스트로 통합 결과를 확인합니다.

  • 두 에이전트의 브랜치 충돌 해결
  • 병렬 worktree의 변경 내용 통합
  • 충돌하는 설계 판단의 이유 확인
NousResearch/hermes-agent25.5만2026년 10월 19일 업데이트

NousResearch의 스킬 모두 보기

이 스킬의 문제 신고