← 목록으로
V6 개발 로그 (07/2026)

V6 개발 로그 (07/2026)

멤버들이 아카이브와 상호작용하는 방식, 그리고 그 행동의 흔적이 Activity에 기록되는 과정을 시각화했습니다. p5.js로 제작.

월간 업데이트: 최신 기능, 개선 사항, 버그 수정 소식을 전합니다.

두 달 동안 네 가지 큰 성과를 이뤘습니다 — 그 사이에 2주간의 휴식도 있었고요. 아카이브 브라우저는 완전히 새로 만들었습니다. 인물, 도구, 카테고리, 태그, 저자, 연대기를 하나로 묶은 통합 분류 탐색기로 거듭났고, D3.js 네트워크 시각화와 함께 새로운 시맨틱 스페이스(Semantic Space)도 선보였습니다. 시맨틱 스페이스는 약 4,300개의 아카이브 게시물 전체를 Three.js 3D 포인트 클라우드로 구현한 것으로, 임베딩과 UMAP 클러스터링을 적용해 멤버들이 단순히 태그가 아닌 의미를 기준으로 17년 넘는 CAN의 기록을 탐색할 수 있게 했습니다. API 문서도 완전히 탈바꿈했습니다 — 단순한 페이지에서 즉각 반응하는 인터랙티브 브라우저로, 과제 중심 내비게이션과 실제 작동하는 cURL/Python/JS 예제를 갖췄으며, 멤버를 위한 검색 API도 처음으로 공식 문서화했습니다. Activity iOS는 내부적으로 더 빠르고 안정적으로 개선됐습니다 — 스마트한 캐싱, 더 안정적인 멘션과 채널, 깔끔한 자격증명 처리는 물론, 새로운 인앱 검색, 선명해진 통계 차트, iOS 26을 위한 실험적인 리퀴드 글래스(Liquid Glass) 디자인, 그리고 피드와 스레드 전반에 걸친 대대적인 개선까지 담았습니다.

CAN의 작은 (소셜) 공간, Activity가 어느덧 첫 돌을 맞았습니다 🎉 — 런칭 후 373일, 단순한 활동 로그로 시작했던 이 공간은 이제 CAN 커뮤니티의 심장부로 자리 잡았습니다. 580명의 참여자(그 중 232명은 API 또는 iOS 앱을 통해 합류)와 함께, 포스트·좋아요·저장·댓글·멘션 등 3,809개의 활동이 차곡차곡 쌓였습니다. 서로의 작업에 반응하고, 교감하고, 영감을 나눈 순간들이죠. 1년 동안 한 걸음씩 개선을 거듭하며, 그 중심에 iOS 앱까지 완성했습니다 — 정말 자랑스럽습니다 🏆. 두 번째 해도 기대해 주세요!

운영 일수 (+63)

373

참여자 수 (+53)

580

활동 수 (+492)

3,809

28/07/2026

CAN API 문서

  • CAN 멤버 API 문서가 길고 단조로운 단일 페이지에서 벗어났습니다. 이제 아카이브 브라우저와 동일한 디자인(사용자 지정 테마 포함)의 인터랙티브 브라우저로 탈바꿈했습니다.
  • 문서는 단순한 엔드포인트 목록이 아닌, 실제로 하고 싶은 작업 중심으로 구성됩니다. 활동 탐색, 피드에 게시, 프로필 관리, 멤버 및 채널 탐색, 검색, 프로젝트 탐색 등 목적별로 나뉘어 있습니다.
  • 엔드포인트를 클릭하면 바로 아래 패널이 열리며 파라미터, 응답 형식, 바로 쓸 수 있는 예시 코드가 표시됩니다. 페이지를 새로 고침할 필요 없이 탐색이 즉시 이루어집니다.
  • 모든 엔드포인트에 cURL 예시가 기본 제공되며, 주요 엔드포인트에는 Python 및 JavaScript 예시도 함께 제공됩니다.
  • Search API가 처음으로 문서화되었습니다. 아티클, 도서, 이벤트, 채용 공고, People/Tools/Tags, 멤버, 활동 전반에 걸쳐 토큰 기반 검색을 지원합니다.
  • 기존 문서의 빈 곳을 채웠습니다: WebView의 세션 처리, 자격 증명 유효성 검사, 실시간 URL 차단 목록, 그리고 활동 응답에 포함될 수 있는 추가 데이터 필드에 대한 완전한 레퍼런스가 추가되었습니다.
  • 사이트의 '새 활동' 표시를 초기화하지 않고 새로운 활동을 확인하는 폴링 클라이언트(메뉴 바 앱, 알림 도구 등) 구축 가이드를 추가했습니다.
  • API의 전체 버전 히스토리(v1.0 → v2.5)를 문서 사이드바 하단에 고정해 언제든지 탐색할 수 있습니다.
  • 트러블슈팅 개선: 자주 발생하는 401/403/404 오류와 오류 응답 형식을 소개(Introduction) 섹션에 정리했습니다.

25/07/2026

  • 특정 게시물에서 리포트 데이터가 불러와지지 않던 버그를 수정했습니다. Matomo에 데이터가 실제로 없는 페이지를 위한 안전망으로, post_views_count 대체값(*로 표시)은 그대로 유지됩니다.

24/07/2026

  • 쿠키 수락 알림을 위한 초경량 워드프레스 플러그인, CAN Cookie를 개발하고 적용했습니다. 단순함과 성능을 최우선으로 만들었으며, 기존에 사용하던 무겁고 비대한 "무료" 플러그인을 드디어 교체할 수 있게 됐습니다.

22/07/2026

CAN Member API v2.5 업데이트

  • GET /can/v1/projects 엔드포인트 추가 — 게시된 CAN 아티클을 페이지 단위로 카드 형태로 불러옵니다 (제목, url, live_url, 요약, 썸네일, 작성자, 인물, 도구, 날짜 포함)
  • page, per_page (기본값 25, 최대 50), tool, people, search 파라미터를 지원합니다
  • tool과 people은 슬러그 또는 표시 이름 모두 사용 가능합니다
  • 응답 데이터에는 projects, total, total_pages, page가 포함됩니다
  • 에디토리얼 아티클과 멤버 제출 작업을 모두 아우르는 Project 카테고리 기준으로 범위가 설정되며, 응답은 10분간 캐시됩니다
  • GET /can/v1/projects/tools 엔드포인트 추가 — 프로젝트가 하나 이상 연결된 모든 도구를 수량 순으로 정렬해 유효한 tool 값을 탐색할 수 있습니다

CAN API 캐시

  • 새로 추가된 GET /can/v1/projects 엔드포인트는 이제 관리자 화면에서 별도의 캐시 타임아웃 설정으로 관리됩니다.

Activity iOS — V2.1.0 출시 — 다운로드

플로팅 바에 새롭게 추가된 리퀴드 글래스 효과 (선택 적용 가능).
새로운 검색 화면 — 토큰을 활용해 검색을 더욱 세밀하게 조정할 수 있습니다
통계 화면 업데이트 — 이제 실시간 데이터를 반영합니다
  • 통계 화면: 7일 차트(활동 방문 수, API 세션)에서 게시물이 없는 날이 차트 끝으로 밀려나는 문제를 수정했습니다 — 데이터 유무와 관계없이 x축이 7일 전체 배열 순서로 고정됩니다
  • 통계 화면: 7일 합계가 이제 Matomo의 전체 집계(오늘 제외) 대신 일별 카운트를 직접 합산하는 방식으로 변경되었습니다
  • 통계 화면: 콜드 런치 시 데이터가 로드되기 전 "Analytics" 제목이 화면 중앙에 떴다가 로드 후 상단으로 튀어오르던 문제를 수정했습니다
  • 런치 스크린의 로딩 점이 흐릿하게 표시되던 문제를 수정하여 단색으로 렌더링되도록 했습니다. 앱 내 로딩 점 전환 동작도 이에 맞게 조정했습니다
  • 채널 목록: 채널 미리보기가 있는 행에서 제목, 항목 수, 꺾쇠 아이콘이 이제 수직 정렬됩니다
  • Watch 앱과 위젯이 항목을 읽음 처리할 때 다음 새로고침 주기를 기다리지 않고 즉시 업데이트됩니다
  • 아티클 카드의 라이브 임베드(동영상/HTML/오디오/이미지/SVG)가 삽입 전 소스 접근 가능 여부를 먼저 확인합니다. 소스에 접근할 수 없을 경우 로딩 상태에서 멈추는 대신 일반 아티클 슬라이드쇼로 대체됩니다
  • 새 검색 기능 추가: 사이드바 및 플로팅 바(기존 Mentions 플로팅 바 버튼을 대체)로 접근 가능한 검색 화면이 추가되었습니다. Activity 항목과 Members를 아우르며, 쉼표 또는 Return 키로 확정되는 캡슐형 토큰 쿼리 빌더, 입력 중 실시간 미리보기, 최근 검색 기록, 일치 검색어 하이라이트, 스레드 뷰 또는 멤버 프로필로의 바로가기를 지원합니다
  • 스레드(단일 항목) 뷰의 코드 블록에서 "Apply Theme" 버튼이 표시되지 않던 문제와, 코드 블록만 있고 이미지나 링크가 없는 항목에서 카드가 아예 렌더링되지 않던 관련 버그를 수정했습니다
  • 검색: Activity 결과에서 이모지 및 특수문자가 원시 코드(예: 😀)로 표시되던 문제를 수정했습니다. 테마 변경 후 하이라이트된 검색어의 색상이 업데이트되지 않던 문제도 수정했습니다. 최근 검색 저장 수가 15개로 늘어났으며 개별 삭제가 가능하고 명칭도 "Recent"로 변경되었습니다. 토큰 캡슐 스타일이 New Entry 시트의 추천 칩과 통일되었으며, 사이드바의 Members와 Saved 사이 간격이 제거되었습니다
  • 앱 설정 → 외관에 새로운 "리퀴드 글래스(Liquid Glass)" 토글 추가 (기본값 비활성화, 실제 글래스 효과를 지원하는 iOS 26 이상에서만 표시) — 활성화하면 플로팅 바, 필터/채널 피커 드롭다운, 플로팅 "@사용자명" 캡슐에 iOS 26 글래스 효과가 적용됩니다. 기본값(비활성화) 상태에서는 기존 플랫 배경 스타일이 유지됩니다
  • 앱 설정: 피커 행(테마, 아이콘, 위젯, 더 불러오기)의 펼치기/접기 꺽쇠 아이콘에 다른 행 인디케이터보다 오른쪽 패딩이 더 붙던 문제 수정
  • 검색: 검색 패널 바깥을 탭해 닫은 후에도 화면 키보드가 닫히지 않던 문제 수정
  • 검색: 이전(만료된) 요청으로 인해 검색 중간에 로딩 점 애니메이션이 취소되던 문제 수정, 결과가 화면을 채운 상태에서 로딩 점이 화면 밖에 렌더링되던 문제 수정
  • 메인 피드, 필터, 채널 피드: 자동으로 3페이지를 연속 불러온 후에는 스크롤이 일시 중지되며, 지금까지 읽은 항목 수와 함께 계속 보기 / 필터 / 검색 선택지를 제공합니다 — 무한 로딩 대신 적절한 시점에 멈춥니다
  • 앱 설정의 "더 불러오기" 페이지당 항목 수 설정이 채널 피드에 적용되지 않던 문제 수정 (설정값과 무관하게 25개로 고정되던 문제)
  • "플로팅 바 확장" 옵션이 켜진 상태에서 채널 피드 하단 여백이 없어 목록 끝 콘텐츠가 플로팅 바 뒤에 가려지던 문제 수정

19/07/2026

CAN API 캐시

  • 사이트에서 관련 없는 이벤트(새 게시물 작성, 좋아요, 저장 등)가 발생할 때마다 액티비티 스레드 전체가 초기화되던 문제를 수정했습니다. 이로 인해 단일 스레드 로딩 속도가 전체 피드를 불러오는 것만큼 느려지는 현상이 있었습니다.
  • 이제 스레드 캐시는 해당 스레드 내 게시물이 수정·삭제되거나, 그 스레드에 댓글이 추가될 때만 무효화됩니다.
  • 댓글 추가 시 스레드 캐시를 무효화하는 키에 언더스코어가 누락되어 아무것도 매칭되지 않던 문제를 수정했습니다.
  • 관리자 대시보드에 "캐시된 스레드(Cached Threads)" 통계 항목을 추가해 현재 캐시된 액티비티 스레드 수를 확인할 수 있습니다.

15/07/2026

멤버 뉴스레터 / 지난주

  • 인트로 텍스트가 이제 /last-week/ 페이지에 포함됩니다.
  • 신규 멤버 목록 생성 방식을 개선했습니다. 기존처럼 수동으로 추적하지 않아도 뉴스레터에서 훨씬 간편하게 업데이트할 수 있습니다.

28/06 - 12/07/2026 - 휴식 ⛱️

19/06/2026

Activity Web

  • #channel 감지 버그 수정: record_wp_activity()에서 채널 파싱이 Activity Entry에만 적용되던 문제를 Comment/Term Comment/Event Comment까지 확장하여 _can_activity_channels가 정상적으로 저장되도록 수정했습니다.
  • Matomo 인증 토큰 단일화: MATOMO_TOKEN을 API 클래스의 Super User 토큰으로 통일하고 중복 토큰을 제거했습니다.
  • 하드코딩된 시크릿 세 개(Matomo 토큰 두 개 중 하나는 이번에 제거, Google Maps 키 하나)를 사용자가 직접 입력할 수 있도록 노출했습니다.
  • 나머지 시크릿을 어드민 설정으로 이관: Activity Logs → Settings에 "API Credentials" 섹션을 추가했습니다.
  • Mentions 필터에서 활동 로그 정렬이 올바르게 작동하지 않던 버그를 수정했습니다.

07/06/2026

Activity iOS 2.0.3 버그 수정 및 개선

  • 재로그인 안정성 개선 — Keychain이 중복 항목(iCloud Keychain 동기화 충돌) 발생 시 자격 증명을 제자리에서 업데이트하고 쓰기 여부를 검증하도록 수정. 여러 번 시도해야 했던 로그인이 이제 첫 시도에 정상적으로 완료됩니다.
  • 로그인 인증 강화 — executeWithAuth가 로그인 직후 자격 증명 전파 구간에서 일시적인 401 오류를 백오프(backoff) 방식으로 재시도합니다.
  • 동영상 임베드가 카드 영역을 벗어나는 문제 수정 — 활성 동영상 플레이어에 유연한 비율 기반 앵커를 적용하여 간헐적으로 발생하던 오버플로를 해결했습니다.
  • 패널 닫기 제스처 개선 — Stats, App Settings, About, Channels, Blocked Users, Channel Feed 패널의 스와이프-백 닫기를 왼쪽 엣지 스와이프로 교체. 드래그 속도와 관계없이 닫힘 동작이 자동 완료되어 이전의 뻑뻑한 느낌이 사라졌습니다.
  • 앱 실행 화면에 인앱 로딩 인디케이터와 동일한 중앙 정렬 로딩 점 표시 추가
  • 새 글 작성 시트: 커스텀 테마에서 메인 에디터와 코드 에디터 간 키보드 표시 방식 통일
  • 회원가입 시트가 멤버십 등급, 설명, 가격 정보를 한꺼번에 불러온 뒤 화면을 표시 — 단계별 깜빡임 현상 제거
  • 선호 채널(플로팅 바)은 이제 컨텍스트 메뉴를 통해서만 설정 가능하며, 첫 채널 방문 시 한 번만 자동 지정됨
  • 플로팅 바의 필터 및 채널 선택에 조건부 햅틱 피드백 추가
  • 계정 관리 인트로 텍스트 상하 여백을 아래 메뉴 항목과 동일하게 조정
  • 빈 상태 트레이 아이콘(“No Entries”)이 이제 본문 색상 적용
  • 04/06/2026

    아카이브 브라우저(Archives Browser)

    • People, Tools, Categories, Tags, Authors, Chronology를 한데 묶는 통합 분류 브라우저용 워드프레스 커스텀 플러그인을 새로 개발하여 적용했습니다. AJAX 기반 포스트 로딩, 무한 스크롤, 그리고 D3.js 네트워크 시각화를 통해 People과 Tools의 공출현(co-occurrence) 관계를 탐색할 수 있습니다.

    시맨틱 스페이스(Semantic Space) (3D 임베딩 시각화)

    Relationships 탭에 세 번째 시각화 뷰인 '시맨틱 스페이스(Semantic Space)'가 추가되었습니다. 아카이브에 수록된 모든 게시물을 인터랙티브 3D 포인트 클라우드로 펼쳐 보여주는 뷰로, 공간상의 거리가 곧 의미적 유사성을 뜻합니다. 작동 원리는 이렇습니다. 아카이브의 게시물 약 4,300개를 문장 변환 모델(all-MiniLM-L6-v2)에 통과시켜 제목과 본문을 384차원 임베딩 벡터로 변환합니다. 이 벡터는 단순한 키워드가 아니라 '의미'를 좌표로 표현하기 때문에, 예를 들어 제너레이티브 타이포그래피를 다룬 두 글은 공유 태그가 하나도 없더라도 서로 가까운 위치에 놓이게 됩니다. 이 벡터에서 두 가지 결과물을 뽑아냅니다. 하나는 코사인 유사도 기반의 '관련 게시물' 기능으로, 각 게시물마다 전체 아카이브와의 유사도를 미리 계산해 상위 매칭 항목을 경량 ID 인덱스로 저장합니다. 다른 하나는 UMAP으로 3D로 축소한 좌표를 포인트 클라우드로 렌더링한 '시맨틱 스페이스'로, Archives → Relationships에서 확인할 수 있습니다. 여기서 거리는 개념적 유사성이며, KMeans 클러스터링으로 자연스럽게 드러나는 주제별 그룹에 색상이 입혀집니다. 임베딩, 유사도 계산, 차원 축소 등 무거운 연산은 모두 Python 파이프라인에서 오프라인으로 처리되어 정적 JSON으로 저장되기 때문에, 실제 서비스에서는 미리 계산된 좌표와 관계 데이터를 읽어오기만 합니다. 요청 시점에 모델 추론이 전혀 일어나지 않는 구조입니다. 결과적으로 17년이 넘는 아카이브가 하나의 아이디어 지도로 탈바꿈합니다. 카테고리를 뒤지는 대신, 개념적 유사성을 따라 자유롭게 탐색할 수 있습니다.

    세부 업데이트

    • 모바일에서 네트워크가 세로 공간의 절반만 차지하던 문제를 수정했습니다.
    • 시맨틱 스페이스 시각화에서 포인트 위에 커서를 올리면 툴팁 안에 썸네일이 표시되도록 업데이트했습니다.
    • 모바일에서 네트워크가 세로 공간의 절반만 차지하던 문제를 수정했습니다.
    • Archives 플러그인의 JS 주입으로 인해 회원 가입 완료가 어려워지던 버그를 수정했습니다.
    • 시맨틱 스페이스(Semantic Space) — CAN 아카이브를 3D 클라우드로 시각화합니다. 모든 포스트를 임베딩하고, UMAP으로 배치한 뒤 k-means로 클러스터링했습니다. 마우스를 올리면 제목이 표시되고, 클릭하면 연관 포스트를 탐색하거나 검색할 수 있습니다.
    • 카운트 기준 목록 보기를 활성화했을 때 카테고리가 두 번 표시되는 버그를 수정했습니다.
    • 항목을 알파벳순 또는 등록 수 기준으로 정렬할 수 있는 버튼을 추가했습니다.
    • 이제 People, Tools, Chronology, Categories, Authors, Tags를 모두 포함합니다. 현재 존재하는 모든 택소노미를 망라한 것입니다. 'Relationships' 탭에서는 People과 Tools의 시각화를 확인할 수 있습니다.
    • 멤버 전용 새 아카이브 페이지로 활용할 /archives-browser/ 템플릿을 새로 만들었습니다.
    • 오프라인 생성: generate_embeddings.py가 각 CSV 내보내기 파일을 순회하며, 로컬 all-MiniLM-L6-v2 sentence-transformer 모델로 모든 포스트의 제목과 정제된 본문을 임베딩합니다. 이후 쌍별 코사인 유사도를 계산해 각 포스트와 가장 유사한 상위 5개 포스트를 추출하고, ID만 담긴 경량 파일 related-index.json(약 210KB, {post_id: [관련 id]})으로 저장합니다.
    • 라이브 렌더링: 숏코드가 임베딩에서 해당 인덱스를 읽어 현재 포스트의 연관 ID를 조회한 뒤, WordPress 데이터(제목·썸네일·링크는 렌더링 시점에 테마의 content-grid 템플릿을 통해 가져옴)를 이용해 카드 형태로 표시합니다. 임베딩 연산이나 유사도 계산은 서버에서 전혀 실행되지 않습니다.

    아직 멤버가 아니신가요? 멤버십에 가입하거나 후원을 통해 저희를 응원해 주세요. 개인 멤버십은 연간 $20(월 $2 미만)으로, 멤버 전용 커뮤니티 기능(Activity 등)을 모두 이용할 수 있습니다. 이 플랫폼과 커뮤니티가 계속 살아 숨 쉴 수 있도록 여러분의 도움이 필요합니다!

    이전 업데이트는 여기서 확인하세요 → V6 개발 로그 (05/2026). 전체 개발 로그는 여기에서 모아볼 수 있습니다.