Resolution Screenshot Tool
Capture screenshots at GA visitor resolutions using Pyppeteer async browser automation.
Legacy tool
This tool needs the old Universal Analytics (pre-GA4) data format. It may still work with historical UA exports, but it does not work with GA4.
#about
Uses Pyppeteer (async Chromium) to capture screenshots at resolutions from GA Browser & OS reports.
Parses resolution strings (e.g., 1920x1080), sets viewport dimensions, and captures PNG screenshots.
Prints the rendered dimensions and device pixel ratio after each capture (no comparison against the requested viewport is performed).
Streamlit app
- Platform
- Browser-based (no installation required)
- Input
- GA Browser & OS CSVTarget URL
- Output
- Screenshots at each resolution (PNG)
- Category
- Reporting
Use cases
- QA testing at real visitor resolutions
- Documenting responsive layout issues
- Verifying above-the-fold content
- Creating resolution-specific screenshots for reporting
#features
- Pyppeteer async headless Chromium (downloads ~100MB Chromium on first run)
- GA Browser & OS CSV parsing (6-row header skip)
- Viewport-only capture (above the fold) with networkidle0 wait and 30s timeout
- Reports rendered dimensions and device pixel ratio (script version)
- 10 built-in default resolutions plus custom sizes (app version)
- Individual PNG downloads or all screenshots as a ZIP (app version)
#how-to-use
- App: enter the target URL and upload a GA CSV, or use the default resolutions
- App: add custom resolutions if needed and click Take Screenshots
- App: download PNGs individually or as a ZIP
- Script: place a CSV matching *Browser & OS*.csv beside the script and edit the url variable
- Script: run it to capture the first 10 resolutions as {width}x{height}.png
#faq
- Why does my CSV upload lose its header or first rows?
- The reader skips the first 6 rows of the file because a Google Analytics Browser & OS export starts with a 6 line comment block before the header. If you upload a hand-built CSV without that preamble, the header and first rows are silently discarded. Either keep the raw GA export intact or pad your own file with 6 throwaway lines.
- Are the captured resolutions really my most popular ones?
- Not guaranteed in the Streamlit app: after parsing, resolutions are deduplicated through a Python set, which does not preserve order, before the top slice is taken. The local script version takes the first 10 rows of the export, which are the top resolutions only if GA's default sessions sort is intact. If exact ranking matters, trim the CSV to just the rows you want before uploading.
- Does it capture the full page or just above the fold?
- Viewport only: the app screenshots with fullPage disabled, sized exactly to the requested width and height, after waiting for network idle with a 30 second timeout. That makes it a genuine above-the-fold check at each resolution rather than a full-page render.
- Do I need GA data at all?
- No. The app ships with 10 built-in popular resolutions (1920x1080 down to mobile sizes like 375x667) and you can add custom resolutions between 320 and 3840 wide and 200 and 2160 high. The GA upload just replaces the defaults with your real visitor resolutions.
- What should I know before the first run?
- Pyppeteer downloads its own Chromium build (roughly 100MB) on first use, so the first capture is slow. The code also notes that the hosted Streamlit Cloud version may fail due to browser limitations there; running locally is the reliable option. The local script has the target URL hardcoded in the source, so edit the url variable before running.
/contact
Want me to run this for you? I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.