Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,8 @@ CLAUDE.local.md
*-release-audit.md
*-release-qa-report.md
*-release-checklist.md

# App Store screenshot workspace: keep planning docs, templates, and the
# curated final set; raw/candidate captures are large and regeneratable.
AppStoreScreenshots/raw/
AppStoreScreenshots/candidates/
16 changes: 16 additions & 0 deletions AppStoreScreenshots/planning/concept-matrix.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Number,ShortName,DeviceClass,FeaturedRealState,Evidence,Headline,Subhead,SearchTheme,Composition,ThemeTreatment,StoryRole,Risk,ClarityScore,DistinctivenessScore,UserValueScore,EvidenceScore,SearchFitScore,TotalScore
H1,"Every Format, One Glance",iphone,"Home Screen crop centered on the systemMedium widget showing the real 'Widget Formatting Demo' note (pinned, indigo). systemMedium caps body at 5 lines, which lands exactly on: heading, plain line, open bullet, open task, and the completed task rendering as green checkmark.circle.fill + strikethrough.","WidgetFamily+CheatSheetLayout.swift:16 (systemMedium lineLimit=5); CheatSheetNote.swift:110-124 (Widget Formatting Demo body, exactly 5 non-empty lines before Tips); WidgetLineView.swift:11,18,20 (checkmark/strikethrough); DisplayLine.swift:52-77 (parser)","Pin the note you need most.","Headings, tasks, and done items — formatted the moment you glance at it.",quick notes widget for iPhone,single-device-framed,"Dark widget gradient rgb(0.12,0.14,0.18)->rgb(0.05,0.06,0.08); indigo 5D6BFF header icon tint",hook,"Line-cap math independently verified against WidgetFamily+CheatSheetLayout.swift — this is the corrected replacement for the original run's 'Becomes a Checklist', which got the same idea wrong",9,8,8,10,8,43
H2,"Home Screen, At a Glance",iphone,"Home Screen with the systemSmall widget prominently placed, showing the Git Rescue demo note (pinned, indigo) from ScreenshotDemoContent.swift. systemSmall caps at 4 lines: heading + first 3 git commands.","WidgetFamily+CheatSheetLayout.swift:16 (systemSmall lineLimit=4); ScreenshotDemoContent.swift:14-29 (Git Rescue note, pinned/indigo); CheatSheetWidgetView.swift (noteView rendering)",The command you always forget.,One glance at your Home Screen.,quick notes widget for iPhone,single-device-framed,"Dark backdrop consistent with widget's own gradient",hook (alternate),"none identified",8,7,8,9,8,40
H3,"Add It in Seconds",iphone,"iOS system widget-gallery sheet (long-press Home Screen -> + -> search CheatSheet), showing the real configurationDisplayName and description strings plus the live 3-size carousel preview.","CheatSheetWidget.swift:11-13 (configurationDisplayName 'CheatSheet', description 'Keep a pinned coding note nearby.', supportedFamilies); WidgetFamily+CheatSheetLayout.swift:15-17 (per-family line caps)",Add it in seconds.,A real widget for a real note.,quick notes widget for iPhone,ui-forward-full-bleed,"OS system chrome, not custom app UI",how-it-works,"Must be a genuine simulator capture of iOS's own widget gallery — cannot be composited/faked",7,8,6,9,6,36
H4,Pin Any Note in One Tap,iphone,"iPhone compact editor with EditorHeader visible: pin button (Label 'Use in Widget'/'Pinned to Widget', systemImage pin/pin.fill), status label ('Editable note'/'Shown in widget'), palette+font pickers alongside.","EditorHeader.swift:32-36 (status label), :44-52 (pin button, accessibilityLabel, .help text); GlassPalettePicker.swift; FontStylePicker.swift",One tap. Pinned for good.,Any note becomes your widget note.,quick notes widget for iPhone,close-crop,"Dark backdrop; note surface = regularMaterial + palette tint",how-it-works,"none identified",8,7,7,9,7,38
H5,"The Widget, Up Close",iphone,"Chrome-free hero crop: systemLarge widget (9-line cap) isolated on the app's own brand backdrop, showing the full Widget Formatting Demo body including the Tips heading section.","WidgetFamily+CheatSheetLayout.swift:17 (systemLarge lineLimit=9); CheatSheetNote.swift:110-124 (full 8-line body fits within 9-line cap); CheatSheetWidgetView.swift:82-107 (widget's own gradient, distinct from in-app material)",Everything you pinned, at a glance.,The widget that doubles as onboarding.,quick notes widget for iPhone,close-crop,"Widget's own LinearGradient per colorScheme, not the app's regularMaterial glass",proof,"none identified",7,7,7,9,6,36
1,Type It Plain,iphone,"iPhone note editor (EditorTextPanel) mid-type on the Git Flow starter note: title field reads Git Flow; TextEditor body shows real starter text typed line-by-line; EditorHeader status label reads Editable note; cyan palette swatch; keyboard visible.","EditorTextPanel.swift:11; EditorHeader.swift:9,32-36; CheatSheetNote.swift:126-137 (Git Flow starter body, cyan tint)",Type the command you already know.,Plain text in, no special syntax to learn.,code snippet notes app / command line reference,single-device-framed,"Dark backdrop #141923->#1A2130->#0D111C; regularMaterial + cyan tint 9-16%, hairline stroke, 20pt corner radius",hook,none identified,8,7,6,9,8,38
3,"Plain Text, Real Structure",iphone,"Single iPhone frame split top/bottom: top = raw typed shorthand from real starter/demo content ('# Git Rescue' / '- [x] Pull, then rebase' / '- [ ] Never force-push main'); bottom = same lines through the real checklist pipeline rendered.","DisplayLine.swift:52-77 parsedChecklistLine; ChecklistLineView.swift:10-23; ScreenshotDemoContent.swift Git Rescue note (real checklist lines, fixes original run's fabricated sample text)",What you type is what you get.,No formatting toolbar — just the shorthand you already use.,markdown checklist notes / auto-formatting notes app,close-crop,"Dark backdrop; thin divider between halves",differentiator,"FIXED from original run: now uses real Git Rescue demo content instead of invented sample lines",7,8,6,9,9,39
5,Color-Code by Project,iphone,"iPhone editor, GlassPalettePicker swatch row expanded inline in EditorHeader's compactControls, mid-selection on the cyan swatch, over the real Git Flow starter note with its actual git command lines.","GlassPalettePicker.swift; EditorHeader.swift (compactControls); CheatSheetNote.swift:147-157 (10-case palette enum) and :126-137 (Git Flow starter note)",10 colors. One glance.,Color-code notes the moment you write them.,customizable notes app,close-crop,"Dark AppTheme gradient; cyan 45C7C4 tint ~12% opacity, all 10 swatches at exact palette hex values",differentiator,none identified,7,7,8,9,8,39
8,"Trash, Not Gone",iphone,"Two-panel before/after: left = Move to Trash toolbar action available; right = resulting TrashNoteView state — In Trash label, 'Deletes automatically in 30 days.' countdown text, Restore Note and Delete Now buttons.","ContentView.swift:266,274 (toggle/move-to-trash buttons); TrashNoteView.swift (full view); CheatSheetNote+Trash.swift:13-31 (trashStatusText, retentionInterval=30 days)",Deleted isn't gone for 30 days.,Move a note to Trash, and it stays recoverable.,notes app with trash recovery,multi-device-justified,"Dark backdrop; note surface = regularMaterial + palette tint",how-it-works,"'Live countdown' phrasing in original description overstated a computed-at-render string — corrected to static countdown text",8,7,6,9,6,36
7,Zero Network Calls,iphone,"Text-forward claim slide (no device chrome): 'No account. No sign-in. No network calls.' with a small citation line referencing the Privacy Nutrition Label.","PrivacyInfo.xcprivacy (both targets, empty NSPrivacyCollectedDataTypes, NSPrivacyTracking false); full-repo grep confirms zero network calls; no login/auth screens exist anywhere",Nothing you write leaves your device.,No account system, no network calls — ever.,private notes app no account,close-crop,"Large-type slide, brand primary #4B88FF headline accent",trust,"Must avoid implying 'encrypted'/'secure' claims not evidenced — keep strictly to 'no account / no network'",9,9,7,10,6,41
12,Find It Before You Lose It,ipad,"iPad split-view Sidebar with the real .searchable field active mid-type, filtering the note list down to 'Git Flow' by matching 'git'.","SidebarView.swift:32-36 (.searchable, placement: .sidebar); CheatSheetNote.swift:127-136 (Git Flow starter content)",Search finds the command.,Type what you remember — CheatSheet narrows instantly.,git commands cheat sheet,single-device-framed,"iPad framed, light AppTheme gradient white 94%->#E8F0F7->#DAE2E6",how-it-works,none identified,7,7,9,7,6,36
13,iPad Split View Checklists,ipad,"iPad landscape, real splitRoot NavigationSplitView: sidebar with searchable field, detail pane showing the shipped Widget Formatting Demo note mixing heading + unchecked + checked lines via the real checklist pipeline.","ContentView.swift splitRoot (NavigationSplitView); DisplayLine.swift parsedChecklistLine; ChecklistLineView.swift; CheatSheetNote.swift starterNotes",Type '- [ ]'. It becomes a checklist.,Headings and checklists, formatted as you type.,code snippet notes app,ui-forward-full-bleed,"Light mode, full-bleed iPad, indigo 5D6BFF tint",how-it-works,none identified,8,7,6,9,5,35
14,iPad Palette and Font Picker,ipad,"iPad landscape split view, EditorHeader with GlassPalettePicker expanded (all 10 swatches) alongside FontStylePicker's 4 options, sidebar behind showing color-coded notes.","GlassPalettePicker.swift; FontStylePicker.swift; EditorHeader.swift; CheatSheetPalette (10 cases) and CheatSheetFontStyle (4 cases)",Color-code every cheat sheet.,10 colors, 4 fonts — organize at a glance.,sticky notes for developers,close-crop,"Dark mode, cropped tight on editor header + expanded pickers",personalization,"Render all 10 swatches at exact hex values",7.5,8.5,5.5,9.5,8,39
15,Mac Menu Bar Quick Capture,mac,"macOS menu bar dropdown (MenuBarQuickAccessView), 340pt wide: header, quick-capture field, glass New Note button (real Cmd-N shortcut), Recent Notes list (real prefix(5), showing Git Flow + Widget Formatting Demo). Full main window visible on the desktop behind.","MenuBarQuickAccessView.swift:17-92 (frame width 340), :51 (.keyboardShortcut(\"n\") VERIFIED), :23-24 (activeNotes.prefix(5) VERIFIED), :115-141 (quick capture), :212-250 (MenuBarNoteRow)",Every command, one click away.,Quick-capture a note without leaving what you're doing.,menu bar notes mac,ui-forward-full-bleed,"Full desktop capture, no device frame, dark backdrop, accent #4B88FF on the glass button",how-it-works,"CORRECTED: ⌘N shortcut and prefix(5) count independently re-verified against source (line 51, line 24) — both real, not speculative as the original synthesis flagged",7,9,9,10,7,42
16,Font Style Menu Open,mac,"FontStylePicker Menu open on the Widget Formatting Demo note, showing all 4 real rows — Mono, System, Rounded, Serif — each rendered in its own Font.Design, checkmark on the active style.","FontStylePicker.swift:6-29 (Menu, ForEach CheatSheetFontStyle.allCases); CheatSheetNote.swift:197-221 (4-case enum)",Mono. System. Rounded. Serif.,Pick the type that matches how you think.,developer note fonts,single-device-framed,"Light AppTheme gradient; indigo 5D6BFF tint",personalization,none identified,8,8,5,9,7,37
78 changes: 78 additions & 0 deletions AppStoreScreenshots/planning/feature-evidence.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# CheatSheet — Feature Evidence Table

Source repo: `/Users/wesleykeetch/Documents/Developer/CheatSheet`, branch
`feature/app-store-screenshots` off `develop`. Every row below is verified
against actual source, not assumed.

## Inputs (Phase 0)

| Input | Value | Basis |
| --- | --- | --- |
| `{APP_NAME}` | CheatSheet | `project.yml` `CFBundleDisplayName` |
| `{REPO_PATH}` | `/Users/wesleykeetch/Documents/Developer/CheatSheet` | — |
| `{OUTPUT_DIR}` | `./AppStoreScreenshots` | this directory |
| `{TARGET_USER}` | A developer mid-task — terminal or editor open — who needs a command or snippet they always forget | README: "keeping short coding notes, checklists, and command reminders close by"; starter notes are `git status` / `git switch -c` / `xcodebuild` style commands, not generic to-dos; onboarding copy: "Keep the coding commands you reach for every day close at hand." |
| `{PRIMARY_SEARCH_INTENT}` | "developer cheat sheet app" | App is a named-genre utility (cheat sheet), scoped explicitly to coding use per README/onboarding/starter content, category `public.app-category.productivity` |
| `{SECONDARY_SEARCH_INTENTS}` | "quick notes widget for iPhone" · "git commands cheat sheet" · "code snippet notes app" · "sticky notes for developers" · "command line reference widget" | Widget feature, Git Flow starter note, checklist/command formatting, menu bar quick capture |
| `{TOP_FEATURES}` | see Selected Features below | — |
| `{DEVICE_SUPPORT}` | iPhone + iPad + Mac | `project.yml`: `CheatSheetiOS` has `TARGETED_DEVICE_FAMILY: "1,2"`; a separate full `CheatSheet` macOS target also exists — brief's iPhone/iPhone+iPad enum doesn't cover this app; extended to include Mac |
| `{BRAND_SOURCE}` | App's own `AccentColor` + `CheatSheetPalette` (10 swatches) + Liquid Glass material system with material fallback | `Shared/Sources/CheatSheetNote.swift`, `CheatSheetApp/Sources/ViewModifiers.swift`, `AppDesign.swift`, `AppTheme.swift` |
| `{TONE}` | Calm, precise, native — a quiet utility, not a flashy consumer app | README Product Principles: "deliberately narrow," "local-first," "No sync, collaboration, rich-document, or account system without a separate product decision"; in-app empty states use plain `ContentUnavailableView`, no marketing chrome |
| `{LOCALIZATION}` | Primary: English (`en`, `sourceLanguage` in both `.xcstrings` catalogs). Follow-on: Spanish (`es`, "neutral international Spanish" per README), verified complete by `Scripts/verify-localization.sh` and covered by `CheatSheetiOSSpanishLocaleUITests` in CI | `CheatSheetApp/Resources/Localizable.xcstrings`, `CheatSheetWidgets/Resources/Localizable.xcstrings`, `.github/workflows/ci.yml` |

## Product constraint list (honest, per Phase 1.5)

- **No accounts, no login screen, no auth flow of any kind** — nothing to capture there; also means "no account needed" is a safe, true claim.
- **No network access at all** — zero `http(s)://` calls in source (verified previously by full-repo grep). No server-dependent screens exist to capture or avoid.
- **No cross-device sync** — App Group sharing is scoped to *one platform's* app ↔ its own widget, not device-to-device. **Do not claim "same notes everywhere"** — that would be false. Safe claim: "native on Mac, iPhone, and iPad," not "synced across."
- **No paid tier / IAP / subscription** — nothing to gate or disclaim.
- **No push notifications, no deep links, no Sign in with Apple** — none exist; not a capture gap, just absent by design.
- **Starter/demo content exists and is safe to show**: `CheatSheetNote.starterNotes` ("Widget Formatting Demo," pinned, indigo; "Git Flow," cyan) are real, shipped, privacy-safe seed content — ideal for deterministic, reproducible captures instead of inventing fake note text.
- **Existing marketing screenshots** (`Docs/Images/*.png`) are mostly good reference material — `cheatsheet-iphone.png`, `cheatsheet-ipad.png`, `cheatsheet-iphone-widget.png`, `cheatsheet-widget-gallery.png` are accurate and on-brand (verified during the earlier release audit). `cheatsheet-desktop-overview.png` is broken (shows an unrelated system widget, not the app) — do not reuse it as a reference; the Mac shot must be recaptured clean.

## Selected top features (used for ASO / message map)

| # | Feature | File(s) | Real user benefit | Capture state | Screenshot-safe? |
| --- | --- | --- | --- | --- | --- |
| 1 | Pin one note to the Home Screen / menu bar widget | `EditorHeader.swift` (pin button), `CheatSheetWidget.swift` (`.systemSmall/.systemMedium/.systemLarge`), `CheatSheetNote.widgetDisplayNote` | The one command you always forget is one glance away, no app launch | iPhone Home Screen with the "Git Rescue"-style pinned widget visible | Yes — real, shipped feature |
| 2 | Automatic checklist & heading formatting | `DisplayLine.swift` (`parsedChecklistLine`), `ChecklistLineView.swift` | Type `- [ ]` and `#` like you already do; it renders as real checklist rows and headings, no special editor | Note editor/preview with a mix of heading + checked + unchecked lines | Yes |
| 3 | 10 colors × 4 fonts per note | `GlassPalettePicker.swift`, `FontStylePicker.swift`, `CheatSheetPalette` (10 cases), `CheatSheetFontStyle` (4 cases) | Color-code by project/language at a glance | Editor header with the palette row visible/expanded | Yes |
| 4 | 30-day Trash with restore | `TrashNoteView.swift`, `NoteTrashPolicy.retentionInterval` (30 days) | Deleted a note by accident? It's recoverable, not gone | Trash detail view showing "Deletes automatically in N days" + Restore | Yes |
| 5 | 100% private — no account, no tracking, no network | `PrivacyInfo.xcprivacy` (both targets, empty `NSPrivacyCollectedDataTypes`, `NSPrivacyTracking: false`), zero network calls in source | Notes never leave the device | Text-forward claim slide (no login screen exists to show *because there isn't one*) | Yes — verifiable claim |

## Additional real, evidenced flows (not in the top-5 ASO set, available as alternates)

| Feature | File(s) | Capture state |
| --- | --- | --- |
| Mac menu bar quick capture | `MenuBarQuickAccessView.swift` | macOS menu bar dropdown, quick-capture field + recent notes list |
| Native per-platform layout (iPad split view, Mac window, compact iPhone) | `ContentView.swift` (`splitRoot`/`compactRoot`) | Side-by-side device composition — real cross-surface feature, not invented |
| Search notes | `SidebarView.swift`, `CompactNoteListView` (`.searchable`) | Sidebar/list with search field active and a filtered result |
| Light & dark mode | `AppTheme.swift` (branches on `colorScheme`) | Same screen captured twice |
| Spanish localization | `Localizable.xcstrings` × 2, `CheatSheetiOSSpanishLocaleUITests` | Same shortlisted screens, es locale, for the Spanish storefront set only |

## Localization cross-reference (found mid-task, folded in)

`Docs/app-store-localization-es.md` (prepared by prior work on this same
release branch) already covers Spanish App Store Connect metadata and
explicitly anticipates this exact screenshot question: *"App Store Connect
lets a Spanish (Mexico) localization reuse the same screenshot images as
English if you don't want to caption them separately... Only recapture if
you later add Spanish caption overlays via the `app-store-screenshots`
skill."* Since Phase 4 of this brief burns headline/subhead text into the
final composites, that condition is now true — the final set needs a
Spanish-captioned variant once the English set is approved. Plan:
1. Ship the English final set first (Phase 6/7 of the brief, gated on the
human style-choice checkpoint below).
2. Re-run only the caption/compositing step (not a full recapture — same
underlying app screenshots, since none of the shortlisted concepts need
Spanish app UI specifically to make their point) with Spanish headlines
translated from the approved English set, informed by the tone already
established in `Docs/app-store-localization-es.md`'s description copy.
3. Note this in App Store Connect guidance: add the Spanish set under the
**Spanish (Mexico)** locale only, per that doc's own recommendation.

## Explicitly excluded (not supported — do not invent)

- Any onboarding claim implying sync, collaboration, or accounts.
- Ratings/download counts/awards in captions — none exist in the repo to cite.
- Apple Watch, tvOS, visionOS — no such targets in `project.yml`.
Loading
Loading