FullSnap is a Chrome Extension (Manifest V3) that captures pixel-accurate, full-page screenshots and saves them as lossless PNG files.
It works by scrolling through the page, capturing viewport-sized tiles, stitching them together on a canvas, and downloading the final image automatically.
- One-click full-page capture from the popup UI.
- Lossless PNG output (
chrome.tabs.captureVisibleTabwith PNG format). - Progress updates during capture (tile count + rough ETA).
- Automatic filename with timestamp (for example:
fullsnap_20260423_131530.png). - Capture statistics in popup after completion (width, height, output size).
- Popup sends a
captureFullPagemessage to the background service worker. - Background script injects the content script and reads page dimensions.
- It scrolls across the page in slightly-overlapping tiles (98% viewport step).
- Each viewport is captured as PNG.
- Content script stitches all tiles into one canvas.
- The final PNG is downloaded via the Downloads API.
- Original page scroll position is restored.
manifest.json— extension metadata, permissions, action popup, service worker.popup.html/popup.js— popup UI + capture trigger + status/progress rendering.background.js— orchestration (inject, measure, scroll, capture, stitch call, download).content.js— page helpers for dimensions, scrolling, restoring, and tile stitching.icons/— extension icons.
activeTab— run capture flow on the currently active tab.scripting— inject and execute scripts in the target tab.tabs— query active tab info and capture visible tab.downloads— save stitched PNG to disk.host_permissions: <all_urls>— allow operation on pages you capture.
- Clone or download this repository.
- Open
chrome://extensionsin Chrome. - Turn on Developer mode.
- Click Load unpacked.
- Select this project folder.
- Pin FullSnap and click the extension icon on a page.
- Open the webpage you want to capture.
- Click the FullSnap extension icon.
- Click Capture Full Page.
- Wait for progress to complete.
- Find the PNG in your default Chrome downloads folder.
- Very large pages may exceed browser canvas limits and fail to stitch.
- Dynamic pages (sticky headers, animations, lazy loading) can introduce visual duplication or seams.
- Capture timing is intentionally throttled (~550ms between shots) to respect Chrome capture rate limits.
- Chrome Web Store packaging/signing is not included in this repository.
This project is plain JavaScript + HTML/CSS (no build step).
To iterate quickly:
- Edit files.
- Go to
chrome://extensions. - Click Reload on FullSnap.
- Re-open popup and test on a real webpage.
This project is licensed under the terms of the LICENSE file.