Skip to content

chore(mobile,marketing): app store submission metadata and privacy policy - #6408

Merged
saddlepaddle merged 3 commits into
mainfrom
store-readiness
Aug 13, 2026
Merged

saddlepaddle merged 3 commits into
mainfrom
store-readiness

Conversation

@saddlepaddle

@saddlepaddle saddlepaddle commented Aug 13, 2026 •

Copy link
Copy Markdown
Collaborator

The final code/content changes before TestFlight (launch-gate D3, D4, D7, D8):

  • iPhone-only (supportsTablet: false): no iPad screenshot set, no iPad review pass, and no stretched phone UI judged on a 13" display. One-way-door aware: device families can be added in any later update but never removed, so claiming iPad now would be irreversible.
  • Review contact (store.config.json): real phone — the org Google Voice number, which is intentionally public-safe (it also serves as the published EU trader phone if we later enable EU storefronts). Review notes rewritten: Sign in with Apple creates a free account instantly (no demo credentials), companion-app empty state explained, account deletion location cited.
  • Privacy policy: covers the mobile app (photo/camera/mic/speech permissions), names analytics (PostHog, identified), user content storage, and the grace-period deletion flow on mobile/desktop/web — including the 30-day recovery window and de-identified retention of shared-org content. Apple reviewers check that the policy matches the app.

Not included by design: app name stays "Superset Mobile" (D5), EU storefronts deferred (D6 — trader declaration is an ASC manual step regardless).

After this: manual ASC steps (age rating questionnaire, privacy nutrition labels, screenshots, trader declaration) → eas metadata:push → first production build → TestFlight.


Summary by cubic

Makes the iOS app iPhone‑only, updates App Store metadata (title, review contact, pro‑gated companion‑app notes and demo access), and expands the privacy policy for mobile permissions, analytics, and the 30‑day account deletion window. This narrows v1 review scope and aligns storefront and policy with real behavior.

What to review

  • Device family: supports iPhone only (supportsTablet: false, was true).
  • Store title: renamed from “Superset Mobile” to “Superset: AI Agent Manager”.
  • Review metadata: phone updated to +1 510 519 1602; demoRequired set to true (was false); notes clarify no in‑app purchases, external Pro subscription, companion‑app scope, demo access via “Sign in with email,” and that SSO creates a free account that lands on the subscription‑required screen; deletion path called out.
  • Privacy policy: adds mobile permissions (photos, camera, mic, speech recognition), identifies analytics (PostHog) tied to account identifiers, and documents immediate deactivation, a 30‑day recovery window, and de‑identified retention for shared org content.

Rollout

  • Complete App Store Connect items (age rating, privacy labels, screenshots, trader declaration), ensure demo account is live and referenced in review notes, run eas metadata:push, build, and submit to TestFlight.

Written for commit 801a82a. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Documentation

    • Updated the privacy policy with details about third-party sign-ins, AI-agent messages and attachments, analytics, device data, mobile capabilities, and account deletion timelines.
    • Clarified data retention for shared organizational content after account deletion.
  • Configuration

    • Updated iOS settings to disable tablet support.
    • Renamed the app to “Superset: AI Agent Manager.”
    • Expanded App Store review guidance for sign-in, onboarding, subscriptions, support, and account deletion.

…licy

iPhone-only for v1 (supportsTablet: false — device families can be
added later but never removed), real review contact phone (org Google
Voice, intentionally public-safe), review notes covering Sign in with
Apple instant signup and the companion-app empty state, and privacy
policy coverage for the mobile app, analytics, and the grace-period
deletion flow across all clients.
@coderabbitai

coderabbitai Bot commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The privacy policy now covers mobile applications, data collection, permissions, and account deletion. The mobile configuration disables tablet support and updates the App Store title and review metadata.

Changes

Privacy and mobile release updates

Layer / File(s) Summary
Privacy policy disclosures
apps/marketing/content/legal/privacy.mdx
The policy adds mobile app, sign-in provider, AI-agent, analytics, device data, permissions, and account deletion details.
Mobile release configuration
apps/mobile/app.config.ts, apps/mobile/store.config.json
The iOS configuration disables tablet support. The App Store title and review metadata now contain updated product, support, sign-in, onboarding, and account deletion information.

Estimated code review effort: 2 (Simple) | ~10 minutes

Mergeability Score: 🟡 Moderate · up to 801a8

The release metadata currently conflicts with the requirement to keep the app name “Superset Mobile,” and the privacy policy may inaccurately describe speech-data transmission boundaries. These issues could cause App Store submission or privacy-review problems, so the PR is not merge-ready until they are resolved or explicitly accepted.

Suggested reviewers: kitenite

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title uses conventional commit format and clearly summarizes the mobile metadata and privacy policy changes.
Description check ✅ Passed The description clearly explains the purpose, scope, key changes, and rollout steps, although it does not list completed tests or checklist status.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch store-readiness

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/marketing/content/legal/privacy.mdx`:
- Line 34: Update the mobile application privacy disclosure to state that
microphone audio may be sent to Apple for speech recognition before the user
sends a message, reflecting the default expo-speech-recognition behavior. Revise
the “only transmitted when you choose to send them” wording so it applies only
to Superset data, such as photos and dictated text sent in messages.
- Line 75: Update the account-deletion policy text to accurately describe the
implemented behavior: deletion deactivates the account and revokes credentials
without claiming automatic permanent purge or de-identification, and signing in
should be described as entering the recovery flow rather than automatically
restoring the account. Keep the guidance for exercising other rights unchanged.
- Line 24: Update the “Usage Data” disclosure to accurately describe PostHog
identity coverage, including authenticated account identifiers, server-event
distinct IDs, and anonymous or unlinked events. State that reset and opt-out do
not remove historical data, account deletion does not invoke provider deletion,
server captures may not honor client opt-out, and explain the applicable
retention process—or implement provider deletion and server-side opt-out
handling instead.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fa26b34e-9085-43cd-907e-c1d5707ab864

📥 Commits

Reviewing files that changed from the base of the PR and between 7d87558 and 88a24ba.

📒 Files selected for processing (3)
  • apps/marketing/content/legal/privacy.mdx
  • apps/mobile/app.config.ts
  • apps/mobile/store.config.json


- **Usage Data:** We collect information about how you interact with our services, including pages visited, features used, and time spent.
- **Device Data:** We may collect device identifiers, operating system version, browser type, and similar technical information.
- **Usage Data:** We collect information about how you interact with our services, including pages visited, screens viewed, features used, and time spent. We use analytics providers (such as PostHog) to process this data, associated with your account identifier, name, and email address.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n -C 6 -i 'posthog|identify\s*\(|capture\s*\(' \
  --glob '*.{ts,tsx,js,jsx}' .

Repository: superset-sh/superset

Length of output: 50377


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- PostHog identity and event calls ---'
rg -n --glob '*.{ts,tsx,js,jsx}' \
  '\b(posthog|client|ph)\.(identify|capture|screen)\s*\(|\bposthog\.capture\s*\(' \
  apps packages \
  | rg -v 'stories|test|node_modules' \
  | head -n 400

printf '%s\n' '--- PostHog reset, opt-out, and deletion-related code ---'
rg -n -i --glob '*.{ts,tsx,js,jsx}' \
  'posthog\.(reset|opt_out_capturing|opt_in_capturing|alias|identify)|delete.*(account|user)|account.*delete|deletion|erase|purge' \
  apps packages \
  | rg -v 'stories|test|node_modules' \
  | head -n 500

printf '%s\n' '--- Privacy policy context ---'
cat -n apps/marketing/content/legal/privacy.mdx | sed -n '1,80p'

Repository: superset-sh/superset

Length of output: 50376


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

files=(
  apps/admin/src/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx
  apps/web/src/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx
  apps/mobile/screens/RootLayout/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx
  apps/desktop/src/renderer/components/PostHogUserIdentifier/PostHogUserIdentifier.tsx
  apps/desktop/src/renderer/hooks/useSignOut/useSignOut.ts
  packages/trpc/src/trpc.ts
  packages/trpc/src/router/user/user.ts
  packages/trpc/src/router/admin/admin.ts
  packages/trpc/src/lib/analytics.ts
  apps/marketing/src/instrumentation-client.ts
  apps/marketing/src/components/CookieConsent/CookieConsent.tsx
  apps/marketing/src/app/components/WaitlistForm/WaitlistForm.tsx
)

for file in "${files[@]}"; do
  if [ -f "$file" ]; then
    printf '\n--- %s ---\n' "$file"
    cat -n "$file" | sed -n '1,220p'
  fi
done

Repository: superset-sh/superset

Length of output: 33450


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

roots = [Path("apps"), Path("packages")]
patterns = re.compile(r"\b(?:posthog|client)\.(?:capture|identify|screen)\s*\(")

for root in roots:
    for path in root.rglob("*"):
        if path.suffix not in {".ts", ".tsx", ".js", ".jsx"}:
            continue
        if any(part in {"node_modules", "stories"} or part.endswith(".test") for part in path.parts):
            continue
        try:
            lines = path.read_text().splitlines()
        except UnicodeDecodeError:
            continue
        hits = [i for i, line in enumerate(lines) if patterns.search(line)]
        if not hits:
            continue
        print(f"\n--- {path} ---")
        for i in hits:
            start = max(0, i - 2)
            end = min(len(lines), i + 14)
            print(f"[lines {start + 1}-{end}]")
            for n in range(start, end):
                print(f"{n + 1}: {lines[n]}")
PY

Repository: superset-sh/superset

Length of output: 29985


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

cat -n apps/marketing/content/legal/privacy.mdx | sed -n '1,70p'
printf '\n--- all PostHog deletion/erasure API references ---\n'
rg -n -i --glob '*.{ts,tsx,js,jsx}' \
  'posthog|person.*delete|delete.*person|erase.*(data|user)|data.*(deletion|deletion)|privacy.*request|gdpr' \
  apps packages \
  | rg -i 'delete|erase|reset|opt.?out|posthog|privacy|gdpr' \
  | rg -v 'stories|test|node_modules' \
  | head -n 400

Repository: superset-sh/superset

Length of output: 42449


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- Desktop telemetry preference flow ---'
cat -n apps/desktop/src/renderer/components/TelemetrySync/TelemetrySync.tsx | sed -n '1,140p'
rg -n -C 5 --glob '*.{ts,tsx}' \
  'TelemetrySync|opt_in_capturing|opt_out_capturing|deleteAccount|reactivateAccount' \
  apps/desktop apps/mobile apps/web apps/admin packages \
  | rg -v 'stories|test|node_modules' \
  | head -n 350

printf '%s\n' '--- Account deletion UI and surrounding session behavior ---'
for file in \
  apps/mobile/screens/'(authenticated)'/settings/hooks/useDeleteAccount/useDeleteAccount.ts \
  apps/mobile/screens/'(authenticated)'/settings/account/AccountSettingsScreen.tsx \
  apps/web/src/app/'(dashboard-legacy)'/settings/account/page.tsx \
  apps/desktop/src/renderer/routes/_authenticated/settings/account/components/AccountSettings/AccountSettings.tsx
do
  if [ -f "$file" ]; then
    printf '\n--- %s ---\n' "$file"
    cat -n "$file" | sed -n '1,260p'
  fi
done

Repository: superset-sh/superset

Length of output: 40362


🌐 Web query:

PostHog JavaScript SDK reset opt_out_capturing delete person historical events documentation

💡 Result:

In the PostHog JavaScript SDK, you can control data collection using specific opt-out methods, and you can manage historical data through the PostHog API or interface. Opting Out of Capture To prevent data collection on the client side, use the following methods: - posthog.opt_out_capturing: This disables event tracking and data persistence (such as cookies or localStorage) for the current instance [1][2]. - posthog.opt_in_capturing: This re-enables data collection if a user previously opted out [3][4]. - posthog.has_opted_out_capturing: Use this to check the user's current opt-out status [3][5]. - opt_out_capturing_by_default: You can initialize the SDK with this option set to true to ensure no data is captured until the user provides consent [3][4]. Resetting the User To clear user state (e.g., when a user logs out or switches accounts), use posthog.reset [6][7]. This unlinks future events from the previous user's profile [6][7]. Note that calling reset returns the instance to its default consent state; if you use opt_out_capturing_by_default: true, reset will effectively stop capturing until you call opt_in_capturing again [1]. Deleting Historical Events The PostHog JavaScript SDK does not provide a direct method to delete historical events already ingested into the platform. Instead, you must use PostHog's data management tools: - Via the PostHog API: You can use the Bulk Delete Persons endpoint to delete a person and their associated events [8]. To delete the events specifically, include the delete_events=true parameter in your request [8]. - Via the PostHog UI: You can navigate to the Persons tab, search for the user, and select the option to delete the person, which removes them and all associated data [8][9]. - Filtering: If you simply want to exclude certain data from your analytics without deleting it, you can add filters in your project settings (e.g., internal and test account filtering) [6][7].

Citations:


Align the PostHog disclosure with the actual data flow.

Authenticated clients identify users with account ID, name, and email. However, server events often include only distinctId, while anonymous marketing, pageview, and unlinked Slack events have no account identity. posthog.reset() and opt_out_capturing() do not delete historical PostHog data. Account deletion also does not call a PostHog deletion API, and server captures do not honor client opt-out. State these limits and the retention process, or add provider deletion and server-side opt-out handling.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/marketing/content/legal/privacy.mdx` at line 24, Update the “Usage Data”
disclosure to accurately describe PostHog identity coverage, including
authenticated account identifiers, server-event distinct IDs, and anonymous or
unlinked events. State that reset and opt-out do not remove historical data,
account deletion does not invoke provider deletion, server captures may not
honor client opt-out, and explain the applicable retention process—or implement
provider deletion and server-side opt-out handling instead.


### 2.4 Mobile Application

Our mobile application lets you monitor and chat with AI agents running in your workspaces. With your permission, it can access your photo library, camera, and microphone so you can attach images to messages and dictate text; speech recognition may be processed by Apple. Photos and dictated text are only transmitted when you choose to send them. The mobile application collects the same account, usage, and device data described above.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n -C 8 -i 'speech|microphone|camera|photo|attachment|upload|transcrib|recogn' \
  apps/mobile --glob '*.{ts,tsx,js,jsx}'

Repository: superset-sh/superset

Length of output: 50377


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- speech-recognition references ---'
rg -n -C 6 -i 'expo-speech-recognition|SpeechRecognizer|speechToText|transcrib|recognition' apps/mobile \
  --glob '*.{ts,tsx,js,jsx,json}' \
  | head -n 400

printf '%s\n' '--- mobile package metadata ---'
rg -n -C 3 'expo-speech-recognition|expo-av|react-native-voice' apps/mobile package.json bun.lockb bun.lock 2>/dev/null || true

printf '%s\n' '--- privacy policy context ---'
cat -n apps/marketing/content/legal/privacy.mdx | sed -n '20,42p'

Repository: superset-sh/superset

Length of output: 28593


🌐 Web query:

expo-speech-recognition 56.0.1 iOS requiresOnDeviceRecognition default Apple server SFSpeechRecognizer

💡 Result:

In expo-speech-recognition version 56.0.1, the requiresOnDeviceRecognition option for iOS defaults to false [1][2][3]. When requiresOnDeviceRecognition is set to false (the default), the library utilizes Apple's standard SFSpeechRecognizer behavior, which sends audio data to Apple's servers for processing [4][5]. When set to true, it forces the underlying SFSpeechRecognitionRequest to perform recognition entirely on-device, preventing audio from being sent over the network [6][7][5]. Key considerations for using requiresOnDeviceRecognition: 1. Performance and Accuracy: Apple notes that on-device recognition may be less accurate than server-based recognition [6][7]. 2. Availability: Not all locales are supported for on-device recognition [5]. Before enabling this option, you should verify support for the target locale using the library's provided utility, ExpoSpeechRecognitionModule.supportsOnDeviceRecognition [8][9]. 3. System Requirements: For on-device recognition to succeed on iOS, the user must have the appropriate dictation language downloaded and enabled in their device settings (General > Keyboard > Dictation) [10]. If the required language model is missing or the configuration is incomplete, the request will fail [9][10]. 4. Privacy: Setting requiresOnDeviceRecognition to true is the primary method for ensuring that audio data never leaves the device, which is often a critical requirement for privacy-focused applications [5].

Citations:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

sed -n '1,150p' 'apps/mobile/screens/(authenticated)/(home)/home/components/NewChatWidget/hooks/useVoiceDictation/useVoiceDictation.ts'
rg -n -C 5 'requiresOnDevice|onDevice|SFSpeech|recognitionRequest|processLocally|speech' . \
  --glob '!bun.lock' \
  --glob '!apps/mobile/components/ai-elements/**' \
  --glob '!**/*.stories.*' \
  | head -n 300

Repository: superset-sh/superset

Length of output: 27676


Disclose microphone audio sent to Apple.

On iOS, expo-speech-recognition uses Apple’s server-based recognition by default because requiresOnDeviceRecognition is not set. State that microphone audio may be sent to Apple before the user sends the message. Limit “only transmitted” to Superset data.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/marketing/content/legal/privacy.mdx` at line 34, Update the mobile
application privacy disclosure to state that microphone audio may be sent to
Apple for speech recognition before the user sends a message, reflecting the
default expo-speech-recognition behavior. Revise the “only transmitted when you
choose to send them” wording so it applies only to Superset data, such as photos
and dictated text sent in messages.

- The right to data portability

To exercise these rights, please contact us using the information provided below.
You can delete your account at any time from Settings → Account → Delete account in our mobile or desktop applications, or from your account settings on our website. Your account is deactivated immediately and permanently deleted after a 30-day recovery period, during which you can restore it by signing back in. After deletion, content you created in shared organizations is retained in de-identified form as part of those organizations' records. To exercise your other rights, please contact us using the information provided below.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n -C 8 -i \
  'Delete account|deleteAccount|restore|30.?day|permanently deleted|de-ident|anonym|onDelete' \
  apps packages --glob '*.{ts,tsx,js,jsx,md,mdx}'

Repository: superset-sh/superset

Length of output: 50377


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- privacy policy ---'
sed -n '60,85p' apps/marketing/content/legal/privacy.mdx

printf '%s\n' '--- account-deletion candidates ---'
rg -l -i \
  'delete account|deleteAccount|account deletion|deletion request|30.?day|recover.*account|restore.*account|de-identif|anonymiz' \
  apps packages \
  --glob '*.{ts,tsx,js,jsx,md,mdx}' \
  --glob '!**/node_modules/**' \
  | sort

printf '%s\n' '--- exact account-deletion references ---'
rg -n -i \
  'delete account|deleteAccount|account deletion|deletion request|recover.*account|restore.*account|de-identif|anonymiz' \
  apps packages \
  --glob '*.{ts,tsx,js,jsx,md,mdx}' \
  --glob '!**/node_modules/**' \
  | head -n 500

Repository: superset-sh/superset

Length of output: 9829


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- relevant route and API filenames ---'
rg --files apps packages | rg -i \
  '(account|user|session|privacy|delete|restore|recover|admin)' \
  | rg -i '(settings|auth|api|router|route|hook|legal|content)' \
  | head -n 500

printf '%s\n' '--- deletion-related API procedures and database operations ---'
rg -n -i \
  '(delete|restore|recover|deactivat|anonym|purge).*(account|user|member)| (account|user).*(delete|restore|recover|deactivat|anonym|purge)' \
  apps packages \
  --glob '*.{ts,tsx,js,jsx}' \
  --glob '!**/node_modules/**' \
  | head -n 500

Repository: superset-sh/superset

Length of output: 50376


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

for file in \
  packages/shared/src/constants.ts \
  packages/trpc/src/router/user/user.ts \
  packages/trpc/src/router/admin/admin.ts \
  apps/web/src/app/'(dashboard-legacy)'/settings/account/page.tsx \
  apps/web/src/app/account-pending-deletion/page.tsx \
  apps/web/src/proxy.ts \
  apps/desktop/src/renderer/routes/_authenticated/settings/account/components/AccountSettings/AccountSettings.tsx \
  apps/desktop/src/renderer/routes/_authenticated/components/PendingDeletionScreen/PendingDeletionScreen.tsx \
  apps/mobile/screens/account-pending-deletion/AccountPendingDeletionScreen.tsx
do
  printf '\n--- %s ---\n' "$file"
  wc -l "$file"
  rg -n -C 10 \
    'ACCOUNT_DELETION_GRACE_DAYS|deleteAccount|pending.?deletion|restore|deactivat|perman|shared|organization|organizationId|author|createdBy|anonym|de-ident' \
    "$file" || true
done

Repository: superset-sh/superset

Length of output: 23665


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- admin.deleteUser call sites ---'
rg -n -C 5 \
  'admin\.deleteUser|deleteUser\.mutate|deleteUser\.mutateAsync|deleteUser' \
  apps packages \
  --glob '*.{ts,tsx,js,jsx}' \
  --glob '!**/node_modules/**'

printf '%s\n' '--- complete user deletion and reactivation mutations ---'
sed -n '60,155p' packages/trpc/src/router/user/user.ts

printf '%s\n' '--- pending-deletion routing and sign-in recovery ---'
rg -n -C 8 \
  'deletionRequestedAt|reactivateAccount|PendingDeletionScreen|account-pending-deletion|signIn' \
  apps/web apps/desktop apps/mobile packages/auth packages/trpc \
  --glob '*.{ts,tsx,js,jsx}' \
  --glob '!**/node_modules/**' \
  | head -n 1000

Repository: superset-sh/superset

Length of output: 50376


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- user-linked persisted content fields ---'
rg -n -C 3 \
  '(createdBy|creatorId|authorId|userId|ownerId|assignedTo|created_by|author_id|user_id)' \
  packages/db/src/schema packages/local-db/src/schema \
  --glob '*.ts' \
  | head -n 1200

printf '%s\n' '--- delete-user cascade behavior in schema ---'
rg -n -C 4 \
  'references\(\(\) => users\.id|references\(\(\) => members\.|onDelete: "cascade"|onDelete: "set null"' \
  packages/db/src/schema packages/local-db/src/schema \
  --glob '*.ts' \
  | head -n 1200

printf '%s\n' '--- explicit anonymization or author replacement logic ---'
rg -n -C 8 -i \
  'de-ident|deident|anonym|anonymous|author.*(null|deleted|unknown)|createdBy.*(null|deleted|unknown)|userId.*(null|deleted|unknown)' \
  apps packages \
  --glob '*.{ts,tsx,js,jsx,sql}' \
  --glob '!**/node_modules/**' \
  | head -n 1000

Repository: superset-sh/superset

Length of output: 50377


Align the policy with the deletion implementation. user.deleteAccount only marks the account and revokes credentials; no scheduled path invokes admin.deleteUser. Signing in opens the recovery flow but does not restore the account automatically. The purge also deletes user-authored shared content through cascading foreign keys, with no de-identification step.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/marketing/content/legal/privacy.mdx` at line 75, Update the
account-deletion policy text to accurately describe the implemented behavior:
deletion deactivates the account and revokes credentials without claiming
automatic permanent purge or de-identification, and signing in should be
described as entering the recovery flow rather than automatically restoring the
account. Keep the guidance for exercising other rights unchanged.

@github-actions

github-actions Bot commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch

Thank you for your contribution! 🎉

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/mobile/store.config.json (1)

8-8: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Restore the required App Store title.

The PR objective says to keep the app name as Superset Mobile, but this value publishes Superset: AI Agent Manager. Restore Superset Mobile, or update the release requirement before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/mobile/store.config.json` at line 8, Update the title value in the app
store configuration to “Superset Mobile” so the published app name matches the
release requirement.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@apps/mobile/store.config.json`:
- Line 8: Update the title value in the app store configuration to “Superset
Mobile” so the published app name matches the release requirement.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 063fa0d5-87fa-424f-b588-cfd70e674466

📥 Commits

Reviewing files that changed from the base of the PR and between e8f84df and 801a82a.

📒 Files selected for processing (1)
  • apps/mobile/store.config.json

@saddlepaddle
saddlepaddle merged commit 1f7375a into main Aug 13, 2026
19 checks passed

This branch was previously deployed

1 inactive deployment
preview — 801a82a0 Deployed Aug 13, 2026 by saddlepaddle via Deploy Admin #7583
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant