Not a smart analyzer. Not a browser automation framework. Just a dumb, reliable screenshotter — one URL, one perfect full-page capture.
mshot focuses on one thing and does it perfectly — pixel-perfect full-page screenshots, reliably.
Scrolls top→bottom→top before capture, triggering lazy images, IntersectionObserver content, and any scroll-dependent rendering. No more half-loaded pages.
Waits for document.fonts.ready and all <img> elements — with a hard timeout ceiling. Never hangs.
Captures dozens of pages using a single Chromium instance. Built-in concurrency, link discovery, and a structured manifest.json output.
Discovers real, rendered links from the base page — including lazy-loaded and JS-rendered content. Supports multi-depth crawling for deeper site coverage.
Numeric IDs, UUIDs, encoded segments — all normalized to :id. Captures one representative per pattern. No more 50 identical entity pages.
One browser capture → Sharp-powered overview thumbnail + overlapping segments. No repeated captures, no extra browser opens. Configurable height and overlap.
Capture desktop (1440px) and mobile (390px) viewports in a single batch run. Each viewport gets its own screenshot and manifest entry.
Powered by Sharp for format conversion and quality control. Choose your output format and quality level — from tiny WebP to lossless PNG.
Clean stdout/stderr contract, atomic file writes (tmp → rename), and automatic cleanup on failure. Built to be called by agents and CI pipelines.
A tight, predictable pipeline from URL to pixel-perfect screenshot.
Fresh Chromium navigates to the URL, waits for domcontentloaded, then networkidle.
Scrolls top→bottom→top to trigger lazy images, IntersectionObserver content, and any scroll-dependent rendering. Capped at 30,000px.
Best-effort wait for fonts and images to load, bounded by --settle-timeout. Animations disabled for stable frames.
Captures the full page in one go. Optional --max-height crop for extremely tall pages.
Sharp converts to the target format. File is written via tmp → rename for atomicity. On failure, everything is cleaned up.
Single URL for quick captures, batch mode for comprehensive visual regression.
One URL → one full-page screenshot. Perfect for quick captures, documentation, or one-off visual checks.
Discover links, capture multiple pages with concurrency, multi-viewport support, and structured manifest output.
Every capture tracked with timings and metadata
{
"manifestVersion": 1,
"baseUrl": "http://localhost:3079",
"pages": [
{
"url": "http://localhost:3079",
"screenshots": { "desktop": "home-desktop.jpg" },
"timings": { "totalMs": 2000 }
}
]
}
For extremely long pages — one capture, split into manageable pieces.
1 browser capture → Sharp overview + overlapping segments
No repeated captures. No extra browser opens.
Deterministic behavior. Same input, same output. Every time.
Clean stdout/stderr contract. Atomic writes. No stale files.
No DOM parsing. No AI. No analysis. Just screenshot and save.
Two commands. That's it.