docs(store): rename marketing assets to Closer Couples

This commit is contained in:
null 2026-07-08 22:01:10 -05:00
parent 213cfddb16
commit 1242799001
6 changed files with 116 additions and 31 deletions

View File

@ -1,8 +1,8 @@
<p align="center"> <p align="center">
<img src="docs/store/feature-graphic-1024x500.png" alt="Closer feature graphic" width="920" /> <img src="docs/store/feature-graphic-1024x500.png" alt="Closer Couples feature graphic" width="920" />
</p> </p>
<h1 align="center">Closer</h1> <h1 align="center">Closer Couples</h1>
<p align="center"> <p align="center">
<strong>A private space for two.</strong><br /> <strong>A private space for two.</strong><br />
@ -37,7 +37,7 @@
--- ---
Closer is a native relationship app for couples who want a quieter way to check in with each other. Closer Couples is a native relationship app for couples who want a quieter way to check in with each other.
Each partner answers privately, reveals intentionally, and keeps a record of the conversations that Each partner answers privately, reveals intentionally, and keeps a record of the conversations that
matter. matter.
@ -86,7 +86,7 @@ Fresh Android captures from the current emulator build.
<h2 align="center">Visual system</h2> <h2 align="center">Visual system</h2>
Closer uses paired light and dark illustration assets so the product can stay warm without fighting Closer Couples uses paired light and dark illustration assets so the product can stay warm without fighting
the selected theme. The home daily-question card is intentionally people-forward: the ready-to-answer the selected theme. The home daily-question card is intentionally people-forward: the ready-to-answer
and reveal-ready moments use the couple/cards artwork, while quieter waiting states can fall back to and reveal-ready moments use the couple/cards artwork, while quieter waiting states can fall back to
the answer-card ritual art. the answer-card ritual art.
@ -106,7 +106,7 @@ the answer-card ritual art.
</tr> </tr>
<tr> <tr>
<td width="33%"><strong>Theme-aware art</strong><br />Light and dark illustrations are paired for the same product moments.</td> <td width="33%"><strong>Theme-aware art</strong><br />Light and dark illustrations are paired for the same product moments.</td>
<td width="33%"><strong>Human warmth</strong><br />The home ritual leads with people and recognizable Closer card artwork.</td> <td width="33%"><strong>Human warmth</strong><br />The home ritual leads with people and recognizable Closer Couples card artwork.</td>
<td width="33%"><strong>Private rituals</strong><br />The visual language reinforces answering alone, revealing together, and continuing gently.</td> <td width="33%"><strong>Private rituals</strong><br />The visual language reinforces answering alone, revealing together, and continuing gently.</td>
</tr> </tr>
</table> </table>

84
docs/NameChange.md Normal file
View File

@ -0,0 +1,84 @@
# App rename: "Closer" → "Closer Couples" (store / marketing tier only)
> Audit + decision record for renaming the product's public name to **"Closer Couples"**.
> Status: **executed in repo.** Store-console changes remain external owner steps.
## 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 does NOT change (per the chosen tier)
- **Android launcher label**`app/src/main/res/values/strings.xml``app_name` stays **"Closer"**.
- **iOS home-screen label**`iphone/Closer/Info.plist``CFBundleDisplayName` stays **"Closer"** (`CFBundleName`/`PRODUCT_NAME` untouched).
- **All ~25 in-app copy strings** stay "Closer" (paywall, onboarding/age-gate, settings, widget, invite share text, privacy `strings.xml:95-96`, share card, iOS onboarding, etc.).
- **Wordmark logos** (onboarding, auth alt-text, widget, share card) stay "Closer" → their asserting tests stay green, untouched.
- **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 the three small card icons/headlines/sublabels centered inside their cards.
- 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. Two internal `generated-art` feature graphics — OPTIONAL (not store-facing)
`docs/brand/generated-art/closer_app_explainer_feature.svg` + `closer_e2ee_privacy_feature.svg` render "Closer" but are referenced by no store/README doc — internal exploration art. Update their `<text>` + re-export **only if** internal consistency is wanted; not required for the rename.
## 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.

View File

@ -1,6 +1,6 @@
# Closer visual identity # Closer Couples visual identity
Closer should feel private, warm, and made for an equal partnership—not clinical, gamified, or like Closer Couples should feel private, warm, and made for an equal partnership—not clinical, gamified, or like
a public dating profile. a public dating profile.
Product goal: **private, mutual-reveal relationship questions with real encryption and calmer UX**. Product goal: **private, mutual-reveal relationship questions with real encryption and calmer UX**.
@ -11,7 +11,7 @@ requirements, see `docs/brand/asset-system.md`.
## Brand mark ## Brand mark
The mark is the approved Closer `C-heart-keyhole`: a soft pink upper `C`, lavender lower sweep, The mark is the approved Closer Couples `C-heart-keyhole`: a soft pink upper `C`, lavender lower sweep,
a heart-shaped inner space, and a true centered keyhole. Pink and lavender represent two people a heart-shaped inner space, and a true centered keyhole. Pink and lavender represent two people
meeting in one private space; the keyhole represents trust and privacy. meeting in one private space; the keyhole represents trust and privacy.
@ -81,7 +81,7 @@ Approved production rotation:
- **No audience. No public feed. Just the two of you.** - **No audience. No public feed. Just the two of you.**
- **Private by design.** - **Private by design.**
- **A private space for two.** - **A private space for two.**
- **Not even Closer can read your answers.** - **Not even Closer Couples can read your answers.**
- **End to end encrypted private responses.** - **End to end encrypted private responses.**
- **Built for trust, not tracking.** - **Built for trust, not tracking.**

View File

@ -1,4 +1,4 @@
# Closer — Google Play Store Assets Checklist # Closer Couples — Google Play Store Assets Checklist
> Checklist of assets, metadata, and compliance items needed for a Google Play Store submission. Targeting the private MVP / internal launch phase. > Checklist of assets, metadata, and compliance items needed for a Google Play Store submission. Targeting the private MVP / internal launch phase.
@ -9,8 +9,9 @@ Store assets should express the product goal: **private, mutual-reveal relations
## 1. Store Listing Metadata ## 1. Store Listing Metadata
### 1.1 App name ### 1.1 App name
- [x] App name finalized: **Closer**. - [x] Store app name finalized: **Closer Couples**.
- [x] App name matches `android:label` in `AndroidManifest.xml` (currently `@string/app_name`). - [x] Store name intentionally differs from the launcher label **Closer** (`android:label` is
`@string/app_name`) so the installed app stays short under the icon.
- [ ] App name is not trademark-conflicting in target categories/territories. - [ ] App name is not trademark-conflicting in target categories/territories.
### 1.2 Short description ### 1.2 Short description
@ -29,10 +30,10 @@ Recommended short description:
Draft full description: Draft full description:
Closer is a private space for two people who want more intentional conversations. Closer Couples is a private space for two people who want more intentional conversations.
Answer one daily question, explore deeper question packs, spin a shared prompt wheel, plan date Answer one daily question, explore deeper question packs, spin a shared prompt wheel, plan date
ideas, save bucket-list moments, and reveal answers when you are both ready. Closer is built for ideas, save bucket-list moments, and reveal answers when you are both ready. Closer Couples is built for
quiet connection, not public posting or pressure. quiet connection, not public posting or pressure.
What you can do: What you can do:
@ -43,7 +44,7 @@ What you can do:
- Use playful connection games like the spin wheel and this-or-that prompts. - Use playful connection games like the spin wheel and this-or-that prompts.
- Plan dates and keep shared ideas in one calm place. - Plan dates and keep shared ideas in one calm place.
Closer is not therapy and does not promise to fix a relationship. It gives couples a steady, Closer Couples is not therapy and does not promise to fix a relationship. It gives couples a steady,
private rhythm for checking in, listening better, and making time for each other. private rhythm for checking in, listening better, and making time for each other.
### 1.4 Keywords / tags ### 1.4 Keywords / tags
@ -182,7 +183,7 @@ private rhythm for checking in, listening better, and making time for each other
| Asset | Spec | Status | Owner | | Asset | Spec | Status | Owner |
|-------|------|--------|-------| |-------|------|--------|-------|
| App name | ≤ 30 chars displayed | Draft | | | App name | Closer Couples, 14 chars displayed | Draft | |
| Short description | ≤ 80 chars | Draft | | | Short description | ≤ 80 chars | Draft | |
| Full description | ≤ 4,000 chars | Draft | | | Full description | ≤ 4,000 chars | Draft | |
| Launcher icon | Adaptive + round + monochrome | Ready | | | Launcher icon | Adaptive + round + monochrome | Ready | |

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

@ -1,4 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="500" viewBox="0 0 1024 500"> <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="500" viewBox="0 0 1024 500" role="img" aria-label="Closer Couples feature graphic">
<defs> <defs>
<filter id="markShadow" x="-30%" y="-30%" width="160%" height="180%"> <filter id="markShadow" x="-30%" y="-30%" width="160%" height="180%">
<feDropShadow dx="0" dy="14" stdDeviation="14" flood-color="#180C20" flood-opacity=".45"/> <feDropShadow dx="0" dy="14" stdDeviation="14" flood-color="#180C20" flood-opacity=".45"/>
@ -13,35 +13,35 @@
<path d="M0 372c144-62 292-57 449-14 142 39 259 43 358 7 70-25 142-33 217-13v148H0Z" fill="#180C20" opacity=".34"/> <path d="M0 372c144-62 292-57 449-14 142 39 259 43 358 7 70-25 142-33 217-13v148H0Z" fill="#180C20" opacity=".34"/>
<path d="M900 0h124v500H820c31-76 34-154 8-236C800 174 812 88 900 0Z" fill="#F7C8E4" opacity=".08"/> <path d="M900 0h124v500H820c31-76 34-154 8-236C800 174 812 88 900 0Z" fill="#F7C8E4" opacity=".08"/>
<image x="68" y="74" width="312" height="312" href="docs/brand/sources/closer-approved-icon-square-white-keyhole.png" preserveAspectRatio="xMidYMid slice" filter="url(#markShadow)"/> <image x="68" y="74" width="312" height="312" href="../../brand/sources/closer-approved-icon-square-white-keyhole.png" preserveAspectRatio="xMidYMid slice" filter="url(#markShadow)"/>
<text x="408" y="142" fill="#FFF8FC" font-family="DejaVu Sans" font-size="72" font-weight="700">Closer</text> <text x="408" y="142" fill="#FFF8FC" font-family="DejaVu Sans" font-size="58" font-weight="700">Closer Couples</text>
<text x="412" y="198" fill="#F7C8E4" font-family="DejaVu Sans" font-size="26" font-weight="600">A private space</text> <text x="412" y="198" fill="#F7C8E4" font-family="DejaVu Sans" font-size="26" font-weight="600">A private space</text>
<text x="660" y="198" fill="#FFF8FC" font-family="DejaVu Sans" font-size="26" font-weight="700">for two.</text> <text x="660" y="198" fill="#FFF8FC" font-family="DejaVu Sans" font-size="26" font-weight="700">for two.</text>
<text x="412" y="236" fill="#F3E8FF" font-family="DejaVu Sans" font-size="18" font-weight="500">Private questions and intentional reveals.</text> <text x="412" y="236" fill="#F3E8FF" font-family="DejaVu Sans" font-size="18" font-weight="500">Private questions and intentional reveals.</text>
<g transform="translate(408 274)" filter="url(#cardShadow)"> <g transform="translate(408 274)" filter="url(#cardShadow)">
<rect width="176" height="116" rx="22" fill="#FFF8FC"/> <rect width="176" height="116" rx="22" fill="#FFF8FC"/>
<circle cx="34" cy="36" r="16" fill="#F0DFFF"/> <circle cx="88" cy="32" r="16" fill="#F0DFFF"/>
<path d="M34 26l9 5v8c0 7-4 11-9 14-5-3-9-7-9-14v-8l9-5Z" fill="#56306F"/> <path d="M88 22l9 5v8c0 7-4 11-9 14-5-3-9-7-9-14v-8l9-5Z" fill="#56306F"/>
<text x="24" y="76" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700">Private first</text> <text x="88" y="78" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700" text-anchor="middle">Private first</text>
<text x="24" y="98" fill="#6D5A75" font-family="DejaVu Sans" font-size="14">Reveal when ready</text> <text x="88" y="100" fill="#6D5A75" font-family="DejaVu Sans" font-size="14" text-anchor="middle">Reveal when ready</text>
</g> </g>
<g transform="translate(606 274)" filter="url(#cardShadow)"> <g transform="translate(606 274)" filter="url(#cardShadow)">
<rect width="176" height="116" rx="22" fill="#FFF8FC"/> <rect width="176" height="116" rx="22" fill="#FFF8FC"/>
<circle cx="34" cy="36" r="16" fill="#FFE8F4"/> <circle cx="88" cy="32" r="16" fill="#FFE8F4"/>
<path d="M34 48c-4-5-20-17-23-27-3-8 2-15 11-15 5 0 9 3 12 8 3-5 7-8 12-8 9 0 14 7 11 15-3 10-19 22-23 27Z" fill="#9B1B5A"/> <path d="M34 48c-4-5-20-17-23-27-3-8 2-15 11-15 5 0 9 3 12 8 3-5 7-8 12-8 9 0 14 7 11 15-3 10-19 22-23 27Z" fill="#9B1B5A" transform="translate(54 -4)"/>
<text x="24" y="76" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700">For two</text> <text x="88" y="78" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700" text-anchor="middle">For two</text>
<text x="24" y="98" fill="#6D5A75" font-family="DejaVu Sans" font-size="14">No public feed</text> <text x="88" y="100" fill="#6D5A75" font-family="DejaVu Sans" font-size="14" text-anchor="middle">No public feed</text>
</g> </g>
<g transform="translate(804 274)" filter="url(#cardShadow)"> <g transform="translate(804 274)" filter="url(#cardShadow)">
<rect width="138" height="116" rx="22" fill="#FFF8FC"/> <rect width="138" height="116" rx="22" fill="#FFF8FC"/>
<circle cx="34" cy="36" r="16" fill="#F4E8FF"/> <circle cx="69" cy="32" r="16" fill="#F4E8FF"/>
<path d="M24 36h20M34 26v20" stroke="#56306F" stroke-width="5" stroke-linecap="round"/> <path d="M59 32h20M69 22v20" stroke="#56306F" stroke-width="5" stroke-linecap="round"/>
<text x="24" y="76" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700">Daily</text> <text x="69" y="78" fill="#24122F" font-family="DejaVu Sans" font-size="18" font-weight="700" text-anchor="middle">Daily</text>
<text x="24" y="98" fill="#6D5A75" font-family="DejaVu Sans" font-size="14">Small rituals</text> <text x="69" y="100" fill="#6D5A75" font-family="DejaVu Sans" font-size="14" text-anchor="middle">Small rituals</text>
</g> </g>
<g transform="translate(408 410)"> <g transform="translate(408 410)">

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB