To capture a website with Puppeteer on an Indian Linux VPS, install a current Node.js runtime and Puppeteer, let Puppeteer download its compatible Chrome for Testing browser, then navigate to the page and call page.screenshot(). For the currently documented Puppeteer 25.12.0, the requirements page specifies Node.js 22.12 or later and Debian or Ubuntu Linux on x64 or arm64. A low-cost VPS may run the workflow, but no provider or small plan is proven to meet a particular screenshot workload without testing it.
Set up Puppeteer on a Linux VPS
Puppeteer controls a browser, so deployment involves more than installing a Node package: the compatible browser, operating-system libraries, fonts, writable storage and safe browser execution all matter.
As an Amazon Associate I earn from qualifying purchases.
Check the runtime and server image
Puppeteer’s current 25.12.0 system requirements specify Node.js 22.12 or later and Chrome for Testing on Debian/Ubuntu Linux x64 and arm64. Confirm the operating system and CPU architecture of your VPS before installing. These requirements may change with future Puppeteer releases, so check the official supported browsers and system requirements for the version you deploy.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Repair Windows errors before they cause bigger problems3Fix the driver behind crashes, sound loss and screen glitchesCreate a project and install Puppeteer
On a supported server with Node.js installed, create a project and install Puppeteer using npm:
#1 Best Overall
mkdir site-shot
cd site-shot
npm init -y
npm install puppeteer
Puppeteer’s install process normally downloads a matched Chrome for Testing browser. Its installation guide estimates the Linux browser download at about 282 MB, so allow for download time and disk space. If your package manager or deployment pipeline disables install scripts, verify that the browser was actually downloaded; otherwise, launching Puppeteer can fail because its expected browser executable is missing. See the Puppeteer installation guide for current installation details.
Capture a website screenshot
Save this as capture.mjs in the project directory. It accepts a target URL as its first argument and saves a full-page PNG. The URL is encoded and checked before navigation; the browser is closed in a finally block even if navigation or capture fails.
import puppeteer from 'puppeteer';
const rawUrl = process.argv[2];
if (!rawUrl) {
throw new Error('Usage: node capture.mjs https://example.com');
}
const target = new URL(rawUrl);
if (!['http:', 'https:'].includes(target.protocol)) {
throw new Error('Only http and https URLs are supported');
}
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
await page.goto(target.href, {
waitUntil: 'networkidle2',
timeout: 60000
});
await page.screenshot({
path: 'page.png',
fullPage: true,
type: 'png'
});
} finally {
await browser.close();
}
Run it with node capture.mjs https://example.com. The example follows Puppeteer’s documented navigation and screenshot flow; it has not been executed against your VPS. networkidle2 waits for a period with no more than two network connections, which is often useful for pages that load assets after the initial HTML. It does not guarantee that every animation, delayed widget or lazy-loaded image has finished.
Rank #2
Choose the capture area
fullPage: truecaptures the full scrollable document; the default isfalse, which captures the viewport.- Use
clipto capture a specific rectangle when you need a fixed region. A clip includes coordinates and dimensions, so keep the viewport stable when exact framing matters. - Set a fixed viewport with
await page.setViewport({ width: 1440, height: 900 });before navigation when repeatable viewport dimensions matter. - For a page with late-loading content, wait for a known selector using
await page.waitForSelector('.content-ready');before taking the screenshot. Choose a selector that actually indicates the content you need.
See the ScreenshotOptions API for the current options and types. A page that continually polls or keeps network connections open may never become idle as expected; in that case, wait for a meaningful selector or use a deliberate delay instead of relying on network idleness alone.
Handle Linux dependencies and browser security
Chrome can fail to start even when the JavaScript is valid. Linux browser builds depend on system libraries and fonts, and the required packages can vary with the distribution and browser version. Use Puppeteer’s current troubleshooting guide for Debian/Ubuntu dependencies. If Chrome reports a missing shared library, inspect the browser binary’s unresolved libraries and install the matching operating-system package rather than guessing from an old package list.
Keep Chrome’s sandbox enabled where possible. Puppeteer explains that sandboxing helps protect the host from untrusted web content and strongly discourages the routine use of --no-sandbox. That is especially important for a screenshot service that accepts URLs from users: a target page is untrusted input, not just an image source. Restrict which URLs and network destinations jobs can access, limit CPU, memory and execution time, and avoid exposing server credentials to the browser process.
Rank #3
- Your Personal Streaming Server - Build your own Netflix-style media library and stream 4K movies, shows and photos to any device without monthly fees
- Create Your Own Cloud - Store your entire photo, video and music collection; access from anywhere with fast 282 MB/s transfer speeds
- Creator-Grade Backup Solution - Protect your irreplaceable content with automated backups to cloud services, external drives and remote NAS
- Multi-Layered Data Protection - Combine RAID redundancy, automated backups and snapshot technology to prevent data loss from any cause
- Smart Home Surveillance - Support up to 30 IP cameras with AI detection, instant alerts and secure remote monitoring
Run Puppeteer in Docker if you need a reproducible image
Puppeteer publishes a Docker image containing Chrome for Testing and its required dependencies. Its documented sandbox invocation uses --cap-add=SYS_ADMIN and --init:
docker run --init --cap-add=SYS_ADMIN
--rm -i ghcr.io/puppeteer/puppeteer:latest
Use the image and invocation documented for the Puppeteer version you deploy; do not assume a floating latest tag is a fixed production version. In containers with restricted filesystem access, ensure the browser profile, cache and temporary paths are writable. The official Docker guide documents the image and sandbox requirements.
Choose a low-cost Indian VPS by workload, not headline price
There is no tested minimum RAM, screenshot throughput, latency figure or universally cheapest Indian provider for this workload. A simple page and a long, script-heavy page do not place the same demands on CPU, memory, disk or transfer. Compare the current plan specifications against your intended pages and job volume, then test representative captures before committing.
| What to compare | Why it matters |
|---|---|
| Monthly price and billing terms | Prices and plan bundles can change; check the live regional offer rather than relying on an old comparison. |
| CPU and RAM | Each browser process consumes resources, and simultaneous jobs compete for them. No minimum size or concurrency level is established for every workload. |
| Disk and transfer allowance | The browser download is substantial, and screenshots, temporary browser files and page assets need storage and network capacity. |
| India region and networking | Check whether the provider offers a location that suits your users and target sites, plus any region-specific transfer limits. |
| OS, architecture and setup effort | Confirm compatibility with Puppeteer’s supported Linux/browser combination and account for the work of maintaining system dependencies. |
| Scaling and operational controls | Consider whether you can add capacity and manage job concurrency, timeouts and resource limits as demand changes. |
DigitalOcean describes Droplets as Linux VPS servers and lists a Bangalore datacenter. AWS Lightsail publishes bundled Linux/Unix plans; its transfer allowances can differ for India regions from standard bundle figures. These pages establish provider options, not a benchmark or proof that a particular low-cost plan will handle your pages at a given rate. Review their live plan and regional terms before choosing.
Improve throughput and reliability
Start with one job at a time and observe the server under the actual pages you need to capture. Increase concurrency gradually while monitoring memory, CPU, disk space and failures. A browser-per-job design is straightforward, but opening many browsers at once can exhaust a small server; reuse or queueing designs can improve resource control, but require careful isolation and lifecycle management.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →- Set navigation timeouts and close the browser in a
finallyblock so failed pages do not leave browser processes behind. - Use a selector-based readiness condition for pages whose meaningful content appears after the initial network activity.
- Write outputs to a known writable directory and enforce a retention policy for screenshots and temporary files.
- Log the target, duration, navigation outcome and capture error without recording secrets such as authorization headers or cookies.
- Test representative pages at the intended concurrency. No provider-specific performance results or sizing guarantee are available for this workflow.
Troubleshoot common failures
| Symptom | Likely cause | What to do |
|---|---|---|
| Browser executable not found | Install scripts were blocked or Puppeteer’s matched browser was not downloaded. | Check the install output and Puppeteer’s browser cache; allow the supported install step to run or follow the official installation instructions for your deployment. |
| Chrome exits immediately or reports missing libraries | Required Linux shared libraries or fonts are absent. | Follow the current Puppeteer troubleshooting instructions for your distro and inspect unresolved shared libraries on the browser executable. |
| Permission denied writing profile, cache or screenshot | The service user or container cannot write to the configured path. | Choose writable profile, cache, temporary and output locations, then check ownership and container filesystem restrictions. |
| Sandbox-related launch failure | The environment does not permit Chrome’s sandbox configuration. | Prefer configuring the sandbox and container permissions as documented. Do not make --no-sandbox the default workaround, especially when visiting arbitrary URLs. |
| Navigation times out | The site is slow, blocked, or keeps connections active beyond the timeout. | Check network access and the target response; tune the timeout to the workload, and use a selector or bounded wait when network-idle is unsuitable. |
| Screenshot misses images or dynamic content | Content loaded after the chosen readiness condition, or below-the-fold assets were lazy-loaded. | Wait for a page-specific ready selector; scroll or otherwise trigger lazy content before capture if required by the target page. |
| Server runs out of memory or becomes slow | Too many simultaneous browser jobs or resource-heavy pages. | Reduce concurrency, impose job limits, monitor resource use and test a larger plan against your actual workload before scaling. |
Or skip the browser setup
If you would rather not install and maintain Chrome on a VPS, ScreenshotNeo provides a website screenshot API. One GET request returns an image or PDF. Its API can accept consent banners as a visitor and remove more than 60 known consent platforms, newsletter popups and chat widgets before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and response headers say which outcome occurred. It also offers an MCP server for AI agents, with the tools take_screenshot, get_page_info and capture_pdf.
cURL example, adapted to the requested target URL; see the ScreenshotNeo API documentation for setup and options:
Best Value
- COMPATIBILITY: Specially designed to mount Ubiquiti UniFi Cloud Gateway models UCG-Ultra and UCG-Max securely in place
- RACK SPECIFICATIONS: Standard 1U height rack mount bracket engineered for 10-inch rack installations, offering efficient space utilization
- MOUNTING SOLUTION: Provides stable and secure placement for your UniFi Cloud Gateway UCG Max or UCG Ultra device in server room or network cabinet setups
- PACKAGE CONTENTS: Includes one (1x) 1U 10-inch rack mount bracket specifically designed for UniFi UCG Ultra & UCG Max Gateway installations
- INSTALLATION: Purpose-built bracket ensures proper device positioning and reliable mounting in standard 10-inch rack environments
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
ScreenshotNeo’s free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Sign up for free.
Frequently Asked Questions
Can I use a URL from a user directly in a screenshot service?
Treat it as untrusted input: validate schemes, restrict network destinations and resources, and keep browser sandboxing enabled where possible.
Free tools Windows power users keep installed
One-click scans. No signup required.
Does Puppeteer guarantee a screenshot after network idle?
No. Network idleness is a navigation condition, not proof that every delayed, animated or lazy-loaded element is ready; wait for a meaningful page-specific condition when needed.
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.




