diff --git a/CLAUDE.md b/CLAUDE.md
index a3ee32e..53d67b7 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -34,8 +34,10 @@
- **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다).
- **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`).
- 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md).
+- **코드가 보여주는 것을 산문으로 다시 쓰지 않는다.** `snippet`에서 산문이 코드를 번역하고 있으면 그 산문은 잉여다 (576.md는 첫 단락이 `배열 → union → 함수` 파생을 설명했는데 바로 아래 코드가 이미 그것이었다).
+- **짧음과 즉답 가능성은 다르다.** 눌러 담으면 짧아지지만 나중에 재구성해야 하는 문장이 된다 — 압축의 기준은 글자 수가 아니라 "6개월 뒤 바로 읽히는가"다. 같은 주장이 산문·코드 주석·컴포넌트 속성에 흩어져 반복되는 것도 이때 생긴다 (576.md는 세 번 반복됐다).
- **검출은 `pnpm lint:voice`** — 빌드에 연결됨. `release` 메모에서 검출되면 빌드가 실패하고, `draft`·`archive`는 경고까지만이다(작성 중에는 원문을 붙여놓고 줄이는 단계가 있으므로).
-- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡힌다. 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우).
+- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡히고, **부풀린 문장은 잡지만 눌러 담은 문장은 못 잡는다**(576.md는 두 린터 모두 조용했다). 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우).
### 하지 말 것
@@ -378,6 +380,7 @@ mtime: YYYY-MM-DD
- 각주만 문제였던 것: 83·19·24·221·312 (링크 제목에 이미 있는 내용을 늘려 쓴 경우. 각주에 박혀 있던 기술 링크는 살렸다)
- 비공개도 정리: 123·125·171(각주), 182·256·267(산문). 125에서 중복 링크 1개 제거
- `309.md`는 본인 작업 기록인데 존댓말이라 `voice: author`를 달아 예외로 표시
+ - 반대 방향도 있었다: `576.md`는 본인 문장인데 과압축·자기 반복이라 산문이 코드를 다시 말하고 있었다 (566자 → 476자, iframe 제거로 `.mdx` → `.md`)
- 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271·182·256(→`bookmarks`), 56·340(→`snippet`), 329(→`note`)
- 태그 정규화: snake_case → kebab-case 변환 (23개 파일)
- 빈 태그 메모: 28개 파일에 태그 적용
diff --git a/public/iframe/date-single-source.html b/public/iframe/date-single-source.html
deleted file mode 100644
index c1575a5..0000000
--- a/public/iframe/date-single-source.html
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-
-
-
-날짜 표기 단일 출처 — 타입이 닫고 함수가 통로 (객체 불필요)
-
-
-
-
-
날짜 표기 단일 출처 — 타입이 닫고, 함수가 통로
-
허용 표기 배열 하나에서 타입·lint 가드·통로 함수가 전부 파생된다. 매핑 객체가 없는 이유는 dayjs가 키=값이기 때문 — i18n과 대비해 보세요
-
dayjs 날짜 표기를 as const 배열 단일 출처로 두면 union 타입, ESLint drift 가드, formatDate 통로 함수가 파생됨을 보여주고, 키=값이라 매핑 객체가 불필요함을 키≠값인 i18n(키→객체→값) 구조와 토글로 대비하는 다이어그램.
-
-
-
-
-
- dayjs (키=값)
- i18n (키≠값)
-
-
-
-
-
-
-
-
-
-
diff --git a/src/content/memo/232.md b/src/content/memo/232.md
index 384a793..43bc1c2 100644
--- a/src/content/memo/232.md
+++ b/src/content/memo/232.md
@@ -3,10 +3,10 @@ type: bookmarks
tags: ['editor', 'input']
status: release
ctime: 2022-12-05
-mtime: 2024-03-22
+mtime: 2026-07-27
---
-- [react-mentions](https://github.com/signavio/react-mentions)[^232-1]
+- [react-mentions](https://www.npmjs.com/package/react-mentions)[^232-1]
- [tribute](https://github.com/zurb/tribute)[^232-2]
- [react-input-trigger](https://github.com/abinavseelan/react-input-trigger)[^232-3]
- [react-contenteditable](https://github.com/lovasoa/react-contenteditable)[^232-4]
diff --git a/src/content/memo/310.md b/src/content/memo/310.md
index ce2982d..b636cb8 100644
--- a/src/content/memo/310.md
+++ b/src/content/memo/310.md
@@ -5,7 +5,7 @@ title: React Router의 Link 컴포넌트 테스트하기
description: 이 글에서는 React Router의 컴포넌트를 테스트하는 방법을 설명합니다. 사용자가 링크를 클릭하면 적절한 페이지로 이동하는지 확인하는 테스트 코드를 예제와 함께 제공합니다.
status: release
ctime: 2024-08-06
-mtime: 2024-08-06
+mtime: 2026-07-27
---
React 애플리케이션에서 라우팅은 중요한 부분. 특히, 사용자가 링크를 클릭할 때 적절한 페이지로 이동하는지 테스트하는 것은 중요. 다음은 [React Router](https://reactrouter.com/en/main)의 `` 컴포넌트를 테스트하는 코드.
@@ -36,4 +36,4 @@ describe('Link', () => {
---
-- https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/__tests__/link-click-test.tsx
+- https://github.com/remix-run/react-router/blob/main/packages/react-router/__tests__/dom/link-click-test.tsx
diff --git a/src/content/memo/491.mdx b/src/content/memo/491.md
similarity index 74%
rename from src/content/memo/491.mdx
rename to src/content/memo/491.md
index 61bb47e..72894a2 100644
--- a/src/content/memo/491.mdx
+++ b/src/content/memo/491.md
@@ -3,15 +3,9 @@ type: bookmarks
tags: [llms.txt]
status: release
ctime: 2025-04-01
-mtime: 2025-04-01
+mtime: 2026-07-27
---
-import QuoteLink from '@components/QuoteLink.astro'
-
-
- llms-full.txt.ts
-
-
`llms.txt`는 웹사이트나 애플리케이션이 자신이 사용하는 LLM(대규모 언어 모델) 및 관련 설정에 대해 명시적으로 문서화할 수 있는 포맷이다.
아래 링크들은 `llms.txt` 포맷이 실제로 어떻게 사용되고 있는지 참고한 자료들. 각 사이트는 자신들의 문서를 `llms.txt`에 구조적으로 명시하고 있다.
diff --git a/src/content/memo/552.mdx b/src/content/memo/552.mdx
index 4f2c2ae..b1876c0 100644
--- a/src/content/memo/552.mdx
+++ b/src/content/memo/552.mdx
@@ -3,7 +3,7 @@ type: snippet
tags: ['tunneling', 'websocket', 'vercel-sandbox', 'networking']
status: release
ctime: 2026-06-07
-mtime: 2026-06-28
+mtime: 2026-07-27
title: vgrok - 터널링의 핵심은 역방향 영속 연결
---
@@ -67,5 +67,5 @@ await sandbox.runCommand({ cmd: 'node', args: ['server.js'], detached: true })
---
-- [vgrok](https://github.com/vercel-labs/vgrok)
+- [vgrok](https://github.com/styfle/vgrok)
- [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox)
diff --git a/src/content/memo/576.mdx b/src/content/memo/576.md
similarity index 56%
rename from src/content/memo/576.mdx
rename to src/content/memo/576.md
index b2aad4d..e8091e6 100644
--- a/src/content/memo/576.mdx
+++ b/src/content/memo/576.md
@@ -3,12 +3,10 @@ type: snippet
tags: ['typescript', 'dayjs', 'date-format', 'type-safety']
status: release
ctime: 2026-06-28
-mtime: 2026-06-28
+mtime: 2026-07-27
---
-import AutoIframe from '@components/AutoIframe/AutoIframe.astro'
-
-날짜 표기를 통일하는 데 **매핑 객체가 필요 없다** — dayjs는 포맷 문자열이 곧 키이자 값이라, 허용 표기를 `as const` 배열 하나로 두면 그게 닫힌 집합이다. 닫힘은 union 타입이, 통로는 함수 하나가 맡는다. (i18n은 키≠값이라 객체가 필수였지만, 여기선 잉여.)
+날짜 표기 통일에 **매핑 객체가 필요 없다** — dayjs는 포맷 문자열이 곧 키이자 값이다. (i18n은 키≠값이라 객체가 필수였다.)
```ts
import dayjs from 'dayjs'
@@ -34,14 +32,9 @@ export const formatDate = (
): string => dayjs(date).format(format)
```
-
-
규율: **여러 곳에서 통일이 필요한 표기만** 배열에 담는다. 일회성(`'M.D'` 등)은 raw `dayjs().format()`으로 인라인 유지 — 안 그러면 배열이 잡동사니 enum이 된다. ESLint `no-restricted-syntax`로 카탈로그 표기를 raw로 다시 쓰면 경고(drift 가드).
> [!WARNING]
> `ddd`(요일)는 진입점에서 `dayjs.locale('ko')`를 호출해야 한국어로 나온다 — 안 하면 영어로 조용히 샌다. **타입은 이 런타임 전제를 못 잡는다.**
-곁가지 — 매핑 객체·빌드타임 hoist·tagged-template 캐시도 검토했으나 접음: 고유 패턴이 수십 개 규모라 dedup·컴파일 최적화가 풀 문제 자체가 없다. 닫힌 타입 + 함수 하나로 충분.
+곁가지 — 빌드타임 hoist·tagged-template 캐시도 검토했으나 접음: 고유 패턴이 수십 개 규모라 dedup·컴파일 최적화가 풀 문제 자체가 없다. 닫힌 타입 + 함수 하나로 충분.
diff --git a/src/content/memo/58.md b/src/content/memo/58.md
index ef53221..b1f1d6c 100644
--- a/src/content/memo/58.md
+++ b/src/content/memo/58.md
@@ -3,14 +3,12 @@ type: bookmarks
tags: ['esm', 'node']
status: release
ctime: 2022-04-09
-mtime: 2024-03-22
+mtime: 2026-07-27
---
[imagemin](https://github.com/imagemin/imagemin)을 사용하려고 하는데 [module](https://nodejs.org/api/esm.html)로 라이브러리가 업데이트 되어서 찾아본 내용. 혼란스러운 부분도 있지만 성숙해지는 과정이라고 본다.
- [Pure ESM package · GitHub](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)
-- [Get Ready For ESM. JavaScript Modules will soon be a… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog](https://blog.sindresorhus.com/get-ready-for-esm-aa53530b3f77)
-- [Hello, Modules!. JavaScript Modules, also known as ESM… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog](https://blog.sindresorhus.com/hello-modules-d1010b4e777b)
- [Publish ESM and CJS in a single package](https://antfu.me/posts/publish-esm-and-cjs)[^58-1]
---
diff --git a/src/content/memo/63.md b/src/content/memo/63.md
index 16cabe4..577aa06 100644
--- a/src/content/memo/63.md
+++ b/src/content/memo/63.md
@@ -3,11 +3,11 @@ type: note
tags: ['node', 'image', 'imagemin']
status: release
ctime: 2022-04-09
-mtime: 2024-03-22
+mtime: 2026-07-27
---
- 이미지 압축 기본 설정값 참조: mozjpeg(75), pngquant([75, 85])[^63-1]
---
-[^63-1]: https://github.com/antonreshetov/image-optimizer/blob/master/src/main/store/module/app.js#L32-L53
\ No newline at end of file
+[^63-1]: https://github.com/antonreshetov/image-optimizer/blob/master/src/main/store/module/app.ts#L33-L53
\ No newline at end of file
diff --git a/src/content/memo/74.md b/src/content/memo/74.md
index 74946bf..1266807 100644
--- a/src/content/memo/74.md
+++ b/src/content/memo/74.md
@@ -3,7 +3,7 @@ type: snippet
tags: ['ffmpeg', 'video']
status: release
ctime: 2022-04-09
-mtime: 2024-03-22
+mtime: 2026-07-27
---
```shell
@@ -36,4 +36,4 @@ encodingVideo() {
---
- [Encoding Video
-](https://gist.github.com/Vestride/278e13915894821e1d6f)
\ No newline at end of file
+](https://gist.github.com/glen-cheney/278e13915894821e1d6f)
\ No newline at end of file
diff --git a/src/content/memo/78.md b/src/content/memo/78.md
index c2fc8b0..18317db 100644
--- a/src/content/memo/78.md
+++ b/src/content/memo/78.md
@@ -3,7 +3,7 @@ type: note
tags: ['cse', 'api']
status: release
ctime: 2022-04-09
-mtime: 2024-03-22
+mtime: 2026-07-27
---
> 검색기능을 정말 간단하게 구현하고 싶을때:
@@ -11,5 +11,4 @@ mtime: 2024-03-22
---
-- [Method: cse.siterestrict.list](https://developers.google.com/custom-search/v1/reference/rest/v1/cse.siterestrict/list)
-- [cbcruk/cse-events](https://github.com/cbcruk/cse-events)
\ No newline at end of file
+- [Method: cse.siterestrict.list](https://developers.google.com/custom-search/v1/reference/rest/v1/cse.siterestrict/list)
\ No newline at end of file