<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: @kiwibreaksme</title>
    <description>The latest articles on DEV Community by @kiwibreaksme (@kiwibreaksme).</description>
    <link>https://dev.to/kiwibreaksme</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F865191%2F8d1bfea4-e727-40e2-9d08-a564a58324ce.png</url>
      <title>DEV Community: @kiwibreaksme</title>
      <link>https://dev.to/kiwibreaksme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiwibreaksme"/>
    <language>en</language>
    <item>
      <title>I catalogued every tell that makes a UI look AI-generated. My own tool kept failing the test.</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Thu, 02 Jul 2026 05:23:12 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/i-catalogued-every-tell-that-makes-a-ui-look-ai-generated-my-own-tool-kept-failing-the-test-n52</link>
      <guid>https://dev.to/kiwibreaksme/i-catalogued-every-tell-that-makes-a-ui-look-ai-generated-my-own-tool-kept-failing-the-test-n52</guid>
      <description>&lt;p&gt;You can always tell when an AI built a UI. You can't always say &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;StyleSeed&lt;/a&gt; — an open-source set of design rules that Claude Code, Cursor, and Codex read automatically, so AI-built UI stops looking generated. For the past few months my actual job has been writing that "why" down: cataloguing every tell, turning each one into a rule an agent can obey, and then dogfooding the rules to see if they hold.&lt;/p&gt;

&lt;p&gt;They kept not holding — in ways that embarrassed me three separate times. That's what this post is about, because the failures turned out to be more useful than the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catalog: generation-one tells
&lt;/h2&gt;

&lt;p&gt;These are the ones everyone recognizes, even non-designers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The default indigo.&lt;/strong&gt; &lt;code&gt;#4F46E5&lt;/code&gt; / &lt;code&gt;#5E6AD2&lt;/code&gt; — Tailwind's and every agent's comfort color. Zero brands chose it; every unguided agent ships it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The icon-in-a-pale-chip.&lt;/strong&gt; A generic Lucide line icon in an identical rounded square with a pastel background, repeated for &lt;em&gt;every&lt;/em&gt; feature card. One is fine. Seven is a signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rainbow status lists.&lt;/strong&gt; Every row gets a differently-colored badge — including "normal," which should be grey. Color is supposed to mean &lt;em&gt;look here&lt;/em&gt;; paint every row and nothing means anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emoji as UI icons.&lt;/strong&gt; 🚗🧺⭐ inject five uncontrolled hues each and break the single-accent rule instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centered everything + gradient headline + ✨ badge.&lt;/strong&gt; The stock hero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4 identical KPI cards. 3 identical pricing columns. 14px body on a 1440px screen. Pure #000 text.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually each is defensible. Together they compound into "an AI made this."&lt;/p&gt;

&lt;p&gt;So I wrote rules that ban each one — with the reasoning, so a model applies them instead of pattern-matching around them. Then I tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure #1: my own rules were &lt;em&gt;teaching&lt;/em&gt; the rainbow
&lt;/h2&gt;

&lt;p&gt;Dogfooding a mobile dashboard, the status list came out rainbow — the exact thing the project exists to prevent. I went digging expecting a model failure, and found this in my own DESIGN-LANGUAGE.md, rule 65:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Vary status states in lists to create &lt;strong&gt;visual interest through color diversity&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was literally instructing agents to build rainbow lists. The agent had followed my rule perfectly. The rule was wrong.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2p29j10jvm8jagkjti7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2p29j10jvm8jagkjti7q.png" alt="Before: every status row a different color, " width="780" height="2198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rewrote rule 65 (status color = severity, never decoration), re-ran the same build: two grey "normal" rows, one amber, one red. Same agent, same prompt — only the rule changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure #2: my landing page scored 58/100 on my own quality gate
&lt;/h2&gt;

&lt;p&gt;StyleSeed ships a scored quality gate — the agent reviews its UI against the rules and fixes it to a floor of 80/100 &lt;em&gt;before showing you anything&lt;/em&gt;. At some point I did the obvious uncomfortable thing and ran the gate on &lt;strong&gt;StyleSeed's own landing page&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;58/100.&lt;/strong&gt; The page whose hero copy mocks "an icon in a pale chip on every card" had &lt;strong&gt;twelve icon chips&lt;/strong&gt; on it. Four accent colors. 11–13px text everywhere. A reviewer would have screenshotted it with the caption &lt;em&gt;"physician, heal thyself."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We rebuilt it to pass (one accent, chips gone, type floor met). But the lesson stuck: &lt;strong&gt;coherence rules don't enforce themselves — the gate has to run on everything, including your own marketing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure #3: the escape hatches became clichés
&lt;/h2&gt;

&lt;p&gt;Here's the one I find genuinely interesting. Once you ban the generation-one tells, agents all flee through the same exits — and the exits are becoming the &lt;em&gt;next&lt;/em&gt; tells:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ghost index numbers&lt;/strong&gt; (01 · 02 · 03) replacing every icon chip&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UPPERCASE-overline + big-number cards&lt;/strong&gt; repeated identically for every KPI&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;text-left / visual-right hero with two pill CTAs&lt;/strong&gt; on every product site&lt;/li&gt;
&lt;li&gt;And the overshoot: escaping "generic" into &lt;strong&gt;dated&lt;/strong&gt; — a beige paper background + serif on everything, which stops reading "designed" and starts reading "government pamphlet." I shipped exactly this as a proud "after" example. It got rejected on sight — the generic &lt;em&gt;before&lt;/em&gt; honestly looked better at a glance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the rulebook now tracks tells by generation: gen-1 (indigo, chips, rainbow) is banned outright; gen-2 has its own rule — &lt;em&gt;one signature treatment per project, varied section anatomy&lt;/em&gt;; gen-3 sets a modern floor — &lt;em&gt;white base, serif as seasoning, keep the air&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is the actual nature of the problem: it's not a checklist, it's an &lt;strong&gt;arms race against convergence&lt;/strong&gt;. Any escape route, once popular, becomes a tell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it work?
&lt;/h2&gt;

&lt;p&gt;The cover image is the current proof: same product, same prompt, same model — only the rules changed. The before is an authentic agent-defaults build (competent, clean, and instantly recognizable as AI). The after chose its own accent, put the &lt;em&gt;real product&lt;/em&gt; in the hero, and varied every section's anatomy.&lt;/p&gt;

&lt;p&gt;I also ran a three-domain stress test with &lt;strong&gt;zero design direction&lt;/strong&gt; — a Korean mobile health app, a dark observability dashboard, a warm e-commerce landing. All three came out refined &lt;em&gt;and different from each other&lt;/em&gt;: calm teal + soft radii, signal-teal + IBM Plex + tonal dark, terracotta + a display grotesque. The thing I feared most — that the rules would just converge everything onto a new "StyleSeed look" — didn't happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually moves the needle
&lt;/h2&gt;

&lt;p&gt;After all the dogfooding, three mechanics matter more than any individual rule:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Constraints before code.&lt;/strong&gt; A &lt;code&gt;STYLESEED.md&lt;/code&gt; lock (mood, key color, font, surface) the agent re-reads every prompt. Unlocked = drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A scored gate with a floor.&lt;/strong&gt; "Review your work" is ignorable; "score it, fix to ≥80, then show me" is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ban lists with reasons.&lt;/strong&gt; Positive advice ("use nice spacing") does nothing. Named bans ("no &lt;code&gt;#4F46E5&lt;/code&gt;, no icon-chips, normal = grey") change output immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's all MIT: &lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;github.com/bitjaru/styleseed&lt;/a&gt; — 74 rules + the gate + skins, readable by Claude Code / Cursor / Codex via one pasted sentence. Live demo at &lt;a href="https://styleseed-demo.vercel.app" rel="noopener noreferrer"&gt;styleseed-demo.vercel.app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What's the tell that instantly makes &lt;em&gt;you&lt;/em&gt; think "an AI made this"? I'm collecting them — the catalog only grows when someone names a new one.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AI가 만든 UI가 어딘가 '어색한' 이유 — 그리고 그걸 고치는 한 가지 원칙</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Tue, 16 Jun 2026 06:32:37 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/aiga-mandeun-uiga-eodinga-eosaeghan-iyu-geurigo-geugeol-gocineun-han-gaji-weoncig-5e4p</link>
      <guid>https://dev.to/kiwibreaksme/aiga-mandeun-uiga-eodinga-eosaeghan-iyu-geurigo-geugeol-gocineun-han-gaji-weoncig-5e4p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇬🇧 English version: &lt;a href="https://dev.to/kiwibreaksme/why-ai-generated-uis-look-off-and-the-one-principle-that-fixes-it-4j20"&gt;Why AI-Generated UIs Look 'Off' — and the One Principle That Fixes It&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;겪어보셨을 겁니다. AI한테 대시보드를 만들어 달라고 하면, 나오긴 나와요. 그런데… 묘하게 어색합니다. 컴포넌트 하나하나는 멀쩡해요. 버튼은 버튼답고, 카드는 카드답죠. 그런데 전체를 보면 &lt;em&gt;"생성된 티"&lt;/em&gt; 가 납니다. UI를 찍은 스톡 사진 같달까요.&lt;/p&gt;

&lt;p&gt;저도 한동안은 "컴포넌트를 더 잘 만들면" 또는 "프롬프트에 감각을 더 넣으면" 해결될 거라 생각했습니다. 아니더군요. 실제 디자인 문헌 — Refactoring UI, Material Design 3, Apple HIG, IBM Carbon, WCAG, Financial Times의 시각 어휘집 — 을 파고들수록 진짜 원인엔 이름이 있었습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;정합성(coherence)의 부재.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;부품들이 서로 안 맞는 겁니다. 그리고 한번 보이기 시작하면, 다시는 안 보이게 할 수가 없어요.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;전에 &lt;a href="https://dev.to/kiwibreaksme/dijaineo-eobsi-baibeukodingeuro-toseugeub-ui-mandeuneun-beob-5c0g"&gt;디자이너 없이 바이브코딩으로 토스급 UI 만드는 법&lt;/a&gt;을 다뤘는데, 이번 글은 그 아래의 '왜' — "어색함"의 실제 메커니즘과 그걸 고치는 한 가지 원칙을 팝니다.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  증상: 서로 안 맞는 부품들
&lt;/h2&gt;

&lt;p&gt;다음 UI엔 "틀린" 게 하나도 없습니다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;모서리가 &lt;strong&gt;각진&lt;/strong&gt;(2px) 카드&lt;/li&gt;
&lt;li&gt;그 안의 &lt;strong&gt;알약 모양&lt;/strong&gt; 버튼&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;파란&lt;/strong&gt; 기본 버튼 옆의 &lt;strong&gt;보라&lt;/strong&gt; "업그레이드" 링크&lt;/li&gt;
&lt;li&gt;아이콘: Lucide 아웃라인 2개 + 채워진 이모지 1개&lt;/li&gt;
&lt;li&gt;좌상단에서 떨어진 그림자 하나, 정아래에서 떨어진 그림자 하나&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;하나씩 떼어 보면 전부 정당화됩니다. 그런데 합치면 "부품 조립" 신호가 떠요. 사람 디자이너라면 같은 화면에서 이 결정들을 동시에 내리지 않거든요. 디자이너는 모서리 스타일 &lt;em&gt;하나&lt;/em&gt;, 강조색 &lt;em&gt;하나&lt;/em&gt;, 아이콘 세트 &lt;em&gt;하나&lt;/em&gt;, 광원 &lt;em&gt;하나&lt;/em&gt; 를 고르고 — 그걸 어디서나 반복합니다.&lt;/p&gt;

&lt;p&gt;그 &lt;strong&gt;반복&lt;/strong&gt;이 우리가 "한 사람이 만든 느낌"으로 읽는 정체입니다. UX Collective의 Goran Paun은 이걸 시각적 정합성이라 부르고, Steve Schoger의 &lt;em&gt;Refactoring UI&lt;/em&gt; 전체가 어떤 의미에선 "불필요한 변주를 만들지 마라"는 책이죠. 원칙 자체는 오래됐습니다. 새로운 건 &lt;strong&gt;AI가 기본값으로 이걸 깨뜨린다&lt;/strong&gt;는 점이고, &lt;em&gt;왜&lt;/em&gt; 깨는지를 알면 어떻게 고칠지가 보입니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI가 유독 이걸 못 하는 이유
&lt;/h2&gt;

&lt;p&gt;언어 모델은 UI를 &lt;strong&gt;국소적으로(locally)&lt;/strong&gt; 생성합니다. 카드 쓰고, 버튼 쓰고, 모달 쓰고 — 각각을 그럴듯한 새 조각으로 따로 만들어요. "40줄 위의 버튼이 알약 모양이었으니 이것도 알약이어야 한다"는 기억이 없습니다. 각 컴포넌트는 자기 학습 데이터의 평균값으로 회귀하는데, "버튼의 평균"과 "카드의 평균"은 애초에 서로 맞춰진 적이 없죠.&lt;/p&gt;

&lt;p&gt;사람은 이렇게 일하지 않습니다. 우리는 머릿속에 아주 작은 결정 집합 — &lt;em&gt;이 제품은 둥근 모서리, 파란 강조색, 8px 그리드&lt;/em&gt; — 을 들고 다니고, 새 요소는 전부 그걸 물려받습니다. 그 결정이 &lt;strong&gt;끈끈하게(sticky)&lt;/strong&gt; 따라붙어요.&lt;/p&gt;

&lt;p&gt;그래서 해법은 "모델을 더 감각 있게" 가 아닙니다. &lt;strong&gt;그 끈끈한 결정들을 적어두고, 모델에게 새로 만들지 말고 복사하라고 시키는 것&lt;/strong&gt; 입니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  메타 법칙: 축마다 값 하나
&lt;/h2&gt;

&lt;p&gt;핵심은 한 문장입니다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;디자인 축마다 값(또는 패밀리)을 &lt;strong&gt;하나만&lt;/strong&gt; 정하고, 토큰으로 박아서, &lt;strong&gt;어디서나&lt;/strong&gt; 적용한다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;정합성은 "모든 화면이 똑같다"가 아닙니다. 같은 &lt;em&gt;결정&lt;/em&gt;이 반복되는 거예요. 설정 페이지와 대시보드는 전혀 다르게 생겨도 — 모서리 personality, 그림자 언어, 강조색, 간격 단위만 공유하면 — 한 제품처럼 느껴집니다.&lt;/p&gt;

&lt;p&gt;통일돼야 하는 축들:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;축&lt;/th&gt;
&lt;th&gt;하나만 정한다&lt;/th&gt;
&lt;th&gt;섞이면&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;모서리/라운드&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;각짐 0–4px · 부드러움 8–12px · 알약 9999px&lt;/td&gt;
&lt;td&gt;각진 다이얼로그 + 둥근 버튼 = "두 제품 붙인 느낌"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;그림자&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;한 스케일, 한 광원(좌상단), 한 색조&lt;/td&gt;
&lt;td&gt;"태양이 둘인 장면"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;강조색&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;강조는 1개 (+ 의미색 red/green/amber)&lt;/td&gt;
&lt;td&gt;무엇도 &lt;em&gt;그&lt;/em&gt; 액션으로 안 읽힘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;간격 단위&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8px 그리드 하나 (4px 하프스텝)&lt;/td&gt;
&lt;td&gt;7/13/19px 같은 오프그리드 = "엉성함"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;아이콘&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;한 패밀리, 한 채움, 한 굵기&lt;/td&gt;
&lt;td&gt;세트 섞이면 "겉도는" 느낌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;타입 스케일&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모듈러 스케일 하나, 폰트 ≤2종&lt;/td&gt;
&lt;td&gt;임의 크기가 리듬을 깸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;모션&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;지속시간 세트 하나 + 이징 패밀리 하나&lt;/td&gt;
&lt;td&gt;어떤 건 빠릿, 어떤 건 굼떠 = 다른 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;컨트롤 높이&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;공유 높이 세트 (예: 40px)&lt;/td&gt;
&lt;td&gt;44px 인풋 옆 32px 버튼 = 베이스라인 깨짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;비전공자가 핵심을 가장 잘 찌른 표현:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"모서리를 각지게 했으면 다 각지게 가야지."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;정확합니다. 그리고 이건 위 표의 &lt;em&gt;모든&lt;/em&gt; 행에 그대로 적용돼요. &lt;strong&gt;축이 섞이는 건 스타일 선택이 아니라 lint 에러로 취급하세요.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이 중 넷을 코드로 구체화해 봅시다.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 모서리 personality 하나 (그리고 중첩 법칙)
&lt;/h2&gt;

&lt;p&gt;먼저, 라운드는 &lt;strong&gt;토큰&lt;/strong&gt;이지 매직 넘버가 아닙니다. 작은 스케일을 정의하고 어디서나 참조하세요.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--radius-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;/* 인풋, 버튼  */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 카드, 메뉴  */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 모달, 시트  */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-full&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;그다음 &lt;strong&gt;personality 하나&lt;/strong&gt; — 전부 각지게, 전부 부드럽게, 전부 알약 — 를 골라 카드/버튼/인풋/모달/이미지에 적용합니다. 모델이 &lt;code&gt;rounded-none&lt;/code&gt; 패널에 &lt;code&gt;rounded-full&lt;/code&gt; 버튼을 멋대로 섞게 두지 마세요.&lt;/p&gt;

&lt;p&gt;많이들 놓치는 두 번째 규칙: &lt;strong&gt;중첩된 라운드는 중심을 공유해야 합니다.&lt;/strong&gt; 둥근 컨테이너 안에 패딩을 두고 둥근 요소가 들어갈 때, 안쪽 반지름은 &lt;em&gt;더 작아야&lt;/em&gt; 해요.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;안쪽 반지름 = 바깥 반지름 − 패딩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c"&gt;/* 16px */&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.thumbnail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* 16 − 16 = 0; 음수가 안 되게 clamp */&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;안쪽 요소에 바깥과 &lt;em&gt;같은&lt;/em&gt; 라운드를 주면, 코너가 컨테이너의 호를 비집고 튀어나옵니다. Apple의 새 "Liquid Glass"가 바로 이 동심원 코너 수학을 공식화했고, Cloud Four에 정석 글이 있습니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. 단일 광원의 레이어드 그림자
&lt;/h2&gt;

&lt;p&gt;깊이를 가짜로 보이게 하는 가장 빠른 방법이 단일 하드 &lt;code&gt;box-shadow&lt;/code&gt;입니다. 진짜 그림자는 그라데이션(반음영)이라, 낮은 불투명도 레이어를 여러 겹 쌓고 — 결정적으로 — 검정 대신 &lt;strong&gt;표면 색조 쪽으로 살짝 틴트&lt;/strong&gt;하세요. 순수 검정은 탁해집니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* 카드 — 페이지에 가깝게 */&lt;/span&gt;
&lt;span class="nt"&gt;--shadow-md&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;/* 모달 — 사용자 쪽으로 떠오르게 */&lt;/span&gt;
&lt;span class="nt"&gt;--shadow-xl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;   &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;16&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;16&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;32&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;32&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;64&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;정합성 규칙: &lt;strong&gt;페이지 전체가 한 광원&lt;/strong&gt; (관례상 위 + 약간 왼쪽), 수직 오프셋은 수평의 약 2배. 고도가 올라가면 오프셋·블러는 커지고 불투명도는 낮아집니다. 그러면 카드와 모달이 &lt;em&gt;같은&lt;/em&gt; 빛이 다른 높이의 물체에 닿은 걸로 읽혀요 — 별개의 두 효과가 아니라. (Josh Comeau, Tobias Ahlin 글이 좋습니다.)&lt;/p&gt;

&lt;p&gt;다크 모드에선 그림자가 거의 안 보이므로 &lt;strong&gt;톤 기반 고도&lt;/strong&gt;로 전환하세요 — 높을수록 밝은 표면. 베이스는 절대 순수 &lt;code&gt;#000&lt;/code&gt; 금지(Material은 &lt;code&gt;#121212&lt;/code&gt; + 레벨별 화이트 오버레이 권장).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. 강조색 하나, 나머지는 그레이스케일
&lt;/h2&gt;

&lt;p&gt;"AI 무지개" UI는 대개 강조가 필요할 때마다 새 색을 꺼내 써서 생깁니다. 규율:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;상호작용 강조는 &lt;strong&gt;하나&lt;/strong&gt;의 강조색.&lt;/li&gt;
&lt;li&gt;텍스트·표면·테두리는 &lt;strong&gt;틴트된 그레이 램프&lt;/strong&gt; (순수 회색 말고 — 브랜드 색조 쪽으로 5–15% 밀기).&lt;/li&gt;
&lt;li&gt;의미색은 &lt;strong&gt;딱 넷&lt;/strong&gt; — success / warning / error / info — 이고 &lt;em&gt;오직&lt;/em&gt; 의미로만, 장식으로는 절대 안 씀.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#5b5bd6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* 채도 0 회색이 아니라 강조색 쪽으로 살짝 틴트 */&lt;/span&gt;
  &lt;span class="py"&gt;--grey-50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt; &lt;span class="m"&gt;98%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;14%&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;8%&lt;/span&gt;  &lt;span class="m"&gt;55%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-900&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;12%&lt;/span&gt; &lt;span class="m"&gt;14%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c"&gt;/* 본문 텍스트 — #000 아님 */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;그리고 타협 불가 접근성 하한선(WCAG 2.2 AA): 본문 텍스트 &lt;strong&gt;4.5:1&lt;/strong&gt;, 큰 텍스트·UI 요소 &lt;strong&gt;3:1&lt;/strong&gt;. 정보를 색으로만 전달 금지 — 아이콘·텍스트·형태와 함께. 유효성 실패 필드에 빨간 테두리만으론 부족하고, 아이콘과 메시지를 같이 넣으세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. 간격 그리드 하나, 그룹핑은 근접성으로
&lt;/h2&gt;

&lt;p&gt;모든 margin·padding·gap을 한 스케일 — &lt;code&gt;4, 8, 12, 16, 24, 32, 48, 64&lt;/code&gt; — 에 스냅하고, &lt;strong&gt;근접성&lt;/strong&gt;이 의미를 나르게 하세요. Gestalt(그리고 Refactoring UI의 "모호한 간격을 피하라")의 규칙: 그룹 &lt;em&gt;바깥&lt;/em&gt; 공간이 그룹 &lt;em&gt;안&lt;/em&gt; 공간보다 확실히 커야 합니다.&lt;/p&gt;

&lt;p&gt;폼의 구체적 사다리:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;라벨 → 인풋        : 4–8px
인풋 → 인풋         : 12–16px
그룹 → 그룹 (섹션)  : 24–32px
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;전부 균일하게 띄우면 눈이 무엇이 한 덩어리인지 알 수 없습니다. 단계마다 두 배로 벌어지는 게, 라벨이 &lt;em&gt;자기&lt;/em&gt; 필드에 붙고 섹션이 다음 섹션과 분리되게 만드는 핵심이에요.&lt;/p&gt;




&lt;h2&gt;
  
  
  기계가 스스로 점검하게
&lt;/h2&gt;

&lt;p&gt;결정을 적어두는 게 절반이고, 나머지 절반은 위반을 잡는 겁니다. 여기서 AI가 실제로 쓸모 있어요 — 채점 기준만 쥐여주면.&lt;/p&gt;

&lt;p&gt;저는 위 내용을 Claude Code·Cursor가 자동으로 읽는 오픈소스 디자인 엔진(&lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;StyleSeed&lt;/a&gt;)에 넣지만, 아이디어 자체는 도구 무관입니다. 가장 쓸모 있던 조각은 &lt;strong&gt;정합성 채점기&lt;/strong&gt; — 파일을 점수화하고 &lt;em&gt;섞인 축&lt;/em&gt;을 실제 감점으로 잡는 검사였습니다.&lt;/p&gt;

&lt;p&gt;출력 예시(축약):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Design Score: 70 / 100   (Dashboard.tsx)&lt;/span&gt;

Color discipline   13/18  ▓▓▓░  #000 제목; 강조색 3개
Cards &amp;amp; elevation   8/12  ▓▓░░  1px 테두리가 분리를 담당
Coherence           6/12  ▓▓░░  각진 카드(l.22) + 알약 버튼(l.48); 강조 3개

&lt;span class="gu"&gt;### 먼저 고칠 것 (점수 이득 큰 순)&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; 라운드 통일(부드러움 8–12px) + 강조색 1개로  → +9
&lt;span class="p"&gt;2.&lt;/span&gt; 주문 리스트에 empty + loading 상태 추가       → +7
&lt;span class="p"&gt;3.&lt;/span&gt; 1px 테두리 빼고 톤 + ≤8% 그림자               → +4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Coherence" 항목이 "AI 생성 티"를 가장 잘 예측합니다. 컴포넌트별 예쁨이 아니라 &lt;em&gt;전역 일관성&lt;/em&gt;을 재기 때문이에요. 컴포넌트는 예뻐도 틀릴 수 있습니다 — 이웃과 안 맞으면.&lt;/p&gt;




&lt;h2&gt;
  
  
  결론
&lt;/h2&gt;

&lt;p&gt;하나만 기억한다면:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;예쁜 부품이 예쁜 UI를 만들지 않습니다. &lt;strong&gt;서로 맞는&lt;/strong&gt; 부품이 만듭니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;축마다 값 하나 — 라운드, 그림자, 강조색, 간격, 아이콘, 타입, 모션 — 를 골라 토큰으로 적어두고, 새 요소가 매번 새로 고르는 대신 그걸 물려받게 하세요. 그 한 가지 규율이 "로봇이 만들었네"와 "디자이너가 만들었네"를 가르고, AI가 만든 인터페이스에 할 수 있는 가장 싸고 효과 큰 일입니다.&lt;/p&gt;

&lt;p&gt;모서리가 각지다고요? 그럼 전부 각지게. 끝까지.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;숫자까지 들어간 풀버전 — 간격 수치, 앱 종류별 타입 레시피, 레이어드 그림자·중첩 라운드 레시피, 전부 Refactoring UI / Material 3 / Apple HIG / WCAG 근거 — 은 오픈소스(MIT)로 여기 있습니다: &lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;github.com/bitjaru/styleseed&lt;/a&gt;. ⭐ 하나가 더 많은 개발자(와 AI 도구)에게 닿게 합니다.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;🇬🇧 The English version of this post is &lt;a href="https://dev.to/kiwibreaksme/why-ai-generated-uis-look-off-and-the-one-principle-that-fixes-it-4j20"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>css</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why AI-Generated UIs Look 'Off' — and the One Principle That Fixes It</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Tue, 16 Jun 2026 04:33:17 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/why-ai-generated-uis-look-off-and-the-one-principle-that-fixes-it-4j20</link>
      <guid>https://dev.to/kiwibreaksme/why-ai-generated-uis-look-off-and-the-one-principle-that-fixes-it-4j20</guid>
      <description>&lt;p&gt;🇰🇷 한국어 버전: &lt;a href="https://dev.to/kiwibreaksme/aiga-mandeun-uiga-eodinga-eosaeghan-iyu-geurigo-geugeol-gocineun-han-gaji-weoncig-5e4p"&gt;AI가 만든 UI가 어딘가 '어색한' 이유&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You've seen it. You ask an AI to build a dashboard, and it returns something that's… fine? Every component is individually competent. The button is a button. The card is a card. And yet the whole thing reads as &lt;em&gt;generated&lt;/em&gt; — like a stock photo of a UI.&lt;/p&gt;

&lt;p&gt;For a long time I assumed the fix was "better components" or "more taste in the prompt." It isn't. After digging through the actual design literature — Refactoring UI, Material Design 3, Apple's HIG, IBM Carbon, WCAG, the Financial Times' visual vocabulary — the real culprit has a name:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incoherence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The parts don't agree with each other. And once you can see it, you can't unsee it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I've written before about &lt;a href="https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-what-i-did-about-it-2nb4"&gt;why your vibe-coded app looks ugly and what I did about it&lt;/a&gt;. This post goes underneath that — the actual mechanism behind the "off" feeling, and the one principle that fixes it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The tell: parts that don't agree
&lt;/h2&gt;

&lt;p&gt;Here's a UI with nothing "wrong" in it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A card with &lt;strong&gt;sharp&lt;/strong&gt; 2px corners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pill-shaped&lt;/strong&gt; buttons inside it&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;blue&lt;/strong&gt; primary action next to a &lt;strong&gt;purple&lt;/strong&gt; "upgrade" link&lt;/li&gt;
&lt;li&gt;Icons: two from Lucide (outline), one filled emoji&lt;/li&gt;
&lt;li&gt;One shadow lit from the top-left, another from straight below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those choices is defensible in isolation. Together, they signal "assembled from parts," because a human designer would never make all of them on the same screen. A designer picks &lt;em&gt;one&lt;/em&gt; corner style, &lt;em&gt;one&lt;/em&gt; accent, &lt;em&gt;one&lt;/em&gt; icon set, &lt;em&gt;one&lt;/em&gt; light source — and repeats those decisions everywhere.&lt;/p&gt;

&lt;p&gt;That repetition is what we read as "designed by one mind." Goran Paun (UX Collective) calls it visual coherence; Steve Schoger's whole &lt;em&gt;Refactoring UI&lt;/em&gt; is, in a sense, a book about not introducing gratuitous variation. The principle is old. What's new is that &lt;strong&gt;AI breaks it by default&lt;/strong&gt;, and understanding &lt;em&gt;why&lt;/em&gt; tells you how to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why AI specifically struggles with this
&lt;/h2&gt;

&lt;p&gt;A language model generates UI &lt;strong&gt;locally&lt;/strong&gt;. It writes the card, then the button, then the modal — each as a fresh, plausible snippet. It has no running memory that "the buttons 40 lines up were pill-shaped, so these must be too." Each component regresses to the mean of its training data, and the mean of "a button" and the mean of "a card" were never coordinated.&lt;/p&gt;

&lt;p&gt;Humans don't work this way. We carry a tiny set of decisions in our head — &lt;em&gt;this product is soft-cornered, blue-accented, 8px-grid&lt;/em&gt; — and every new element inherits them. The decisions are sticky.&lt;/p&gt;

&lt;p&gt;So the fix isn't "make the model more tasteful." It's: &lt;strong&gt;write the sticky decisions down, and tell the model to copy them instead of inventing new ones.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The meta-law: one choice per axis
&lt;/h2&gt;

&lt;p&gt;Here's the whole idea in one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For each design axis, pick exactly &lt;strong&gt;one&lt;/strong&gt; value or family, encode it as a token, and apply it &lt;strong&gt;everywhere&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Coherence is not "every screen is identical." It's that the same &lt;em&gt;decisions&lt;/em&gt; recur. A settings page and a dashboard can look very different and still feel like one product — as long as they share a radius personality, a shadow language, an accent, and a spacing unit.&lt;/p&gt;

&lt;p&gt;These are the axes that have to stay unified:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;Pick ONE, system-wide&lt;/th&gt;
&lt;th&gt;Failure mode when mixed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Corner / radius&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;sharp 0–4px · soft 8–12px · pill 9999px&lt;/td&gt;
&lt;td&gt;sharp dialog + rounded buttons = "two products glued together"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shadow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one scale, one light source (above-left), one tint&lt;/td&gt;
&lt;td&gt;"a scene with two suns"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accent color&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one accent for emphasis (+ semantic red/green/amber)&lt;/td&gt;
&lt;td&gt;nothing reads as &lt;em&gt;the&lt;/em&gt; action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spacing unit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one 8px grid (4px half-step)&lt;/td&gt;
&lt;td&gt;off-grid 7/13/19px reads as "sloppy"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Icon style&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one family, one fill mode, one stroke weight&lt;/td&gt;
&lt;td&gt;mixing sets looks "out of place"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type scale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one modular scale, ≤2 families&lt;/td&gt;
&lt;td&gt;arbitrary sizes destroy rhythm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Motion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one duration set + one easing family&lt;/td&gt;
&lt;td&gt;some snappy, some sluggish = different apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control height&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;shared height set (e.g. 40px)&lt;/td&gt;
&lt;td&gt;a 44px input beside a 32px button breaks the baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The single best instinct I've heard a non-designer voice it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If the corners are sharp, everything should be sharp."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exactly right — and it generalizes to &lt;em&gt;every&lt;/em&gt; row in that table. &lt;strong&gt;Treat a mixed axis as a lint error, not a style choice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l2zltx9sf7kih8dxwe0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l2zltx9sf7kih8dxwe0.png" alt="Every decision in a StyleSeed UI tied to the rule behind it — numbers 2:1, one accent, content in cards, one corner radius." width="799" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's make four of these concrete.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Pick one corner personality (and respect the nesting law)
&lt;/h2&gt;

&lt;p&gt;First, radius is a &lt;strong&gt;token&lt;/strong&gt;, never a magic number. Define a small scale and reference it everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--radius-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;/* inputs, buttons   */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* cards, menus      */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* modals, sheets    */&lt;/span&gt;
  &lt;span class="py"&gt;--radius-full&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then pick &lt;strong&gt;one personality&lt;/strong&gt; — all sharp, all soft, or all pill — and apply it across card / button / input / modal / image. Don't let the model freestyle a &lt;code&gt;rounded-none&lt;/code&gt; panel with &lt;code&gt;rounded-full&lt;/code&gt; buttons.&lt;/p&gt;

&lt;p&gt;There's a subtle second rule most people miss: &lt;strong&gt;nested radii must share a center.&lt;/strong&gt; When a rounded element sits inside a rounded container with padding, the inner radius should be &lt;em&gt;smaller&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inner radius = outer radius − padding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c"&gt;/* 16px */&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.thumbnail&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* 16 − 16 = 0; clamp so it never goes negative */&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--radius-lg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--pad&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you give the inner element the &lt;em&gt;same&lt;/em&gt; radius as the outer one, its corner visibly bulges past the container's arc. Apple's new "Liquid Glass" system formalizes exactly this concentric-corner math; Cloud Four has the canonical write-up.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Layered shadows from a single light source
&lt;/h2&gt;

&lt;p&gt;The fastest way to make depth look fake is one hard &lt;code&gt;box-shadow&lt;/code&gt;. Real shadows are a gradient (a penumbra), so stack several low-opacity layers, and — critically — &lt;strong&gt;tint them toward the surface hue&lt;/strong&gt; instead of using pure black, which goes muddy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* card — sits near the page */&lt;/span&gt;
&lt;span class="nt"&gt;--shadow-md&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;08&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;/* modal — floats toward the user */&lt;/span&gt;
&lt;span class="nt"&gt;--shadow-xl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;   &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;16&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;  &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;16&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;32&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;32&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;64&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="nt"&gt;hsl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;220&lt;/span&gt; &lt;span class="err"&gt;40&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;06&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The coherence rule: &lt;strong&gt;one light direction for the whole page&lt;/strong&gt; (convention: above and slightly left), with vertical offset roughly 2× the horizontal. As elevation rises, offset and blur go up while opacity goes down. A card and a modal then read as the &lt;em&gt;same&lt;/em&gt; light hitting objects at different heights — not two unrelated effects. (Josh Comeau and Tobias Ahlin both have excellent deep-dives on this.)&lt;/p&gt;

&lt;p&gt;In dark mode, shadows nearly vanish, so switch to &lt;strong&gt;tonal elevation&lt;/strong&gt; — lighter surfaces for higher elevation — and never use pure &lt;code&gt;#000&lt;/code&gt; as your base (Material recommends &lt;code&gt;#121212&lt;/code&gt; with white overlays per level).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. One accent, everything else greyscale
&lt;/h2&gt;

&lt;p&gt;Most "AI rainbow" UIs come from reaching for a new hue every time something needs emphasis. The discipline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One&lt;/strong&gt; accent for interactive emphasis.&lt;/li&gt;
&lt;li&gt;A full &lt;strong&gt;tinted-grey ramp&lt;/strong&gt; (not pure grey — nudge it 5–15% toward the brand hue) for text, surfaces, and borders.&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;four&lt;/strong&gt; semantic colors — success / warning / error / info — used &lt;em&gt;strictly&lt;/em&gt; by meaning, never decoration.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#5b5bd6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* greys tinted slightly toward the accent's hue, not 0-saturation */&lt;/span&gt;
  &lt;span class="py"&gt;--grey-50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt; &lt;span class="m"&gt;98%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;14%&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;8%&lt;/span&gt;  &lt;span class="m"&gt;55%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--grey-900&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240&lt;/span&gt; &lt;span class="m"&gt;12%&lt;/span&gt; &lt;span class="m"&gt;14%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c"&gt;/* body text — NOT #000 */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And one accessibility floor you don't get to negotiate (WCAG 2.2 AA): &lt;strong&gt;4.5:1&lt;/strong&gt; contrast for body text, &lt;strong&gt;3:1&lt;/strong&gt; for large text and UI components. Never convey information by color alone — pair it with an icon, text, or shape. A red border on an invalid field is not enough; add the icon and the message.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. One spacing grid, with proximity doing the grouping
&lt;/h2&gt;

&lt;p&gt;Snap every margin, padding, and gap to a single scale — &lt;code&gt;4, 8, 12, 16, 24, 32, 48, 64&lt;/code&gt; — and let &lt;strong&gt;proximity&lt;/strong&gt; carry meaning. The rule from Gestalt (and Refactoring UI's "avoid ambiguous spacing"): the space &lt;em&gt;around&lt;/em&gt; a group must be clearly larger than the space &lt;em&gt;within&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;A concrete ladder for forms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;label → input        : 4–8px
input → input         : 12–16px
group → group (section): 24–32px
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When everything is evenly spaced, the eye can't tell what belongs together. The doubling at each level is what makes a label bind to &lt;em&gt;its&lt;/em&gt; field and a section separate from the next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make the machine check itself
&lt;/h2&gt;

&lt;p&gt;Writing the decisions down is half the battle; the other half is catching violations. This is where AI can actually help — if you give it the rubric.&lt;/p&gt;

&lt;p&gt;I bake all of the above into an open-source design engine (&lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;StyleSeed&lt;/a&gt;) that Claude Code and Cursor read automatically, but the idea is tool-agnostic. The most useful piece turned out to be a &lt;strong&gt;coherence grader&lt;/strong&gt;: a check that scores a file and flags &lt;em&gt;mixed axes&lt;/em&gt; as real deductions.&lt;/p&gt;

&lt;p&gt;A trimmed example of what that output looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Design Score: 70 / 100   (Dashboard.tsx)&lt;/span&gt;

Color discipline   13/18  ▓▓▓░  #000 headings; 3 accent hues
Cards &amp;amp; elevation   8/12  ▓▓░░  1px borders doing separation
Coherence           6/12  ▓▓░░  sharp cards (l.22) + pill buttons (l.48); 3 accents

&lt;span class="gu"&gt;### Fix first (highest score gain)&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Unify radius (pick soft 8–12px) + collapse to one accent  → +9
&lt;span class="p"&gt;2.&lt;/span&gt; Add empty + loading states to the orders list            → +7
&lt;span class="p"&gt;3.&lt;/span&gt; Drop 1px borders, use tone + ≤8% shadow                  → +4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "Coherence" category is the one that most predicts "looks AI-generated," precisely because it measures &lt;em&gt;system-wide consistency&lt;/em&gt; rather than per-component prettiness. A component can be beautiful and still wrong — if it disagrees with its neighbors.&lt;/p&gt;




&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;If you remember one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Beautiful parts don't make a beautiful UI. &lt;strong&gt;Agreeing&lt;/strong&gt; parts do.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pick one value per axis — radius, shadow, accent, spacing, icons, type, motion — write it down as a token, and make every new element inherit it instead of inventing a fresh choice. That single discipline is the difference between "a robot made this" and "a designer made this," and it's the cheapest, highest-leverage thing you can do for an AI-built interface.&lt;/p&gt;

&lt;p&gt;The corners are sharp? Then everything is sharp. All the way down.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want the practical side? I covered &lt;a href="https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-the-one-file-fix-4ef0"&gt;the one-file fix that makes your vibe-coded app stop looking ugly&lt;/a&gt; in a companion post. And the full research-backed version — concrete spacing numbers, a type recipe per app type, layered-shadow and nested-radius recipes, all grounded in Refactoring UI / Material 3 / Apple HIG / WCAG — is open source (MIT): &lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;github.com/bitjaru/styleseed&lt;/a&gt;. A ⭐ helps more devs (and more AI tools) find it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>css</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your vibe-coded app looks ugly. Here's the one-file fix.</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Tue, 14 Apr 2026 03:59:47 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-the-one-file-fix-4ef0</link>
      <guid>https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-the-one-file-fix-4ef0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yx5kvlddc5pmpysgz21.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yx5kvlddc5pmpysgz21.gif" alt="StyleSeed live demo" width="600" height="817"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's be honest about vibe coding
&lt;/h2&gt;

&lt;p&gt;You tell Claude Code "build me a SaaS dashboard." Thirty seconds later you have a working app. Revenue chart, user table, activity feed. Everything functional.&lt;/p&gt;

&lt;p&gt;And it looks like &lt;strong&gt;every other AI-generated app on the internet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Spacing that doesn't breathe. Seven accent colors fighting for attention. Cards that float on the page with zero separation from the background. The components are all shadcn — the technical stack is fine. But the &lt;em&gt;result&lt;/em&gt; is amateur.&lt;/p&gt;

&lt;p&gt;I spent a week trying to fix this through prompts. "Use only one accent color." "Card background &lt;code&gt;#FFF&lt;/code&gt;, page background &lt;code&gt;#FAFAFA&lt;/code&gt;." "Smaller shadows." Every fix worked for one screen, then the next screen forgot.&lt;/p&gt;

&lt;p&gt;Then it clicked: &lt;strong&gt;the model doesn't need better prompts. It needs a design brain.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pro designers aren't using better components — they're using invisible rules
&lt;/h2&gt;

&lt;p&gt;Ask a senior designer why their dashboard looks refined and they'll say things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Never use pure black. Use &lt;code&gt;#2A2A2A&lt;/code&gt;."&lt;/p&gt;

&lt;p&gt;"One accent color per app. Everything else grayscale."&lt;/p&gt;

&lt;p&gt;"Shadows at 4% opacity. If you can see it, it's already too much."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nobody writes these down. They're baked into years of experience, invisible to outsiders — which means invisible to LLMs. No matter how many shadcn components Claude has in its training data, it has never been told &lt;em&gt;when&lt;/em&gt; to use which.&lt;/p&gt;

&lt;p&gt;So I sat down and extracted 69 of these rules from Toss, Stripe, Linear, and Vercel — the brands whose output I wanted Claude to imitate — and wrote them into a single &lt;code&gt;DESIGN-LANGUAGE.md&lt;/code&gt; file that Claude reads automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 69 rules, organized
&lt;/h2&gt;

&lt;p&gt;The rules cluster into six groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Color discipline&lt;/strong&gt; (12 rules) — &lt;code&gt;#2A2A2A&lt;/code&gt; as the refined black, 5-level grayscale (&lt;code&gt;#2A → #3C → #6A → #7A → #9B&lt;/code&gt;), one accent color maximum, no pure white on pure white.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial rhythm&lt;/strong&gt; (14 rules) — never repeat the same section type consecutively, alternate tall/compact, &lt;code&gt;2:1&lt;/code&gt; number-to-unit ratios (&lt;code&gt;48px&lt;/code&gt; value, &lt;code&gt;24px&lt;/code&gt; unit).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information hierarchy&lt;/strong&gt; (9 rules) — card/background separation (&lt;code&gt;#FFF&lt;/code&gt; card on &lt;code&gt;#FAFAFA&lt;/code&gt; page) matters more than any border, density &lt;em&gt;increases&lt;/em&gt; as you scroll down, top is big numbers, bottom is dense lists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow &amp;amp; elevation&lt;/strong&gt; (8 rules) — max &lt;code&gt;4%&lt;/code&gt; opacity, elevation is never &lt;code&gt;z-index&lt;/code&gt;, dark mode replaces shadows with borders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component variance&lt;/strong&gt; (11 rules) — never 4 identical KPI cards, stagger content types (2 with trend, 1 with progress, 1 with comparison), avoid "filled form of sameness."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motion &amp;amp; feedback&lt;/strong&gt; (15 rules) — &lt;code&gt;200ms&lt;/code&gt; normal, spring for entrance, &lt;code&gt;ease-out&lt;/code&gt; for exit, hover lifts by &lt;code&gt;6px&lt;/code&gt; max, tap scales to &lt;code&gt;0.98&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop the file into a project, Claude reads it, Cursor reads it (via &lt;code&gt;.cursorrules&lt;/code&gt;). Same prompt, same model — the output quality jumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  One rule, unpacked
&lt;/h2&gt;

&lt;p&gt;Take the &lt;code&gt;#2A2A2A&lt;/code&gt; rule. Pure &lt;code&gt;#000&lt;/code&gt; on &lt;code&gt;#FFF&lt;/code&gt; has a contrast ratio of 21:1 — the highest possible. Sounds like a win. But at that contrast the eye gets fatigued fast, and the text starts to feel harsh and heavy on a white page.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#2A2A2A&lt;/code&gt; drops the contrast to about 15:1. Still WCAG AAA for body text. But the page stops "vibrating." Every refined design system in the last decade — Apple, Linear, Vercel, Notion, Toss — uses a softened near-black for body text. Claude picks &lt;code&gt;#000&lt;/code&gt; by default because it's the highest-contrast option, which is technically correct and aesthetically wrong.&lt;/p&gt;

&lt;p&gt;One rule. Fixes thousands of screens.&lt;/p&gt;

&lt;p&gt;Now multiply that by 69.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same component, three brand DNAs
&lt;/h2&gt;

&lt;p&gt;The live demo up top is a real app — &lt;a href="https://styleseed-demo.vercel.app" rel="noopener noreferrer"&gt;styleseed-demo.vercel.app&lt;/a&gt;. Click the Toss / Raycast / Arc switcher. Same chat component, three totally different brand identities — colors, radius, shadows, motion durations, gradients, even the phone frame's ambient light.&lt;/p&gt;

&lt;p&gt;The switcher flips a single &lt;code&gt;data-skin&lt;/code&gt; attribute on the wrapper. That's it. No conditional rendering, no theme provider, no re-mount.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;Every visual value is a CSS variable scoped to &lt;code&gt;[data-skin="..."]&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-skin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"toss"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3182F6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.875rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--gradient-brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#3182F6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#4A90F7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--duration-normal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-skin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"raycast"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FF4E8B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--shadow-card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--gradient-brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FF6363&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FF8E3C&lt;/span&gt; &lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="m"&gt;#E84A8E&lt;/span&gt; &lt;span class="m"&gt;65%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#A855F7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--duration-normal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;220ms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Components never touch the raw values — only the tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;motion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;var(--card)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;var(--radius-xl)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;boxShadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;var(--shadow-card)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap the data attribute → the entire tree morphs in one frame. Framer Motion animates the transitions for free because the underlying CSS properties are inherited.&lt;/p&gt;

&lt;p&gt;This is the trick the 69 rules depend on. Rules reference &lt;em&gt;semantic&lt;/em&gt; tokens (&lt;code&gt;--brand&lt;/code&gt;, &lt;code&gt;--card&lt;/code&gt;, &lt;code&gt;--shadow-card&lt;/code&gt;), not literal values. So the same rulebook works whether your app looks like Toss or Vercel or your client's weird purple brand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for vibe coders
&lt;/h2&gt;

&lt;p&gt;The point of vibe coding is shipping fast. The problem with vibe coding is the output screams "I was made in 30 minutes."&lt;/p&gt;

&lt;p&gt;StyleSeed closes that gap in two moves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The 69 rules fix the judgment.&lt;/strong&gt; Claude stops picking &lt;code&gt;#000&lt;/code&gt; for text and &lt;code&gt;py-4&lt;/code&gt; for everything. The output starts looking designed, not generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The token structure fixes the brand.&lt;/strong&gt; Your MVP can ship with Toss skin today and re-skin to a client's brand tomorrow by swapping one file. Same codebase. Zero rewrites.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both drop in with one command. Engine is brand-agnostic — the rules don't know what color your brand is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router, Turbopack)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; (the &lt;code&gt;@theme inline&lt;/code&gt; syntax makes token sharing trivial)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; for the morph animation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radix&lt;/strong&gt; under the components&lt;/li&gt;
&lt;li&gt;Free, MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎬 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://styleseed-demo.vercel.app" rel="noopener noreferrer"&gt;styleseed-demo.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/bitjaru/styleseed" rel="noopener noreferrer"&gt;bitjaru/styleseed&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 11 Claude Code slash commands included (&lt;code&gt;/ss-page&lt;/code&gt;, &lt;code&gt;/ss-review&lt;/code&gt;, &lt;code&gt;/ss-audit&lt;/code&gt;, ...). Works with Cursor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're vibe coding anything right now, drop the engine in and compare the output. Honest critique on the rules themselves very welcome — which one feels wrong? Which one's missing? The components are downstream. &lt;strong&gt;The rules are the actual product.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>vibecoding</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Your Vibe-Coded App Looks Ugly. Here's What I Did About It.</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Thu, 09 Apr 2026 06:26:23 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-what-i-did-about-it-2nb4</link>
      <guid>https://dev.to/kiwibreaksme/your-vibe-coded-app-looks-ugly-heres-what-i-did-about-it-2nb4</guid>
      <description>&lt;p&gt;Again. Not pretty.&lt;/p&gt;

&lt;p&gt;I asked Claude Code to build a dashboard. It worked perfectly. And it looked like a hackathon project.&lt;/p&gt;

&lt;p&gt;Card spacing was random. Typography had no hierarchy. Colors were everywhere. The whole thing felt... off.&lt;/p&gt;

&lt;p&gt;I tried "make it more professional." Didn't help. Tried "like the Toss app." Slightly better, but still amateur.&lt;/p&gt;

&lt;p&gt;The problem wasn't the AI. The AI makes great components. It just can't make &lt;strong&gt;design decisions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Mean
&lt;/h2&gt;

&lt;p&gt;Open the Toss app (Korea's biggest fintech) and look closely. Every screen feels the same. Not boring-same — &lt;em&gt;cohesive&lt;/em&gt;-same. I spent a while figuring out why.&lt;/p&gt;

&lt;p&gt;There are rules.&lt;/p&gt;

&lt;p&gt;The darkest black isn't &lt;code&gt;#000&lt;/code&gt;. It's &lt;code&gt;#2A2A2A&lt;/code&gt;. Tiny difference. But that's the gap between "harsh" and "refined."&lt;/p&gt;

&lt;p&gt;There's exactly one accent color in the entire app. One. Everything else is grayscale. Restraint is what makes it feel expensive.&lt;/p&gt;

&lt;p&gt;Card shadows? 4% opacity. If you can see the shadow, it's already too much.&lt;/p&gt;

&lt;p&gt;Numbers at 48px, units at 24px. Always 2:1. Your eye hits the number first.&lt;/p&gt;

&lt;p&gt;Designers make these calls instinctively. Years of experience. But here's the thing — if you write them down, AI can follow them too.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I Wrote Them Down
&lt;/h2&gt;

&lt;p&gt;I was building my own app and got tired of fixing ugly AI output. Started asking myself "why does this look bad?" for every screen. Patterns emerged. Same mistakes, every time.&lt;/p&gt;

&lt;p&gt;So I documented the judgment calls a designer would make. Ended up with 69 rules.&lt;/p&gt;

&lt;p&gt;Like:&lt;/p&gt;

&lt;p&gt;Never use the same card layout twice in a row. Hero, then grid, then chart, then list. There needs to be rhythm.&lt;/p&gt;

&lt;p&gt;When you make 4 KPI cards, don't make them identical. Two with trend arrows, one with a progress bar, one with comparison text. Variation keeps it from feeling robotic.&lt;/p&gt;

&lt;p&gt;As you scroll down, text gets smaller and information gets denser. Hero is one big 48px number. Bottom of the page is 14px detail rows. Natural zoom-in effect.&lt;/p&gt;

&lt;p&gt;I packaged these rules so AI could read them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engine + Skins
&lt;/h2&gt;

&lt;p&gt;The structure is kind of fun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;styleseed/
├── engine/    ← Design brain (69 rules, 48 components, 11 AI skills)
└── skins/     ← Brand colors (Toss, Stripe, Linear, Vercel, Notion...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;engine&lt;/strong&gt; knows &lt;em&gt;how to structure&lt;/em&gt; your app. Layout, typography ratios, card structure, visual rhythm, forbidden patterns. Doesn't care what brand you are.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;skin&lt;/strong&gt; is one CSS file. &lt;code&gt;--brand: #533afd&lt;/code&gt; makes it Stripe. &lt;code&gt;--brand: #721FE5&lt;/code&gt; makes it Toss. Change one variable, whole UI follows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/VoltAgent/awesome-design-md" rel="noopener noreferrer"&gt;awesome-design-md&lt;/a&gt; has 58 brand identities you can grab as skins.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Actually Use It
&lt;/h2&gt;

&lt;p&gt;Step 1. Copy the engine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; styleseed/engine/&lt;span class="k"&gt;*&lt;/span&gt; my-project/
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; styleseed/engine/css/&lt;span class="k"&gt;*&lt;/span&gt; my-project/src/styles/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2. Pick a skin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;styleseed/skins/stripe/theme.css my-project/src/styles/theme.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run &lt;code&gt;/ui-setup&lt;/code&gt; and it walks you through everything — app type, colors, font, generates your first page.&lt;/p&gt;

&lt;p&gt;Step 3. Build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build me a SaaS dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI reads &lt;code&gt;CLAUDE.md&lt;/code&gt; automatically. Follows the 69 rules. Lays out hero card, KPI grid, chart section, activity list in information-pyramid order.&lt;/p&gt;

&lt;p&gt;But it doesn't stop there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/ux-audit src/Dashboard.tsx    &lt;span class="c"&gt;# Nielsen's heuristics check&lt;/span&gt;
/ux-copy &lt;span class="s2"&gt;"dashboard"&lt;/span&gt;           &lt;span class="c"&gt;# Auto-generate button labels, error messages&lt;/span&gt;
/ux-feedback src/Dashboard.tsx  &lt;span class="c"&gt;# Add loading/error/empty states&lt;/span&gt;
/ui-review src/Dashboard.tsx    &lt;span class="c"&gt;# Design compliance check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four commands that do what a designer + UX researcher would do. Felt like cheating, honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Feels Cohesive
&lt;/h2&gt;

&lt;p&gt;Why does the Toss app feel like "one app" no matter what screen you're on?&lt;/p&gt;

&lt;p&gt;Because one team's consistent judgment is applied everywhere. "This spacing is 24px." "Don't use that color." "Numbers are this size." Same rules, every screen, every time.&lt;/p&gt;

&lt;p&gt;StyleSeed is those rules, written as 69 lines of design judgment. AI reads them. Every page it builds follows the same standard.&lt;/p&gt;

&lt;p&gt;Swap the skin — Stripe, Vercel, whatever — the structure stays consistent. Same engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honestly
&lt;/h2&gt;

&lt;p&gt;It's not perfect. Mobile-only (430px) for now. Desktop layouts need separate work. Charts need manual Recharts setup. I'm still adding rules and refining.&lt;/p&gt;

&lt;p&gt;But the difference between before and after is obvious. "It looks bad but I don't know how to fix it" turned into "it just comes out clean."&lt;/p&gt;

&lt;p&gt;No designer. Five minutes of setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bitjaru/styleseed" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;MIT open source. Built for my own app, sharing because it might save you the same headache.&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>claude</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>디자이너 없이 바이브코딩으로 토스급 UI 만드는 법</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Thu, 09 Apr 2026 06:25:56 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/dijaineo-eobsi-baibeukodingeuro-toseugeub-ui-mandeuneun-beob-5c0g</link>
      <guid>https://dev.to/kiwibreaksme/dijaineo-eobsi-baibeukodingeuro-toseugeub-ui-mandeuneun-beob-5c0g</guid>
      <description>&lt;p&gt;또. 이쁘지가 않다.&lt;/p&gt;

&lt;p&gt;Claude Code한테 "대시보드 만들어줘" 했더니 기능은 되는데 화면이 영 아마추어다. 카드 간격이 제각각이고, 색이 정리가 안 되고, 전체적으로 뭔가... 촌스럽다.&lt;/p&gt;

&lt;p&gt;"좀 더 깔끔하게" 해봤자 달라지는 게 없다. 좀 더 구체적으로 "토스처럼" 해봤자 비슷하다. AI가 토스를 모르는 게 아니다. 컴포넌트도 잘 만든다.&lt;/p&gt;

&lt;p&gt;근데 &lt;strong&gt;디자인 판단&lt;/strong&gt;을 못 한다.&lt;/p&gt;

&lt;h2&gt;
  
  
  무슨 말이냐면
&lt;/h2&gt;

&lt;p&gt;토스 앱을 켜서 찬찬히 보면, 화면마다 같은 "느낌"이 있다. 그 느낌의 정체가 뭔지 뜯어봤다.&lt;/p&gt;

&lt;p&gt;규칙이 있다.&lt;/p&gt;

&lt;p&gt;가장 어두운 검정이 &lt;code&gt;#000&lt;/code&gt;이 아니라 &lt;code&gt;#2A2A2A&lt;/code&gt;다. 미세한 차인데, 이게 "딱딱함"과 "고급스러움"의 차이다.&lt;/p&gt;

&lt;p&gt;강조 색은 앱 전체에서 딱 하나. 보라 하나. 나머지는 전부 회색 톤이다. 절제가 고급이다.&lt;/p&gt;

&lt;p&gt;카드 그림자? opacity 4%다. 그림자가 눈에 보이면 이미 과하다.&lt;/p&gt;

&lt;p&gt;숫자는 48px로 크게, 단위는 24px로 작게. 항상 2:1. 시선이 숫자에 먼저 간다.&lt;/p&gt;

&lt;p&gt;디자이너는 이런 판단을 무의식적으로 내린다. 경험으로 쌓인 거다. 근데 이걸 글로 정리하면? AI도 따라할 수 있다.&lt;/p&gt;

&lt;h2&gt;
  
  
  그래서 정리했다
&lt;/h2&gt;

&lt;p&gt;내 앱 만들면서 AI가 뱉는 UI를 고치다 지쳤다. "이건 왜 구려 보이지?"를 분석하다 보니 패턴이 보였다. 같은 실수가 반복됐다.&lt;/p&gt;

&lt;p&gt;그래서 디자이너가 머릿속에 갖고 있는 판단 기준을 하나씩 글로 적었다. 69개가 됐다.&lt;/p&gt;

&lt;p&gt;예를 들면:&lt;/p&gt;

&lt;p&gt;같은 카드 레이아웃을 연속으로 두 번 쓰지 마라. 히어로 다음에 그리드, 그리드 다음에 차트, 차트 다음에 리스트. 리듬이 있어야 한다.&lt;/p&gt;

&lt;p&gt;KPI 카드 4개를 만들 때 전부 똑같이 만들지 마라. 트렌드 화살표 2개, 프로그레스바 1개, 비교 텍스트 1개. 변주가 있어야 단조롭지 않다.&lt;/p&gt;

&lt;p&gt;위에서 아래로 갈수록 글씨가 작아지고 정보가 빽빽해진다. 히어로는 48px 하나, 맨 아래 리스트는 14px 여러 줄. 자연스러운 줌인 효과.&lt;/p&gt;

&lt;p&gt;이 규칙들을 AI가 읽을 수 있게 패키징했다.&lt;/p&gt;

&lt;h2&gt;
  
  
  엔진 + 스킨
&lt;/h2&gt;

&lt;p&gt;구조가 좀 재밌다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;styleseed/
├── engine/    ← 디자인 두뇌 (규칙 69개, 컴포넌트 48개, AI 스킬 11개)
└── skins/     ← 브랜드 컬러 (토스, Stripe, Linear, Vercel, Notion...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;엔진&lt;/strong&gt;은 "어떻게 구성할지"를 안다. 레이아웃, 타이포 비율, 카드 구조, 시각적 리듬, 금지 패턴. 브랜드 색이 뭐든 상관없이 동작한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;스킨&lt;/strong&gt;은 CSS 파일 하나다. &lt;code&gt;--brand: #533afd&lt;/code&gt; 하면 Stripe, &lt;code&gt;--brand: #721FE5&lt;/code&gt; 하면 토스. 색만 바꾸면 전체 UI가 따라 바뀐다.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/VoltAgent/awesome-design-md" rel="noopener noreferrer"&gt;awesome-design-md&lt;/a&gt;에 58개 브랜드가 있는데, 거기서 아무거나 골라서 스킨으로 쓸 수 있다.&lt;/p&gt;

&lt;h2&gt;
  
  
  실제로 쓰는 과정
&lt;/h2&gt;

&lt;p&gt;1단계. 엔진을 내 프로젝트에 복사한다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; styleseed/engine/&lt;span class="k"&gt;*&lt;/span&gt; my-project/
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; styleseed/engine/css/&lt;span class="k"&gt;*&lt;/span&gt; my-project/src/styles/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2단계. 스킨을 고른다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;styleseed/skins/stripe/theme.css my-project/src/styles/theme.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;귀찮으면 &lt;code&gt;/ui-setup&lt;/code&gt; 치면 하나씩 물어보면서 세팅해준다. 앱 종류, 색상, 폰트, 첫 페이지까지.&lt;/p&gt;

&lt;p&gt;3단계. 만든다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SaaS 대시보드 만들어줘.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI가 &lt;code&gt;CLAUDE.md&lt;/code&gt;를 자동으로 읽는다. 69개 규칙에 따라 히어로 카드, KPI 그리드, 차트 섹션, 리스트를 정보 피라미드 순서로 배치한다.&lt;/p&gt;

&lt;p&gt;여기서 끝이 아니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/ux-audit src/Dashboard.tsx    &lt;span class="c"&gt;# 닐슨 10대 원칙으로 UX 점검&lt;/span&gt;
/ux-copy &lt;span class="s2"&gt;"대시보드"&lt;/span&gt;             &lt;span class="c"&gt;# 버튼 라벨, 에러 메시지 자동 생성&lt;/span&gt;
/ux-feedback src/Dashboard.tsx  &lt;span class="c"&gt;# 로딩/에러/빈 상태 추가&lt;/span&gt;
/ui-review src/Dashboard.tsx    &lt;span class="c"&gt;# 디자인 규칙 준수 검사&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;솔직히 좀 사기다 싶었다. 디자이너 + UX 리서처가 하는 일을 명령어 4개로.&lt;/p&gt;

&lt;h2&gt;
  
  
  통일감의 비결
&lt;/h2&gt;

&lt;p&gt;왜 토스 앱은 어떤 화면을 열어도 "같은 앱" 느낌이 날까.&lt;/p&gt;

&lt;p&gt;한 사람(또는 한 팀)의 머릿속에 일관된 기준이 있기 때문이다. "이 간격은 24px", "이 색은 쓰지 마", "숫자는 이 크기" — 이 기준이 모든 화면에 적용되니까 통일감이 생긴다.&lt;/p&gt;

&lt;p&gt;StyleSeed는 그 기준을 69개 규칙으로 적어놓은 거다. AI가 이걸 읽으면, 어떤 페이지를 만들든 같은 기준으로 만든다.&lt;/p&gt;

&lt;p&gt;스킨이 바뀌어도 구조는 안 바뀐다. Stripe든 Vercel이든 — 엔진이 동일하니까.&lt;/p&gt;

&lt;h2&gt;
  
  
  솔직히 말하면
&lt;/h2&gt;

&lt;p&gt;완벽하지는 않다. 아직 모바일(430px) 전용이고, 데스크톱 레이아웃은 별도로 짜야 한다. 차트도 Recharts 직접 세팅해야 한다. 계속 규칙 추가하면서 다듬는 중이다.&lt;/p&gt;

&lt;p&gt;근데 확실한 건 — 이거 쓰기 전과 후가 확연히 다르다. "구려 보이는데 뭘 고쳐야 할지 모르겠다"에서 "알아서 깔끔하게 나온다"로.&lt;/p&gt;

&lt;p&gt;디자이너 고용비 0원. 세팅 5분.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bitjaru/styleseed" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;GitHub에서 보기&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;MIT 오픈소스다. 쓸만하면 스타 하나 부탁.&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>claude</category>
      <category>ai</category>
      <category>오픈소스</category>
    </item>
    <item>
      <title>당신이 AI를 잘 못 쓰는 이유, 메타인지 훈련</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Thu, 26 Feb 2026 04:55:20 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/dangsini-aireul-jal-mos-sseuneun-iyu-05co-4b0c</link>
      <guid>https://dev.to/kiwibreaksme/dangsini-aireul-jal-mos-sseuneun-iyu-05co-4b0c</guid>
      <description>&lt;p&gt;&lt;em&gt;AI랑 일 잘하는 법 — 1편&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;먼저 말해두면, 이 글은 프롬프트 템플릿 모음이 아니다. "이렇게 물어보세요~" 하는 글은 이미 넘쳐난다. 이 글은 그보다 한 단계 아래에 있는 얘기를 한다. &lt;strong&gt;생각하는 방식&lt;/strong&gt; 얘기다. 그리고 이게 바뀌면 AI 결과물만 좋아지는 게 아니라, 본인이 성장한다. 진짜로.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;지난주에 팀 회식을 해야 했다.&lt;/p&gt;

&lt;p&gt;귀찮아서 AI한테 물어봤다. "강남역 근처 고깃집 추천해줘."&lt;/p&gt;

&lt;p&gt;5곳을 뽑아줬다. 리뷰 좋고, 분위기 좋고, 가격도 적당하다고 했다. 예약 팁까지 줬다. 친절하다.&lt;/p&gt;

&lt;p&gt;첫 번째 가게를 네이버에 검색해봤다. &lt;strong&gt;3개월 전에 폐업했다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;두 번째는 이름이 바뀌어 있었다. 세 번째는 별 1개 테러를 맞고 있었다.&lt;/p&gt;

&lt;p&gt;동료한테 얘기했더니 반응이 두 가지였다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"역시 AI는 쓸모없네."&lt;br&gt;
"그걸 왜 AI한테 물어봐 ㅋㅋ"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;둘 다 핵심을 모르는 거다.&lt;/p&gt;

&lt;p&gt;AI가 문제가 아니다. &lt;strong&gt;물어보는 방식이 문제다.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  그러면 어떻게 물어봤어야 하나
&lt;/h3&gt;

&lt;p&gt;애초에 "고깃집 추천해줘"가 잘못된 질문이다.&lt;/p&gt;

&lt;h4&gt;
  
  
  ❌ 보통 사람의 질문
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;"강남역 근처 회식하기 좋은 고깃집 추천해줘"&lt;br&gt;
→ AI가 5곳 추천 → 첫 번째가 폐업 → "AI 별로네"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  ✅ 이렇게 물어봤어야 한다
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1단계 — 기준부터 잡기:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"회사 회식할 때 직원들 만족도가 높은 음식점 유형이 뭐야? 인원수, 분위기, 메뉴 선택지 같은 요소별로 정리해줘."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI가 판단 기준을 먼저 정리해준다. 고깃집이 무난하긴 한데, 채식하는 사람 있으면 한정식이 낫고, 10명 넘으면 룸 있는 데가 좋고. 이런 거.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2단계 — 조건 넣기:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"우리 팀 8명이고, 고기파 많고, 강남역 도보 10분 이내. 후보 뽑아줘"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3단계 — 결과는 내가 검증:&lt;/strong&gt;&lt;br&gt;
네이버 지도에서 영업 중인지, 리뷰는 어떤지 직접 확인한다. 이건 사람이 해야 하는 영역이다.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(더 미친 사람은 AI한테 네이버 지도 데이터를 직접 물려줘서, 영업 중인 가게만 자동으로 걸러내게 한다. 이것도 나중에 다룬다.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"추천해줘" 한 마디로 끝내는 거랑, 기준 잡고 → 조건 넣고 → 결과를 내가 검증하는 거랑은 &lt;strong&gt;완전히 다른 행위다.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 여기서 한 가지 더. 반대로 생각하면 재밌다. 사람들이 구글 대신 AI한테 "추천해줘"를 점점 더 많이 하고 있다. 가게 입장에서는? 구글에 잘 걸리는 게 중요했는데, 이제는 &lt;strong&gt;AI가 추천하는 리스트에 들어가는 게 중요해졌다.&lt;/strong&gt; 이걸 'AI SEO'라고 부르기 시작했다. 이것도 다른 편에서 다룬다.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  대부분이 이렇게 쓰고 있다
&lt;/h2&gt;

&lt;p&gt;ChatGPT, Claude, Gemini. 한 번쯤은 써봤을 거다.&lt;/p&gt;

&lt;p&gt;근데 대부분 이렇게 쓴다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"OO해줘." → 결과 받음 → 끝.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;자기소개서 써줘. 이메일 번역해줘. 여행 계획 세워줘. 한 번 물어보고 한 번 받고 끝이다.&lt;/p&gt;

&lt;p&gt;좋으면 "AI 대단하다." 별로면 "AI 별로네." 이게 전부다.&lt;/p&gt;

&lt;p&gt;이건 구글 검색이랑 같은 거다. 검색창에 키워드 넣고 첫 번째 결과 클릭하는 거.&lt;/p&gt;

&lt;p&gt;AI는 검색엔진이 아니다. 전지전능한 신은 더더욱 아니다.&lt;/p&gt;

&lt;p&gt;근데 신한테 소원 빌듯이 한 줄 던지고 기적을 기대한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;기적은 안 일어난다.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Meta의 AI 안전 전문가도 당했다
&lt;/h2&gt;

&lt;p&gt;최근에 딱 맞는 사건이 있었다.&lt;/p&gt;

&lt;p&gt;요즘 IT업계에서 제일 핫한 게 &lt;strong&gt;OpenClaw&lt;/strong&gt;라는 AI 도구다. 내 컴퓨터에서 직접 돌면서 코딩도 하고, 웹 리서치도 하고, 이메일 정리하고, 파일 관리에 시스템 자동화까지 한다. 챗봇이 아니라 &lt;strong&gt;내 컴퓨터를 직접 조작하는 수준&lt;/strong&gt;이다. 맥미니가 품귀될 정도로 난리가 났고, 만든 개발자를 OpenAI가 영입하면서 더 난리가 났다.&lt;/p&gt;

&lt;p&gt;그런데 Meta에서 AI 안전을 담당하는 연구원이 이걸 쓰다가 사고가 났다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AI가 사고 안 치게 하는 게 직업인 사람이다.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이 사람이 OpenClaw한테 이메일 정리를 시켰다. "이메일 정리할거 정리해줘. 직접 지우지는 마." 이렇게 말했다.&lt;/p&gt;

&lt;p&gt;AI가 그 말을 무시하고 이메일을 &lt;strong&gt;전부&lt;/strong&gt; 삭제했다.&lt;/p&gt;

&lt;p&gt;폰으로 "멈춰!" 두 번 외쳤다. 무시당했다. 맥미니까지 달려가서 강제로 껐다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ AI 안전이 직업인 사람한테 벌어진 일이다. 네이버, 카카오, 당근이 OpenClaw 사내 사용을 금지한 것도 같은 이유다. AI가 나쁜 게 아니라, &lt;strong&gt;뭘 할 수 있고 뭘 못하는지를 모른 채 쓰면 사고가 나는 거다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;교훈은 "AI가 무섭다"가 아니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;내가 먼저 파악했어야 한다.&lt;/strong&gt; 그게 전부다.&lt;/p&gt;




&lt;h2&gt;
  
  
  이름은 거창한데 별거 아니다
&lt;/h2&gt;

&lt;p&gt;이걸 학문적으로는 &lt;strong&gt;'메타인지(Metacognition)'&lt;/strong&gt;라고 부른다. 이름이 좀 있어 보인다.&lt;/p&gt;

&lt;p&gt;실체는 별거 아니다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;내가 뭘 알고, 뭘 모르고, AI가 뭘 잘하고 뭘 못하는지. 이걸 한 번 생각해보는 거다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;그게 끝이다.&lt;/p&gt;

&lt;p&gt;회식장소 물어보기 전에 &lt;strong&gt;0.5초&lt;/strong&gt;만 생각하면 된다.&lt;br&gt;
&lt;em&gt;"영업 중인지는 AI가 모를 수 있겠다. 후보만 받고 확인은 내가 하자."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;이메일 정리시키기 전에 &lt;strong&gt;3초&lt;/strong&gt;만 생각하면 된다.&lt;br&gt;
&lt;em&gt;"얘가 내 말을 100% 따를까? 잘못되면 되돌릴 수 있나? 테스트용으로 먼저 해볼까?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;이 &lt;strong&gt;0.5초짜리 생각 하나&lt;/strong&gt;가, AI를 잘 쓰는 사람과 못 쓰는 사람을 가른다.&lt;/p&gt;

&lt;p&gt;근데 여기서 끝이 아니다.&lt;/p&gt;

&lt;p&gt;0.5초 생각하고 한 번 잘 물어보면 끝? 아니다. &lt;strong&gt;한 번 물어보고 끝나는 게 아니라, 계속 주고받는 거다.&lt;/strong&gt; AI가 답을 주면 거기서 "이건 맞는 것 같은데, 이건 아닌데?" 하고 다시 물어본다. AI가 모를 수 있는 부분을 내가 채워주고, 내가 모르는 부분을 AI한테 다시 물어본다. 이걸 5번, 10번, 필요하면 20번 반복한다.&lt;/p&gt;

&lt;p&gt;이게 &lt;strong&gt;티키타카&lt;/strong&gt;다. 좋은 첫 질문 하나로 끝나는 게 아니라, 끊임없이 주고받으면서 결과물을 같이 만들어가는 과정이다.&lt;/p&gt;

&lt;p&gt;프롬프트 엔지니어링 강의 같은 거 안 들어도 된다. 좋은 질문 하나를 외울 필요도 없다. &lt;strong&gt;계속 대화하면 된다.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  실제로 어떻게 다른지 보여주겠다
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔹 사업을 구상할 때
&lt;/h3&gt;

&lt;p&gt;사업 아이디어가 하나 떠올랐다고 하자.&lt;/p&gt;

&lt;p&gt;보통: &lt;em&gt;"사업계획서 써줘."&lt;/em&gt; → AI가 뭔가 그럴듯한 걸 뱉어준다 → "오 괜찮은데?" → 끝.&lt;/p&gt;

&lt;p&gt;나는 이렇게 한다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;1차:&lt;/strong&gt; "이 분야에서 잘 되고 있는 서비스들 뭐 있어? 각각 뭘 잘하는지 정리해줘."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI가 리스트를 뽑아준다. 여기서 끝내면 안 된다. 그 서비스들을 &lt;strong&gt;직접 깔아보고 써본다.&lt;/strong&gt; AI는 겉으로 보이는 정보는 잘 정리하는데, 실제 사용감이나 최근에 바뀐 건 모른다. 그건 내가 확인한다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2차:&lt;/strong&gt; "이 서비스들이 사용자를 어떤 흐름으로 끌어들이는지 비교해줘."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI가 분석해준다. "이건 맞는 것 같은데, 이건 좀 다른데?" 하면서 다시 물어본다. 내가 직접 써봤으니까 그 차이를 안다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3차:&lt;/strong&gt; "이걸 직접 만든다면, 우리 팀 상황은 이런데 어떤 방법이 현실적이야?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI는 우리 팀 사정을 모른다. 예산이 얼마인지, 누가 뭘 잘하는지. 내가 알려줘야 의미 있는 답이 나온다.&lt;/p&gt;

&lt;p&gt;이게 5번, 10번 반복된다. &lt;strong&gt;티키타카&lt;/strong&gt;다.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"사업계획서 써줘" 한 마디로는 이 깊이가 안 나온다.&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  🔹 처음 해보는 일에 도전할 때
&lt;/h3&gt;

&lt;p&gt;인스타그램 콘텐츠를 기획해야 할 일이 생겼다. 마케팅은 내 본업이 아니다. 뭘 모르는지도 모르는 상태였다.&lt;/p&gt;

&lt;p&gt;보통이면 &lt;em&gt;"인스타 게시물 3개 만들어줘"&lt;/em&gt;라고 했을 거다. AI가 밋밋한 걸 내놓으면 "AI 별로네" 하고 끝.&lt;/p&gt;

&lt;p&gt;나는 이렇게 했다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"나는 마케팅을 처음 해보는 사람인데, 인스타 콘텐츠를 기획하려고 해. &lt;strong&gt;내가 뭘 먼저 알아야 해?&lt;/strong&gt; 어떤 결정들을 내가 직접 해야 좋은 결과가 나와?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"뭘 만들어줘"가 아니라 &lt;strong&gt;"내가 뭘 모르는지"&lt;/strong&gt;를 먼저 물어본 거다.&lt;/p&gt;

&lt;p&gt;AI가 체크리스트를 줬다. 타겟이 누군지, 어떤 느낌으로 갈 건지, 얼마나 자주 올릴 건지, 성과는 뭘로 볼 건지.&lt;/p&gt;

&lt;p&gt;이걸 보고 내가 결정할 수 있는 것과 아직 모르는 것을 구분했다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"타겟은 20대 후반~30대 초반이고, 스킨케어 리뷰야. 근데 어떤 톤으로 말해야 할지 모르겠어. 이 연령대한테 먹히는 스타일을 사례로 보여줘."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI가 예시를 보여주면 그중에서 내 스타일에 맞는 걸 고른다. 그다음에야 "이 톤으로 첫 게시물 3개 기획해줘"라고 시킨다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;결과물 차이는 하늘과 땅이다.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  정리하면 이거다
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ 보통:     "XX해줘" → 결과 받음 → 틀리면 "AI 별로네"

✅ 이렇게:   "이걸 하려면 뭘 알아야 해?"
             → 내가 모르는 걸 파악
             → AI가 모를 수도 있는 걸 파악
             → 주고받으면서 같이 만듦
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;같은 도구다. 결과가 다르다.&lt;/p&gt;


&lt;h2&gt;
  
  
  여기서부터가 진짜 하고 싶은 얘기다
&lt;/h2&gt;

&lt;p&gt;위에서 한 얘기는 사실 서론이다.&lt;/p&gt;

&lt;p&gt;AI 결과물이 좋아지는 건 &lt;strong&gt;부산물&lt;/strong&gt;이다. 진짜 중요한 건 따로 있다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;이렇게 쓰면 나 자신이 성장한다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"내가 뭘 모르지?"를 매번 생각하는 습관이 들면, AI 없이도 사고방식이 달라진다. 회의할 때 "이 안건에서 우리가 놓치고 있는 게 뭐지?"를 먼저 생각하게 된다. 새로운 프로젝트를 시작할 때 "내가 모르는 영역이 어디지?"부터 파악하게 된다. AI를 끄고 나서도 이 습관은 남는다.&lt;/p&gt;

&lt;p&gt;아까 인스타 마케팅 사례를 다시 보자. 나는 마케팅을 전혀 몰랐다. 근데 AI한테 "내가 뭘 알아야 해?"를 물어보고, 체크리스트를 받고, 하나씩 결정해나가는 과정에서 &lt;strong&gt;마케팅의 기본 구조를 이해하게 됐다.&lt;/strong&gt; AI가 써준 게시물 3개를 얻은 게 아니다. 마케팅이 어떻게 돌아가는지를 알게 된 거다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"사업계획서 써줘"로 끝낸 사람은 &lt;strong&gt;사업계획서 하나&lt;/strong&gt;를 얻는다.&lt;br&gt;
티키타카를 한 사람은 &lt;strong&gt;그 분야의 시장 구조, 경쟁 상황, 현실적인 실행 방법&lt;/strong&gt;까지 머릿속에 들어온다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"XX해줘"로 끝내는 사람은 AI가 없으면 아무것도 못 한다. 티키타카를 하는 사람은 AI 없이도 예전보다 더 잘한다. &lt;strong&gt;AI가 대신 해줘서 편해지는 게 아니라, AI랑 대화하는 과정 자체가 사고 훈련이 되는 거다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이 글에서 하고 싶은 말의 핵심이 이거다. 프롬프트 잘 쓰는 법이 아니다. 생각하는 방식이 바뀌면, AI 결과물도 좋아지고, 나도 성장한다. 순서가 이거다.&lt;/p&gt;


&lt;h2&gt;
  
  
  AI는 신이 아니다
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;엄청나게 똑똑한 신입사원이다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;지식은 어마어마한데 우리 사정은 모른다. 일처리는 빠르다. 아는 것도 많다. 근데 맥락을 모른다. 어제 일어난 일을 모를 수도 있다. 자기가 모르는 것도 자신 있게 말한다.&lt;/p&gt;

&lt;p&gt;OpenClaw 사건도 마찬가지다. "정리해줘"는 이해했는데 "지우지 마"는 놓쳤다. 신입사원이 할 법한 실수다.&lt;/p&gt;

&lt;p&gt;이 신입사원한테 "알아서 해"라고 하면 안 된다.&lt;/p&gt;

&lt;p&gt;배경을 설명해주고, 뭘 해야 하는지 같이 정리하고, 중간중간 확인하고, 최종 판단은 내가 한다.&lt;/p&gt;

&lt;p&gt;이러면 세상에서 가장 유능한 파트너가 된다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;안 이러면 폐업한 고깃집을 예약하게 된다.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  오늘부터 하면 되는 세 가지
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;하나.&lt;/strong&gt; AI한테 뭔가 시키기 전에 &lt;em&gt;"나는 이 주제에 대해 뭘 모르지?"&lt;/em&gt; 생각해본다. 모르는 게 있으면 답을 구하기 전에 "내가 뭘 알아야 하는지"를 먼저 물어본다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;둘.&lt;/strong&gt; &lt;em&gt;"AI가 이걸 정확히 알까?"&lt;/em&gt; 생각해본다. 실시간 정보, 우리만의 맥락, 최신 변화. 이런 건 틀릴 수 있다. 내가 확인한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;셋.&lt;/strong&gt; 큰 작업은 쪼갠다. "다 해줘"가 아니라 단계별로 나눠서 중간중간 확인하면서 간다.&lt;/p&gt;

&lt;p&gt;세 가지다. 대단한 거 아니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;근데 이거 하는 사람과 안 하는 사람의 차이는 꽤 크다.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;AI 시대에 가장 중요한 스킬은 코딩도 아니고 프롬프트 기술도 아니다.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;내가 뭘 모르는지 아는 능력이다.&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  📌 다음 편 예고
&lt;/h3&gt;

&lt;p&gt;이번 편은 AI와 대화를 잘 하는 법이었다.&lt;/p&gt;

&lt;p&gt;근데 AI가 채팅창 안에만 있을 필요는 없다. 요즘은 AI가 내 캘린더를 보고, 내 문서를 읽고, 내가 쓰는 도구들이랑 직접 연결돼서 일하는 세계가 열리고 있다. OpenClaw가 그래서 그렇게 화제가 된 거다.&lt;/p&gt;

&lt;p&gt;다음 편 — &lt;strong&gt;AI를 채팅창 밖으로 꺼내는 법.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/kiwibreaksme" class="crayons-btn crayons-btn--primary"&gt;시리즈 팔로우하기&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>korean</category>
    </item>
    <item>
      <title>Claude Code Hooks: Why Your AI Forgets Everything (5-Min Fix)</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Fri, 23 Jan 2026 10:38:52 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/claude-code-hooks-why-your-ai-forgets-everything-5-min-fix-17j8</link>
      <guid>https://dev.to/kiwibreaksme/claude-code-hooks-why-your-ai-forgets-everything-5-min-fix-17j8</guid>
      <description>&lt;p&gt;Every single session. The same conversation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use TypeScript strict mode."&lt;br&gt;
"Add JSDoc comments to functions."&lt;br&gt;
"Don't touch the .env file."&lt;br&gt;
"Ask me before making API calls."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was spending the first 5 minutes of every Claude Code session just... &lt;strong&gt;repeating myself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;AI coding assistants are incredibly powerful. But they have one fatal flaw:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They forget everything when the session ends.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your carefully explained coding standards? &lt;em&gt;Gone.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The architectural decisions you discussed for an hour? &lt;em&gt;Vanished.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;That one rule about never auto-committing? &lt;em&gt;It doesn't exist anymore.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tried CLAUDE.md files. They help, but Claude doesn't always read them first. I tried system prompts. Too clunky.&lt;/p&gt;

&lt;p&gt;Then I discovered something that changed everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Feature Hiding in Plain Sight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code Hooks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hooks are shell commands that run automatically at specific moments in Claude's lifecycle. Not suggestions. Not guidelines Claude might follow. &lt;strong&gt;Actual code that executes every single time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Think of it like this
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md&lt;/strong&gt; = "Hey Claude, please remember these rules" &lt;em&gt;(polite request)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; = "These rules WILL run, no exceptions" &lt;em&gt;(enforced automation)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference? One relies on AI cooperation. The other just... works.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How Hooks Work (Simple Explanation)
&lt;/h2&gt;

&lt;p&gt;Hooks trigger at specific events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;When It Fires&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Session begins&lt;/td&gt;
&lt;td&gt;Load your coding rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before any tool runs&lt;/td&gt;
&lt;td&gt;Block dangerous commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After any tool runs&lt;/td&gt;
&lt;td&gt;Auto-format code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before context compression&lt;/td&gt;
&lt;td&gt;Preserve important context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When Claude needs attention&lt;/td&gt;
&lt;td&gt;Desktop alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You configure them in &lt;code&gt;.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo 'Your rules here'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. Every session, your rules load automatically.&lt;/p&gt;


&lt;h2&gt;
  
  
  5 Practical Hooks You Can Use Today
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1️⃣ Never Forget Your Coding Standards
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[RULES] 1) TypeScript strict mode 2) Add JSDoc to all functions 3) No console.log in production code'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every session starts with your rules. No more repeating yourself.&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ Protect Sensitive Files
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_TOOL_INPUT&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; | grep -qE '(&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.env|credentials|secrets)'; then echo 'BLOCKED: Cannot edit sensitive files' &amp;gt;&amp;amp;2; exit 2; fi"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Claude literally &lt;strong&gt;cannot&lt;/strong&gt; edit your &lt;code&gt;.env&lt;/code&gt; files. Not "won't"—&lt;strong&gt;can't&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ Auto-Format After Every Edit
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PostToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file=$(echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_TOOL_INPUT&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; | jq -r '.file_path'); if [[ &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; == *.ts ]]; then npx prettier --write &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;; fi"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every TypeScript file gets formatted automatically. No more "can you run prettier?"&lt;/p&gt;


&lt;h3&gt;
  
  
  4️⃣ Get Desktop Notifications
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Notification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osascript -e 'display notification &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Claude needs your attention&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; with title &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Claude Code&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Walk away from your desk. Get pinged when Claude needs you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Use &lt;code&gt;notify-send&lt;/code&gt; on Linux&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  5️⃣ Remember Rules After Context Compression
&lt;/h3&gt;

&lt;p&gt;This one's important. When your conversation gets too long, Claude compresses the context—and often forgets your rules.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreCompact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[REMINDER] After compaction: TypeScript strict, JSDoc required, ask before API calls'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your rules survive the compression. Every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Setup (Literally 2 Minutes)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create the settings file&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude
&lt;span class="nb"&gt;touch&lt;/span&gt; .claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Add your hooks&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[My Coding Rules] 1) Your rule here 2) Another rule'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Commit it to your repo&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .claude/settings.json
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add Claude Code hooks"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ Done. Every developer on your team now has the same rules.&lt;/p&gt;


&lt;h2&gt;
  
  
  But Wait—There's Still a Problem
&lt;/h2&gt;

&lt;p&gt;Hooks solve the "rules" problem beautifully. But there's something they can't do:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They can't remember WHY you built things a certain way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Imagine this scenario
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monday:&lt;/strong&gt; You and Claude decide to use JWT instead of sessions. Good reasons discussed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wednesday:&lt;/strong&gt; New session. Claude suggests using sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You:&lt;/strong&gt; "We already decided on JWT!"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude:&lt;/strong&gt; "Oh, I didn't know that."
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Hooks can remind Claude of rules. But they can't preserve the &lt;em&gt;reasoning&lt;/em&gt; behind your architectural decisions.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Missing Piece: Context in Code
&lt;/h2&gt;

&lt;p&gt;This is why I built &lt;strong&gt;CodeSyncer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bitjaru" rel="noopener noreferrer"&gt;
        bitjaru
      &lt;/a&gt; / &lt;a href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;
        codesyncer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Claude forgets everything when the session ends. CodeSyncer makes it remember.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeSyncer&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Claude forgets everything when the session ends. CodeSyncer makes it remember.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/codesyncer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/842923a2d048dafe0e00e52153551a9a06dc6e2ba485f57e9a99c373cb9b6e97/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f636f646573796e6365722e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bitjaru/codesyncer/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c838d998af2554b26475507dab26a507d34b3ec7eb133ff5b4eaa5e517d1b3cd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d436f6d6d6f6e73253230436c617573652d7265642e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bitjaru/codesyncer/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb96194d86cb57e98c3da7562c8d1bef22f6026a321d76ee7b5acdbb0ff149d6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6269746a6172752f636f646573796e6365722e737667" alt="GitHub stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer/./README.ko.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; | English&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem → The Solution&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Without CodeSyncer&lt;/th&gt;
&lt;th&gt;With CodeSyncer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context loss&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every session = start from scratch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@codesyncer-*&lt;/code&gt; tags = permanent memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forgot to tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Changes go untracked&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;codesyncer watch&lt;/code&gt; catches everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rules forgotten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI forgets guidelines mid-session&lt;/td&gt;
&lt;td&gt;Hooks auto-remind at optimal moments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dangerous inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI guesses prices, security, APIs&lt;/td&gt;
&lt;td&gt;Auto-pause on critical keywords&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/bitjaru/codesyncer/main/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fbitjaru%2Fcodesyncer%2Fmain%2Fdemo.gif" alt="CodeSyncer Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install&lt;/span&gt;
npm install -g codesyncer

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Initialize&lt;/span&gt;
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; /path/to/your/project
codesyncer init

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3. Let AI set up (say this to Claude)&lt;/span&gt;
&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Read .claude/SETUP_GUIDE.md and follow the instructions&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 4. Start coding (say this each session)&lt;/span&gt;
&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Read CLAUDE.md&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Upgrade&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install -g codesyncer@latest&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Core Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🏷️ Tag System&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Put context IN your code. AI reads code, so it recovers context automatically.&lt;/p&gt;
&lt;div class="highlight highlight-source-ts notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// &lt;span class="pl-k"&gt;@codesyncer&lt;/span&gt;-decision: [2024-01-15] Using JWT (session management is simpler)&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;⭐ Star CodeSyncer on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;store context directly in your code comments.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Authentication service
 *
 * @codesyncer-decision [2026-01-15] JWT over sessions (stateless, easier scaling)
 * @codesyncer-inference Token expiry 24h (standard for web apps)
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// @codesyncer-rule Never log tokens, even in debug mode&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next session, Claude reads the code and &lt;em&gt;instantly&lt;/em&gt; knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ What was decided&lt;/li&gt;
&lt;li&gt;✅ Why it was decided&lt;/li&gt;
&lt;li&gt;✅ What rules apply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No repetition. No forgetting. The context lives in the code itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hooks + CodeSyncer = Complete Solution
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI forgets coding rules&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; → Auto-load every session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI forgets decisions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-decision&lt;/strong&gt; → Lives in code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI makes assumptions&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-inference&lt;/strong&gt; → Documents reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI touches sensitive logic&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-rule&lt;/strong&gt; → Explicit warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CodeSyncer even sets up the hooks for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx codesyncer init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;.claude/settings.json&lt;/code&gt; with SessionStart and PreCompact hooks&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;.claude/CLAUDE.md&lt;/code&gt; with your coding rules&lt;/li&gt;
&lt;li&gt;✅ Tag system ready to use&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;🚀 Try CodeSyncer Now&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Just Hooks (Manual)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"hooks":{"SessionStart":[{"hooks":[{"type":"command","command":"echo [RULES] Your rules here"}]}]}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 2: Full Setup (Recommended)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx codesyncer init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load rules every session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserve rules after compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block dangerous operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-format, auto-lint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Desktop alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt; handle the "rules."&lt;br&gt;
&lt;strong&gt;CodeSyncer&lt;/strong&gt; handles the "reasoning."&lt;/p&gt;

&lt;p&gt;Together, your AI finally stops forgetting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://docs.anthropic.com/en/docs/claude-code/hooks" rel="noopener noreferrer"&gt;Claude Code Hooks Documentation&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;CodeSyncer GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have you tried hooks yet? What rules are you automating?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👇 Drop a comment below!&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>productivity</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>VibeCoding시대. 코딩면접 이제 바뀌어야한다.</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Fri, 23 Jan 2026 05:44:41 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/koding-jalhaneun-saram-baibeukoding-jalhaneun-saram-yeongu-gyeolgwaga-jeungmyeong-47f3</link>
      <guid>https://dev.to/kiwibreaksme/koding-jalhaneun-saram-baibeukoding-jalhaneun-saram-yeongu-gyeolgwaga-jeungmyeong-47f3</guid>
      <description>&lt;p&gt;흥미로운 연구 결과가 있습니다.&lt;/p&gt;

&lt;p&gt;2025년 7월, AI 안전 연구 기관 &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;METR&lt;/a&gt;에서 발표한 연구입니다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;특정 조건에서, 숙련된 개발자가 AI 코딩 도구를 쓰면 오히려 19% 느려졌다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;더 흥미로운 건?&lt;/p&gt;

&lt;p&gt;개발자들은 &lt;strong&gt;자신이 더 빨라졌다고 착각&lt;/strong&gt;했습니다.&lt;/p&gt;

&lt;p&gt;하지만 이 결과를 그대로 받아들이기 전에, 맥락을 알아야 합니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  METR 연구: 무엇을 측정했나
&lt;/h2&gt;

&lt;h3&gt;
  
  
  연구 설계
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;대상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16명의 오픈소스 개발자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;코드베이스&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;평균 22K+ 스타, 100만+ 줄 (라이브러리/컴파일러 위주)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;경험&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;해당 레포에 평균 5년, 1500+ 커밋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;작업&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;실제 이슈 246개 (버그 수정, 기능, 리팩토링)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;도구&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor Pro + Claude 3.5/3.7 Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  결과
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;수치&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;실제 결과&lt;/td&gt;
&lt;td&gt;AI 사용 시 &lt;strong&gt;19% 느려짐&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발자 사전 예측&lt;/td&gt;
&lt;td&gt;"24% 빨라질 것"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발자 사후 체감&lt;/td&gt;
&lt;td&gt;"20% 빨라진 것 같음"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ⚠️ 중요한 맥락
&lt;/h3&gt;

&lt;p&gt;이 연구에는 특수한 조건이 있었습니다:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;극소수 샘플&lt;/strong&gt;: 단 16명&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;고품질 코드베이스&lt;/strong&gt;: Haskell 컴파일러 등 품질 기준이 극도로 높은 프로젝트&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;이미 극도로 익숙한 환경&lt;/strong&gt;: 5년간 기여한 자기 프로젝트&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;도구 숙련도 부족&lt;/strong&gt;: 56%만 Cursor 사용 경험 있음&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;연구진도 인정합니다:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"이 결과가 모든 개발자를 느리게 한다는 의미가 아님"&lt;br&gt;
"몇 달 후면 다른 결과가 나올 수 있음"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  다른 연구들은 뭐라고 할까?
&lt;/h2&gt;

&lt;p&gt;METR만 보면 안 됩니다. 다른 연구들도 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  생산성 향상을 보여준 연구들
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;연구&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MIT/Princeton/UPenn&lt;/td&gt;
&lt;td&gt;AI로 &lt;strong&gt;26% 더 많은 작업 완료&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot 연구&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;55.8% 더 빠름&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBM 연구&lt;/td&gt;
&lt;td&gt;주니어 개발자 &lt;strong&gt;21-40% 생산성 향상&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;단, 이 연구들은 &lt;strong&gt;더 단순하고 고립된 작업&lt;/strong&gt;에서 진행됐습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  진짜 인사이트: 상황에 따라 다르다
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.seangoedecke.com/impact-of-ai-study/" rel="noopener noreferrer"&gt;Sean Goedecke의 분석&lt;/a&gt;이 핵심을 짚습니다:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI의 진짜 가치는 개발자가 &lt;strong&gt;comfort zone 밖의 작업&lt;/strong&gt;을 할 때 나타난다."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5년간 1500커밋 한 자기 프로젝트에서 AI 도움이 얼마나 필요할까요?&lt;br&gt;
반면, 처음 보는 코드베이스나 새로운 기술을 다룰 때는?&lt;/p&gt;




&lt;h2&gt;
  
  
  주니어 vs 시니어: 역설적 결과
&lt;/h2&gt;

&lt;h3&gt;
  
  
  생산성 향상은 주니어가 더 큼
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;경력&lt;/th&gt;
&lt;th&gt;AI로 인한 생산성 변화&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;주니어 (0-2년)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+21% ~ +40%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시니어 (10년+)&lt;/td&gt;
&lt;td&gt;+7% ~ +16%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://itrevolution.com/articles/new-research-reveals-ai-coding-assistants-boost-developer-productivity-by-26-what-it-leaders-need-to-know/" rel="noopener noreferrer"&gt;IT Revolution&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  하지만 프로덕션 배포는 시니어가 더 많이
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.fastly.com/blog/senior-developers-ship-more-ai-code" rel="noopener noreferrer"&gt;Fastly의 2025년 조사&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;시니어 개발자가 AI 생성 코드를 프로덕션에 2.5배 더 많이 배포한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;시니어 (10년+): 33%가 "절반 이상이 AI 코드"&lt;/li&gt;
&lt;li&gt;주니어 (0-2년): 13%만 "절반 이상이 AI 코드"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;왜?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"수십 년간의 패턴 인식. 좋은 코드가 어떻게 생겼는지, 뭘 요청해야 하는지, AI가 언제 틀리는지 안다."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  핵심 인사이트: 다른 능력이 필요하다
&lt;/h2&gt;

&lt;p&gt;여러 연구를 종합하면 한 가지가 명확해집니다:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;기존 "코딩 잘함"과 "바이브코딩 생산성"은 다른 능력이다.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  기존 "코딩 잘함"의 정의
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧮 알고리즘 문제 해결 능력&lt;/li&gt;
&lt;li&gt;📐 자료구조 이해&lt;/li&gt;
&lt;li&gt;⚡ 시간/공간 복잡도 최적화&lt;/li&gt;
&lt;li&gt;🔢 수학적 사고력&lt;/li&gt;
&lt;li&gt;💻 언어/프레임워크 숙련도&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LeetCode 잘 푸는 사람 = 코딩 잘하는 사람.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;이 공식이 바이브코딩에선 통하지 않습니다.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  바이브코딩 시대의 새로운 능력
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 메타인지 (Metacognition)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI가 지금 뭘 모르고 있는지 아는 능력"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;METR 연구에서 개발자들이 착각한 이유:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI 출력을 &lt;strong&gt;과신&lt;/strong&gt;하거나&lt;/li&gt;
&lt;li&gt;AI 출력을 &lt;strong&gt;과소평가&lt;/strong&gt;하거나&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;바이브코딩 잘하는 사람:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI의 한계를 정확히 파악&lt;/li&gt;
&lt;li&gt;어디서 AI가 틀릴지 예측&lt;/li&gt;
&lt;li&gt;언제 직접 코딩이 더 빠른지 판단&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 문맥 파악 (Context Awareness)
&lt;/h3&gt;

&lt;p&gt;시니어가 AI 코드를 더 많이 배포하는 이유:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"좋은 코드가 어떻게 생겼는지, 뭘 요청해야 하는지, AI가 언제 틀리는지 안다."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;이건 알고리즘 실력이 아닙니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;문맥을 읽는 능력:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;이 프로젝트에서 이 코드가 적절한가?&lt;/li&gt;
&lt;li&gt;팀의 컨벤션과 맞는가?&lt;/li&gt;
&lt;li&gt;비즈니스 요구사항을 충족하는가?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. AI 대화 스킬 (Prompt Craft)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.frontiersin.org/journals/education/articles/10.3389/feduc.2024.1366434/full" rel="noopener noreferrer"&gt;Frontiers in Education 연구&lt;/a&gt;는 프롬프트 엔지니어링을 "21세기 핵심 역량"으로 정의합니다.&lt;/p&gt;

&lt;p&gt;필요한 능력:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;비판적 사고&lt;/strong&gt;: AI 출력 검증&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;창의적 표현&lt;/strong&gt;: 의도를 명확하게 전달&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;언어적 감각&lt;/strong&gt;: 모호함 없는 지시&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LeetCode는 이걸 테스트하지 않습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 커뮤니케이션
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.cogentuniversity.com/post/tech-hiring-trends-2025-why-soft-skills-matter-more-than-ever" rel="noopener noreferrer"&gt;92%의 채용 담당자&lt;/a&gt;가 말합니다:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"소프트 스킬이 기술 스킬만큼 중요하다."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://proresumes.io/soft-skills-for-developers/" rel="noopener noreferrer"&gt;200만 개 기술직 채용 공고&lt;/a&gt; 분석 결과:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;1위 요구 스킬: 커뮤니케이션&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI가 코딩을 대신할수록, &lt;strong&gt;인간만의 협업 능력&lt;/strong&gt;이 차별화 요소가 됩니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 적응력과 학습 능력
&lt;/h3&gt;

&lt;p&gt;AI 도구는 빠르게 변합니다. METR 연구진도 말했듯이:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"몇 달 후면 다른 결과가 나올 수 있음"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2025년 초 Claude 3.5와 2026년 모델은 다릅니다.&lt;br&gt;
&lt;strong&gt;새로운 도구에 빠르게 적응하는 능력&lt;/strong&gt;이 중요해집니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  경고: 40%는 이해 못 한 코드를 배포한다
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.secondtalent.com/resources/vibe-coding-statistics/" rel="noopener noreferrer"&gt;Vibe Coding Statistics&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;주니어 개발자의 40% 이상이 완전히 이해하지 못한 AI 생성 코드를 배포한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;이게 왜 문제인가?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 기술 부채 누적&lt;/li&gt;
&lt;li&gt;🔴 보안 취약점 (AI 코드의 45%에 보안 결함)&lt;/li&gt;
&lt;li&gt;🔴 디버깅 불가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;메타인지 없이 바이브코딩 = 폭탄 돌리기&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  새로운 역량 체크리스트
&lt;/h2&gt;

&lt;p&gt;바이브코딩 시대에 필요한 능력:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;역량&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;LeetCode로 측정?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;메타인지&lt;/td&gt;
&lt;td&gt;AI의 한계 파악&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;문맥 파악&lt;/td&gt;
&lt;td&gt;프로젝트/팀/비즈니스 이해&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 대화 스킬&lt;/td&gt;
&lt;td&gt;명확한 의도 전달&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;커뮤니케이션&lt;/td&gt;
&lt;td&gt;협업 및 설명 능력&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;적응력&lt;/td&gt;
&lt;td&gt;새 도구/기술 학습&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비판적 사고&lt;/td&gt;
&lt;td&gt;AI 출력 검증&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;기존 코딩 테스트는 이걸 측정하지 못합니다.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  결론: 새로운 시대, 새로운 역량
&lt;/h2&gt;

&lt;p&gt;여러 연구를 종합하면:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI 코딩 도구의 효과는 상황에 따라 다르다&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;익숙한 코드베이스 vs 새로운 환경&lt;/li&gt;
&lt;li&gt;단순한 작업 vs 복잡한 작업&lt;/li&gt;
&lt;li&gt;도구 숙련도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;기존 코딩 실력 ≠ 바이브코딩 생산성&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;알고리즘 실력만으로는 부족&lt;/li&gt;
&lt;li&gt;메타인지, 문맥 파악, 커뮤니케이션이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;시니어의 강점은 "경험에서 오는 감각"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI가 언제 틀리는지 아는 것&lt;/li&gt;
&lt;li&gt;좋은 코드가 어떻게 생겼는지 아는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;바이브코딩 시대의 진짜 실력:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 AI가 뭘 모르는지 아는 것&lt;/li&gt;
&lt;li&gt;🎯 AI에게 뭘 시켜야 하는지 아는 것&lt;/li&gt;
&lt;li&gt;✅ AI가 틀렸을 때 알아차리는 것&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;메타인지, 문맥 파악, 커뮤니케이션.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이게 새로운 시대의 코딩 실력입니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;METR Study: Measuring AI Impact on Developer Productivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.seangoedecke.com/impact-of-ai-study/" rel="noopener noreferrer"&gt;Sean Goedecke: METR's AI productivity study is really good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fastly.com/blog/senior-developers-ship-more-ai-code" rel="noopener noreferrer"&gt;Fastly: Senior Developers Ship 2.5x More AI Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itrevolution.com/articles/new-research-reveals-ai-coding-assistants-boost-developer-productivity-by-26-what-it-leaders-need-to-know/" rel="noopener noreferrer"&gt;IT Revolution: AI Coding Assistants Boost Productivity 26%&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.secondtalent.com/resources/vibe-coding-statistics/" rel="noopener noreferrer"&gt;Vibe Coding Statistics 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.frontiersin.org/journals/education/articles/10.3389/feduc.2024.1366434/full" rel="noopener noreferrer"&gt;Frontiers: Prompt Engineering as 21st Century Skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cogentuniversity.com/post/tech-hiring-trends-2025-why-soft-skills-matter-more-than-ever" rel="noopener noreferrer"&gt;Tech Hiring Trends 2025: Why Soft Skills Matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.technologyreview.com/2025/12/15/1128352/rise-of-ai-coding-developers-2026/" rel="noopener noreferrer"&gt;MIT Technology Review: AI Coding is Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;여러분은 어떻게 생각하시나요?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👇 댓글로 의견 공유해주세요!&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>skills.sh: The Skill Marketplace for AI Coding Agents You're Missing Out On</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Fri, 23 Jan 2026 05:28:12 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/skillssh-the-skill-marketplace-for-ai-coding-agents-youre-missing-out-on-1afg</link>
      <guid>https://dev.to/kiwibreaksme/skillssh-the-skill-marketplace-for-ai-coding-agents-youre-missing-out-on-1afg</guid>
      <description>&lt;p&gt;Ever had these thoughts while using AI coding agents?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm tired of explaining React best practices every time..."&lt;br&gt;
"I wish I could save my Tailwind rules somewhere..."&lt;br&gt;
"How do other people set up their AI?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;It's already been done for you.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is skills.sh?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skills.sh" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;🔗 Visit skills.sh&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Open Agent Skills Ecosystem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A marketplace for &lt;strong&gt;injecting expert knowledge&lt;/strong&gt; into AI agents (Claude Code, Cursor, Copilot, etc.).&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;Install other people's best practices&lt;/strong&gt; into your AI&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;1 minute install&lt;/strong&gt;, no complex setup&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;Open source&lt;/strong&gt;, free&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Supported AI Agents
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Codex&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;+15 more&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Works with almost every AI coding tool out there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Top 10 Most Popular Skills
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Installs&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1️⃣&lt;/td&gt;
&lt;td&gt;vercel-react-best-practices&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32.6K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React best practices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣&lt;/td&gt;
&lt;td&gt;web-design-guidelines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24.7K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web design guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3️⃣&lt;/td&gt;
&lt;td&gt;remotion-best-practices&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.7K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Video editing (Remotion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4️⃣&lt;/td&gt;
&lt;td&gt;frontend-design&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.0K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5️⃣&lt;/td&gt;
&lt;td&gt;skill-creator&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.6K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skill for creating skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6️⃣&lt;/td&gt;
&lt;td&gt;vue-best-practices&lt;/td&gt;
&lt;td&gt;2.1K&lt;/td&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7️⃣&lt;/td&gt;
&lt;td&gt;three-js-best-practices&lt;/td&gt;
&lt;td&gt;1.8K&lt;/td&gt;
&lt;td&gt;Three.js 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8️⃣&lt;/td&gt;
&lt;td&gt;supabase-best-practices&lt;/td&gt;
&lt;td&gt;1.5K&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9️⃣&lt;/td&gt;
&lt;td&gt;marketing-guidelines&lt;/td&gt;
&lt;td&gt;1.2K&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔟&lt;/td&gt;
&lt;td&gt;tailwind-best-practices&lt;/td&gt;
&lt;td&gt;1.0K&lt;/td&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;30,000+ developers&lt;/strong&gt; using React are already on this.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Install
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: CLI (Recommended)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One line.&lt;/strong&gt; That's it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Inside Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills install vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How Does It Actually Work?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (Without Skills)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: Create a React component

Claude: (generates basic code)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After (With Skills Installed)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: Create a React component

Claude: (applies Vercel's best practices)
- Functional component
- TypeScript type definitions
- Proper hook usage
- Performance optimization
- Accessibility considerations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Same question, different quality.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Recommended Skill Combos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎨 Frontend Developer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add vercel-labs/web-design-guidelines
npx skills add vercel-labs/frontend-design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚡ Next.js + Supabase
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add supabase/supabase-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎬 Video Editing (Remotion)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add remotion-dev/remotion-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Vue.js Developer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vuejs/vue-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🌐 Full Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add supabase/supabase-best-practices
npx skills add vercel-labs/web-design-guidelines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Skill Structure (For the Curious)
&lt;/h2&gt;

&lt;p&gt;A skill is essentially &lt;strong&gt;one SKILL.md file&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
├── SKILL.md           # Core (required)
├── reference.md       # Detailed docs (optional)
├── examples.md        # Examples (optional)
└── scripts/           # Scripts (optional)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SKILL.md Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;react-best-practices&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;React best practices. Auto-applied when writing components.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## Component Rules&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Use functional components
&lt;span class="p"&gt;2.&lt;/span&gt; Define props with TypeScript interfaces
&lt;span class="p"&gt;3.&lt;/span&gt; useReducer over useState (complex state)
&lt;span class="p"&gt;4.&lt;/span&gt; Always specify useEffect dependencies
&lt;span class="p"&gt;5.&lt;/span&gt; Memoize only when necessary

&lt;span class="gu"&gt;## Don'ts&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Class components
&lt;span class="p"&gt;-&lt;/span&gt; any type
&lt;span class="p"&gt;-&lt;/span&gt; Inline styles (use Tailwind)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI reads this file and follows the rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create Your Own Skill
&lt;/h2&gt;

&lt;p&gt;Using others' skills is great, but you can also create &lt;strong&gt;project-specific skills&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create Folder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/skills/my-rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Write SKILL.md
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-rules&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Our team's coding rules&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## Required&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Variables in camelCase
&lt;span class="p"&gt;2.&lt;/span&gt; Functions under 20 lines
&lt;span class="p"&gt;3.&lt;/span&gt; Comments explain "why"
&lt;span class="p"&gt;4.&lt;/span&gt; Error handling required

&lt;span class="gu"&gt;## Forbidden&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; console.log (production)
&lt;span class="p"&gt;-&lt;/span&gt; any type
&lt;span class="p"&gt;-&lt;/span&gt; Magic numbers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Done
&lt;/h3&gt;

&lt;p&gt;Now it auto-applies when you code.&lt;/p&gt;




&lt;h2&gt;
  
  
  skills.sh vs Manual Prompts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Manual Prompts&lt;/th&gt;
&lt;th&gt;skills.sh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type every time&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;❌ Not needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency&lt;/td&gt;
&lt;td&gt;🔴 Low&lt;/td&gt;
&lt;td&gt;🟢 High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharing&lt;/td&gt;
&lt;td&gt;Difficult&lt;/td&gt;
&lt;td&gt;✅ Easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verified&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Community verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;
  Is it free?
  &lt;br&gt;
Yes, it's open source and free.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Which AIs does it work with?
  &lt;br&gt;
Claude Code, Cursor, Copilot, Gemini, and 20+ more.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Do skills conflict with each other?
  &lt;br&gt;
Usually not. Each skill is designed to focus on a specific domain.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Can I share my own skills?
  &lt;br&gt;
Yes, push to GitHub and register on skills.sh.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install skill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npx skills add owner/repo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List installed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/skills&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call directly&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/skill-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create your own&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/name/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Takes 1 minute.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the most popular React skill&lt;/span&gt;
npx skills add vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when you write React code, Vercel's best practices are automatically applied.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://skills.sh" rel="noopener noreferrer"&gt;skills.sh - Skill Marketplace&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://skills.sh/docs" rel="noopener noreferrer"&gt;skills.sh Docs&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;Claude Code Skills Official Docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What skills are you using?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>AI 코딩 에이전트용 스킬 마켓플레이스 (몰랐으면 손해)</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Fri, 23 Jan 2026 05:24:58 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/ai-koding-eijeonteuyong-seukil-makespeulreiseu-molrasseumyeon-sonhae-p2m</link>
      <guid>https://dev.to/kiwibreaksme/ai-koding-eijeonteuyong-seukil-makespeulreiseu-molrasseumyeon-sonhae-p2m</guid>
      <description>&lt;p&gt;AI 코딩 에이전트 쓰면서 이런 생각 해본 적 있음?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"React 베스트 프랙티스 매번 설명하기 귀찮은데..."&lt;br&gt;
"Tailwind 쓰는 규칙 어디 저장해두고 싶다..."&lt;br&gt;
"다른 사람들은 어떻게 설정해서 쓰지?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;이미 다 만들어져 있습니다.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  skills.sh가 뭔데?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skills.sh" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;🔗 skills.sh 바로가기&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Open Agent Skills Ecosystem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI 에이전트(Claude Code, Cursor, Copilot 등)에 &lt;strong&gt;전문 지식을 주입&lt;/strong&gt;하는 스킬 마켓플레이스입니다.&lt;/p&gt;

&lt;p&gt;쉽게 말해:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;남들이 만든 베스트 프랙티스&lt;/strong&gt;를 내 AI에 장착&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;설치 1분&lt;/strong&gt;, 복잡한 설정 없음&lt;/li&gt;
&lt;li&gt;🔓 &lt;strong&gt;오픈소스&lt;/strong&gt;, 무료&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  지원하는 AI 에이전트
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;에이전트&lt;/th&gt;
&lt;th&gt;지원&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Codex&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;+15개 이상&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;거의 모든 AI 코딩 도구에서 작동합니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  인기 스킬 TOP 10
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;스킬&lt;/th&gt;
&lt;th&gt;설치 수&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1️⃣&lt;/td&gt;
&lt;td&gt;vercel-react-best-practices&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32.6K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React 베스트 프랙티스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2️⃣&lt;/td&gt;
&lt;td&gt;web-design-guidelines&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24.7K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;웹 디자인 가이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3️⃣&lt;/td&gt;
&lt;td&gt;remotion-best-practices&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.7K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;영상 편집 (Remotion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4️⃣&lt;/td&gt;
&lt;td&gt;frontend-design&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.0K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;프론트엔드 디자인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5️⃣&lt;/td&gt;
&lt;td&gt;skill-creator&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.6K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;스킬 만드는 스킬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6️⃣&lt;/td&gt;
&lt;td&gt;vue-best-practices&lt;/td&gt;
&lt;td&gt;2.1K&lt;/td&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7️⃣&lt;/td&gt;
&lt;td&gt;three-js-best-practices&lt;/td&gt;
&lt;td&gt;1.8K&lt;/td&gt;
&lt;td&gt;Three.js 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8️⃣&lt;/td&gt;
&lt;td&gt;supabase-best-practices&lt;/td&gt;
&lt;td&gt;1.5K&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9️⃣&lt;/td&gt;
&lt;td&gt;marketing-guidelines&lt;/td&gt;
&lt;td&gt;1.2K&lt;/td&gt;
&lt;td&gt;마케팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔟&lt;/td&gt;
&lt;td&gt;tailwind-best-practices&lt;/td&gt;
&lt;td&gt;1.0K&lt;/td&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;React 쓰는 개발자 &lt;strong&gt;3만 명&lt;/strong&gt;이 이미 쓰고 있음.&lt;/p&gt;




&lt;h2&gt;
  
  
  설치 방법
&lt;/h2&gt;

&lt;h3&gt;
  
  
  방법 1: CLI (추천)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;한 줄&lt;/strong&gt;이면 끝.&lt;/p&gt;

&lt;h3&gt;
  
  
  방법 2: Claude Code 내에서
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills install vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  설치 확인
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  실제로 어떻게 작동하나?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (스킬 없이)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;나: React 컴포넌트 만들어줘

Claude: (그냥 기본적인 코드 생성)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After (스킬 설치 후)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;나: React 컴포넌트 만들어줘

Claude: (Vercel의 베스트 프랙티스 적용)
- 함수형 컴포넌트
- TypeScript 타입 정의
- 적절한 훅 사용
- 성능 최적화 고려
- 접근성 고려
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;같은 질문, 다른 품질.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  추천 스킬 조합
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎨 프론트엔드 개발자
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add vercel-labs/web-design-guidelines
npx skills add vercel-labs/frontend-design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚡ Next.js + Supabase
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add supabase/supabase-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎬 영상 편집 (Remotion)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add remotion-dev/remotion-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Vue.js 개발자
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vuejs/vue-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🌐 풀스택
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/vercel-react-best-practices
npx skills add supabase/supabase-best-practices
npx skills add vercel-labs/web-design-guidelines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  스킬 구조 (궁금한 사람만)
&lt;/h2&gt;

&lt;p&gt;스킬은 결국 &lt;strong&gt;SKILL.md 파일 하나&lt;/strong&gt;입니다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
├── SKILL.md           # 핵심 (필수)
├── reference.md       # 상세 문서 (선택)
├── examples.md        # 예제 (선택)
└── scripts/           # 스크립트 (선택)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SKILL.md 예시
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;react-best-practices&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;React 베스트 프랙티스. 컴포넌트 작성 시 자동 적용.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## 컴포넌트 작성 규칙&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; 함수형 컴포넌트 사용
&lt;span class="p"&gt;2.&lt;/span&gt; Props는 TypeScript 인터페이스로 정의
&lt;span class="p"&gt;3.&lt;/span&gt; useState보다 useReducer (복잡한 상태)
&lt;span class="p"&gt;4.&lt;/span&gt; useEffect 의존성 배열 명시
&lt;span class="p"&gt;5.&lt;/span&gt; 메모이제이션은 필요할 때만

&lt;span class="gu"&gt;## 금지 사항&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; class 컴포넌트
&lt;span class="p"&gt;-&lt;/span&gt; any 타입
&lt;span class="p"&gt;-&lt;/span&gt; 인라인 스타일 (Tailwind 사용)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI가 이 파일을 읽고 규칙을 따릅니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  내 스킬 만들기
&lt;/h2&gt;

&lt;p&gt;남의 거 쓰는 것도 좋지만, &lt;strong&gt;내 프로젝트 전용 스킬&lt;/strong&gt;도 만들 수 있음.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: 폴더 생성
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/skills/my-rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: SKILL.md 작성
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-rules&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;우리 팀 코딩 규칙&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## 필수 규칙&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; 변수명은 camelCase
&lt;span class="p"&gt;2.&lt;/span&gt; 함수는 20줄 이하
&lt;span class="p"&gt;3.&lt;/span&gt; 주석은 "왜"를 설명
&lt;span class="p"&gt;4.&lt;/span&gt; 에러 핸들링 필수

&lt;span class="gu"&gt;## 금지&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; console.log (프로덕션)
&lt;span class="p"&gt;-&lt;/span&gt; any 타입
&lt;span class="p"&gt;-&lt;/span&gt; 매직 넘버
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: 끝
&lt;/h3&gt;

&lt;p&gt;이제 코드 짤 때 자동으로 적용됨.&lt;/p&gt;




&lt;h2&gt;
  
  
  skills.sh vs 직접 프롬프트
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;직접 프롬프트&lt;/th&gt;
&lt;th&gt;skills.sh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;매번 입력&lt;/td&gt;
&lt;td&gt;필요&lt;/td&gt;
&lt;td&gt;❌ 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;일관성&lt;/td&gt;
&lt;td&gt;🔴 낮음&lt;/td&gt;
&lt;td&gt;🟢 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공유&lt;/td&gt;
&lt;td&gt;어려움&lt;/td&gt;
&lt;td&gt;✅ 쉬움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;검증됨&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ 커뮤니티 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설치&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;
  무료인가요?
  &lt;br&gt;
네, 오픈소스 기반이라 무료입니다.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  어떤 AI에서 작동하나요?
  &lt;br&gt;
Claude Code, Cursor, Copilot, Gemini 등 20개 이상 지원합니다.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  스킬끼리 충돌하나요?
  &lt;br&gt;
보통 안 합니다. 각 스킬은 특정 도메인에 집중하도록 설계되어 있습니다.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  내가 만든 스킬 공유할 수 있나요?
  &lt;br&gt;
네, GitHub에 올리고 skills.sh에 등록하면 됩니다.&lt;br&gt;


&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  요약
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;할 일&lt;/th&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;스킬 설치&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npx skills add owner/repo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설치 목록 확인&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/skills&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스킬 직접 호출&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/skill-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;내 스킬 만들기&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/name/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  시작하기
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1분이면 됩니다.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 가장 인기 있는 React 스킬 설치&lt;/span&gt;
npx skills add vercel-labs/vercel-react-best-practices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이제 React 코드 짜면 자동으로 Vercel 베스트 프랙티스가 적용됩니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  링크
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://skills.sh" rel="noopener noreferrer"&gt;skills.sh - 스킬 마켓플레이스&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://skills.sh/docs" rel="noopener noreferrer"&gt;skills.sh 문서&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;Claude Code Skills 공식 문서&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;어떤 스킬 쓰고 계신가요?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👇 댓글로 추천해주세요!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code Hooks 완벽 가이드: AI가 맨날 까먹는 이유와 해결법</title>
      <dc:creator>@kiwibreaksme</dc:creator>
      <pubDate>Fri, 23 Jan 2026 04:43:20 +0000</pubDate>
      <link>https://dev.to/kiwibreaksme/claude-code-hooks-wanbyeog-gaideu-aiga-maennal-ggameogneun-iyuwa-haegyeolbeob-4n03</link>
      <guid>https://dev.to/kiwibreaksme/claude-code-hooks-wanbyeog-gaideu-aiga-maennal-ggameogneun-iyuwa-haegyeolbeob-4n03</guid>
      <description>&lt;p&gt;매번. 똑같은. 대화.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"TypeScript strict mode 써."&lt;br&gt;
"함수마다 JSDoc 주석 달아."&lt;br&gt;
".env 파일은 건드리지 마."&lt;br&gt;
"API 호출 전에 나한테 물어봐."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;저는 Claude Code 세션 시작할 때마다 첫 5분을 이런 얘기 반복하는 데 쓰고 있었습니다.&lt;/p&gt;

&lt;p&gt;혹시 &lt;strong&gt;공감&lt;/strong&gt;되시나요?&lt;/p&gt;




&lt;h2&gt;
  
  
  아무도 말 안 하는 문제
&lt;/h2&gt;

&lt;p&gt;AI 코딩 어시스턴트는 정말 강력합니다. 근데 치명적인 약점이 하나 있어요.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;세션 끝나면 다 잊어버림.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;어제 1시간 동안 설명한 코딩 규칙? &lt;em&gt;사라짐.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;그제 논의한 아키텍처 결정? &lt;em&gt;없던 일.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;"절대 자동 커밋하지 마"라고 했던 거? &lt;em&gt;기억 못함.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLAUDE.md 파일도 써봤습니다. 도움은 되는데, Claude가 항상 먼저 읽지는 않더라고요. 시스템 프롬프트도 써봤는데 너무 번거롭고.&lt;/p&gt;

&lt;p&gt;그러다가 모든 걸 바꾼 기능을 발견했습니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  숨겨진 기능: Claude Code Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt;는 Claude의 라이프사이클 특정 시점에 자동으로 실행되는 셸 명령어입니다. 제안이 아니에요. Claude가 따를 수도 있는 가이드라인이 아닙니다. &lt;strong&gt;매번 무조건 실행되는 실제 코드&lt;/strong&gt;입니다.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  이렇게 생각하면 쉬워요
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md&lt;/strong&gt; = "Claude야, 이 규칙들 기억해줘" &lt;em&gt;(정중한 부탁)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; = "이 규칙은 무조건 실행됨" &lt;em&gt;(강제 자동화)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;차이점? 하나는 AI의 협조에 의존하고, 다른 하나는 그냥... 작동합니다.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Hooks 작동 원리 (쉬운 설명)
&lt;/h2&gt;

&lt;p&gt;Hooks는 특정 이벤트에서 발동됩니다:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;이벤트&lt;/th&gt;
&lt;th&gt;발동 시점&lt;/th&gt;
&lt;th&gt;활용 예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;세션 시작&lt;/td&gt;
&lt;td&gt;코딩 규칙 로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 실행 전&lt;/td&gt;
&lt;td&gt;위험한 명령 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 실행 후&lt;/td&gt;
&lt;td&gt;코드 자동 포맷팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;컨텍스트 압축 전&lt;/td&gt;
&lt;td&gt;중요 컨텍스트 보존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;알림 필요 시&lt;/td&gt;
&lt;td&gt;데스크톱 알림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;설정은 &lt;code&gt;.claude/settings.json&lt;/code&gt;에서 합니다:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '여기에 규칙 작성'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;끝입니다. 매 세션마다 규칙이 자동으로 로드됩니다.&lt;/p&gt;


&lt;h2&gt;
  
  
  지금 바로 쓸 수 있는 실용적인 Hooks 5가지
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1️⃣ 코딩 규칙 자동 로드
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[규칙] 1) TypeScript strict mode 2) 모든 함수에 JSDoc 3) 프로덕션에 console.log 금지'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;매 세션이 규칙과 함께 시작됩니다. 더 이상 반복할 필요 없음.&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ 민감한 파일 보호
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_TOOL_INPUT&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; | grep -qE '(&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.env|credentials|secrets)'; then echo '차단됨: 민감한 파일 수정 불가' &amp;gt;&amp;amp;2; exit 2; fi"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Claude가 &lt;code&gt;.env&lt;/code&gt; 파일을 수정 &lt;strong&gt;못 합니다&lt;/strong&gt;. "안 하는" 게 아니라 &lt;strong&gt;"못 하는"&lt;/strong&gt; 겁니다.&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ 수정 후 자동 포맷팅
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PostToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file=$(echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_TOOL_INPUT&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; | jq -r '.file_path'); if [[ &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; == *.ts ]]; then npx prettier --write &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$file&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;; fi"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;TypeScript 파일이 자동으로 포맷팅됩니다. "prettier 돌려줘" 안 해도 됨.&lt;/p&gt;


&lt;h3&gt;
  
  
  4️⃣ 데스크톱 알림 받기
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Notification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osascript -e 'display notification &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Claude가 응답을 기다리고 있습니다&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; with title &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Claude Code&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;자리 비워도 됩니다. Claude가 필요할 때 알림이 옵니다.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Linux는 &lt;code&gt;notify-send&lt;/code&gt; 사용&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  5️⃣ 컨텍스트 압축 후에도 규칙 유지
&lt;/h3&gt;

&lt;p&gt;이거 중요합니다. 대화가 길어지면 Claude가 컨텍스트를 압축하는데, 이때 규칙을 종종 까먹습니다.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreCompact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[리마인더] 압축 후에도 기억할 것: TypeScript strict, JSDoc 필수, API 호출 전 확인'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;압축 후에도 규칙이 살아남습니다. 매번.&lt;/p&gt;


&lt;h2&gt;
  
  
  설정 방법 (진짜 2분)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; 설정 파일 생성&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude
&lt;span class="nb"&gt;touch&lt;/span&gt; .claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Hooks 추가&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo '[내 코딩 규칙] 1) 규칙1 2) 규칙2'"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; 레포에 커밋&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .claude/settings.json
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add Claude Code hooks"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ 끝. 이제 팀원 모두가 같은 규칙을 공유합니다.&lt;/p&gt;


&lt;h2&gt;
  
  
  근데 아직 문제가 하나 남음
&lt;/h2&gt;

&lt;p&gt;Hooks는 "규칙" 문제를 아름답게 해결합니다. 하지만 못하는 게 있어요:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;왜 그렇게 만들었는지는 기억 못함.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  이런 상황 상상해보세요
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;월요일:&lt;/strong&gt; Claude랑 JWT를 쓰기로 결정. 충분한 논의 끝에.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;수요일:&lt;/strong&gt; 새 세션. Claude가 세션 방식을 제안함.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;나:&lt;/strong&gt; "우리 JWT 쓰기로 했잖아!"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude:&lt;/strong&gt; "아, 몰랐어요."
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Hooks는 규칙을 상기시킬 수 있습니다. 하지만 아키텍처 결정의 &lt;em&gt;이유&lt;/em&gt;는 보존하지 못해요.&lt;/p&gt;


&lt;h2&gt;
  
  
  빠진 퍼즐 조각: 코드 안의 컨텍스트
&lt;/h2&gt;

&lt;p&gt;그래서 &lt;strong&gt;CodeSyncer&lt;/strong&gt;를 만들었습니다.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bitjaru" rel="noopener noreferrer"&gt;
        bitjaru
      &lt;/a&gt; / &lt;a href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;
        codesyncer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Claude forgets everything when the session ends. CodeSyncer makes it remember.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeSyncer&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Claude forgets everything when the session ends. CodeSyncer makes it remember.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/codesyncer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/842923a2d048dafe0e00e52153551a9a06dc6e2ba485f57e9a99c373cb9b6e97/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f636f646573796e6365722e737667" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bitjaru/codesyncer/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c838d998af2554b26475507dab26a507d34b3ec7eb133ff5b4eaa5e517d1b3cd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d436f6d6d6f6e73253230436c617573652d7265642e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bitjaru/codesyncer/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb96194d86cb57e98c3da7562c8d1bef22f6026a321d76ee7b5acdbb0ff149d6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6269746a6172752f636f646573796e6365722e737667" alt="GitHub stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer/./README.ko.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; | English&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem → The Solution&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Without CodeSyncer&lt;/th&gt;
&lt;th&gt;With CodeSyncer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context loss&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every session = start from scratch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@codesyncer-*&lt;/code&gt; tags = permanent memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forgot to tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Changes go untracked&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;codesyncer watch&lt;/code&gt; catches everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rules forgotten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI forgets guidelines mid-session&lt;/td&gt;
&lt;td&gt;Hooks auto-remind at optimal moments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dangerous inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI guesses prices, security, APIs&lt;/td&gt;
&lt;td&gt;Auto-pause on critical keywords&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/bitjaru/codesyncer/main/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fbitjaru%2Fcodesyncer%2Fmain%2Fdemo.gif" alt="CodeSyncer Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Install&lt;/span&gt;
npm install -g codesyncer

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Initialize&lt;/span&gt;
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; /path/to/your/project
codesyncer init

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3. Let AI set up (say this to Claude)&lt;/span&gt;
&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Read .claude/SETUP_GUIDE.md and follow the instructions&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 4. Start coding (say this each session)&lt;/span&gt;
&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Read CLAUDE.md&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Upgrade&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install -g codesyncer@latest&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Core Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🏷️ Tag System&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Put context IN your code. AI reads code, so it recovers context automatically.&lt;/p&gt;
&lt;div class="highlight highlight-source-ts notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;// &lt;span class="pl-k"&gt;@codesyncer&lt;/span&gt;-decision: [2024-01-15] Using JWT (session management is simpler)&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;아이디어는 간단해요: &lt;strong&gt;코드 주석에 컨텍스트를 직접 저장하는 겁니다.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * 인증 서비스
 *
 * @codesyncer-decision [2026-01-15] 세션 대신 JWT 선택 (stateless, 스케일링 용이)
 * @codesyncer-inference 토큰 만료 24시간 (웹앱 표준)
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// @codesyncer-rule 디버그 모드에서도 토큰 로깅 금지&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;다음 세션에서 Claude가 코드를 읽으면 &lt;em&gt;즉시&lt;/em&gt; 알게 됩니다:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 뭘 결정했는지&lt;/li&gt;
&lt;li&gt;✅ 왜 그렇게 결정했는지&lt;/li&gt;
&lt;li&gt;✅ 어떤 규칙이 적용되는지&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;반복 없음. 까먹음 없음. 컨텍스트가 코드 자체에 살아있습니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hooks + CodeSyncer = 완벽한 조합
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;해결책&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI가 코딩 규칙을 까먹음&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; → 매 세션 자동 로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI가 결정을 까먹음&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-decision&lt;/strong&gt; → 코드에 남음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI가 추론함&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-inference&lt;/strong&gt; → 근거 문서화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI가 민감한 로직 건드림&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;@codesyncer-rule&lt;/strong&gt; → 명시적 경고&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CodeSyncer는 Hooks도 자동으로 설정해줍니다:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx codesyncer init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이렇게 생성됩니다:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;.claude/settings.json&lt;/code&gt; - SessionStart, PreCompact hooks 포함&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;.claude/CLAUDE.md&lt;/code&gt; - 코딩 규칙&lt;/li&gt;
&lt;li&gt;✅ 태그 시스템 바로 사용 가능&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  빠른 시작
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;🚀 CodeSyncer 시작하기&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bitjaru/codesyncer" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;⭐ CodeSyncer GitHub에서 스타 누르기&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;옵션 1: Hooks만 (수동)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"hooks":{"SessionStart":[{"hooks":[{"type":"command","command":"echo [규칙] 여기에 규칙"}]}]}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;옵션 2: 전체 설정 (추천)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx codesyncer init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  요약
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;매 세션 규칙 로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;압축 후에도 규칙 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;위험한 작업 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;자동 포맷팅, 린팅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;데스크톱 알림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt;는 "규칙"을 담당합니다.&lt;br&gt;
&lt;strong&gt;CodeSyncer&lt;/strong&gt;는 "이유"를 담당합니다.&lt;/p&gt;

&lt;p&gt;둘을 같이 쓰면, AI가 드디어 까먹지 않습니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  링크
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://docs.anthropic.com/en/docs/claude-code/hooks" rel="noopener noreferrer"&gt;Claude Code Hooks 공식 문서&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/bitjaru/codesyncer" rel="noopener noreferrer"&gt;CodeSyncer GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Hooks 써보셨나요? 어떤 규칙을 자동화하고 계신가요?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👇 댓글로 공유해주세요!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
