Use a scheduled browser job to render the page, save a screenshot, and upload it to a private S3 bucket. A practical setup is Playwright running in GitHub Actions on a cron schedule, with GitHub OIDC letting the workflow assume a narrowly scoped AWS role instead of storing long-lived AWS credentials. This guide covers the capture choice, AWS permissions, scheduling, retention, and a complete workflow.
Choose what the screenshot should show
Before automating the capture, decide whether each file should show the current browser viewport, the entire scrollable page, or one component. Playwright can save a screenshot to a file or return its image buffer; a locator can capture a specific element.
As an Amazon Associate I earn from qualifying purchases.
| Capture | Playwright setting | Best for | Trade-off |
|---|---|---|---|
| Viewport | page.screenshot({ path: 'screenshot.png' }) |
A consistent view of the page at a chosen viewport size. | Content outside the visible viewport is not included. |
| Full page | page.screenshot({ path: 'screenshot.png', fullPage: true }) |
A record of the full scrollable page. | The image can be very tall; page layout and lazy-loaded content may affect what appears. |
| Element | locator.screenshot({ path: 'screenshot.png' }) |
A chart, card, or other specific component. | The selected element must exist and be visible when the capture runs. |
See Playwright’s screenshot documentation for the available screenshot options. In the example below, change FULL_PAGE or the capture call if your desired artifact differs.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minutePrepare AWS access without storing long-lived keys
Configure GitHub as an OpenID Connect (OIDC) identity provider in AWS, then create an IAM role whose trust policy accepts only the GitHub repository and branch that should run the job. The workflow requests an OIDC token and exchanges it for short-lived AWS credentials by assuming that role. This avoids keeping persistent AWS access keys in repository secrets.
#1 Best Overall
- Get NVMe solid state performance with up to 1050MB/s read and 1000MB/s write speeds in a portable, high-capacity drive(1) (Based on internal testing; performance may be lower depending on host device & other factors. 1MB=1,000,000 bytes.)
- Up to 3-meter drop protection and IP65 water and dust resistance mean this tough drive can take a beating(3) (Previously rated for 2-meter drop protection and IP55 rating. Now qualified for the higher, stated specs.)
- Use the handy carabiner loop to secure it to your belt loop or backpack for extra peace of mind.
- Help keep private content private with the included password protection featuring 256‐bit AES hardware encryption.(3)
- Easily manage files and automatically free up space with the SanDisk Memory Zone app.(5). Non-Operating Temperature -20°C to 85°C
- In AWS IAM, configure the GitHub OIDC provider and create a role trusted by the intended repository and branch context. Follow GitHub’s AWS OIDC setup guidance; verify the current trust-policy details for your repository before deployment.
- Give the role only
s3:PutObjectaccess to the destination object prefix, such asarn:aws:s3:::YOUR-BUCKET/screenshots/*. The precise resource ARN depends on your bucket and key layout. Additional permissions may be necessary if you deliberately use features such as object ACLs, tags, Object Lock, or customer-managed KMS encryption. - In the GitHub workflow, grant
id-token: writeand useaws-actions/configure-aws-credentialsto assume the role. Pin third-party actions to reviewed versions or commit SHAs according to your supply-chain policy. GitHub identifies its example AWS credentials action as third-party, not GitHub-certified.
S3 objects are private by default and newly uploaded objects are encrypted by default. Keep screenshots private unless publication is intentional: captures can contain account or customer information, and default encryption does not replace access control. See the AWS documentation on S3 access and public access controls and default encryption.
Create the scheduled Playwright workflow
The following example captures a public page once each day at 03:17 UTC, then uploads the PNG to S3. Replace the repository, role, bucket, target URL, and key prefix. The workflow uses a timestamped key so each successful run creates a separate historical object.
Save this file as .github/workflows/website-screenshot.yml and ensure that the workflow file is on the repository’s default branch; GitHub schedule events run from that branch. The third-party action references below use version tags for readability—review and pin them to commit SHAs if that is your policy.
Rank #2
- Solid state performance with up to 800MB/s read speeds in a portable drive. (Based on internal testing; performance may be lower depending on host device, interface, usage conditions and other factors. 1MB=1,000,000 bytes.)
- Back up your content and memories on a storage solution that fits seamlessly into your mobile lifestyle.
- Take it with you on your adventures—up to two-meter drop protection means this durable drive can take a beating. (Based on internal testing.)
- Secure it to your belt loop or backpack for extra peace of mind thanks to the tough rubber hook.
- From Sandisk, a brand professional photographers trust to take on assignments.
name: Recurring website screenshot
on:
schedule:
- cron: '17 3 * * *'
workflow_dispatch:
permissions:
contents: read
id-token: write
jobs:
capture:
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'
- name: Install Playwright and browser
run: |
npm install --no-save playwright
npx playwright install --with-deps chromium
- name: Capture page
env:
TARGET_URL: https://example.com
FULL_PAGE: 'true'
run: |
node --input-type=module <<'NODE'
import { chromium } from 'playwright';
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } });
await page.goto(process.env.TARGET_URL, { waitUntil: 'networkidle', timeout: 60000 });
await page.screenshot({ path: 'screenshot.png', fullPage: process.env.FULL_PAGE === 'true' });
} finally {
await browser.close();
}
NODE
- name: Configure AWS credentials through OIDC
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/github-screenshot-uploader
aws-region: us-east-1
- name: Upload screenshot
env:
AWS_REGION: us-east-1
run: |
stamp="$(date -u +'%Y/%m/%d/%H%M%S')"
aws s3 cp ./screenshot.png "s3://YOUR-BUCKET/screenshots/${stamp}.png"
--region "$AWS_REGION"
GitHub schedule expressions use UTC unless a timezone is specified. The example’s 03:17 UTC timing avoids the top of the hour, when scheduled workflows are more likely to be delayed. GitHub notes that high load can delay scheduled runs and that queued runs can be dropped, so this is suitable for recurring snapshots, not a precision clock or guaranteed monitoring interval. See GitHub’s schedule event documentation.
Use local wall-clock time only when you need it
GitHub also supports an IANA timezone for scheduled workflows. Local schedules can shift in UTC when daylight-saving time changes. Confirm the timezone support and syntax in the live GitHub documentation, and decide whether a local wall-clock time or a fixed UTC time is the better operational choice.
Wait for the right page state
networkidle is a useful starting point for pages that settle after network requests finish, but it is not a universal signal that the content you need is ready. If a page renders the relevant content later, wait for a specific locator or use a deliberate delay before taking the screenshot. If the page requires authentication, its login/session flow is site-specific; do not assume that a public-page example handles it.
Rank #3
- Capacity Display Variance: 500GB external ssd often appears as around 465GB on Windows. MacOS can show full 500 GB capacity. This is binary calculation difference and doesn’t affect SSD hard drive actual physical storage
- 1050 MB/s Speed: Instantly access to your files with blazing-fast 10Gbps external SSD read up to 1050MB/s and write up to 1000MB/s. LED Light indicates USB SSD instant activity
- Data Security: Solid state drives S.M.A.R.T. health diagnostics and adaptive TRIM optimizing data block management ensures consistent write speeds and extends the longevity of the portable SSD
- USB-C & USB-A Cable: Both cables featuring rapid USB 3.2 Gen2, this USB SSD effortlessly bridges devices, enabling seamless cross-platform file transfers and backup between computers, smartphones, tablets and iPhone
- Always Fast: No slowdowns for large file transfers. With SLC caching (25% of current available capacity allocated as high-speed cache), this external SSD delivers steady 10Gbps for transfers within the cache capacity
Choose an S3 key and retention policy
A unique key preserves a history; a stable key such as screenshots/latest.png replaces the prior current image. Pick the naming scheme based on whether you need an audit trail, a latest-state artifact, or both. The example uses UTC path components to make retained captures easy to browse.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →If old screenshots should move to a lower-cost storage class or be deleted, configure an S3 Lifecycle rule for the relevant prefix. Lifecycle transitions and expiration apply to existing as well as newly matching objects, but deletion is not an exact real-time timer. Check bucket versioning too: expiration behavior differs when noncurrent versions are retained. Consult AWS S3 Lifecycle documentation before setting a retention rule.
Or skip the browser setup
ScreenshotNeo can return a screenshot from one GET request, without provisioning a browser runner. It accepts a URL and can return PNG, JPEG, WebP, or PDF; you can save the response and upload it to S3 using the same AWS identity and destination policy described above. The parameter names used by other screenshot APIs also work, which can simplify a switch.
Rank #4
- NEARLY 2X FASTER THAN OUR PREVIOUS GENERATION(8) – move 1,000 high-res photos in under 60 seconds(6) with up to 2000MB/s transfer speeds(2).
- IP65 RATING AND UP TO 3M DROP PROTECTION(3) – protects against spills and drops.
- POCKET-SIZED – fits easily in pockets and small bags.
- SPACE TO OWN YOUR AI CONTENT – speed and capacity to download your high-res clips and photo edits.
- 256-BIT AES ENCRYPTION(4) – helps keep private files secure with password protection.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
See the ScreenshotNeo API documentation for request options. Cookie banners are accepted and removed before capture, as are known newsletter popups and chat widgets; each cleanup step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. An MCP server exposes take_screenshot, get_page_info, and capture_pdf to AI agents and MCP clients. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for ScreenshotNeo’s free plan.
Troubleshoot common failures
- The workflow never starts: Confirm the workflow file is committed to the default branch and that the cron expression is valid. A scheduled event is not guaranteed to start exactly on time; GitHub may delay or drop runs under load.
- AWS reports that it cannot assume the role: Check that the workflow grants
id-token: write, the OIDC provider is configured, and the role trust policy matches the repository and branch context actually running the workflow. - The upload returns AccessDenied: Verify the role’s
s3:PutObjectpermission covers the exact bucket and object prefix. If using a feature such as a customer-managed KMS key, check for its associated permissions as well. - The screenshot is blank or incomplete: Check the target URL and browser navigation result, then replace a generic network-idle wait with a selector or delay that matches the page’s rendering behavior. Confirm that the desired viewport, full-page, or element capture mode is selected.
- The job times out on navigation: The page may load slowly or keep network connections open. Review the navigation timeout and choose a meaningful readiness condition for that page rather than treating any one wait state as universal.
- The object is unexpectedly public or unavailable: Check bucket and object access policies, public-access settings, and the credentials or role used to read it. Encryption at rest alone does not grant or restrict a reader’s access.
- Old files are not removed when expected: Review the lifecycle rule’s prefix filters, versioning configuration, and lifecycle timing; expiration is not a precise scheduled deletion.
Reliability, security, and cost considerations
Scheduled captures create browser compute and S3 storage and request usage. A useful estimate depends on your AWS region, capture frequency, image size, retention duration, request volume, and storage class; use the current AWS pricing information for those inputs rather than assuming a universal per-screenshot cost. No benchmark or fixed cost follows from the workflow alone.
Recommended Free Tools
Keep the AWS role restricted to the intended repository and branch, scope S3 writes to the required object prefix, and do not place credentials in filenames, command-line arguments, or public object URLs. Review the target site’s authentication restrictions, anti-automation terms, consent requirements, and rules for retaining its content before scheduling captures.
GitHub Actions scheduling is best-effort rather than a precise monitoring clock. If you need dependable alerting or exact capture intervals, choose a scheduler or monitoring service whose documented guarantees meet that requirement.
Best Value
- Easily store and access 2TB to content on the go with the Seagate Portable Drive, a USB external hard drive
- Designed to work with Windows or Mac computers, this external hard drive makes backup a snap just drag and drop
- To get set up, connect the portable hard drive to a computer for automatic recognition no software required
- This USB drive provides plug and play simplicity with the included 18 inch USB 3.0 cable
- The available storage capacity may vary.
Frequently Asked Questions
Can I trigger a capture manually as well as on a schedule?
Yes. The example includes workflow_dispatch, which exposes a manual run option in GitHub Actions.
Can the same workflow keep only the most recent screenshot?
Yes. Change the upload destination to a stable key such as s3://YOUR-BUCKET/screenshots/latest.png; each successful upload replaces that object’s contents.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Quick 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.




