개인정보 처리방침
1. 수집하는 정보
BestFrame(이하 "앱")에는 회원가입·로그인이 없고, 아래 테스트 제보를 전달하는 기능 말고는 운영자 서버가 없으며, 광고나 추적 기술을 쓰지 않습니다. 사진, 분석 결과, 취향 정보는 이용자의 기기 안에만 있고 운영자는 접근할 수 없습니다. 테스트 참여자가 제보에 첨부해 보낸 스크린샷만 예외입니다.
BestFrame 1.2부터 앱은 다음 정보만 PostHog(아래 6번)로 보냅니다. 이름, 이메일, 전화번호, Apple 계정, 광고 식별자(IDFA)는 수집하지 않으며, 보낸 정보를 이용자 신원과 연결하지 않습니다.
| 항목 | 내용 | 목적 |
|---|---|---|
| 오류(충돌) 보고 | 앱이 비정상 종료되었을 때의 오류 종류와 스택 트레이스(앱 코드의 어느 부분에서 멈췄는지), 앱 실행 파일 정보. 충돌 다음에 앱을 열 때 보냅니다. | 오류를 찾아 고치기 위해 |
| 사용 통계 8가지 | ① 처음 실행(설치당 한 번) ② 사진 접근 권한 선택 결과(전체·선택한 사진·거부 중 하나) ③ 분석 완료: 찾은 장면 수, 확인한 사진 수, 건너뛴 사진 수, 걸린 시간(초) ④ 정리 완료: 마친 장면 수, 그중 추천을 바꾸지 않고 마친 장면 수, 남긴 사진 수, 삭제한 사진 수 ⑤ 정리를 마친 화면이 나타남(1.3부터): 마친 장면 수, 남긴 사진 수, 삭제한 사진 수와 건너뛴 장면 수, 확인한 사진 수, 삭제 없이 마쳤는지 여부, 화면 형태(격자) ⑥ 정리를 마친 화면을 닫음(1.3부터): 화면을 연 시간 구간(3초 미만·3–10초·10–30초·30초 이상), 사진 목록을 스크롤했는지 여부 ⑦ 정리 확정 실패(1.4부터): 정해진 실패 이유(권한 없음, 보관함이 바뀜, 삭제를 허용하지 않음 등) 중 하나, 장면 수, 삭제도 함께 선택했는지 여부 ⑧ 사진 분석이 끝까지 가지 못하고 멈춤: 멈춘 이유(iOS가 백그라운드 작업을 끝냄·오류 중 하나), 분석 단계(새 사진·세부 측정·이전 사진·날짜 없는 사진·건너뛴 사진 다시 확인 중 하나), 오류 종류(Vision·사진 보관함 등 정해진 값 중 하나)와 오류 번호, 처리한 사진 수, 앱이 백그라운드였는지 여부, 걸린 시간(초) | 기능이 실제로 쓰이고 제대로 끝나는지 확인하기 위해 |
| 익명 식별자 | 앱이 처음 실행될 때 PostHog SDK가 만드는 무작위 ID와 세션 ID. 기기나 이용자 정보로 만들지 않습니다. | 같은 설치에서 온 기록을 묶어 세기 위해 |
| 기기·앱 정보 | 앱 버전·빌드, iOS 버전, 기기 모델(예: iPhone16,1), 화면 크기, 언어 설정, Wi-Fi·셀룰러 연결 여부, TestFlight·시뮬레이터 여부, SDK 버전. 기기 이름(이용자가 정한 이름)과 시간대는 보내지 않습니다. App Store 개인정보 항목의 "기타 진단 데이터"에 해당합니다. | 오류와 통계를 버전·기기별로 나눠 보기 위해 |
보내지 않는 정보: 사진과 이미지(아래 테스트 제보에 테스트 참여자가 첨부한 스크린샷 제외), 사진의 식별자·촬영 시각·위치·파일 이름·앨범 이름, 분석 결과와 화질 수치, 취향 가중치, 이용자가 입력한 글(아래 테스트 제보에서 이용자가 직접 보내는 경우 제외). 화면 이동이나 버튼 누름을 자동으로 기록하지 않고, 화면 녹화(세션 리플레이)와 설문도 쓰지 않습니다.
IP 주소와 위치: 인터넷으로 정보를 보낼 때 PostHog 서버는 통신 과정에서 기기의 IP 주소를 받게 됩니다. 앱은 IP 주소로 위치를 추정하지 않도록 요청($geoip_disable)하며, BestFrame의 PostHog 프로젝트는 IP 주소를 저장하지 않도록 설정합니다.
테스트 제보(테스트 참여자만): 운영자가 테스트 참여자로 지정한 설치에만 설정 화면에 '제보하기'와 '모두 초기화'(기기에 저장된 앱 기록만 지우며 사진은 건드리지 않고 아무것도 보내지 않음)가 보입니다. 이를 위해 앱을 실행한 뒤 설정 화면을 처음 열 때 앱이 PostHog에 이 기능이 켜져 있는지(debug-report) 한 번 묻습니다. 답을 받지 못하면 다음에 설정 화면을 열 때 다시 묻습니다. 이용자가 제보 화면에서 '보내기'를 누른 경우에만 다음 정보를 보내며, 보낼 내용은 보내기 전에 화면에 모두 보여 줍니다.
| 항목 | 내용 | 목적 |
|---|---|---|
| 제보 내용 | 유형(버그·기능 요청), 이용자가 쓴 제목과 설명 | 버그를 고치고 기능을 정하기 위해 |
| 스크린샷(선택) | 이용자가 첨부한 경우만: 설정 아래에 있던 앱 화면을 찍은 이미지, 또는 이용자가 사진 선택 화면에서 고른 스크린샷 한 장. 긴 쪽 1600px 이하 JPEG로 줄이고 위치 같은 사진 정보는 지웁니다. 앱 화면에는 보관함 사진의 미리보기가 보일 수 있습니다. | 문제를 재현하기 위해 |
| 기기·앱 정보 | 앱 이름, 버전, 빌드, iOS 버전, 기기 모델, 제보를 연 화면(설정) | 버전·기기별 문제를 찾기 위해 |
| 식별자 | 위 익명 식별자(PostHog ID, 분석이 꺼진 빌드에서는 없음)와, 제보 화면을 처음 열 때 만드는 무작위 제보 ID, 제보 화면을 열거나 내용을 고칠 때 새로 만드는 무작위 중복 방지 ID | 같은 설치의 제보를 묶고, 너무 잦은 제보를 막고, 응답을 받지 못해 다시 보낸 제보가 두 번 등록되지 않게 하기 위해 |
제보는 BestFrame 사이트의 중계 함수(Cloudflare)를 거쳐 운영자의 이슈 관리 도구 Linear에 이슈로 저장됩니다. 중계 함수는 너무 잦은 제보를 막기 위해 IP 주소와 제보용 ID를 원래 값 대신 서버 비밀 키로 만든 해시 값으로만 잠시(기본 한 시간) 셉니다. 다시 보낸 제보를 알아보기 위해 제보 ID와 중복 방지 ID를 같은 방식으로 만든 해시 값과 만든 이슈 번호를 하루 동안 둡니다.
제보 한 건에 이용자가 쓴 글·스크린샷과 익명 식별자·기기 정보가 함께 저장되므로, 테스트 제보가 들어간 빌드부터 App Store 개인정보 항목에서는 "기기 ID"와 "기타 진단 데이터"도 보수적으로 "사용자와 연결됨"으로 표시합니다. 사용 통계와 오류 보고 자체는 지금처럼 이름·계정과 연결하지 않습니다.
2. 기기 안에서 하는 일
- 사진 분석: 이용자가 허용한 사진(전체 또는 선택한 사진)을 Apple의 Vision 프레임워크로 기기 안에서 분석해, 비슷한 사진을 묶고 남길 컷을 추천합니다.
- 사진 분석에는 네트워크를 쓰지 않음: 분석용 이미지를 불러올 때 네트워크 다운로드를 요청하지 않습니다. 그래서 iCloud에만 있고 기기에 없는 사진은 분석하지 않고 건너뜁니다. 앱이 인터넷으로 보내는 것은 1번의 오류 보고와 사용 통계, 제보 기능이 켜져 있는지 묻는 요청, 테스트 참여자가 보내는 제보뿐입니다.
- 알림: 이용자가 "완료 알림 받기"를 허용하면, 분석이 끝났을 때 기기 안에서 만든 로컬 알림을 한 번 보냅니다. 서버 푸시 알림이 아닙니다.
- 정리를 마친 화면: 보관함의 장면을 모두 정리하면 남긴 사진을 모아 보여 줍니다. 이 화면에서만, 기기에 없는 사진의 미리보기를 Apple의 사진 기능이 iCloud 사진에서 받아올 수 있습니다(BestFrame 1.3부터). 이 다운로드는 이용자의 iCloud 사진과 기기 사이에서만 이뤄지고 운영자에게 전달되지 않습니다.
3. 기기에 저장하는 정보
앱은 다음 정보를 이용자의 기기에만 저장합니다. 사진 원본이나 이미지 사본은 저장하지 않습니다.
| 저장 위치 | 내용 | 용도 |
|---|---|---|
| UserDefaults | 추천 취향 가중치, 반영한 비교 횟수, 취향에 반영한 장면 수(BestFrame 1.3부터 적용), 정리를 마친 장면의 식별값(사진 식별자와 수정 시각으로 계산) | 추천을 이용자 취향에 맞추고, 이미 정리한 장면을 다시 보여 주지 않기 위해 |
| UserDefaults | 별점 요청 기록: 앱을 실행한 횟수, 현재 앱 버전에서 삭제를 마친 사진 수와 그 버전, 별점 요청 대기 여부, 마지막으로 별점을 요청한 앱 버전(BestFrame 1.1부터 적용) | App Store 별점 요청을 사진을 정리한 뒤에만, 앱 버전마다 한 번까지만 보여 주기 위해 |
| UserDefaults | 처음 실행 통계를 이미 보냈는지 여부(BestFrame 1.2부터 적용) | 처음 실행을 설치당 한 번만 세기 위해 |
| UserDefaults | 스와이프 방법 안내를 이미 봤는지 여부(BestFrame 1.3.2 빌드 26부터 적용) | 안내를 한 번만 보여 주기 위해 |
| UserDefaults | 설정의 '장면 묶기'에서 고른 단계(7단계 중 하나, BestFrame 1.6부터 적용) | 다음 분석부터 고른 단계로 비슷한 사진을 묶기 위해 |
| 앱 데이터 폴더(PostHog SDK) | 익명 식별자와 세션 ID, 아직 보내지 못한 통계·오류 보고, 다음 실행 때 보낼 충돌 기록(BestFrame 1.2부터 적용). 기기 백업(iCloud 백업 등)에서는 제외됩니다. | 인터넷이 없을 때 모아 두었다가 보내기 위해 |
| Application Support 폴더의 파일 | 분석 진행 상황: 찾은 장면을 이루는 사진의 기기 내 식별자, 촬영 시각, 추천에 쓰는 화질 수치(선명도·노출 등)와 찾은 얼굴 수, 장면에 묶인 사진의 눈 뜸·웃음·구도 추정 수치(얼굴 이미지나 위치, 눈·입 같은 얼굴 특징점은 저장하지 않음). 분석을 마친 촬영 시각의 범위(홈 화면의 "…까지 확인"에 표시)와 다시 분석할 사진의 촬영 시각. 분석하지 못하고 건너뛴 사진(iCloud에만 있는 사진 등)은 기기 내 식별자, 그리고 처음 분석을 포함해 시도한 횟수와 마지막으로 시도했을 때의 사진 수정 시각(BestFrame 1.1부터 적용). 선택한 사진만 허용했다면 그 사진들의 기기 내 식별자 | 앱을 다시 열었을 때 처음부터 분석하지 않고 이어서 하기 위해. 건너뛴 사진은 처음 분석을 포함해 3번까지 확인하고, 그 뒤에는 사진 수정 시각이 바뀌었을 때만 다시 확인하기 위해. 사진 접근을 넓히면(전체 허용, 사진 추가 선택) 새로 보이게 된 사진만 찾아 분석하기 위해 |
| Application Support 폴더의 파일(테스트 참여자만) | 정리 기록: 정리를 확정한 장면마다 사진별 화질·얼굴·구도 수치와 남겼는지, 처음 추천됐는지, 좋아요였는지(최근 1000개 장면). 사진, 사진의 식별자·촬영 시각·위치는 저장하지 않습니다. 테스트 참여자가 직접 만든 추천 가중치 세트와 그 이름. 운영자가 테스트 참여자로 지정한 설치에서, 앱을 실행한 뒤 설정 화면을 열어 테스트 참여자로 확인된 때부터 그 실행 동안만 기록하며, 설정의 '추천 가중치'에서 끄거나 지울 수 있습니다. | 테스트 참여자가 자기 정리 기록으로 추천 가중치를 다시 맞춰 보고 비교하기 위해. 테스트 참여자가 '공유'를 누르면 가중치와 개수만 담은 파일(세트 이름·사진 정보 없음)을 공유 시트로 직접 보낼 수 있으며, 앱이 운영자에게 보내지는 않습니다. |
| Application Support 폴더의 파일(테스트 참여자만) | 장면 묶기 판정 기록(BestFrame 1.5 이후 빌드부터 적용): 테스트 참여자가 설정의 '장면 묶기 강도'에서 '판정 내보내기'로 고른 사진 2–20장을 그 자리에서 다시 분석한 결과. 사진마다 촬영 순서 번호, 첫 사진부터 지난 초, 가로세로 비율, HEIC 여부, 얼굴 수와 가장 큰 얼굴 크기, 몸 영역 높이, 회전 여부, 분석 이미지의 가로·세로 픽셀 수, 사진 쌍마다 장면·얼굴·몸 특징 거리와 묶거나 나눈 규칙, 고른 사진과 같은 분석 묶음에 있는 다른 사진 중 매우 비슷한 사진의 수와 각 사진과의 간격(초)·특징 거리, 그리고 앱 버전·빌드, iOS 버전, 기기 모델과 그때의 묶기 설정. 사진, 사진의 식별자·파일 이름·촬영 날짜·위치, 특징 벡터는 저장하지 않습니다. 내보낼 때마다 덮어씁니다. | 테스트 참여자가 받은 장면 나눔을 기기 밖에서 같은 숫자로 재현하기 위해. 테스트 참여자가 '공유'를 누르면 이 파일을 공유 시트로 직접 보낼 수 있으며, 앱이 운영자에게 보내지는 않습니다. 스캔 결과와 분석 진행 상황은 바뀌지 않습니다. |
분석 진행 상황 파일은 기기 안에만 저장되며, 앱은 이 파일의 내용을 기기 밖으로 보내지 않습니다(사용 통계에는 장면·사진 개수만 들어갑니다). 보관함에서 지워진 사진과 정리를 마친 장면은 이 파일에서 빠지고, 건너뛴 사진은 나중에 분석되면 건너뛴 목록에서 빠집니다. 정리 중에 고르던 내용은 메모리에만 있어 앱을 종료하면 사라집니다. 설정의 "취향 초기화"는 취향 가중치와 비교 횟수, 취향에 반영한 장면 수를, "처음부터 다시 찾기"는 분석 진행 상황을 지웁니다. 정리를 마친 장면의 식별값과 별점 요청 기록은 이 두 설정으로 지워지지 않습니다. 저장된 정보는 앱을 삭제하면 모두 삭제됩니다. 이용자가 iPhone 백업(iCloud 백업 등)을 사용하면 이 앱 데이터가 Apple의 백업 정책에 따라 백업에 포함될 수 있습니다. 이때도 운영자에게 전달되지는 않습니다.
4. 사진 보관함 변경
- 삭제: 앱은 "정리하기" 화면에서 이용자가 지울 사진을 확인하고 삭제 버튼을 누른 뒤, iOS가 보여 주는 확인 창에서 다시 허용한 경우에만 PhotoKit을 통해 사진을 삭제합니다. 시스템 확인을 건너뛰지 않습니다.
- 복구: 삭제한 사진은 사진 앱의 "최근 삭제된 항목"으로 이동하며, iOS가 정한 기간 안에는 복구할 수 있습니다. iCloud 사진을 사용 중이면 같은 계정의 다른 기기에서도 삭제됩니다.
- 좋아요: 이용자가 "좋아요"를 누르면 사진 앱의 즐겨찾기 표시가 바뀝니다. 즐겨찾기한 사진은 처음에 남길 사진으로 표시되며, 이용자가 직접 지울 사진으로 고른 경우에만 다른 사진과 같이 삭제 확인을 거쳐 지워집니다.
5. 권한
앱은 사진 보관함 접근 권한(분석, 즐겨찾기 변경, 삭제)과 선택적으로 알림 권한을 요청합니다. 권한은 언제든 설정 › BestFrame에서 바꿀 수 있습니다. 사진 접근을 끄면 앱은 사진을 읽지 않습니다.
6. 제3자 제공·처리 위탁·국외 이전
운영자는 정보를 제3자에게 팔거나 제공하지 않습니다. 1번의 오류 보고와 사용 통계를 저장·분석하는 일은 PostHog에 맡기며, 이 과정에서 정보가 국외로 이전됩니다.
| 받는 자 | PostHog, Inc.(분석 서비스 제공자, 개인정보 처리방침) |
|---|---|
| 이전 국가 | 미국(PostHog US Cloud). BestFrame이 EU 지역을 쓰도록 설정한 빌드는 유럽연합(PostHog EU Cloud) |
| 이전 항목 | 1번 표의 오류 보고, 사용 통계, 익명 식별자, 기기·앱 정보 |
| 이전 시기와 방법 | 앱 사용 중(오류 보고는 충돌 다음 실행 때) 암호화된 인터넷 연결(HTTPS)로 전송 |
| 목적 | 오류 수정과 기능 개선을 위한 통계 |
| 보유 기간 | 7번과 같습니다 |
테스트 제보(1번)를 보낸 경우에만 다음 처리자가 추가됩니다.
| 받는 자 | Cloudflare, Inc.(제보를 전달하는 중계 함수 호스팅, 개인정보 처리방침), Linear Orbit, Inc.(이슈 관리 도구, 제보와 스크린샷 저장, 개인정보 처리방침) |
|---|---|
| 이전 국가 | 미국(Cloudflare는 이용자와 가까운 데이터센터에서 중계합니다) |
| 이전 항목 | 1번 테스트 제보 표의 항목. Cloudflare는 전달하는 동안 IP 주소를 받습니다. |
| 이전 시기와 방법 | 이용자가 '보내기'를 누를 때 암호화된 인터넷 연결(HTTPS)로 전송 |
| 목적 | 버그 수정과 기능 개선 |
| 보유 기간 | 7번과 같습니다 |
PostHog는 운영자를 위해서만 이 정보를 처리하며, 광고나 다른 회사와의 정보 연결(추적)에 쓰지 않습니다. 앱 설치와 업데이트는 App Store에서 Apple을 통해 이뤄지며, 이 과정에는 Apple의 개인정보 처리방침이 적용됩니다.
7. 보관 기간과 삭제
- 보관 기간: PostHog에 보낸 정보는 PostHog 요금제가 정한 기간 동안 보관됩니다(무료 요금제 1년, 유료 요금제 최대 7년). 운영자는 목적에 필요하지 않게 된 정보를 이 기간 안에도 지울 수 있습니다.
- 테스트 제보: Linear의 이슈로 남아 있다가, 문제를 고치거나 필요 없어지면 운영자가 지웁니다. 아래 이메일로 요청하면 해당 제보를 지웁니다(제보 화면의 PostHog ID를 알려 주시면 찾기 쉽습니다).
- 익명 식별자 초기화: 앱을 삭제하면 기기에 있던 익명 식별자와 보내지 않은 기록이 함께 지워지고, 다시 설치하면 새 식별자가 만들어집니다. 이전 기록과 새 기록은 연결되지 않습니다.
- 삭제 요청: 아래 이메일로 삭제를 요청할 수 있습니다. 다만 보낸 정보에는 이름이나 계정이 없어서, 운영자가 특정 이용자의 기록을 찾지 못할 수 있습니다. 이 경우 찾을 수 있는 범위에서 지우고 그 결과를 알려 드립니다.
- 보내지 않으려면: 현재 앱 안에 통계·오류 보고를 끄는 설정은 없습니다. 원하지 않으면 앱을 쓰지 않거나 삭제할 수 있으며, 기기에 인터넷이 없을 때는 아무것도 보내지 않습니다.
8. 아동
앱은 이용자의 나이를 묻지 않으며, 만 14세 미만 아동을 포함해 누구의 이름이나 연락처도 수집하지 않습니다. 1번의 익명 정보는 나이와 관계없이 같은 방식으로 처리됩니다.
9. 방침의 변경
앱의 정보 처리 방식이 바뀌면, 바뀐 내용이 적용되기 전에 이 페이지에 시행일과 함께 알립니다. 1번과 6·7번의 PostHog 관련 내용은 BestFrame 1.2부터, 사용 통계 ⑤·⑥은 1.3부터, ⑦은 1.4부터 적용되며, ⑧과 테스트 제보는 그 기능이 들어간 빌드부터 적용됩니다.
10. 문의와 개인정보 보호책임자
운영자·개인정보 보호책임자: Taehee Lee(이태희)
이메일: somandlee@gmail.com
Privacy Policy
1. Information we collect
BestFrame (the "App") has no account or sign-in, no server of ours other than the relay for tester reports below, and uses no advertising or tracking technology. Your photos, analysis results, and preferences stay on your device. We cannot access them. The only exception is a screenshot a tester attaches to a report and sends.
From BestFrame 1.2, the App sends only the following to PostHog (section 6). It does not collect your name, email, phone number, Apple Account, or advertising identifier (IDFA), and we do not link what it sends to your identity.
| Item | What | Why |
|---|---|---|
| Crash reports | When the App quits unexpectedly: the error type, the stack trace (where in the App's code it stopped), and information about the App's binary. Sent the next time you open the App. | To find and fix bugs |
| Eight usage statistics | (1) First launch (once per install) (2) The photo access you chose (full, selected photos, or denied) (3) Scan finished: number of scenes found, photos checked, photos skipped, and time taken in seconds (4) Clean-up finished: number of scenes finished, how many of them were finished without changing the recommendation, photos kept, and photos deleted (5) Completion screen shown (from 1.3): scenes finished, photos kept, and photos deleted, plus scenes skipped, photos checked, whether you finished without deleting, and the layout (grid) (6) Completion screen closed (from 1.3): how long it was open (under 3, 3–10, 10–30, or 30+ seconds) and whether you scrolled the photos (7) Clean-up could not be confirmed (from 1.4): one fixed reason (such as no permission, the library changed, or deletion not allowed), the number of scenes, and whether you chose to delete (8) Photo analysis stopped before the end: the reason (iOS ended the background task, or an error), the stage (new photos, details, older photos, undated photos, or re-checking skipped photos), the error kind (one fixed value such as Vision or the photo library) and error number, the number of photos processed, whether the app was in the background, and the time taken (seconds) | To check that features are used and finish correctly |
| Anonymous identifier | A random ID and a session ID created by the PostHog SDK when the App first runs. They are not derived from your device or from you. | To count records from the same install together |
| Device and app information | App version and build, iOS version, device model (such as iPhone16,1), screen size, language setting, whether on Wi-Fi or cellular, whether TestFlight or a simulator, and SDK version. Not your device's name or your time zone. Listed as "Other Diagnostic Data" in the App Store privacy details. | To break down crashes and statistics by version and device |
Never sent: photos and images (except a screenshot a tester attaches to a report, below); photo identifiers, capture times, locations, file names, or album names; analysis results and quality scores; your preference weights; anything you type (except what a tester chooses to send in a report, below). The App does not record screen views or taps automatically, and uses no session replay or surveys.
IP address and location: Sending data over the internet gives PostHog's servers your device's IP address. The App asks PostHog not to derive a location from it ($geoip_disable), and BestFrame's PostHog project is set to discard IP addresses.
Tester reports (testers only): Only installs we have chosen as testers see "Send Feedback" and "Reset Everything" in Settings (the reset only clears what the App saved on the device; it never touches photos and sends nothing). To decide this, the App asks PostHog once, the first time Settings opens after the App starts, whether the feature (debug-report) is on. If no answer comes back, it asks again the next time Settings opens. The following is sent only when you tap Send on the report screen, and the screen shows all of it before you send.
| Item | What | Why |
|---|---|---|
| Report | Type (bug or feature request) and the title and description you write | To fix bugs and decide on features |
| Screenshot (optional) | Only if you attach one: an image of the App screen behind Settings, or one screenshot you choose in the photo picker. Reduced to a JPEG of up to 1600 px on the long side, with location and other photo metadata removed. An App screen may show previews of photos in your library. | To reproduce the problem |
| Device and app information | App name, version, build, iOS version, device model, and the screen the report was opened from (Settings) | To find problems by version and device |
| Identifiers | The anonymous identifier above (PostHog ID; none in builds without analytics) and a random report ID created the first time you open the report screen, and a random duplicate check ID created each time you open it or change the report | To group reports from one install, to stop too many reports, and to file a report sent again after a lost response only once |
Reports pass through a relay function on the BestFrame site (Cloudflare) and are stored as issues in our issue tracker, Linear. To stop too many reports, the relay briefly counts (one hour by default) the IP address and report ID only as hashes keyed with a server secret, never the values themselves. To recognize a report sent again, it keeps a hash of the report ID and duplicate check ID, made the same way, with the filed issue number for one day.
Because a report stores your text and screenshot together with the anonymous identifier and device information, from the first build that includes tester reports the App Store privacy details also list "Device ID" and "Other Diagnostic Data" as linked to you, to be conservative. Usage statistics and crash reports themselves are still not linked to your name or any account.
2. What happens on your device
- Photo analysis: The App analyzes the photos you allow (all photos or a selection) on device using Apple's Vision framework to group similar shots and suggest the ones to keep.
- No network use for photo analysis: The App never asks to download images for analysis, so photos stored only in iCloud and not on the device are skipped. The only things the App sends over the internet are the crash reports and usage statistics in section 1, the check for whether tester reports are on, and the reports testers send.
- Notifications: If you turn on "Notify me when done," the App sends one local notification created on the device when the scan finishes. It is not a server push.
- Completion screen: When every scene in your library is cleaned up, the App shows the photos you kept. On this screen only, Apple's Photos framework may download previews of photos that are not on the device from iCloud Photos (from BestFrame 1.3). This download happens only between your iCloud Photos and your device and is never sent to us.
3. Information stored on your device
The App stores the following only on your device. It never stores copies of your photos.
| Where | What | Why |
|---|---|---|
| UserDefaults | Your preference weights, the number of comparisons learned, the number of scenes learned from (from BestFrame 1.3), and fingerprints of scenes you finished (computed from photo identifiers and modification dates) | To tailor suggestions to you and avoid showing finished scenes again |
| UserDefaults | Rating request records: how many times the App was launched, the number of photos deleted in the current App version and that version, whether a rating request is pending, and the App version in which a rating was last requested (from BestFrame 1.1) | To ask for an App Store rating only after you clean up photos, and at most once per App version |
| UserDefaults | Whether the first-launch statistic was already sent (from BestFrame 1.2) | To count a first launch only once per install |
| UserDefaults | The step chosen under Settings → Scene Grouping (one of seven, from BestFrame 1.6) | To group similar photos at that step from the next scan |
| App data folder (PostHog SDK) | The anonymous identifier and session ID, statistics and crash reports not yet sent, and a crash record to send at the next launch (from BestFrame 1.2). Excluded from device backups (such as iCloud Backup). | To hold data while offline and send it later |
| A file in Application Support | Scan progress: on-device identifiers and capture times of photos in found scenes, and the quality scores used for suggestions (sharpness, exposure, etc.) and the number of faces found (no face images or positions). The range of capture times already scanned (shown as "Checked back to …" on the home screen) and the capture times of photos waiting to be scanned again. For photos that could not be analyzed and were skipped (such as iCloud-only photos): their on-device identifiers, plus the number of attempts, including the original scan, and the photo's modification date at the last attempt (from BestFrame 1.1). If you allowed only selected photos: the on-device identifiers of those photos | To resume scanning instead of starting over. To check each skipped photo up to 3 times, including the original scan, and after that only when its modification date changes. To find and scan only the newly visible photos when you widen photo access (full access, or more photos selected) |
| A file in Application Support (test participants only) | Cleanup log: for each scene you confirm, each photo's quality, face and framing scores and whether it was kept, first suggested, or a favorite (the latest 1,000 scenes). No photos, photo identifiers, capture times or locations. Recommendation weight sets the test participant made, with their names. Recorded only on installs the operator marked as test participants, and in each launch only after Settings is opened and confirms it; it can be turned off or cleared in Settings → Ranking Weights. | So test participants can refit and compare recommendation weights from their own cleanups. When a test participant taps Share, they can send a file with only weights and counts (no set names or photo information) through the share sheet themselves; the App does not send it to the operator. |
| A file in Application Support (test participants only) | Scene grouping decisions (from builds after BestFrame 1.5): the result of analyzing again the 2–20 photos a test participant picks under Settings → Scene Grouping Strength → Export Decisions. For each photo, its number in capture order, seconds since the first photo, aspect ratio, whether it is HEIC, face count and largest face size, body area height, whether it was turned upright, and the analysis image's width and height in pixels; for each pair of photos, the scene, face and body feature distances and the rule that grouped or split them; the number of other photos in the same analysis batch that are near-identical to a picked photo, with the seconds between them and their feature distance; plus the app version and build, iOS version, device model, and the grouping settings in use. No photos, photo identifiers, file names, capture dates, locations, or feature vectors. Overwritten by each export. | So a test participant's scene split can be reproduced off the device with the same numbers. When a test participant taps Share, they can send this file through the share sheet themselves; the App does not send it to the operator. Scan results and scan progress do not change. |
The scan progress file is stored only on your device, and the App never sends its contents off the device (usage statistics contain only counts of scenes and photos). Photos removed from your library and scenes you finished are dropped from this file, and a skipped photo leaves the skipped list once it is analyzed. Choices you are still making stay in memory and are discarded when the App quits. In Settings, "Reset Personalization" clears your preference weights, comparison count, and learned scene count, and "Rescan Library" clears scan progress. Neither clears the fingerprints of finished scenes or the rating request records. All stored data is removed when you delete the App. If you use iPhone backups (such as iCloud Backup), this App data may be included under Apple's backup policies. It is still never sent to us.
4. Changes to your photo library
- Deletion: The App deletes photos through PhotoKit only after you review them on the Clean Up screen, tap Delete, and then approve the iOS confirmation dialog. The App never bypasses that confirmation.
- Recovery: Deleted photos move to Recently Deleted in the Photos app, where you can recover them within the period set by iOS. If you use iCloud Photos, they are also deleted on your other devices.
- Favorites: Tapping "Like" changes the photo's Favorite status in Photos. Favorites start out marked to keep; one is deleted only if you mark it for deletion yourself, through the same confirmation as any other photo.
5. Permissions
The App asks for photo library access (for analysis, favorites, and deletion) and, optionally, notification permission. You can change these anytime in Settings › BestFrame. Without photo access, the App reads no photos.
6. Sharing, processors, and international transfers
We do not sell or share information with third parties. PostHog stores and analyzes the crash reports and usage statistics in section 1 on our behalf, which transfers that data outside Korea.
| Recipient | PostHog, Inc. (analytics provider, privacy policy) |
|---|---|
| Country | United States (PostHog US Cloud). Builds of BestFrame configured for the EU region: European Union (PostHog EU Cloud) |
| Data | The crash reports, usage statistics, anonymous identifier, and device and app information in section 1 |
| When and how | While you use the App (crash reports at the next launch after a crash), over an encrypted connection (HTTPS) |
| Purpose | Statistics to fix bugs and improve features |
| Retention | As in section 7 |
Only when a tester sends a report (section 1), these processors are added.
| Recipient | Cloudflare, Inc. (hosts the relay function that passes reports on, privacy policy) and Linear Orbit, Inc. (issue tracker that stores reports and screenshots, privacy policy) |
|---|---|
| Country | United States (Cloudflare relays from a data center near you) |
| Data | The items in the tester report table in section 1. Cloudflare receives the IP address while passing the report on. |
| When and how | When you tap Send, over an encrypted connection (HTTPS) |
| Purpose | Fixing bugs and improving features |
| Retention | As in section 7 |
PostHog processes this data only for us and does not use it for advertising or to link it with other companies' data (tracking). App downloads and updates are handled by Apple through the App Store under Apple's privacy policy.
7. Retention and deletion
- Retention: Data sent to PostHog is kept for the period set by the PostHog plan (1 year on the free plan, up to 7 years on paid plans). We may delete data sooner once it is no longer needed.
- Tester reports: Kept as issues in Linear until the problem is fixed or the report is no longer needed, then deleted. Ask at the email below and we delete your report (the PostHog ID shown on the report screen helps us find it).
- Resetting the anonymous identifier: Deleting the App removes the anonymous identifier and any unsent records from your device. Reinstalling creates a new identifier that is not linked to the old records.
- Deletion requests: You can ask us to delete data at the email below. Because the data contains no name or account, we may not be able to find records that belong to you. In that case we delete what we can find and tell you the result.
- Opting out: The App has no setting to turn off statistics and crash reports yet. If you do not want them sent, you can stop using or delete the App. Nothing is sent while your device is offline.
8. Children
The App does not ask for your age and collects no one's name or contact details, including children under 14. The anonymous data in section 1 is handled the same way regardless of age.
9. Changes to this policy
If the way the App handles information changes, we will post the update here with its effective date before it applies. The PostHog parts of sections 1, 6, and 7 apply from BestFrame 1.2; usage statistics (5) and (6) apply from 1.3, and (7) from 1.4; (8) and tester reports apply from the first build that includes them.
10. Contact and privacy officer
Developer and privacy officer: Taehee Lee (이태희)
Email: somandlee@gmail.com