Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsTo take a website screenshot automatically, put a Puppeteer script in your repository and schedule it with GitHub Actions. Add a workflow under .github/workflows/, use on.schedule with a five-field cron expression, and make sure the workflow is on the repository’s default branch. GitHub runs it against the latest commit on that branch; scheduled runs use UTC by default and may start later than the scheduled minute.
What you need
- A GitHub repository with the workflow committed to its default branch.
- A Node.js project with Puppeteer installed and a script that writes the screenshot to a file.
- A workflow that checks out the repository, sets up a compatible Node.js version, installs dependencies, runs the script, and saves or publishes the resulting image.
The Puppeteer documentation for version 25.12.0 lists Node.js 22.12 or later in its system requirements. Use a runtime compatible with the Puppeteer version actually in your project, and check the release requirements when upgrading. Puppeteer installation and system requirements
As an Amazon Associate I earn from qualifying purchases.
Write the screenshot script
Install Puppeteer in the project and create capture.js:
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} finally {
await browser.close();
}
})();
Replace the example URL with the page to capture. Puppeteer runs headless by default, which suits a non-interactive GitHub runner. The screenshot guide demonstrates navigation followed by page.screenshot(); it also documents capturing an individual element with ElementHandle.screenshot(). Puppeteer screenshot guide
#1 Best Overall
- Includes Raspberry Pi 5 with 2.4Ghz 64-bit quad-core CPU (8GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
Choose when the page is ready
networkidle2 is an example, not a universal best setting. A mostly static page may be ready sooner; a site that keeps requests open, such as one with live updates, may never reach a network-idle condition. Choose and validate a readiness condition against the target site. You can instead wait for a particular selector when the needed content appears, or use a deliberate delay when the site’s behavior requires it.
Schedule the script with GitHub Actions
Create .github/workflows/screenshot.yml and commit it to the repository’s default branch:
name: Scheduled website screenshot
on:
schedule:
- cron: '17 9 * * *'
workflow_dispatch:
jobs:
screenshot:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
- name: Install dependencies
run: npm ci
- name: Capture screenshot
run: node capture.js
- name: Keep screenshot as a workflow artifact
uses: actions/upload-artifact@v4
with:
name: website-screenshot
path: screenshot.png
if-no-files-found: error
The example runs daily at 09:17 UTC. Change the cron fields to set a different cadence. workflow_dispatch adds a manual run option in GitHub Actions, useful for checking the script without waiting for the schedule. The artifact step retains the generated image with that workflow run; if the image needs to appear elsewhere, add an appropriate publishing step instead.
Rank #2
- Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM)
- Includes Pre-Loaded 32GB EVO+ Micro SD Card (Class 10), USB MicroSD Card Reader
- CanaKit Premium High-Gloss Raspberry Pi 4 Case with Integrated Fan Mount, CanaKit Low Noise Bearing System Fan
- CanaKit 3.5A USB-C Raspberry Pi 4 Power Supply (US Plug) with Noise Filter, Set of Heat Sinks, Display Cable - 6 foot (Supports up to 4K60p)
- CanaKit USB-C PiSwitch (On/Off Power Switch for Raspberry Pi 4)
Read a cron expression
GitHub Actions uses five-field POSIX cron syntax: minute, hour, day of month, month, and day of week. For example, 17 9 * * * means minute 17 of hour 9 every day. The shortest supported interval for scheduled workflows is once every five minutes. Avoid minute 0 where possible: GitHub warns that high load, especially at the start of an hour, can delay runs or cause some queued jobs to be dropped. GitHub Actions schedule event details
UTC or a local timezone
Schedules use UTC by default. UTC keeps the wall-clock schedule consistent through daylight-saving changes, so the local execution time may shift seasonally. Current workflow syntax also supports an IANA timezone. A named local timezone can keep a schedule aligned with a local business day, but its daylight-saving transitions affect when it runs; check GitHub’s schedule documentation before using it.
Make sure the browser is installed
Puppeteer normally downloads a compatible Chrome for Testing browser during installation. If your package-manager policy blocks install scripts, that download may be skipped and the workflow can fail when it tries to launch the browser. Allow Puppeteer’s install script or install the browser explicitly in the workflow after dependency installation:
- name: Install Chrome for Testing for Puppeteer
run: npx puppeteer browsers install
Refer to Puppeteer’s installation guide for the supported installation process and requirements. Puppeteer installation guide
Common failures and fixes
The scheduled workflow never appears or does not start
- Confirm the workflow file exists on the repository’s default branch. A schedule does not trigger from a workflow file that exists only on another branch.
- Check the Actions run history and confirm the workflow is enabled.
- Verify the five cron fields and timezone. Remember that UTC is the default unless an IANA timezone is configured.
- If the run is late, allow for Actions load. Move the cron minute away from
0to reduce exposure to the busy start of the hour; exact-time execution is not guaranteed.
A public repository stopped running its scheduled workflow
GitHub automatically disables scheduled workflows in public repositories after 60 days without repository activity. Check whether the workflow was disabled and review the repository’s activity and Actions settings. GitHub schedule behavior
The job cannot launch Chrome
Check the install log for a skipped Puppeteer install script or browser download. Permit the install script or run npx puppeteer browsers install explicitly, then rerun the job.
Rank #4
- Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1. 5GHz
- 2. 4 GHz and 5. 0 GHz IEEE 802. 11b/g/n/ac wireless LAN, Bluetooth 5. 0, BLE
- 2 × USB 3. 0 ports, 2 x USB 2. 0 Ports
- 2 × micro HDMI ports supproting up to 4Kp60 video resolution
- Micro SD card slot for loading operating system and data storage
The screenshot is blank, incomplete, or missing
- Check whether navigation returned successfully and whether the page’s content had loaded before the screenshot call.
- Change the readiness condition to match the site. A page that continually makes network requests may not suit a network-idle wait; wait for the required selector or another site-appropriate condition.
- Confirm the script writes to the same path named in the artifact step. With
if-no-files-found: error, a missing screenshot fails visibly rather than silently uploading nothing.
The workflow syntax or job is failing
Inspect the run logs for the first failing step, then check the workflow file’s syntax, dependency installation, runtime compatibility, and script path. GitHub’s troubleshooting guide covers diagnosing workflow runs and configuration problems. Troubleshooting GitHub Actions workflows
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
ScreenshotNeo provides a website screenshot API and MCP server. Its API can return a screenshot or PDF from a GET request, without installing Puppeteer and Chrome in the workflow. For example, save a WebP capture of a target URL with cURL:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
Replace YOUR_API_KEY with your key. See the ScreenshotNeo API documentation for request options and response details.
Best Value
- Includes Raspberry Pi 5 16GB with 2.4Ghz 64-bit quad-core CPU (16GB RAM)
- Includes 128GB Micro SD Card pre-loaded with 64-bit Raspberry Pi OS, USB MicroSD Card Reader
- CanaKit Turbine Black Case for the Raspberry Pi 5
- CanaKit Low Noise Bearing System Fan
- Mega Heat Sink - Black Anodized
- Cookie banners and consent notices are accepted before capture, and 60+ known consent platforms, newsletter popups, and chat widgets are removed; each step can be turned off.
- Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed. Responses identify the page verdict and billing status in headers.
- An MCP server provides
take_screenshot,get_page_info, andcapture_pdftools for AI agents and MCP clients such as Claude and Cursor. - The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots.
Learn about ScreenshotNeo or sign up for 1,000 free screenshots a month, no card required.
FAQ
Can I take a screenshot more than once a day?
Yes. Set the cron expression to the desired interval, subject to GitHub’s documented five-minute minimum for scheduled workflows.
Can Puppeteer capture just one element instead of the whole page?
Yes. Select the element in the page and use its ElementHandle.screenshot() method rather than capturing the page with page.screenshot(). See the Puppeteer screenshot guide.
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallQuick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




