참조
데이터와 개인정보
리뷰는 프로젝트 폴더에 저장됩니다. 설정은 ~/.ferret/에, 키와 계정은 OS의 사용자 데이터 폴더에 있습니다. 개발자에게 전달되는 것은 Sentry를 통한 충돌 보고서뿐이며, 이것도 끌 수 있습니다. 앱에서 직접 보내기로 선택한 피드백은 공개 GitHub Issue가 됩니다.
#.ferret/reviews/의 내용
<project>/.ferret/reviews/20261003-104500/
├── feedback.md # what the agent reads
├── 01.png, 02.png… # one or more images per finding
├── session.json # review state and edit history
├── events.jsonl # action log (built-in browser only)
├── recording.webm # the video
└── work/ # intermediate audio and frames
이름이 바뀌기 전에 만든 리뷰는 .ade-movie/reviews/에 있습니다. 이 리뷰들도 계속 목록에 나오고 열 수 있으며, 새 리뷰는 .ferret/reviews/에 저장됩니다.
녹화를 시작하면 .ferret/가 .git/info/exclude에 추가됩니다. worktree와 submodule도 처리됩니다. .gitignore는 수정하지 않습니다. 중간에 끊긴 리뷰는 기록이 남아 있으면 기록에서 복구할 수 있습니다. 이때 앱은 마지막 몇 초가 빠졌을 수 있다고 경고합니다.
#보관 기간
녹화 보관(기본 7일, 30일 또는 영구): 시작할 때 그보다 오래된 완료된 리뷰에서 recording.webm과 work/가 삭제됩니다. feedback.md와 지적 사항 이미지는 유지됩니다. 완료되지 않은 리뷰는 삭제하지 않습니다. 정리는 앱을 시작할 때 마지막으로 연 프로젝트를 대상으로 실행됩니다.
#컴퓨터 밖으로 나가는 것
| 언제 | 보내는 곳 | 데이터 |
|---|---|---|
| 음성 인식: 기기 내(무료) | 없음 | — |
| 음성 인식: OpenAI / 호환 | OpenAI 또는 설정한 Base URL | 오디오 조각 |
| 모델 다운로드 | Hugging Face | 파일 요청 |
| 정리 | 사용자의 Claude Code / Codex CLI, 또는 organizer에 설정한 LLM 엔드포인트 | 텍스트와 동작 로그만(이미지, 오디오, 동영상 없음) |
| 완료 검사(판정 모델, 기본값은 꺼짐) | 사용자의 에이전트가 로컬 중계를 거쳐 Ollama / Cloudflare / AI Gateway / TypeSafe / 설정한 URL로 | 에이전트가 보내는 것: 지적 사항 텍스트, "완료 조건", BEFORE/AFTER 스크린샷(이미지 모델만) |
| 에이전트에게 보내기 | 터미널의 에이전트 | feedback.md를 가리키는 지시 하나 |
| GitHub로 보내기 | gh를 통해 GitHub | 본문 텍스트만(이미지 없음) |
| 푸터의 사용량 표시(Claude Code와 Codex만) | Anthropic, ChatGPT | 사용자 본인의 로그인으로 보내는 사용량 요청 |
| GitHub 스타 요청 | 사용자의 gh를 통해 GitHub | 저장소에 스타를 줬는지 확인하고, GitHub에서 스타를 눌렀을 때만 스타를 줌 |
| 업데이트 확인(수동) | 다운로드 서버(Cloudflare R2) | latest.json 요청 |
| 앱에서 피드백 보내기(직접 보낼 때만, 출시 예정) | 개발자의 피드백 중계 서버(Cloudflare Worker). JapanMarketing-Dev/ferret에 공개 Issue를 엶 | 작성한 텍스트, 버그인지 아이디어인지, 앱 / OS 버전과 CPU, 첨부한 스크린샷 최대 3장. 키, 토큰, 이메일 주소, 홈 폴더 경로는 가려집니다. 중계 서버는 IP 주소를 저장하지 않습니다(앱에서 보내는 피드백 참고) |
| 충돌 또는 오류(충돌 보고서 보내기가 켜져 있을 때) | Sentry | 스택 트레이스와 OS / CPU / 앱 버전(충돌 보고서 참고) |
- 앱에는 분석 도구, 성능 추적, 세션 리플레이가 없습니다. 사용자가 요청하지 않아도 보내는 데이터는 충돌 보고뿐입니다. 즉 오류, 실행당 세션 하나, 느린 시작과 멈춤 경고이며, 모두 아래에 설명되어 있고 모두 충돌 보고서 보내기로 제어됩니다.
- URL 안의 비밀처럼 보이는 값(토큰, 키)은
feedback.md에 기록되기 전에 가려집니다. - 페이지에서 가져온 텍스트는
feedback.md에서 데이터로 표시되므로, 에이전트는 그 안에 있는 지시를 따르지 않도록 안내받습니다. - 이 웹사이트(앱이 아님)는 Cloudflare Web Analytics로 페이지 조회수를 셉니다. 쿠키를 쓰지 않고, 사이트 간 추적도 개인 데이터도 없습니다.
#앱에서 보내는 피드백
출시 예정
앱 안의 피드백 양식과 그 중계 서버는 아직 공개되지 않았습니다. 이 섹션은 앞으로 어떻게 동작할지를 설명합니다.
GitHub 계정이 없어도 Ferret 안에서 버그 보고나 아이디어를 보낼 수 있게 됩니다. 직접 보낼 때만 전송되며, JapanMarketing-Dev/ferret (새 탭에서 열림)에 from-app 라벨이 붙은 공개 Issue가 됩니다. 공개적으로 올리지 않을 내용은 넣지 마세요.
- 앱은 사용자의 컴퓨터에서 작은 중계 서버(개발자가 운영하는 Cloudflare Worker)로 보내고, 중계 서버가 자체 GitHub 토큰으로 Issue를 엽니다. 사용자가 작성한 내용을 받는 개발자의 서버는 이 중계 서버뿐입니다.
- 보내는 것: 제목과 본문, 버그인지 아이디어인지, 앱 버전, 첨부한 PNG 또는 JPEG 스크린샷 최대 3장. OS 이름과 버전, CPU 아키텍처, 무작위 설치 ID는 포함된 상태로 두었을 때만 보냅니다. 보내지 않는 것: 이름, 이메일, GitHub 계정, 프로젝트 파일, 녹화, 지적 사항.
- Issue를 만들기 전에 중계 서버는 키나 토큰처럼 보이는 텍스트, 이메일 주소, 홈 폴더 경로 안의 사용자 이름을 가리고,
@mentions가 누군가에게 알림을 보내지 않도록 막습니다. 스크린샷에서 위치 정보 등의 메타데이터도 제거합니다. 그래도 텍스트는 직접 확인하세요. 가리기로 모든 것을 잡아낼 수는 없습니다. - 중계 서버는 IP 주소를 저장하지 않습니다. 한 발신자가 올릴 수 있는 횟수(시간당 5회, 하루 20회)를 제한하기 위해 IP 주소(보낸 경우 설치 ID도)의 키 기반 해시를 최대 24시간 동안 세고, 그 뒤 삭제합니다. 둘 다 Issue에는 나타나지 않습니다.
- 스크린샷은 중계 서버가 추측할 수 없는 이름으로 Cloudflare R2에 보관하고 Issue에 표시합니다. Issue나 그 스크린샷을 지우고 싶으면 해당 Issue에 코멘트를 달거나 새 Issue를 여세요.
- 중계 서버의 코드는 저장소의
workers/feedback-relay에 있습니다.
#충돌 보고서
앱이 충돌하거나 처리되지 않은 오류가 발생하면, Ferret은 버그를 고칠 수 있도록 Sentry (새 탭에서 열림)에 충돌 보고서를 보냅니다. 기본값은 켜짐입니다. 설정 → 개인정보 보호 → 충돌 보고서 보내기에서 끄거나, 처음 실행할 때 표시되는 알림의 끄기로 끌 수 있습니다. 끄면 즉시 적용됩니다. 다시 켜면 다음 실행부터 적용됩니다. 개발 빌드(pnpm dev)도 development 태그를 붙여 보내므로, 개발자가 작업 중에 겪은 충돌을 고칠 수 있습니다. E2E 실행과 단위 테스트에서는 절대 보내지 않습니다.
| 보내는 것 | 보내지 않는 것 |
|---|---|
|
|
설치된 앱은 실행당 최대 10건의 보고서를 보내며, JavaScript 오류는 절반만 보냅니다(네이티브 충돌은 항상 보냄). 개발 빌드는 실행당 최대 50건까지 모든 오류를 보냅니다. 같은 오류는 실행당 한 번만 보냅니다. 느린 시작(5초 초과)과 앱의 긴 멈춤(1초 초과)은 경고로 보내며, 최대 10분에 한 번입니다. 성능 추적이나 세션 리플레이는 사용하지 않습니다. 앱은 Sentry의 무료 플랜을 사용합니다. 한도가 차면 추가 보고서는 버려지고 누구에게도 요금이 청구되지 않습니다.
Ferret을 직접 빌드하나요? FERRET_SENTRY_DSN(예전 이름인 MOVIE_ADE_SENTRY_DSN도 동작)을 자신의 Sentry DSN으로 설정하거나, 아무것도 보내지 않으려면 빈 문자열로 설정하세요. 코드는 src/main/telemetry.ts와 src/shared/telemetry.ts에 있습니다.