Product Screenshot Workflow
Product screenshots should answer one question at a glance: where do I click and what should I check? This is the repeatable flow for turning a documented dashboard journey into a screenshot with a visible focus ring, drop shadow, and directional arrows.What deserves a screenshot?
After reviewing the docs, these are the highest-value screenshot candidates:
Capture the smallest state that completes the step. A single focused view is
more useful than a full-page dump with unreadable controls.
Capture → annotate → embed
1. Define the flow
Add a flow underscripts/doc-screenshot-flows/. Dashboard flows are split
between core.ts and core-details.ts, settings flows between settings.ts
and settings-details.ts, and provider dialogs live in integrations.ts. Give
it:
- the documentation path it supports;
- a stable route and a selector that means “the page is ready”;
- the frame to crop (
mainor a dialog-sized container); and - selectors for the controls that deserve numbered labels.
2. Capture a safe, deterministic state
Use a disposable workspace with seeded data. The capture script supports either a Playwright storage state or a short-lived browser login:.auth file:
packages/docs/images/ and keeps the unannotated browser capture under the
gitignored .context/docs-screenshots/raw/ directory for visual review.
Sensitive fields can declare maskSelectors; the generator covers them before
the annotation renderer sees the image.
3. Add visual guidance
Every annotation has four parts:- a tight focus rectangle around the exact control;
- a short, verb-first label such as “Open API Keys” or “Add an email”;
- a restrained curved arrow that ends on the control; and
- a warm matte and restrained frame shadow so the screenshot reads as a deliberate card.
#f16366 coral, thin borders, compact type, and small radii.
Only the screenshot frame gets a shadow; labels stay flat and quiet.
Inter is bundled with the generator, and each label is measured before
rendering so longer instructions cannot overflow their callout.
4. Embed the generated asset
Use the generated path in the relevant MDX page with Mintlify’sFrame:
alt text should describe the screen and the user-visible guidance. It
should still make sense if the image does not load.
The docs-wide mapping is maintained by the idempotent embed command. It reuses
one product state wherever the same flow is explained, adds more focused states
under the section that explains them, and leaves API endpoint reference pages
screenshot-free:
5. Review before publishing
Run the docs checks and inspect the output at the size a reader will see it:Embedding the same screenshot in an email
If the screenshot belongs inside a campaign, sequence email, template, or transactional email, upload the generated PNG to the workspace media library with theupload_image_asset MCP tool. Insert the returned imageBlock into
the target email’s blocks array:
imageBlock is explicitly added to that email. Use contain when the
arrows and labels must remain visible; use cover only for a deliberate hero
crop.
Screenshot hygiene
- Never capture production customer data, API keys, webhook secrets, or real subscriber addresses.
- Keep original third-party setup screenshots when a step happens in the provider’s dashboard. A Sequenzy connection dialog supplements that image; it does not replace it.
- Prefer seeded names and values that explain the flow, such as “Lifecycle
Welcome” or
company_id. - Keep the source screenshot and its annotated output separate so the callouts can be regenerated when the UI moves.
- Change the image when the documented interaction changes; do not leave a screenshot that points at a control the user can no longer find.