도구/Obsidian Singleton을 Per-Instance로 바꾼 뒤 찾아온 메모리 누수: 16줄로 잡은 Orphaned RateLimiter Obsidian 플러그인의 multi-config 리팩토링 중 발견한 조용한 메모리 누수: config를 삭제해도 그 config가 쓰던 RateLimiter가 공유 Map에 그대로 남았던 버그의 원인과 3파일 16줄짜리 fix. Per-instance 서비스 전환 시 주의해야 할 4가지 cleanup 함정을 정리했습니다.
도구/Obsidian Obsidian 플러그인을 Multi-Database로 리팩토링하기: DatabaseProvider 추상화와 FieldType 정규화 Airtable에 강결합돼 있던 Obsidian 플러그인 서비스 레이어를 provider-agnostic DatabaseProvider 인터페이스로 추상화한 2단계 리팩토링(PR #49, #50) 기록. 런타임 capability flag, 5-way discriminated union credential, 29→11 StandardFieldType 정규화까지 395/395 테스트를 유지하며 진행한 설계 결정을 공유합니다.
도구/Obsidian 하나의 Obsidian Vault에서 여러 Airtable 동시 싱크: Multi-Config 아키텍처 구현기 Airtable 플러그인을 단일 config에서 multi-config 멀티테넌트 구조로 확장한 경험. ConfigInstance와 ConfigManager의 역할 분리, credential-scoped RateLimiter 공유, defensive + idempotent 마이그레이션, 폴더 겹침 검증, Obsidian command palette의 dynamic re-registration까지.
자동화/블로그 Ghost MCP v1.0.1 업데이트기: 프로토타입에서 오픈소스 도구로 — 무엇이 달라졌나 v1.0.0 공개 후 2개월. "내 블로그용 스크립트"를 "오픈소스 도구"로 끌어올린 변화 — 테스트, 보안, 유연성, 온보딩 네 가지 영역의 성숙화를 한눈에 정리합니다.
AI/도구활용 양방향 링크 시스템을 테스트 커버리지에 확장하기: @tested / @covers 마커 패턴 문서↔코드 양방향 링크 시스템을 테스트 영역에 확장한 후속편. @tested / @covers 마커 설계, 3계층 테스트 커버리지 선언, CI 검증 스크립트까지 정리합니다.
백엔드/API설계 마크다운 3포맷 자동 감지 파서 설계: legacy, frontmatter, plain을 한 파서로 기존 사용자의 레거시 포맷을 깨지 않으면서 표준 frontmatter와 일반 마크다운까지 지원해야 했습니다. 감지 순서, fallback 설계, 그리고 strategy 패턴을 포기한 이유를 정리합니다.
백엔드/인증-보안 MCP 서버 보안: LLM이 생성한 파일 경로를 18줄로 막는 Path Traversal 방어 MCP 서버는 로컬 권한과 LLM 입력이 만나는 새로운 공격 표면입니다. Path Traversal, prefix 우회, symlink 공격을 18줄의 검증 함수로 막는 방법과 그 뒤의 설계 원칙을 정리합니다.
백엔드/API설계 TypeScript로 읽기 전용 상태 표현하기: Ghost 'sent' 상태 타입 분리 설계 시스템이 자동 설정하는 상태를 타입으로 어떻게 강제할까요? Ghost 포스트의 sent 상태를 예시로, Read 타입과 Write 타입을 분리해 invariant를 컴파일 타임에 보장하는 설계 패턴을 정리합니다.
백엔드/API설계 Ghost API 태그 삭제가 안 되는 이유: 빈 배열과 PATCH 시맨틱의 함정 Ghost MCP 개발 중 발견한 태그 삭제 silent failure. spread-if 패턴이 PATCH 요청에서 왜 위험한지, 그리고 빈 배열을 명시적으로 전송해야 하는 이유를 정리합니다.
AI/Claude Code claude-dashboard v1.25~v1.26: 위젯을 쪼개고, 커뮤니티가 테마와 기능을 보태다 claude-dashboard v1.25~v1.26의 변화를 정리합니다. context 위젯을 세 조각으로 쪼개 좁은 터미널에서 필요한 것만 보여주고, tagStatus로 릴리스 태그를 추적하며, 커뮤니티가 peakHours, Pro 7일 한도, Catppuccin Latte 테마를 보태 줬습니다.
AI/Claude Code 실패도 캐싱하라: API 클라이언트 회복력을 위한 TypeScript 패턴 (negative caching + discriminated union) API hammering을 막으려면 실패도 캐시해야 합니다. 30초 negative caching, 1시간 stale fallback, 그리고 TypeScript discriminated union으로 "데이터 또는 에러" 불변식을 타입에 박아 넣는 세 단계 패턴을 정리합니다.
AI/Claude Code 터미널 상태줄을 클릭 가능하게: OSC8 하이퍼링크와 두 가지 보안 함정 OSC8은 9줄짜리 함수로 터미널 텍스트를 클릭 가능한 링크로 만들어 줍니다. 단, segment 단위 URL 인코딩과 git remote URL의 자격증명 stripping이라는 두 가지 함정을 미리 잡지 않으면 토큰을 escape sequence 안에 그대로 노출시킬 수 있습니다.
AI/Claude Code claude-dashboard v1.14~v1.24: stdin 우선, OSC8 링크, 그리고 파서를 한 번 더 100배 빠르게 claude-dashboard v1.14~v1.24의 변화를 정리합니다. Claude Code stdin이 새 필드를 추가하면서 API 호출을 0으로 줄였고, 트랜스크립트 파서를 두 번 더 100배 빠르게 만들었으며, lastPrompt 위젯의 데이터 소스를 history.jsonl로 옮겼습니다.
인프라/Docker Docker Desktop, 아직도 쓰세요? 2026년 컨테이너 런타임 완벽 비교 가이드 16GB Mac에서 Docker Desktop이 8GB를 잡아먹고 있었습니다. OrbStack으로 전환하자 634MB로 줄었습니다. 2026년 현재 사용 가능한 5가지 대안을 실측 벤치마크와 함께 비교합니다.
AI/Claude Code 터미널 다크/라이트 모드 자동 감지: COLORFGBG 환경 변수의 조용한 진실 브라우저엔 `prefers-color-scheme`가 있는데 터미널엔 뭐가 있을까? COLORFGBG 환경 변수, OSC 11 이스케이프 쿼리, TERM_PROGRAM 휴리스틱을 비교하고, Rust TUI 프로젝트에서 쓴 12줄짜리 디텍터와 그 한계를 정리합니다.
AI/Claude Code Ratatui로 Miller Columns 3-Pane 파일 탐색 UI 만들기: Finder 스타일 TUI 설계 가이드 ratatui 튜토리얼은 대부분 단일 리스트에서 멈춥니다. Finder 스타일 3-pane 네비게이션을 만들기 위한 레이아웃 설계, pane 팩토리, 포커스 관리, 캐스케이딩 리셋 패턴을 Rosé Pine 테마와 함께 정리합니다.
AI/Claude Code Claude Code 프로젝트 폴더명 디코딩: `~/.claude/projects/`의 손실 인코딩 복원기 `~/.claude/projects/`의 이상한 폴더 이름을 사람이 읽을 수 있는 프로젝트명으로 되돌리는 알고리즘. 손실 인코딩 복원, greedy 파일시스템 매칭, 중복 제거까지 duru의 scan.rs가 세 번의 리팩토링을 거치는 과정을 정리합니다.
프론트엔드/React 한 기능을 수직으로 덮는 테스트 피라미드: Weekly Report 기능의 50+ 테스트 사례 연구 주간 리포트 하나를 출시하는 데 유닛 41개 + E2E 10개 = 51개 테스트가 필요했다. 같은 기능을 왜 여러 층위에서 반복 검증하는가? 피라미드 각 층의 역할과 '어떤 테스트를 어디에 둘지'의 구체적 선택.
프론트엔드/Next.js URL 쿼리로 토글하는 인라인 전체화면: Next.js App Router + useRouter().replace() 패턴 '별도 /fullscreen 라우트 만들지 말고, 같은 페이지에서 ?panel=full 쿼리로 토글합시다.' PR 리뷰 코멘트 하나로 페이지 전체가 단순해졌다. URL을 상태로 삼는 패턴과 그 한계.
백엔드/API설계 UI는 좁게, API는 넓게: 타임존 설정의 두 단계 검증 전략 조직별 타임존 설정에서 드롭다운은 6개만 보여주지만 API는 IANA 전체를 받습니다. 이 '좁은 UI, 넓은 API' 패턴이 왜 단순 화이트리스트보다 나은지, 그리고 Intl.DateTimeFormat으로 어떻게 구현하는지.
백엔드/API설계 메모 한 통에 10MB? API 입력 길이 제한으로 무제한 텍스트 남용 막기 리포트 메모 필드에 아무 제한 없이 문자열을 받고 있었다. 악의든 실수든 누군가 MB 단위 텍스트를 넣으면 DB와 네트워크가 먼저 비명을 지른다. 5분이면 추가할 수 있는 방어선을 PR 리뷰에서 발견한 기록.
백엔드/API설계 new Date(2026, 3, 6)의 9시간 드리프트: 테스트 픽스처는 왜 반드시 Date.UTC()여야 하는가 CI는 초록불인데 로컬에선 빨간불이 떴다. 원인은 테스트 픽스처의 new Date(2026, 3, 6) 한 줄. 로컬 타임존 생성자는 개발자 KST와 CI UTC 사이에서 9시간 어긋나고, 주차 경계 테스트를 조용히 깨뜨렸다.
백엔드/Prisma Prisma $extends 테넌트 격리와 $transaction 사이의 타협: 수동 orgId 주입 전략 SaaS 모드에서 Project 쿼리에 organizationId를 자동 주입하던 $extends 확장이 $transaction 콜백 안에서는 동작하지 않았다. 테넌트 격리를 포기할 수도, 트랜잭션을 포기할 수도 없어서 '수동 orgId 주입' 패턴으로 절충한 기록.
백엔드/API설계 Active, Ongoing, Completed: 주차 기반 태스크 상태 쿼리의 3가지 의미론과 그 함정 '이번 주 진행중인 태스크'를 쿼리하는 방법이 세 가지나 있었다. '주 중에 전환된', '주 동안 어느 시점이라도', '주 시작 시점에'. 말로는 비슷하지만 SQL은 전혀 다르고, 틀리면 이전 주부터 계속 진행되던 태스크가 리포트에서 사라진다.
백엔드/API설계 과거 주차 조회에서 '그 당시 최신 스프린트'는 뭐였나: weekEnd 기준 latest sprint 설계 주간 리포트 API가 '이번 주의 latest sprint' 개념으로 태스크를 골라왔는데, 과거 주차를 조회하면 '그 당시'가 아닌 '지금의' latest sprint가 튀어나왔다. carry-over 없이 버려진 태스크까지 리포트에 다시 나타나는 버그였다.