이 레포는 코드만 담은 공개 템플릿입니다. 실제 운영 레포는 일기 원문이 들어가므로 private. 사용법: 이 레포를 template으로 새 private 레포 생성 → Settings에 Secrets
ANTHROPIC_API_KEY, VariablesBLOG_ID(네이버 블로그 ID) 등록 → 크롬 확장은extension/폴더를 개발자 모드로 로드. 본인 계정 전용 도구입니다 — 타인의 블로그 수집 용도가 아닙니다.📖 프로젝트 스토리(설계 결정·트러블슈팅·회고): https://aes-portfolio-app-phi.vercel.app/project/ThoughtGarden
네이버 블로그 일기를 자동으로 수확해 LLM으로 분석하고, 주간 인사이트 리포트를 git 커밋으로 쌓는 도구. 백준허브가 알고리즘 풀이에 하는 일을 "내 생각"에 합니다.
- 글이 먼저, 리포트는 부산물. 리포트를 위해 글을 쓰게 만드는 기능은 만들지 않습니다.
- 수동 작업 0. 복붙을 요구하는 순간 설계 실패. (이 프로젝트 자체가 "복붙 짜증"에서 출발)
- 비용 0원. 서버 없음. GitHub Actions 스케줄 실행. (LLM 호출만 예외 — 주간 ~$0.05)
도구의 존재 이유 검증: 리포트를 읽고 뭔가 달라진 순간이 있으면 일기에 자연스럽게 남긴다(리포트를 언급하지 말고, 그냥 평소처럼). 몇 달 뒤 리포트가 스스로 답하게 된다 — 이 도구가 삶에 흔적을 남겼는지, 읽고 잊는 콘텐츠였는지. 추가 코드 0줄짜리 자기 평가 루프.
[공개] RSS (새 글 발견) → 모바일 페이지에서 본문 전문 추출 → posts/YYYY-MM-DD-slug.md
[비공개] 크롬 확장이 열람 시점에 수확 → private-posts/ (GitHub API 직접 커밋)
reports/YYYY-WW.md ← posts/ 전체, 주 1회 자동 (Actions cron)
reports/private-YYYY-WW.md ← private-posts/ 전체, 수동 실행 ("private report" 워크플로)
reports/private-cross-*.md ← 공개 vs 비공개 대조, 수동 실행 ("cross report" 워크플로)
RSS description은 ~500자에서 잘리기 때문에 본문은 m.blog.naver.com에서 따로 가져옵니다. (requests·beautifulsoup4가 의존성에 있는 이유)
pip install -r requirements.txt
python fetch.py --blog-id jokebear67 # posts/에 md 생성
ANTHROPIC_API_KEY=... python analyze.py # reports/에 리포트 생성
pytest # 테스트Actions에는 ANTHROPIC_API_KEY를 repo Secrets로 등록.
분석 프롬프트(v3)의 규칙 6개는 머리로 만든 게 아니라, 실제 글 6편으로 2사이클 돌리며 출력이 틀린 사건마다 규칙으로 고친 이력입니다.
| 규칙 | 어떤 오류에서 나왔나 |
|---|---|
| 1. 원문 인용 필수 | 근거 없는 "성장했네요" 류의 빈 평가가 출력됨 |
| 2. 원인/심리 추정 금지 | 글쓴이만 알 수 있는 심리를 LLM이 지어냄. 해석은 사용자 몫으로 분리 |
| 3. 본인 설명 존중 | 본인이 "과식 때문"이라고 쓴 증상을 "건강 이상 패턴"으로 묶음 |
| 4. 당연한 반복 제외 | "생일 시즌 기록"이라는 정보가치 0인 채우기 패턴이 실제로 출력됨 |
| 5. 기록 미확인 명시 | 원문 기록 없이 본인 진술로만 존재하는 과거사를 사실처럼 단정 |
| 6. 3시점 이상 = 패턴 | 2회 등장을 성급히 패턴으로 승격. 2회는 "후보"로만 |
운영 중에도 이력은 계속 쌓인다: 규칙 5가 실전에서 일한 사례 — 비공개 글 날짜가 버그로 전부 같은 날이 됐을 때, 리포트가 스스로 "작성 시기를 특정하기 어렵다"고 한계를 밝혔다 (단정하는 대신). 날짜 버그를 고치고 재생성한 뒤에야 시간축 분석이 켜졌다.
extension/은 백준허브와 같은 방식의 크롬 확장입니다. 본인 블로그 글을 브라우저에서
열람하는 순간 본문을 추출하고, 쿠키 없이 같은 URL을 재요청해 안 보이면 비공개로
판별해 private-posts/에 GitHub API로 직접 커밋합니다. 공개 글은 v1(RSS)이 담당하므로 스킵.
- 로그인 쿠키를 Secrets에 넣는 방식은 배제했던 이유(만료 시 수동 갱신 = 원칙 2 위반, 네이버 세션 유출 리스크)가 확장에서는 사라짐 — 이미 로그인된 본인 브라우저 안에서 돌기 때문.
- 설치:
chrome://extensions→ 개발자 모드 → "압축해제된 확장 프로그램 로드" →extension/선택. 옵션에서 GitHub 토큰(contents 쓰기)·레포·블로그 ID 입력. - 파싱 실패·커밋 실패 시 조용히 죽지 않고 크롬 알림을 띄움.
- 테스트:
node --test extension/lib.test.js - 작성일은 화면 표기(JS 렌더링이 늦어 폴백 오염 사고 있었음) 대신 페이지 원본의
addDate(epoch ms)에서 추출. 잘못 저장된 과거 파일은 옵션의 "날짜 백필" 버튼으로 일괄 교정 (MV3 워커 5분 제한 때문에 60편씩 배치 — 실제로 한 번에 돌리다 죽어서 배움).
| 리포트 | 대상 | 실행 | 프롬프트 |
|---|---|---|---|
| 주간 | posts/ (공개) | 매주 월 07:00 자동 | v3 |
| 비공개 | private-posts/ | 수동 | v3 |
| 교차 | 공개 vs 비공개 대조 | 수동 | 교차 전용 |
| 회상 | 지난 해들의 이맘때 vs 지금 | 수동 | 회상 전용 |
회상 리포트(--recall)만 구조가 다르다. 나머지 셋은 코퍼스 전체를 넣지만, 회상은
오늘 날짜 ±10일에 해당하는 지난 해들의 글만 골라 최근 글과 대조한다. 글을 고르는 데는
LLM이 필요 없고(날짜 매칭), 입력이 몇 편뿐이라 제일 싸다. 이유: 전체 분석은 글이 쌓일수록
출력 분량은 그대로인데 입력만 늘어 개별 글이 패턴으로 뭉개져 사라진다. "5년 전 이맘때
무슨 생각을 했나"는 전체 분석의 부산물로는 안 나오고 따로 만들어야 나온다.
공개/비공개는 톤이 달라 섞지 않고 분리 분석하되, 교차 리포트가 둘을 대조한다 — 같은 시기를 다르게 기록한 사례, 한쪽에만 존재하는 주제, 같은 사건의 두 서술. 교차 규칙 2개 추가: 대비 사례는 반드시 양쪽 모두 인용(한쪽만 인용하면 대비가 아니라 주장), "숨기고 싶어서" 같은 동기 해석 금지(공개/비공개 선택의 이유 추정은 규칙 2 위반).
reports/.corpus.json에 마지막으로 분석한 코퍼스의 sha256을 리포트 종류별로 남긴다.
실행 시 지문이 같으면 API를 호출하지 않고 skip으로 끝낸다 — 새 글 없는 주에 지난주와
똑같은 리포트를 다시 만들어 돈을 쓰는 낭비를 막는다. 강제로 다시 만들려면 --force
(프롬프트를 고쳤을 때 등). mtime이 아니라 내용 해시를 쓰는 이유는 CI가 매번 새로
checkout해서 파일 시각이 전부 리셋되기 때문.
기본 Haiku 4.5. Sonnet과 Haiku로 같은 비공개 코퍼스(340편)를 각각 분석해 비교한 결과 규칙 준수·관찰 품질에서 체감 차이가 없어 저가 모델로 확정 (1인용 도구라 충분). 교차 리포트만 Sonnet — 공개+비공개 합산 ~21만 토큰이 Haiku 컨텍스트(20만)를 초과해 선택이 아니라 제약. 실측 비용: 주간 공개 ~$0.05, 비공개 전체 ~$0.15, 교차 ~$0.5.
-
과거 글 백필: RSS는 최근 글 위주(실측 약 1년치 제공). 지금부터 쌓이는 것으로 충분.
-
쿠키 기반 비공개 글 서버 수집: 위 확장으로 대체.
-
커밋 기록 분석 (작업 스타일 피드백): 바이브코딩 시대의 커밋은 저자가 사람+AI 혼합이라 "내 스타일" 신호가 흐림. 일기 코퍼스가 100% 본인 목소리인 것과 대조적. 프로젝트 생애주기 (뭘 시작하고 뭘 버렸나)는 가치 있지만 일기에 이미 기록됨 — 별도 도구 대신 교차 보조 축 후보.
-
솔루션/액션 제안 기능: 규칙 2(해석 금지)의 정면 위반. 관찰까지가 도구의 일, 액션은 읽은 사람의 일.
- 레포는 private 필수. 비공개 일기 원문이 들어간다.
- 로컬 작업 폴더에는
git sparse-checkout으로private-posts/와reports/private-*를 제외 — 파일은 GitHub에만 존재하고 노트북 폴더에는 안 나타남. 교차 리포트도 비공개 내용을 담으므로 파일명을private-cross-*로 지어 같은 패턴에 걸리게 함.
-
비공개 글 수동 투입 경로→ 크롬 확장으로 해결 (수동조차 아님) -
과거 글 백필→ RSS가 1년치 제공 + 비공개는 열람만 하면 수확 -
월간 "변화 리포트"(1년 전 나 vs 지금 나)→ 회상 리포트로 대체 (연 단위 대조) - 주간을 델타로: 새 글이 주 1편인데 매주 전체 51편을 다시 분석한다 — 입력의 98%가 지난주와 같아 리포트도 거의 같게 나온다. 이번 주 새 글만 넣고 기존 패턴 요약을 컨텍스트로 줘서 "이번 글이 패턴을 확인하는지/벗어나는지"만 보게 바꿀 것. (지문 가드는 새 글 0편일 때만 막지, 1편일 때 51편치 비용 내는 건 못 막는다)
- 전체 재분석을 월간/분기로 이관: 패턴 갱신 주기는 주 단위가 아니다. 주간 리포트가 실제로 반복되는 걸 눈으로 확인한 뒤에 옮길 것 — 순서가 먼저다.
- 기록형(숫자·루틴) / 서사형(생각·감정) 분리 분석 — junk 희석 문제