11 KiB
Marketing assets and workflow
Scope: website screenshots, device renders, Figma App Store boards and exports. Never change product behavior to make a screenshot easier; fixture-only tests may mount real views with in-memory data and no real host/account/network.
Invariants and asset map
- Raw sources are immutable during framing/composition/export; back up raw files and a SHA-256 manifest before recapture.
Feature-first paths, never reorganize by device:
Marketing/Screenshots/Captures/<feature>/<device>-<locale>.pngandMarketing/Screenshots/DeviceFrames/<feature>/<device>-<locale>-framed.png. - Filenames use
en,zh-hans,zh-hant; features include workspace/ssh/sftp/metrics/assistant/vault/command-generator. Missing platform captures are not permission to fabricate UI. Terminal commands/output stay English; localize chrome/copy. - Mobile status bar/navigation/toolbars/home indicator must be real captured system UI. Mac capture must be active/key (colored traffic lights; focused Workspace pane blue). Do not run competing app activations while capturing.
- Device artwork comes from MockUPhone, not CSS/Figma-drawn hardware/chrome. Keep every device pixel visible; shadows may clip.
Traditional Chinese uses Taiwan terminology (
伺服器), PingFang TC; Simplified uses PingFang SC, English SF Pro. - Website imports the DeviceFrames allowlist through
LandingPage/src/lib/marketingImages.tsandScreenshotPicture.astro; Astro optimizes assets. Do not copy sources intoLandingPage/public.
Captures
Mobile
TFITests/MobileMarketingScreenshotTests.swift mounts real feature views in system windows. Ready/ack markers coordinate
complete simulator display capture; unique TERMIND_MARKETING_CAPTURE_ID rejects stale markers. Output stages in DerivedData
and enters the source tree only after tests/count checks pass.
Scripts/run-mobile-marketing-screenshots.sh
# Target one feature/device across all locales:
TERMIND_MARKETING_SCENES=assistant TERMIND_MARKETING_DEVICES=ipad \
Scripts/run-mobile-marketing-screenshots.sh
| Device | Orientation / raw size | Scenes per locale |
|---|---|---|
| iPhone 17 Pro Max | Portrait, 1320×2868 | vault, sftp, ssh, metrics, assistant |
| iPad Pro 13-inch (M5) | Landscape, 2752×2064 | same |
Three locales yield 30 captures. Default runtime is iOS/iPadOS 26.5; TERMIND_MARKETING_RUNTIME explicitly overrides it,
never silently select a newer same-name device. iPad-only runs do not require an iPhone. Each locale is a separate process
with matching Apple language/region/locale and fixture language. Status is deterministic 9:41/charged/Wi-Fi/cellular;
iPhone uses scene-requested portrait plus simctl capture; iPad uses devicectl landscape capture/dimension validation, no rotation.
Fixtures follow production Vault/Metrics/Workspaces/Assistant/Settings order. iPad Metrics shows top tabs, Vault/Assistant
expanded sidebar; SSH/SFTP use MobileRootView/production Workspace pages with in-memory connection services, Workspaces
selected/sidebar collapsed. Do not use legacy iPhone wrappers for iPad. The approved SSH/SFTP topbar set uses iPadOS 27.0:
TERMIND_MARKETING_SCENES=ssh,sftp TERMIND_MARKETING_DEVICES=ipad \
TERMIND_MARKETING_RUNTIME=com.apple.CoreSimulator.SimRuntime.iOS-27-0 \
Scripts/run-mobile-marketing-screenshots.sh
Recapture affected scenes in every locale, regenerate matching frames/boards only. Vault/Metrics/Assistant map to mobile boards 04–06; SSH/SFTP to 02–03. First boards additionally depend on iPhone SSH and iPad SFTP, so those source changes affect all nine first boards.
Mac
TFMTests/MacMarketingScreenshotTests.swift captures the production WindowGroup with ScreenshotDemoConfiguration, never
a second RootView/terminal/transcript. It verifies app active + key window before/after capture, 300 ms focused rendering
and native 2× scale. The runner backs up replaced raws under .build/screenshot-backups/<timestamp>/.
Scripts/run-mac-marketing-screenshots.sh # Workspace, all locales
TERMIND_MAC_MARKETING_SCENES=hosts,metrics,command Scripts/run-mac-marketing-screenshots.sh
TERMIND_MAC_MARKETING_SCENES=agent TERMIND_MAC_MARKETING_LOCALES=zh-Hant \
Scripts/run-mac-marketing-screenshots.sh
Scene mapping: hosts → vault/mac, workspace → workspace/mac, agent → assistant/mac, command → command-generator/mac,
metrics → metrics/mac-overview. Metrics detail is a development demo, not a marketing export. Locale selectors are
en, zh-Hans, zh-Hant. Pinned build → serial locale launches → key-window marker → system capture by window number →
remove only optional two-pixel transparent edge → acknowledgement/dimensions. Raw size 2360×1480, command 2044×1280.
SFTP chrome/file metadata localize; terminal transcripts do not.
Device frames and website
Run Scripts/generate-mockuphone-assets.py with Python/Pillow (the workspace runtime is
/Users/kaede/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3). Templates: iPhone 15 Pro Max
Black Titanium portrait, iPad Pro 13-inch Space Gray landscape, MacBook Pro 16-inch front; credited through MockUPhone
to Apple Design Resources. Outputs: 15 iPhone +15 iPad +3 Mac Workspace frames.
Mac windows sit on deterministic Termind-owned blue/cyan artwork, approximately 91% screen width/88% height. No Apple
wallpaper, third-party photography, Dock/user data, duplicated titlebar/traffic lights. Framed sizes: iPhone 1530×3036,
iPad 2960×2290, MacBook 4340×2860. Keep dimensions in website metadata, intrinsic aspect ratio and object-fit: contain.
Formal routes: /, /zh-hans/, /zh-hant/; /zh/ and children redirect to Simplified Chinese. Automatic language
selection only on root English, respecting manual termind.locale. Taiwan label 正體中文; HK/Macau/generic Hant 繁體中文.
App Store CTA uses the Apple silhouette, never an emoji/text/CSS substitute.
Messaging: capable permission-aware remote workspace, not device count. Preserve “Your terminal, with judgment.” / “你的终端,自有判断。” Focus SFTP on file workflow, Metrics on diagnosing/continuing over SSH, Assistant on controlled action, Vault on private iCloud plus separate Keychain protection. Mac-only MCP remains prominent with tool controls, loopback default and audits. Keep sync exclusions in FAQ/Privacy, not feature pitches; exact localized copy belongs in website sources.
Figma authoring and exports
Use Figwright MCP with its plugin running in the connected Termind file (not rate-limited hosted Figma MCP). Before writes:
ping → list_files → claim Termind if multiple files → inspect existing variables/components/styles/fonts/pages.
Stop on wrong/unclaimed file. Reuse the design system; English first, screenshot-review, then both Chinese locales.
Pages: Foundations, Components, App Store Mac, App Store iPhone, App Store iPad, Promo. Reference IDs (revalidate before use):
Foundations 25:54, Components 25:96; Mac locale sections 25:106, 25:308, 25:374;
iPhone 25:173, 25:440, 25:511; iPad 25:236, 25:582, 25:653.
Platform labels remain MAC/IPHONE/IPAD.
54 boards = 3 locales × 3 platforms × 6. Sizes: Mac 2880×1800, iPhone 6.5-inch 1284×2778 (not raw capture size), iPad 13-inch 2752×2064.
| Board | iPhone / iPad | Mac |
|---|---|---|
| 01 | Mac Workspace + iPhone SSH + iPad SFTP | same |
| 02 | SSH | Workspace |
| 03 | SFTP | Metrics |
| 04 | Metrics | Assistant |
| 05 | Assistant | Vault |
| 06 | Vault | Command Generator |
All mobile boards use MockUPhone; Mac only board 01 does. Mac 02–06 use native windows with one consistent soft shadow, no extra frame. All three devices on first boards remain fully visible.
Export high-quality opaque sRGB JPG at 1× with Figwright save_screenshots (format: "JPG", scale: 1).
get_screenshot is size-capped review only. Keep helper/temporary exports outside delivery:
Marketing/AppStore/<locale>/mac/01-06-*.jpg
Marketing/AppStore/<locale>/iphone-6.5/01-06-*.jpg
Marketing/AppStore/<locale>/ipad-13/01-06-*.jpg
If an export lacks ICC metadata, add sRGB without recompressing and verify decoded RGB equality before delivery. Check Figma image bytes against sources and unchanged copy/fonts/geometry/FIT/shadows on targeted replacement. Review every board at 100% plus platform/locale contact sheets.
test "$(find Marketing/AppStore -type f -name '*.jpg' | wc -l | tr -d ' ')" = 54
test -z "$(find Marketing/AppStore -type f ! -name '*.jpg' -print -quit)"
for platform in mac iphone-6.5 ipad-13; do
find Marketing/AppStore -path "*/$platform/*.jpg" -print0 \
| xargs -0 identify -format '%wx%h %[colorspace] %[channels] opaque=%[opaque]\n' \
| sort | uniq -c
done
Expect 18 opaque sRGB RGB images at each platform size; also inspect embedded ICC profiles, not colorspace alone.
No .DS_Store, manifests/previews/temp PNGs in delivery.
Verification and retained caveats
(cd LandingPage && npm run build)
Scripts/check-zh-localization.sh
xcrun swift-format lint --strict TFITests/MobileMarketingScreenshotTests.swift TFMTests/MacMarketingScreenshotTests.swift
zsh -n Scripts/run-mobile-marketing-screenshots.sh Scripts/run-mac-marketing-screenshots.sh
python3 -m py_compile Scripts/generate-mockuphone-assets.py
git diff --check
Visually check formal/compatibility routes, Apple CTA, unclipped real device chrome, current production SFTP/navigation, Mac key-window appearance, owned background, Chinese fonts/terminology and 54 final exports. Capture success is not a full regression-suite pass; never adjust production behavior/unrelated assertions to satisfy marketing fixtures.
Historical evidence is in local .build/marketing-forwarding-refresh/ and .build/marketing-topbar-refresh/ when retained,
not guaranteed repository artifacts. The latest recorded topbar refresh (2026-09-19) left 45 raws, 33 frames and 54 JPGs;
39 changed/93 unchanged. 23 untouched baseline JPGs lacked embedded ICC profiles despite earlier blanket claims.
Do not declare every export tagged without a new profile audit.
That refresh passed capture/build/localization/format checks, but full suites were not green:
- TFM: 1,719 passed, one failed, 23 skipped;
MetricsDetailToolbarTests.legacyCompactSearchOpensTheNativeFieldAndKeepsItsQueryWhenWidenedfailed in all three language cases. - TFI: 679 passed, one failed;
MobileAssistantInteractionRenderingTests.interactionTextRemainsVisibleOnMaterialhad iPadOS 27.0 OCR mismatches. All 352 framework tests passed on both platforms; four separately runMobileNavigationParityTestspassed, and their obsolete capture exclusion was removed. - Xcode diagnostic collection stalled after suites completed; stopping only its
simctl diagnosechild allowed xcresults to finalize without interrupting tests. Historical counts/failures are not current verification; rerun affected checks.