Closer/docs/NameChange.md

102 lines
9.5 KiB
Markdown
Raw Normal View History

# App rename: "Closer" → "Closer Couples"
> Audit + decision record for renaming the product's public name to **"Closer Couples"**.
> Status: **executed in repo.** Store-console changes remain external owner steps.
>
> **2026-07-09 extension — in-app prose now renamed.** The original pass was store/marketing only
> (in-app copy deliberately stayed "Closer"). Owner decision to extend: **in-app *prose* copy now uses
> "Closer Couples"** across Android + iOS (settings, pairing, invite share, widget headlines, paywall
> subhead/thank-you, age gate, privacy body, iOS settings/onboarding/pairing). The **launcher label and
> wordmark logos still stay "Closer"** (owner kept these — truncation under the icon, and the logo is a
> brand mark). See "What still stays 'Closer'" below. No technical identifiers touched; Android compiles +
> unit tests green (`TodayWidgetTest` assertions updated).
## Context
After auditing every occurrence of the name across Android, iOS, images, and docs, the chosen approach is a deliberate **two-tier branding** outcome:
- **Store & marketing name** = "Closer Couples"
- **Installed-app name** (home-screen launcher label + every in-app string) **stays "Closer"** — it fits under the icon ("Closer Couples" at 14 chars truncates to "Closer Coupl…") and avoids a full in-app rewrite.
**Most important consequence:** no code changes, no rebuild, no app re-release. And critically — **the only thing users actually see change (the store listing title + the feature graphic) is set in the Google Play / App Store console, which is an EXTERNAL step performed by the owner.** Editing this repo does not rename anything that is live; the repo work is (a) the source-of-truth feature-graphic asset, (b) doc/record housekeeping. The wordless C-heart-keyhole icon/logo is unaffected (icon SVG sources contain zero `<text>`).
## Technical identifiers that must NOT change
Renaming any of these breaks builds / Firebase / the Play listing:
`namespace app.closer` · `applicationId closer.app` · package `app.closer.*` + `class CloserApp` · deep-link host `closer.app` + `closer://` scheme · Firebase `closer-app-22014` (`google-services.json`, `GoogleService-Info.plist`) · iOS `PRODUCT_BUNDLE_IDENTIFIER app.closer.iphone` + `bundleIdPrefix app.closer` + product/target/scheme `Closer` · SPM package `Closer` · Gradle `rootProject.name "Closer"` · resource filenames (`closer_launcher_*`, `ic_notification_closer`, `ic_launcher*`) · XML styles `Theme.Closer[.Splash]` · entitlement id `closer_premium` · crypto AAD constants.
## What still stays "Closer" (after the 2026-07-09 prose extension)
- **Android launcher label** — `app/src/main/res/values/strings.xml``app_name` stays **"Closer"** (14-char "Closer Couples" truncates under the icon).
- **iOS home-screen label** — `iphone/Closer/Info.plist``CFBundleDisplayName` stays **"Closer"** (`CFBundleName`/`PRODUCT_NAME` untouched).
- **Wordmark logos** (onboarding `OnboardingScreen`/iOS `OnboardingViews`, auth alt-text `AuthVisuals`, `TodayWidget` header, `WeeklyRecapShareCard` drawText) stay "Closer" → the logo is a brand mark; their asserting tests (`FirstRunRenderSmokeTest` contentDescription, recap/widget tests) stay green.
- **Deliberate copy exceptions that stay "Closer":** the **"Grow Closer"** onboarding headline (intimacy pun, not the app name); the privacy-rotator slogan *"…so Closer cannot read them"* and iOS *"not even Closer's servers"* (entity references; the rotator line also has a hard 64-char display cap that "Closer Couples" would exceed — `CloserBrandCopyTest`); the iOS **"Settings > Closer"** help path (must match the kept `CFBundleDisplayName`); and the **"Closer Premium"** tier label (matches the RevenueCat entitlement display name).
- **Internal engineering/brand-system docs** using "Closer" as codename/design-system name (`DEVELOPMENT_LOG.md`, `SECURITY.md`, `Future.md`, `Engineering_Reference_Manual`, `Claude*.md`, brand-system docs).
## In-app prose renamed to "Closer Couples" (2026-07-09)
The ~26 user-facing strings where "Closer" names the app in a sentence now read "Closer Couples":
- **Android (9 files):** `CloserCopy` (paywall subhead reworded to avoid "Couples…couples", thank-you, age-gate ×3), `InviteShareText`, `PairPromptScreen`, `SettingsScreen` (appearance + delete-account subtitles), `TodayWidget` (Open / "Something's waiting" headlines — header wordmark kept), `MainActivity` biometric prompt, `WeeklyRecapShareCard` caption (drawText wordmark kept), `strings.xml` (`privacy_no_export_body`, `privacy_rule_intro`). `TodayWidgetTest` exact-match assertions updated.
- **iOS (2 files):** `SettingsViews` (profile/account/data-export/legal/help/premium-eligibility/paywall subhead), `PairingViews` explore line.
- **Internal engineering/brand-system docs** using "Closer" as codename/design-system name (`DEVELOPMENT_LOG.md`, `SECURITY.md`, `Future.md`, `Engineering_Reference_Manual`, the `Claude*.md` reports, `docs/brand/asset-system.md` "Closer Artwork Asset System", `docs/brand/generated-art/glyphs/README.md` "Closer G-set").
## Changes to make (in-repo)
### 1. Store feature graphic (the one required image) — `docs/store/`
The exhaustive wordmark-SVG list is exactly three files; only this one is store-facing (the other two are unreferenced internal art — see §5).
- Completed: `docs/store/sources/feature-graphic.svg` now uses `Closer Couples` at `font-size="58"`, with centered card icons/headlines/sublabels and privacy-forward copy: private questions, encrypted answers, mutual reveals, no public feed.
- Completed: `docs/store/feature-graphic-1024x500.png` was re-exported from the SVG (1024×500, **no alpha**) — see re-export procedure.
### 2. Store-listing doc — `docs/release/store-assets.md`
- Completed: title, app-name checklist, full-description prose, and §9 inventory now use **"Closer Couples"** while documenting that the launcher label remains **"Closer"**.
### 3. `README.md` — product-name references only
Completed: `<h1>`, feature-graphic alt text, and product-facing prose use "Closer Couples". Codename/dir/scheme mentions (`iphone/Closer`, `Closer.xcodeproj`, `-scheme Closer`) remain unchanged.
### 4. `docs/brand/visual-identity.md` — product-name prose (consistency, optional)
Completed: product-name prose uses "Closer Couples"; asset paths stay unchanged.
### 5. Retired internal `generated-art` feature graphics
Removed the two unreferenced banner-like generated-art files so there is a single source of truth for README/store banner work:
`docs/store/sources/feature-graphic.svg` -> `docs/store/feature-graphic-1024x500.png`.
## Feature-graphic re-export procedure (the installed tooling can't do it naively)
`rsvg-convert` / `inkscape` / `resvg` are **not installed**, and ImageMagick's SVG delegate is wired to the missing `rsvg-convert`, so a bare `convert file.svg file.png` falls back to ImageMagick's native renderer and **will mangle** this SVG's `feDropShadow` filters, gradients, and embedded `<image>`. Use the rasterizer that IS present:
- **Headless Chrome** (`google-chrome` is installed) — pixel-accurate; **DejaVu Sans Bold is installed**, so text renders correctly.
- The SVG's `<image href="../../brand/sources/…png">` is **relative to `docs/store/sources/`**, so serving the repo root and loading the SVG over `http://` resolves the embedded icon correctly:
```sh
python3 -m http.server 8099 & # or: npx http-server -p 8099 (node is available)
google-chrome --headless --disable-gpu --hide-scrollbars \
--window-size=1024,500 --screenshot=/tmp/fg.png \
"http://localhost:8099/docs/store/sources/feature-graphic.svg"
```
- **Flatten alpha** (Play requires no alpha; Chrome screenshots carry an alpha channel — the opaque `#24122F` rect covers it visually but the channel persists):
```sh
convert /tmp/fg.png -background '#24122F' -flatten -alpha off docs/store/feature-graphic-1024x500.png
```
- **Fallback** if headless Chrome misbehaves (sandbox/sizing): the corrected `.svg` is the source of truth — commit it and re-export the PNG with proper design tooling before uploading to Play Console. Per `store-assets.md:200`, never hand-edit the raster; always regenerate from the SVG.
## External steps (owner performs — outside the repo; this is what actually renames the app)
- **Google Play Console** → store listing → **App name = "Closer Couples"**, paste the updated description, upload the re-exported feature graphic.
- **App Store Connect** (when iOS ships) → app name "Closer Couples".
- Heads-up: (a) Play title policy allows a descriptor addition — "Closer" → "Closer Couples" is a clear same-brand superset, low risk, but a launcher label that differs from the store title is worth a sanity check at review; (b) `store-assets.md:14`'s trademark check should be re-run against the **new** name.
## Verification
- Re-exported `feature-graphic-1024x500.png`: visibly reads "Closer Couples", legible, no clipping/overlap with the icon or the three cards; confirm **1024×500 and no alpha** (`identify -verbose … | grep -iE 'Geometry|Alpha|Type'`).
- Grep the touched docs for leftover standalone "Closer" that should be "Closer Couples" (excluding codename/dir/scheme + technical URLs).
- **Launcher untouched:** `app_name` in `strings.xml` and `CFBundleDisplayName` in `Info.plist` both still "Closer".
- No build required (no source touched); optional `./gradlew :app:assembleDebug` still succeeds unchanged.
## Pre-existing issue noted (NOT fixed here)
`store-assets.md:106` — support URL `couplesconnect.app` vs the `closer.app` domain used elsewhere; unrelated to this rename, leave for separate cleanup.