Now part of CaptureTools

Sealshot now ships inside CaptureTools, one extension holding five separate tools that stay isolated from each other. This page still describes Sealshot in full. See the suite.

#DHSeaDev — Chrome MV3 — Toolbar Action — Full-Page Screenshot

SEALSHOT

Sealshot is a Chrome extension that captures an entire scrollable web page in one click and never asks for permission to reach the network. That second half is the point. Its manifest declares no host permissions at all, and there is no code in the package capable of making a network request — no account, no upload, no telemetry, no sign-in. You do not have to take that on trust: install it unpacked and read the manifest yourself, because the whole permission list is four lines long.

CHROME WEB STORE LISTING IN PREPARATION

Version 1.2.0 is packaged and gated. Nothing is submitted yet, so this page claims no store listing. The full privacy policy is in the Privacy section below. Questions: dhseadev@gmail.com

A long page sheet closed with a wax seal A tall sheet of ruled paper drawn in a light prism stroke, extending below the frame to suggest a page longer than one screen, with a round wax seal pressed over its lower corner.

Why this exists

In August 2026 the most widely used full-page screenshot extension on Chrome was pulled from the Chrome Web Store. Its developers say the removal followed a copyright complaint about a single design element, that they believe it was made in error, and that it was never a security problem; the extension is still available on other browsers and a beta channel while they work on getting the Chrome listing back. Whatever the outcome, several million people found out in one morning that a daily part of their workflow was a single listing away from disappearing.

That is the occasion, not the argument. The argument is narrower: a screenshot of a page is a copy of that page, and most extensions in this category either upload your captures to an account or at minimum hold permission to talk to servers you have never inspected. Sealshot is built so that it cannot — not as a policy it promises to keep, but as a property of what is in the package.

What it does

One click, the whole page

The toolbar button, or Alt+Shift+S, captures the full scrollable page and opens the result in a tab of its own with a Download button. PNG, or JPEG with a quality slider. Capture only the visible area instead, if that is all you need.

Sticky elements placed once

Fixed headers do not repeat down the image and fixed footers do not get stranded in the middle of it. Sealshot classifies each floating element by what it is anchored to and renders it once, where it belongs on the finished page.

Scale measured, not assumed

The capture scale is measured from the real captured frame rather than read off a browser property that browser zoom and display scaling both push out of sync. No soft output, no doubled output, and no seam every screen height.

It will not silently truncate

A canvas past Chrome’s size limit does not throw and does not return null — every draw quietly does nothing and you get a correctly sized blank image. Sealshot proves the canvas is usable before it captures a single tile, and scales a very tall page to fit rather than cutting the bottom off.

Seven themes, none of them yours

Seven themes for Sealshot’s own pages, including a high-contrast one. It restyles nothing on the pages you capture, and it puts nothing on them either.

Refusals you can read

Pages Chrome forbids any extension from reading — its own settings pages, the Web Store itself — come back with a sentence explaining why, instead of a spinner that never resolves.

Built to be checked, not just to work

The part that decides what to capture is a pure module: given page dimensions it returns a tile plan, with no browser API and no canvas anywhere in it, so the geometry is tested in Node against known answers rather than by looking at pictures. The service worker is a capture proxy that holds nothing and serialises every call against Chrome’s two-per-second quota. The multi-second loop runs in the content script, because a long capture legitimately outlives the service worker’s idle timeout. The stitching canvas lives in an offscreen document, the one extension context with no documented lifetime limit.

What that bought, in numbers: 17 known-answer geometry tests plus a harness-integrity gate that proves the coverage assertion is capable of failing, 30 live assertions driven against real Chromium with the extension loaded across 9 page fixtures at two display scales, four stress shards covering zoom, hostile page surfaces, geometry and lifecycle, and six real-world page archetypes captured end to end.

Four defects worth naming, because every one of them was found by a test rather than by use, and two of them were passing tests first. Fractional display scaling broke every capture: the browser snaps scrolling to whole device pixels and lands a fraction past the target, which a strict check read as unreachable. A page zoomed out reported its height in two different coordinate systems depending on which element was asked, inventing a phantom column of empty space. Scroll snapping moved the scroll after it was set and left a band of the page belonging to no tile at all. And a full-height fixed sidebar vanished from every tile — while the assertion watching for it passed, because it only asked whether the sidebar was repeated, and something that has disappeared is not repeated. That assertion was rewritten before the bug was.

The extension this one references

Sealshot is a clean-room build whose feature list was taken from GoFullPage — Full Page Screen Capture, by GoFullPage, originally written by Peter Coles. It is the extension that defined what people expect this category to do, and the parity target for this build was its published feature list and nothing else.

Nothing was copied. No source, no assets, no markup. Its behaviour was read as a specification and the implementation written fresh — which is also why the two products differ where they differ: Sealshot has no annotation, no editing, no cloud, no share links and no PDF export, because all of those want capabilities it declines to ask for.

Credit where it is owed, and a correction to the usual framing. GoFullPage is not abandoned and this is not a replacement for something dead. Its Chrome listing was removed in August 2026 following a copyright complaint its developers say was made in error and unrelated to security; it remains available elsewhere while they work on restoring it. If it comes back and you prefer it, use it — it is a good piece of software and it earned its position honestly.

No comparison is drawn anywhere in this project’s store listing. Naming a competitor there is against Chrome Web Store policy, and beyond the policy it would be a poor argument. The claim Sealshot makes stands on its own manifest.

Questions

Does Sealshot upload my screenshots anywhere?

It cannot. The manifest declares no host permissions, so the extension holds no access to any server, and the package contains no network code — no XMLHttpRequest, no WebSocket, no beacon, no remote script, font or image. The single fetch call in the codebase is guarded to accept only a data URL and exists to decode an image already in memory. There is no account, no sign-in and no telemetry, and none of the four permissions it does request is capable of reaching the network.

Why does it need scripting and activeTab?

Capturing the visible area of a tab requires either activeTab or blanket access to every site. Sealshot takes activeTab, which Chrome grants per click, for one tab, and revokes on navigation. The scripting permission injects the code that measures the page, scrolls it one screen at a time, hides floating elements so they do not repeat, and puts the scroll position and styling back when it is done. It never reads page content, and it sends nothing anywhere.

Where does my screenshot go between capture and download?

Into the browser’s own local database for a few seconds, because the finished image is a binary object and Chrome’s extension messaging cannot carry one. The result tab reads and deletes it in the same operation, which is why reloading a result tab shows nothing — the image was already gone. Anything an interrupted run left behind is swept when Chrome starts, before every new capture, and when a result tab is closed.

What happens on a page too tall for one image?

It is scaled down to fit and told to you, in the result tab, in a sentence. Chrome’s canvas has both a per-side and a total-area limit, and exceeding either does not raise an error — every drawing operation silently does nothing and the output is a correctly sized blank image. Sealshot writes a sentinel pixel and reads it back to prove the canvas is real before it captures anything, so a blank capture is a failure it reports rather than a file you discover is empty later.


Privacy

The short version: Sealshot has no network permissions, makes no network requests, and keeps every capture on your machine. There is no analytics, no account and no telemetry. This section is the extension’s privacy policy.

WhatAnswer
Data collectedNone. Sealshot collects and transmits no data about you, to us or to anyone.
Accounts or sign-inNone. There is no account system, no login and no email field anywhere in the extension.
Network requestsNone at all, and the extension is structurally incapable of making one: the manifest declares no host permissions, and the package contains no XMLHttpRequest, WebSocket, beacon, EventSource or remote script, font or image.
Analytics or telemetryNone. No events, no usage counters, no crash reporting, no advertising identifiers, no third-party scripts.
Website accessNo standing access to any site. Sealshot runs on the one tab you clicked, only after you click it, under a permission Chrome revokes on navigation.
Permissions requestedFour, all local: activeTab, scripting, storage and offscreen. Each is explained below. No host permissions.
Where your captures liveIn the browser’s local database for the seconds between capture and the result tab opening, then in whatever folder you download them to. Nowhere else.
What syncsNothing. Sealshot never uses Chrome’s sync storage, because sync leaves the machine. Your theme and preferences are stored locally on this device only.
Page contentNever read, never stored and never transmitted. The injected code measures and scrolls the page; it does not look at what is on it, and the finished image is handed to you and to nobody else.
Remote codeNone. No eval, no remotely hosted scripts, no CDN libraries, no bundled third-party runtime. Every line in the package is in the package.
Selling or sharing dataThere is no data to sell, share or transfer, to anyone, for any purpose.
Deleting your dataRemoving the extension deletes its preferences with it. Captures you downloaded are ordinary files in your own folder and are yours to delete.
ChildrenBecause it collects nothing, it holds no information about anyone, regardless of age.
The permissions, and why each one exists
PermissionWhy
activeTabLets Sealshot photograph the visible area of the tab you clicked on. Chrome grants it per click, for that one tab, and revokes it on navigation. The alternative is standing access to every website, which this extension declines.
scriptingInjects the capture driver into the page being captured: it measures the page, scrolls it one screen at a time, temporarily hides floating elements, and restores the original scroll position and styling afterwards. Injected only on your click, only into that tab.
storageRemembers your theme, your sticky-element preference and whether you want the whole page or the visible area. chrome.storage.local only; chrome.storage.sync is never used.
offscreenGives the extension a canvas to stitch the captured screens on. A Manifest V3 service worker has no DOM and therefore no canvas, and the stitch must outlive the service worker’s idle timeout on a long page.
Host permissionsNone requested. That absence is what lets every claim above be made at all, and it is the first thing worth checking in the manifest.

Questions about any of this: dhseadev@gmail.com


Credits

Built by #DHSeaDev. Code, art and tests are hand-written for this project with no bundler, no framework and zero third-party runtime dependencies. Its feature list is a parity target taken from GoFullPage — Full Page Screen Capture, originally by Peter Coles, as described in The extension this one references above. Sealshot is not affiliated with, associated with, or endorsed by GoFullPage or its developers, and contains none of their code.

Built by #DHSeaDev — dhseadev@gmail.com


More from DHSeaDev

Sealshot shares its pure-logic-module and relay-only service worker architecture with the rest of the shelf — see Focus Ledger for the same pattern applied to a timer that has to survive being killed. The devlog entry A canvas that fails without failing covers the silent-truncation trap at the centre of this build, and the assertion that passed a bug because it only asked half a question. Everything else I have built is on the projects page.