Q Presence
개인정보처리방침 · Privacy Policy — 최종 업데이트 / Last updated: 2026-07-25
한국어
Q Presence는 콘텐츠에 중앙 서버가 없는 존재 기반 소셜 네트워크입니다. 다만 앱에는 성격이 완전히 다른 두 계층이 있고, 두 번째 계층에서는 개발자 서버가 일부 데이터를 받습니다. 이 문서는 그 경계를 정확히 구분합니다.
- 계층 1 — P2P 콘텐츠 계층 (서버 없음): 글·사진·영상·대화·팔로우. 개발자 서버를 거치지 않습니다.
- 계층 2 — 선택적 계정/relay 계층 (수집 있음): 개발자가 운영하는
auth.ugot.uk서버가 아래에 적힌 데이터를 받습니다.
계층 1 — P2P 콘텐츠: 우리가 받지 않는 것
- 계정 키 — 앱을 설치하면 기기에서 암호학적 키페어(Ed25519)가 생성되며, 이 키가 곧 당신의 pnp 신원입니다. 기본 사용에는 이메일·전화번호·이름을 요구하지 않습니다. (선택적 Google 로그인을 하면 계층 2가 적용됩니다.)
- 콘텐츠(글·사진·영상·대화) — 어떤 서버에도 저장되지 않습니다. 당신이 온에어인 동안 당신의 기기에서 상대의 기기로 종단간 암호화(P2P)되어 직접 전달되며, 세션이 끝나면 사라집니다.
- 관계·활동 — 팔로잉·팔로워 목록과 "함께한 시간"은 전적으로 당신의 기기에만 저장되며 어디에도 업로드되지 않습니다. 팔로우 사실은 서버 집계 없이, 서명된 P2P 세션으로 상대 기기에만 전달됩니다.
계층 2 — 선택적 계정/relay 계층: 우리가 받는 것
개발자가 운영하는 서버는 https://auth.ugot.uk 하나이며, 아래 여섯 가지 경우에만 데이터를 받습니다.
- Google 로그인(선택) — @핸들을 쓰려고 Google 로그인을 하면, 앱이 Google ID 토큰을
auth.ugot.uk로 보내 Q Presence 토큰으로 교환합니다. 요청 스코프는openid profile email offline_access이며, 이때 이메일 주소·이름·프로필 사진 URL이 서버 계정 레코드로 저장됩니다. 로그인하지 않으면 이 항목은 전혀 발생하지 않습니다. - pnp 공개키 ↔ @핸들 매핑 — 로그인 후
POST /api/auth/pubkey로 당신의 pnp 공개키(pnp:URI)와 @핸들의 연결이 서버에 저장됩니다. 이 매핑은 만료 기간 없이 보관되며, 누구나 인증 없이GET /api/auth/username-by-pubkey로 공개키에서 @핸들을 역조회할 수 있습니다(그것이 이 기능의 목적입니다). 즉 로그인하는 순간 당신의 가명 pnp 신원과 Google 계정 기반 @핸들이 공개적으로 연결됩니다. - iOS APNs 기기 토큰 — iOS는 OS가 백그라운드 P2P를 차단하므로, iOS 앱은
POST /api/relay/register로 APNs 기기 토큰을 등록합니다. 토큰은 서버에 최대 30일 보관되며(앱이 주기적으로 재등록해 갱신), Apple이 무효라고 확정하면 즉시 폐기됩니다. Android 앱은 이 등록을 하지 않습니다. - relay 깨우기 대상 식별자 — 대화(DM)를 보낼 때마다 앱이
POST /api/relay/wake로 상대의 pnp URI와 종류 값(dm)을 서버에 보냅니다. 이 호출은 로그인 여부와 무관하게, 상대가 relay에 등록돼 있는지와 무관하게 발생합니다. 서버는 상대가 등록된 iOS 사용자일 때 내용이 전혀 없는 APNs 푸시로 상대 앱을 깨울 뿐이며, 메시지 내용은 절대 서버로 전송되지 않습니다 — 깨어난 앱이 당신과 직접 P2P로 연결해 내용을 받습니다. 서버는 대상 식별자나 wake 이력을 저장하지 않고, 남용(푸시 폭탄) 방지를 위해 발신 IP의 SHA-256 해시 앞 8바이트만 5분 창 카운터로 사용합니다(원문 IP는 저장·로그하지 않습니다). - 핸들 역조회 시의 접속 정보 — 피드에서 다른 사람의 @핸들을 표시하기 위해 앱이 그 사람의 pnp 공개키를 조회 요청에 담아 보냅니다. 모든 HTTPS 요청과 마찬가지로 이때 당신의 IP 주소가 서버에 도달합니다.
- 구독 결제 — Q Presence+ 구독 결제 자체는 Apple App Store 또는 Google Play가 처리하며, 카드·결제 수단 정보는 우리에게 오지 않습니다. iOS에서 relay 구독 게이팅이 활성화된 경우에 한해, StoreKit 트랜잭션 증명(JWS — 상품 ID·구매/만료 시각 등 구매 이력)이
auth.ugot.uk로 전송되어 검증되고 당신의 계정에 결속됩니다.
보관 기간
| 데이터 | 보관 기간 |
|---|---|
| 계정 레코드(이메일·이름·프로필 사진 URL) | 계정 삭제 요청 시까지 |
| pnp 공개키 ↔ @핸들 매핑 | 만료 없음 — 해제 또는 계정 삭제 시까지 |
| iOS APNs 기기 토큰 | 최대 30일(재등록 없으면 자동 만료, 무효 확정 시 즉시 삭제) |
| relay 소유자 기록(@핸들) | 365일(재등록 때마다 갱신) |
| wake 남용 방지 카운터(IP 해시) | 5분 |
| wake 대상 식별자·메시지 내용 | 저장하지 않음 |
기기에만 저장되는 것
- 신원 비밀키 — Android는 Android Keystore, iOS는 Keychain으로 기기 보안 저장소에 보관됩니다.
- 북마크 — 당신이 저장 버튼을 눌러 명시적으로 보관한 포스트의 사본. 당신의 기기에만 저장되며 저자에게 통지되지 않고, 어디에도 업로드되지 않습니다.
- 차단 목록 — 전적으로 기기에만 저장되며 차단당한 사람에게 통지되지 않습니다.
- 미디어 캐시 — 재방문 시 대역폭을 아끼기 위한 임시 캐시로, 앱 메모리(RAM)에만 있고 앱을 종료하면 사라집니다.
제3자 인프라
- P2P 디스커버리/릴레이(number0의 iroh 공개 인프라) — 기기끼리 서로를 찾고 방화벽(NAT)을 통과하기 위해 iroh 공개 릴레이·디스커버리 노드를 경유할 수 있습니다. 이 과정에서 당신의 노드 ID와 접속 주소(IP)가 해당 인프라에 노출됩니다. 이 노드들은 암호문만 중계하며 내용을 볼 수 없습니다. 이는 개발자 서버가 아닌 제3자 인프라입니다.
- 개발자 운영 깨우기 relay(
auth.ugot.uk) — 위 계층 2에 적힌 계정·APNs·wake 기능을 담당하는 개발자 자체 서버입니다. 위 iroh 릴레이와는 별개이며, 메시지 내용은 이 서버를 지나가지 않습니다. - Google 로그인 — 선택적 로그인에 Google Credential Manager(Android) / Google Sign-In(iOS)을 사용합니다. Google의 개인정보 처리에는 Google 정책이 적용됩니다.
- 결제 — Apple App Store / Google Play가 결제를 처리합니다.
- 광고·분석 — 광고 SDK, 분석(analytics) SDK, 크래시 리포팅 서버를 직접 통합하지 않습니다. 광고 ID(AD_ID) 권한도 선언하지 않습니다. 다만 Google 로그인(Credential Manager)을 쓰기 때문에 Google Play 서비스 구성요소가 앱에 포함되며(릴리스 병합 매니페스트의
com.google.android.datatransport.runtime.*등), 이는 Google Play 서비스가 자체 진단·전송에 사용하는 구성요소입니다. Q Presence는 이 경로로 어떤 데이터도 수집하지 않습니다.
권한
- 마이크 — 음성 메시지를 녹음할 때만 사용하며, 녹음은 전송 후 즉시 삭제됩니다. 서버에 저장되지 않습니다.
- 알림 — ① 온에어 동안 존재 유지를 항상 표시하는 상시 알림([끄기] 액션 포함) ② 팔로우한 사람이 온에어가 될 때의 로컬 알림. Android에서는 모두 기기에서 생성되며 서버 푸시가 아닙니다. iOS에서 relay를 등록한 경우에 한해, 앱을 깨우기 위한 내용 없는 APNs 푸시가 추가로 사용됩니다.
계정 삭제 / 데이터 삭제 요청
- 기기 데이터 — 앱을 삭제하면 당신의 pnp 계정 키와 모든 로컬 데이터가 기기에서 사라집니다. 백업해둔 24단어 니모닉이 없으면 pnp 계정은 영구히 복구 불가능합니다.
- 한 번도 로그인하지 않았다면 — 서버에 삭제할 데이터가 존재하지 않으며, 앱에 [계정 삭제] 메뉴도 나타나지 않습니다(로그인 상태에서만 노출).
- 로그인한 적이 있다면, 아래 세 가지 방법 중 하나로 계정 계층 데이터를 삭제할 수 있습니다.
- 앱 내에서 — iOS는 나 탭 → 우측 상단 ⚙ 메뉴 → 계정 섹션의 [계정 삭제], Android는 나 탭 화면 안 계정 영역의 [계정 삭제]입니다. 앱이
DELETE /api/auth/pubkey로 pnp 공개키 ↔ @핸들 매핑을 해제하고 로그아웃합니다. iOS에 등록된 APNs 기기 토큰이 있으면DELETE /api/relay/register로 같은 흐름에서 삭제됩니다. 계정 레코드 삭제는 아래 2·3번으로 요청해 주세요. - 웹에서 — delete-account.html 에서 삭제를 요청할 수 있습니다.
- 이메일 — dudnjsckrgo@gmail.com 으로 요청하면 계정 레코드(이메일·이름·프로필 사진 URL)를 포함해 전부 삭제합니다.
- 앱 내에서 — iOS는 나 탭 → 우측 상단 ⚙ 메뉴 → 계정 섹션의 [계정 삭제], Android는 나 탭 화면 안 계정 영역의 [계정 삭제]입니다. 앱이
- 삭제 요청은 접수 후 30일 이내에 처리합니다. 요청과 무관하게, APNs 토큰은 재등록이 없으면 최대 30일 안에 자동 만료됩니다.
문의
English
Q Presence is a presence-based social network with no central server for content. However, the app has two layers with entirely different properties, and in the second layer the developer's server does receive some data. This document draws that line precisely.
- Layer 1 — P2P content layer (no server): posts, photos, videos, chats, follows. Never passes through a developer server.
- Layer 2 — optional account / relay layer (collection happens): the developer-operated server
auth.ugot.ukreceives the data listed below.
Layer 1 — P2P content: what we never receive
- Account key — On install, a cryptographic keypair (Ed25519) is generated on your device — that key is your pnp identity. Basic use requires no email, phone number, or name. (Optional Google sign-in puts you into Layer 2.)
- Content (posts, photos, videos, messages) — Never stored on any server. While you are on-air, content is delivered end-to-end encrypted, device-to-device (P2P), and disappears when the session ends.
- Relationships / activity — Your following/follower lists and "time together" are stored solely on your device and never uploaded. A follow is delivered only to the other person's device over a signed P2P session — no server tally exists.
Layer 2 — optional account / relay layer: what we receive
The developer operates exactly one server, https://auth.ugot.uk, and it receives data only in the six cases below.
- Google sign-in (optional) — If you sign in with Google to claim an @handle, the app sends your Google ID token to
auth.ugot.ukto exchange it for a Q Presence token. The requested scopes areopenid profile email offline_access, and your email address, name, and profile picture URL are stored in a server account record. None of this happens if you never sign in. - pnp public key ↔ @handle mapping — After sign-in,
POST /api/auth/pubkeystores the link between your pnp public key (pnp:URI) and your @handle on the server. This mapping is kept with no expiry, and anyone, without authentication, can reverse-look-up a handle from a public key viaGET /api/auth/username-by-pubkey(that is the point of the feature). In other words, signing in publicly links your pseudonymous pnp identity to your Google-backed @handle. - iOS APNs device token — Because iOS blocks background P2P at the OS level, the iOS app registers its APNs device token via
POST /api/relay/register. The token is retained on the server for up to 30 days (the app periodically re-registers to refresh it) and is discarded immediately if Apple reports it as invalid. The Android app performs no such registration. - Relay wake target identifier — Every time you send a direct message, the app sends the recipient's pnp URI and a kind value (
dm) toPOST /api/relay/wake. This call happens regardless of whether you are signed in and regardless of whether the recipient is registered. When the recipient is a registered iOS user, the server sends a contentless APNs push to wake their app; message content is never sent to the server — the woken app connects to you directly over P2P to receive it. The server does not store target identifiers or wake history; for abuse (push-bomb) protection it uses only the first 8 bytes of a SHA-256 hash of the sender IP as a 5-minute window counter (raw IPs are neither stored nor logged). - Connection metadata during handle lookups — To show other people's @handles in your feed, the app sends their pnp public key in a lookup request. As with any HTTPS request, your IP address reaches the server.
- Subscription payments — Q Presence+ payments are processed by Apple's App Store or Google Play; card and payment-instrument details never reach us. Only when relay subscription gating is enabled on iOS, a StoreKit transaction proof (a JWS containing purchase history such as product ID and purchase/expiry timestamps) is sent to
auth.ugot.ukfor verification and bound to your account.
Retention
| Data | Retention |
|---|---|
| Account record (email, name, profile picture URL) | Until you request deletion |
| pnp public key ↔ @handle mapping | No expiry — until unbound or the account is deleted |
| iOS APNs device token | Up to 30 days (auto-expires without re-registration; deleted at once when invalidated) |
| Relay owner record (@handle) | 365 days (refreshed on each re-registration) |
| Wake abuse-protection counter (hashed IP) | 5 minutes |
| Wake target identifiers, message content | Not stored |
Stored only on your device
- Identity secret key — Android Keystore on Android, Keychain on iOS.
- Bookmarks — copies of posts you explicitly saved with the bookmark button. Kept only on your device, never uploaded, and the author is not notified.
- Block list — kept solely on your device; blocked people are not notified.
- Media cache — a temporary in-memory (RAM) cache to save bandwidth on revisits; cleared when the app closes.
Third-party infrastructure
- P2P discovery / relay (number0's public iroh infrastructure) — Devices may route through public iroh relay and discovery nodes to find each other and traverse NAT. In doing so, your node ID and connection address (IP) are exposed to that infrastructure. These nodes relay ciphertext only and cannot read content. This is third-party infrastructure, not a developer server.
- Developer-operated wake relay (
auth.ugot.uk) — the developer's own server handling the account, APNs, and wake functions described in Layer 2. It is separate from the iroh relays above, and message content never passes through it. - Google sign-in — optional sign-in uses Google Credential Manager (Android) / Google Sign-In (iOS). Google's own privacy policy governs Google's processing.
- Payments — handled by the Apple App Store / Google Play.
- Ads & analytics — we integrate no advertising SDK, analytics SDK, or crash-reporting server, and we do not declare the advertising ID (AD_ID) permission. However, because the app uses Google sign-in (Credential Manager), Google Play services components are included in the app (e.g.
com.google.android.datatransport.runtime.*in the release merged manifest); these are components Google Play services uses for its own diagnostics/transport. Q Presence collects no data through that path.
Permissions
- Microphone — only to record voice messages; recordings are deleted immediately after sending and are never stored on a server.
- Notifications — ① a persistent notification, always visible while you are on-air, with an explicit stop action; ② a local notification when someone you follow comes on-air. On Android both are generated on-device — never server push. On iOS, only if you registered with the relay, a contentless APNs push is additionally used to wake the app.
Account deletion / data deletion requests
- Device data — Uninstalling the app removes your pnp account key and all local data from the device. Without your backed-up 24-word mnemonic, the pnp account is permanently unrecoverable.
- If you never signed in — there is no server-side data to delete, and the app shows no [Delete account] item at all (it appears only while signed in).
- If you have signed in, you can delete the account-layer data in any of three ways:
- In the app — on iOS: the Me tab → the ⚙ menu at the top right → [Delete account] in the Account section; on Android: [Delete account] in the account area of the Me tab screen itself. The app calls
DELETE /api/auth/pubkeyto unbind the pnp public key ↔ @handle mapping and signs you out. If an APNs device token is registered on iOS, it is deleted in the same flow viaDELETE /api/relay/register. To delete the account record, use option 2 or 3 below. - On the web — request deletion at delete-account.html.
- By email — write to dudnjsckrgo@gmail.com and we will delete everything, including the account record (email, name, profile picture URL).
- In the app — on iOS: the Me tab → the ⚙ menu at the top right → [Delete account] in the Account section; on Android: [Delete account] in the account area of the Me tab screen itself. The app calls
- Deletion requests are processed within 30 days. Independently of any request, APNs tokens auto-expire within 30 days if not re-registered.