# Naming Audit — flutter_demo

Read-only scoping report. Captures every product-name occurrence in the repo
plus the launch-blockers a rename pass would need to fix. No code was changed
to produce this report.

**Date:** 2026-05-21
**Canonical brand per CLAUDE.md:** **"All Gifted Math"** (two words).
**Search terms covered:** `AllGifted Math`, `All Gifted Math`, `Singapore Math`,
`S'pore Pri`, `AGS Math`, `math app`, plus `app_name` / `appName` / `APP_NAME` /
`android:label` / `CFBundleName` / `CFBundleDisplayName` / `PRODUCT_NAME` /
`PRODUCT_BUNDLE_IDENTIFIER`, and all `ag_math` / `allgifted` slug variants.
**Not found:** `S'pore Pri`, `AGS Math`. No fastlane/ or store metadata/
directory exists — App Store / Play Store copy lives in App Store Connect and
Play Console, not in this repo. No notification packages are installed
(no `firebase_messaging`, no `flutter_local_notifications`), so there are no
notification sender names to rename.

---

## 1. Occurrences by spelling

### "All Gifted Math" (canonical brand — 2 words)

| File | Line | Current string |
|---|---|---|
| `pubspec.yaml` | 2 | `description: All Gifted Math` |
| `web/index.html` | 5 | `<title>All Gifted Math</title>` |
| `web/manifest.json` | 8 | `"description": "All Gifted Math App."` |
| `lib/main.dart` | 59 | `title: 'All Gifted Math',` (MaterialApp title) |
| `lib/screens/startup_splash_screen.dart` | 76 | `'All Gifted Math'` (splash brand text) |
| `lib/screens/subject_select_screen.dart` | 314 | `Text('All Gifted Math', style: AppFontStyles.heading2)` |

### "AllGifted Math" (one-word variant — INCONSISTENT)

| File | Line | Current string |
|---|---|---|
| `AUDIT.md` | 1 | `# AllGifted Math — Flutter Codebase Audit` |
| `CLAUDE.md` | 1 | `# AllGifted Math — Flutter app` |
| `lib/services/payment/payment_service_mobile.dart` | 63 | `merchantDisplayName: 'AllGifted Math'` (Stripe — **shown to user at payment**) |
| `lib/services/payment/payment_service_mobile.dart` | 132 | `merchantDisplayName: 'AllGifted Math'` (Stripe — second call site) |
| `lib/services/payment/payment_service_web.dart` | 4 | `'…available in the AllGifted Math '` (paywall copy) |
| `lib/widgets/subscription/get_the_app_panel.dart` | 55 | `'…available in the AllGifted Math '` (paywall copy) |

### "AG Math" / "Ag Math" (abbreviated — INCONSISTENT)

| File | Line | Current string |
|---|---|---|
| `ios/Runner/Info.plist` | 8 | `<key>CFBundleDisplayName</key><string>Ag Math</string>` (**iOS home-screen icon label**) |
| `lib/utils/smooth_page_transitions.dart` | 3 | `/// Smooth page transitions for AG Math app` (comment only) |

### "ag_math" / "allgifted_math" (package / identifier — slug form)

| File | Line | Current string |
|---|---|---|
| `pubspec.yaml` | 1 | `name: ag_math` |
| `README.md` | 1 | `# ag_math` |
| `web/manifest.json` | 2-3 | `"name": "allgifted_math"`, `"short_name": "allgifted_math"` (**PWA install label**) |
| `android/app/src/main/AndroidManifest.xml` | 3 | `android:label="ag_math"` (**Android launcher label**) |
| `ios/Runner/Info.plist` | 16 | `<key>CFBundleName</key><string>ag_math</string>` |
| `macos/Runner/Configs/AppInfo.xcconfig` | 8, 11 | `PRODUCT_NAME = ag_math`; `PRODUCT_BUNDLE_IDENTIFIER = com.example.agMath` |
| `macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme` | 18, 34, 69, 86 | `BuildableName = "ag_math.app"` |
| `macos/Runner.xcodeproj/project.pbxproj` | 67, 134, 220, 391, 405, 419 | `ag_math.app` references |
| `windows/CMakeLists.txt` | 3, 7 | `project(ag_math …)`, `set(BINARY_NAME "ag_math")` |
| `windows/runner/main.cpp` | 30 | `window.Create(L"ag_math", …)` (**Windows window title**) |
| `windows/runner/Runner.rc` | 93, 95, 97, 98 | `FileDescription`, `InternalName`, `OriginalFilename`, `ProductName` all `"ag_math"` |
| `linux/CMakeLists.txt` | 7, 10 | `BINARY_NAME "ag_math"`, `APPLICATION_ID "com.example.ag_math"` |
| `linux/runner/my_application.cc` | 48, 52 | `gtk_header_bar_set_title(…, "ag_math")`, `gtk_window_set_title(…, "ag_math")` |
| `ios/Runner.xcodeproj/project.pbxproj` | 371, 387, 404, 419, 550, 572 | `PRODUCT_BUNDLE_IDENTIFIER = com.example.agMath` / `.RunnerTests` |

### "Singapore Math"

| File | Line | Current string |
|---|---|---|
| `CLAUDE.md` | 3 | `K-P6 Singapore Math, IRT-based adaptive learning…` (Claude guidance only — not in product code) |

### "math app" (generic / placeholder)

| File | Line | Current string |
|---|---|---|
| `web/index.html` | 6 | `<meta name="description" content="A Duolingo-style math app" />` (**SEO description — placeholder + competitor name**) |
| `web/manifest.json` | 8 | `"description": "All Gifted Math App."` |
| `lib/utils/smooth_page_transitions.dart` | 3 | `/// Smooth page transitions for AG Math app` |

---

## 2. Launch blockers

These are the items that would fail review on the App Store / Play Store, or
that ship today in a brand-inconsistent state visible to end users.

### 2.1 Five different spellings ship in the binary

The repo currently contains five distinct product-name spellings, three of
which are user-facing:

- `All Gifted Math` ← canonical
- `AllGifted Math` ← one-word variant, including the Stripe payment sheet
- `Ag Math` ← iOS home-screen icon label
- `ag_math` ← Android launcher label, Windows window title, Linux window title
- `allgifted_math` ← PWA install label

A rename pass should converge all five on `All Gifted Math` (for display) and
keep `ag_math` only where a slug/identifier is technically required.

### 2.2 Stripe merchant display name uses the wrong spelling

`lib/services/payment/payment_service_mobile.dart:63` and `:132` both pass
`merchantDisplayName: 'AllGifted Math'` to the Stripe payment sheet. This is
brand-critical surface area — it appears in the iOS / Android native payment
sheet at the moment the user authorizes a charge. Should be `All Gifted Math`.

### 2.3 `com.example.*` bundle identifiers (Store-rejection risk)

Android was fixed in `android/app/build.gradle.kts:18,32` (`com.allgifted.math`),
but every other platform still ships the `flutter create` template default:

- iOS — `ios/Runner.xcodeproj/project.pbxproj:371, 550, 572` → `com.example.agMath`
  (and `:387, 404, 419` → `com.example.agMath.RunnerTests`)
- macOS — `macos/Runner/Configs/AppInfo.xcconfig:11` → `com.example.agMath`
  (and `macos/Runner.xcodeproj/project.pbxproj:388, 402, 416` for RunnerTests)
- Linux — `linux/CMakeLists.txt:10` → `com.example.ag_math`

App Store Connect will reject any upload using a `com.example.*` bundle ID;
this is a hard launch blocker for iOS. macOS and Linux are not currently
release targets, but the IDs are wrong regardless.

### 2.4 SEO meta still names a competitor

`web/index.html:6`:

```html
<meta name="description" content="A Duolingo-style math app" />
```

This is the page-level description Google/Bing index for the web app's root
URL. Ships the wrong product name and an explicit competitor reference. Should
be replaced with brand-approved copy before any marketing push to the web app.

### 2.5 Favicon hot-linked to backend (related risk)

Not strictly a naming issue, but surfaced here because a rename pass is the
natural place to localize brand assets:

- `web/index.html:10` — `<link rel="icon" … href="https://mathapi.allgifted.com/media/storage/favicons/favicon.ico" />`

A local `web/favicon.ico` exists but is unused. If the backend is down, the
favicon breaks; browser caching is also unpredictable for cross-origin
favicons. AUDIT.md line 226 also flags this.

---

## 3. What this audit does NOT cover

- **Store-listing copy** — title, subtitle, screenshots' caption text,
  promotional text. None of that lives in this repo; it lives in App Store
  Connect and Google Play Console and must be audited there separately.
- **Push-notification sender names** — the app has no notification packages
  installed (`firebase_messaging`, `flutter_local_notifications` are absent
  from `pubspec.yaml`), so there is nothing to rename in-repo today. If
  notifications are added later, the sender display name will need to match
  the canonical brand.
- **Email-from names** — sent by the Laravel backend (`mathapi.allgifted.com`),
  not this repo. Audit that repo separately.
- **Backend-served strings** — anything the API returns (e.g. error messages,
  marketing emails, receipt copy) is out of scope for this audit.
