Take Documentation Screenshots
Capture screenshots of the running pgconsole app at http://localhost:5173 for use in documentation.
Prerequisites
- •The dev server must be running (
pnpm dev) - •
shot-scrapermust be installed (pipx install shot-scraper && shot-scraper install) - •
cwebpmust be installed (brew install webp)
Authentication
Login credentials are in pgconsole.toml under [[users]]. Use the first user entry.
- •Read
pgconsole.tomlto find the email and password from the first[[users]]entry - •Call the login API to get a session token:
code
curl -s -c cookies.txt -X POST http://localhost:5173/api/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"<email>","password":"<password>"}' - •Extract the
pgconsole_tokencookie value from cookies.txt - •Create a Playwright auth state JSON file:
json
{ "cookies": [{ "name": "pgconsole_token", "value": "<token>", "domain": "localhost", "path": "/", "httpOnly": true, "secure": false, "sameSite": "Lax" }], "origins": [] }
Taking Screenshots
Write a Playwright script (.mjs file in the scratchpad directory) that:
- •Launches Chromium with
viewport: { width: 1440, height: 900 }(nodeviceScaleFactor— use 1x) - •Sets the auth cookie via
context.addCookies() - •Navigates to
http://localhost:5173 - •Uses Playwright actions (click, type, keyboard) to navigate to the desired state
- •Saves screenshots as PNG
CodeMirror Interaction
The SQL editor uses CodeMirror 6. To type into it:
- •Click
.cm-contentto focus - •Use
page.keyboard.type('SQL here', { delay: 5 })to type - •Use
page.keyboard.press('Control+Space')for autocomplete - •Use
page.keyboard.press('Meta+a')to select all before replacing content - •Do NOT try to access
cmViewfrom the DOM — it's not exposed
UI Navigation
Key buttons to interact with:
- •
buttonwith textSQL— opens a new query tab - •
buttonwith textRun— executes the query - •
buttonwith textFormat— opens format dropdown - •
buttonwith textQuick SQL— opens quick SQL dropdown - •
buttonwith textProcesses— opens processes modal - •Right-click on
.cm-contentfor context menu
Dismissing Overlays
After capturing dropdown/modal screenshots, always dismiss with:
js
await page.keyboard.press('Escape');
await page.waitForTimeout(500);
An open overlay blocks clicks on other elements.
Image Processing
- •Convert PNGs to WebP:
cwebp -q 90 input.png -o output.webp - •Store in
docs/images/features/<feature-name>/(matchingdocs/features/<feature-name>.mdx) - •Reference in MDX as
 - •Clean up temporary PNG files after conversion
Image Convention
- •Format: WebP (
.webp), quality 90 - •Dimensions: 1440x900 (1x resolution)
- •Location:
docs/images/mirroring thedocs/structure - •Naming:
<feature>-<description>.webp(e.g.,sql-editor-autocomplete.webp) - •Alt text: brief description of what the screenshot shows