From e96cd3cea11c1518021207daef889367fe489d85 Mon Sep 17 00:00:00 2001 From: h3p Date: Thu, 12 Feb 2026 16:55:14 +0100 Subject: [PATCH] appreview: add paywall disclosures and privacy policy links --- Neon Vision Editor/UI/NeonSettingsView.swift | 13 +++++++++++ PRIVACY.md | 24 ++++++++++++++++++++ README.md | 1 + docs/AppStoreReviewNotes.md | 2 ++ 4 files changed, 40 insertions(+) create mode 100644 PRIVACY.md diff --git a/Neon Vision Editor/UI/NeonSettingsView.swift b/Neon Vision Editor/UI/NeonSettingsView.swift index fa73262..03d5e38 100644 --- a/Neon Vision Editor/UI/NeonSettingsView.swift +++ b/Neon Vision Editor/UI/NeonSettingsView.swift @@ -39,6 +39,7 @@ struct NeonSettingsView: View { @State private var geminiAPIToken: String = SecureTokenStore.token(for: .gemini) @State private var anthropicAPIToken: String = SecureTokenStore.token(for: .anthropic) @State private var showSupportPurchaseDialog: Bool = false + private let privacyPolicyURL = URL(string: "https://github.com/h3pdesign/Neon-Vision-Editor/blob/main/PRIVACY.md")! @AppStorage("SettingsThemeName") private var selectedTheme: String = "Neon Glow" @AppStorage("SettingsThemeTextColor") private var themeTextHex: String = "#EDEDED" @@ -454,6 +455,9 @@ struct NeonSettingsView: View { VStack(alignment: .leading, spacing: 12) { Text("In-App Purchase is optional and only used to support the app.") .foregroundStyle(.secondary) + Text("One-time, non-consumable purchase. No subscription and no auto-renewal.") + .font(.footnote) + .foregroundStyle(.secondary) if supportPurchaseManager.canUseInAppPurchases { Text("Price: \(supportPurchaseManager.supportPriceLabel)") .font(.headline) @@ -467,6 +471,11 @@ struct NeonSettingsView: View { } .disabled(supportPurchaseManager.isPurchasing || supportPurchaseManager.isLoadingProducts) + Button("Restore Purchases") { + Task { await supportPurchaseManager.restorePurchases() } + } + .disabled(supportPurchaseManager.isLoadingProducts) + Button("Refresh Price") { Task { await supportPurchaseManager.refreshProducts() } } @@ -480,6 +489,10 @@ struct NeonSettingsView: View { .font(.footnote) .foregroundStyle(.secondary) } + + Link("Privacy Policy", destination: privacyPolicyURL) + .font(.footnote.weight(.semibold)) + if supportPurchaseManager.canBypassInCurrentBuild { Divider() Text("TestFlight/Sandbox: You can bypass purchase for testing.") diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..e8c2699 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,24 @@ +# Privacy Policy + +Neon Vision Editor does not collect, sell, or share personal data for analytics or advertising. + +## Data Handling + +- Local editor content stays on-device unless you explicitly open/save/export files. +- API tokens for optional AI providers are stored in Apple Keychain. +- No telemetry is sent by default. + +## Network Use + +- Network requests occur only when you explicitly use optional AI/completion providers. +- Requests are sent over HTTPS to the selected provider endpoint. + +## In-App Purchase + +- The support purchase is a one-time, non-consumable purchase. +- No auto-renewing subscription is used. +- Core app functionality is not locked behind the support purchase. + +## Contact + +For privacy questions, use the security contact in `SECURITY.md`. diff --git a/README.md b/README.md index 1038250..f916c00 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ Full release history: [`CHANGELOG.md`](CHANGELOG.md) ## Privacy & Security +- Privacy policy: [`PRIVACY.md`](PRIVACY.md). - API keys are stored in Keychain (`SecureTokenStore`), not `UserDefaults`. - Network traffic uses HTTPS. - No telemetry. diff --git a/docs/AppStoreReviewNotes.md b/docs/AppStoreReviewNotes.md index b641721..8e3ede8 100644 --- a/docs/AppStoreReviewNotes.md +++ b/docs/AppStoreReviewNotes.md @@ -12,6 +12,8 @@ - Users can use the full app without purchasing. - Purchase UI is in Settings -> Support. - "Restore Purchases" is available in the same Support dialog. +- Support purchase is one-time and non-consumable (no subscription / no auto-renewal). +- Privacy policy link is shown in-app in the Support tab and documented in `PRIVACY.md`. ## Test Notes - Local StoreKit config file included at: