Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1d2cc7e
build: make iOS 26 the platform baseline
weskcode Sep 1, 2026
f115dec
fix: never resolve a simulator newer than the active SDK
weskcode Sep 1, 2026
786ae9f
fix: keep the trailing "#" in headings like "# C#"
weskcode Sep 2, 2026
49940ac
ci: rework CI into a checks/iOS/macOS pipeline for all platforms
weskcode Sep 2, 2026
e020830
Add Spanish localization for the app and widget
weskcode Aug 28, 2026
901cb8a
feat: add deterministic screenshot demo-content seeding
weskcode Aug 30, 2026
aa6d767
docs: finalize App Store screenshot concept matrix and shortlist
weskcode Aug 30, 2026
fd6619f
feat: add scripted screenshot compositor, lock style direction
weskcode Aug 30, 2026
0c96892
fix: compose_screenshot.py ignored the --device flag entirely
weskcode Aug 30, 2026
b9e34a6
fix: correct concept count from 16 to 15 in planning docs
weskcode Aug 30, 2026
c8fd461
test: make the manual QA sweep XCUITest pass on iPhone as well as iPad
weskcode Aug 31, 2026
4918089
test: make the iOS UI suite deterministic across OS versions and load
weskcode Sep 2, 2026
6b884cf
ci: run the iOS UI suite on iPad as well as iPhone
weskcode Sep 2, 2026
28ff16b
test: make the iOS UI suite pass on iPad's split-view layout
weskcode Sep 2, 2026
2d74792
release: 1.2 (build 14), and stop gating CI on the QA sweep
weskcode Sep 5, 2026
1fd36e3
feat: produce the 1.2 App Store screenshot set, and fix what it exposed
weskcode Sep 6, 2026
f99d35b
test: stop the UI suite tapping system chrome without waiting
weskcode Sep 6, 2026
556322c
docs: add the 1.2 App Store release kit
weskcode Sep 8, 2026
fb20e39
test: synchronize SpyLegacyRepository's mutable state
weskcode Sep 8, 2026
f06954c
docs: clean up prose across public documentation
weskcode Sep 8, 2026
9bdeaf4
docs: add the support email to the privacy policy and release kit
weskcode Sep 8, 2026
4fbeb6e
ci: replace GitHub Actions with Xcode Cloud
weskcode Sep 8, 2026
a352f0e
ci: add the Xcode Cloud replacement and update docs
weskcode Sep 8, 2026
0d41732
feat: produce the 1.2 Mac App Store screenshot set
weskcode Sep 10, 2026
17409cf
fix: resolve sidebar collapse, trash/onboarding bugs, and design audi…
weskcode Sep 18, 2026
4b2846e
feat: add anonymous TelemetryDeck analytics and a pin-based review pr…
weskcode Sep 21, 2026
7b4b295
ci: pin TelemetryDeck 2.14.2 for Xcode Cloud SPM resolution
weskcode Sep 26, 2026
6e34368
Relabel build as CheatSheet 1.0 (16)
weskcode Sep 27, 2026
e49be08
fix: keep the iPhone editor header controls inside the screen
weskcode Oct 1, 2026
36cbe3a
test: capture the full iPhone marketing set and fail loudly on misses
weskcode Oct 1, 2026
29af0ff
docs: add the screenshot renderer and caption manifest for the new set
weskcode Oct 1, 2026
286134d
feat: replace the App Store screenshots with ten iPhone and ten Mac i…
weskcode Oct 1, 2026
c16b90b
docs: move to a single-branch flow and refresh the 1.2 release notes
weskcode Oct 1, 2026
2e84d2b
docs: replace em dashes in planning notes and release copy
weskcode Oct 1, 2026
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
122 changes: 0 additions & 122 deletions .github/workflows/ci.yml

This file was deleted.

6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,9 @@ 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/
AppStoreScreenshots/templates/__pycache__/
1 change: 1 addition & 0 deletions .xcode-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
26.6
52 changes: 52 additions & 0 deletions AppStoreScreenshots/final/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# CheatSheet App Store screenshots

The current set contains ten iPhone screenshots (`iphone-01.png` through
`iphone-10.png`) and ten Mac screenshots (`mac-01.png` through `mac-10.png`).
Upload them in filename order. The iPhone files are 1320 × 2868 pixels for the
6.9-inch display slot. The Mac files are 2880 × 1800 pixels. All are RGB PNGs
without transparency.

The first iPhone image shows the Home Screen widget. The next images show the
note library, editor, checklist, font and text-size controls, search, colors,
reference notes, and Trash recovery. The Mac set shows menu bar quick capture,
varied notes and colors, search, and Trash recovery. Captions and capture sources are
listed in `captions.tsv`.

The iPad files in this directory are from an earlier set. They are outside
this iPhone and Mac update.

## Capture and render

The iPhone UI test target has a dedicated `MarketingScreenshotTests` suite.
It launches the app with `-cheatsheet-seed-screenshot-demo` to show curated
reference notes. Run it on an installed iPhone simulator runtime, then export
the kept attachments and copy them to `AppStoreScreenshots/raw/iphone/` using
the attachment names from `captions.tsv`:

```sh
xcodebuild test -project CheatSheet.xcodeproj -scheme CheatSheetiOSUI \
-configuration Debug \
-destination 'platform=iOS Simulator,name=<existing 6.9-inch iPhone simulator>,OS=27.0' \
-resultBundlePath /tmp/CheatSheet-Marketing-Captures.xcresult \
-only-testing:CheatSheetiOSUITests/MarketingScreenshotTests
xcrun xcresulttool export attachments \
--path /tmp/CheatSheet-Marketing-Captures.xcresult \
--output-path /tmp/CheatSheet-Marketing-Attachments
```

The widget source is cropped from the existing
`Docs/Images/cheatsheet-iphone-widget.png` marketing capture.

The Mac sources were captured from the app window and menu bar panel in the
Debug build with the same seeded notes and `-showWidgetHints NO`. The panel
and app window were aligned at their actual screen positions for `mac-02`.
The raw capture directory is
ignored by Git. Once the sources are present, render the final assets with:

```sh
python3 AppStoreScreenshots/templates/render_final.py
```

The renderer uses the approved centered-caption layout and the existing dark
CheatSheet gradient. Captions describe visible features. They are short enough
to read at App Store preview size.
21 changes: 21 additions & 0 deletions AppStoreScreenshots/final/captions.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
device order source caption feature
iphone 01 iphone/00-widget-source.png Pin a note on your\nHome Screen Home Screen widget
iphone 02 iphone/M1-library.png All your notes in\none place note library
iphone 03 iphone/M2-note-open.png Save commands\nin plain text note editor
iphone 04 iphone/M3-checklist.png Plan a release\nwith checklists checklist notes
iphone 05 iphone/M4-font-menu.png Choose a font\nfor each note font styles
iphone 06 iphone/M8-size-menu.png Set a comfortable\nreading size text size
iphone 07 iphone/M5-search.png Find notes\nas you type search
iphone 08 iphone/M9-concurrency.png Color-code notes\nby topic palette
iphone 09 iphone/M12-http.png Save references\nyou use often reference notes
iphone 10 iphone/M7-trash-detail.png Restore notes\nfrom Trash Trash recovery
mac 01 mac/01-library.png Notes for every\npart of your work note library
mac 02 mac/02-quick-capture.png Capture a note\nfrom the menu bar menu bar quick capture
mac 03 mac/03-checklist.png Check each step\nbefore you ship checklist notes
mac 04 mac/04-swift.png Save Swift notes\nfor later reference notes
mac 05 mac/05-docker.png Docker commands\nin one place command notes
mac 06 mac/07-zsh.png Use color to sort\nyour notes palette
mac 07 mac/08-xcode.png Xcode shortcuts\nat a glance shortcut notes
mac 08 mac/09-http.png Monospaced text\nfor technical notes font styles
mac 09 mac-raw-search.png Search notes\nas you type search
mac 10 mac/10-trash.png Bring notes back\nfrom Trash Trash recovery
Binary file added AppStoreScreenshots/final/ipad-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/ipad-02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/ipad-03.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-03.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-04.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-05.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-06.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-07.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-09.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/iphone-10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-03.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-04.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-05.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-06.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-07.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-09.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added AppStoreScreenshots/final/mac-10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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
Loading