← back

Privacy

last updated 22 October 2026

Keep Every Page Alive does not run accounts, advertising trackers, or fingerprinting. Session lists stay on your device. The website uses self-hosted, cookieless pageview analytics (details below); the browser extension still phones home to no one.

The website

keepalive.page is a static page. The list of sites you ask it to keep alive is held in your browser's localStorage on your own device. Your list, intervals and settings stay in this browser after you close the tab (refresh counts start again from zero), so anyone using this browser profile can see them. Releasing a page takes it off the list, but its hostname can stay behind: the activity log keeps it (for example mail.google.com — released) until you press clear on the log, and a site whose tab closed within a few seconds of opening is remembered, so the page can warn you before you try it again, until you clear this site's data. Clearing this site's data removes everything, the activity log included.

Your list, the sites on it and your settings are never uploaded, with one deliberate exception: the count described below. Our web server does see when a kept tab refreshes, though not which site: in Reload mode (the default) a kept tab comes back to our holding page, keepalive.page/twin.html, after every refresh, so the server receives a request each time with your IP address, your browser and the time. The site travels only in the part of that address after #, which browsers never send. The server's short-lived access logs can therefore show how many pages you keep and how often they refresh. Hold in place mode makes no such requests.

There is one deliberate exception, and it is small: when you add a page, we count the bare hostname — mail.google.com, not the address you actually typed — so we can see which services people are fighting with and write better advice about them. What that means precisely:

That same hostname is also the only thing behind the on-site leaderboard: a small, self-hosted counter of our own (separate from the analytics below) tallies how many times each hostname has been added, if it passes the check above and is also an ordinary well-formed name (one ending in a dot or containing an underscore still goes to the analytics, but the counter refuses it), across everyone who uses the tool, and the page can show that running count. For each hostname it keeps the total and the time it was last added, which is used only to decide which entry to drop when the list is full; no visitor identifier and no IP address are stored with it, and only the hostname and its total are ever shown. A hostname can be shown only once it has been added at least three times, and the board shows the 20 most-added. Those additions are not tied to anyone, so all three can come from one person — keeping three pages of the same site is enough — and a site only you use can appear on the board. If that matters to you, switch the count off.

To switch it off, run this once in your browser's console on this site. It is remembered only as long as this browser keeps this site's data: run it again in any other browser, profile or private window, and again whenever this site's data is cleared, whether by you or by the browser (Safari deletes it after seven days of use without a visit here). A copy added to the Home Screen on an iPhone or iPad keeps its own data and has no console, so the switch cannot be set there; if you need the count off, keep pages from Safari instead. While it is set, the page no longer counts the sites you add: it sends no "Kept site" event to the analytics and nothing to the leaderboard. Page views are still counted unless you also block the analytics script:

localStorage.setItem('keepalive:no-count','1')

A content blocker that stops the analytics script stops everything sent to the analytics, page views included, but not the leaderboard counter, which isn't a third-party script; the console command stops the count going to either. To stop both, use both. The tool works exactly the same either way.

Pre-filled links. A link like keepalive.page/?url=… or ?u=… fills in the address for you. The page reads it and takes it out of its own address before the analytics loads, so it is not sent to the analytics. The request that opened the link still reached our web server, address and all, and may appear in its short-lived access logs (below).

The site loads no advertising trackers, no fingerprinting scripts, and no third-party fonts or frames. Its content security policy allows network requests only to itself and to our self-hosted analytics endpoint (below).

Our web server keeps ordinary short-lived access logs (IP address, the requested address including any query string, user agent) as any web server does. These are used only to keep the service running and are not combined with anything else or shared.

Analytics

We run a self-hosted Plausible Analytics instance at plausible.junovin.com (not Plausible Cloud). It records pageviews without cookies and without storing personal information: path, referrer, browser, OS, and coarse country from the request. There is no cross-site tracking and no advertising profile. You can block it with any content blocker; the tool still works.

The browser extension

For each tab you keep, the extension stores its nickname, the address you chose and its site, the interval, the method, and the result of its last few checks. That list lives in chrome.storage.local on your own machine. Nothing is uploaded, there is no remote code, and the extension never contacts keepalive.page or any third party.

On a course page it recognises, each check calls the course site's own session-keepalive service, from the extension's own sandbox where the page cannot fake the answer. It also asks the course player to save your progress (SCORM Commit) and nudges the page with synthetic pointer movement. That is what holding a course page means, so it does not wait for the opt-in below. On a site the extension treats as an exam proctor, a bank or a remote desktop, it does only the first two.

It does not hide from a course player that you switched to another tab, because a player that pauses its timer when you look away would otherwise count time nobody watched. That, and three other trade-offs, can be changed under Advanced settings, which says what each change costs. Every one starts at the choice we recommend.

It does talk to the sites you keep alive: reloading their tabs, and on some rungs of the keepalive ladder sending a background request to that site carrying your browser's own cookies — the same traffic your browser would send if you reloaded the page yourself. Those requests go only to the site being kept alive, never to us. One exception, and it is opt-in: on the ladder's last rung, on a site where you ticked Allow page-detectable rungs, the extension asks the app's own sign-in library to refresh your sign-in, and that library may contact the app's sign-in provider (Microsoft's, for example) exactly as it does when the app refreshes on its own.

When your screen locks, every check stops — nothing is reloaded, nudged or sent — and the in-page helpers the smart ladder can leave running are switched off: the one that hides the tab going into the background, the visibility override, and the lock and blank video track that stop Chrome freezing the page. The same happens when you pause or remove a tab, or withdraw the extension's access to its site. Chrome is still told not to unload a kept tab, so it is there when you come back. Pages that were open when the extension updated keep the old version's helpers until they are reloaded; the update switches those off where Chrome lets it reach them.

At install it asks for five permissions, none of which show a warning, and access to no website:

Four more are optional. None is part of the install, and each is asked for only when you choose the feature that needs it:

Before each check of a kept tab, the extension looks at which page it is on — where Chrome lets it, which is on sites you allowed or with tabs switched on — and, on a site you allowed, which pages it frames — so that it never reloads a course player it recognises, even one embedded in another page, and never clicks on one. That address is used for that one decision and is not stored.

On a site you put on the smart ladder, the extension's two scripts load into every page of that site, from the moment each page starts, for as long as anything on that site is kept; releasing the last tab on the site — however you release it — stops them loading into new pages. One of them notes the site's own repeated background requests — their address, method and four kinds of header only: content type, accepted types, the X-Requested-With marker and the site's anti-forgery header; never Authorization, cookies or any other header — so it can repeat one later. For a site that keeps a live socket open it notes only that the socket exists, never what is sent over it. That record stays in the page's memory and goes nowhere except back to that same site. When the extension repeats such a request, or pings the site, it copies the site's anti-forgery token into it (from the page, or from the site's own CSRF cookie), as the site's own code does.

What we do not do

Your cookies stay yours

Reloading a page you asked us to keep alive causes your browser to send its own cookies to that site, exactly as it would if you pressed reload yourself. The website cannot see those cookies at all. The extension, on sites you allowed, looks at cookie names to tell how a site signs you in. The one cookie value it ever uses is a site's anti-forgery (CSRF) token, which it copies into a request to that same site the way the site's own code does. It never stores your cookies or sends them anywhere else. No session information ever passes through us.

Payments (future)

The product is free today. If optional paid features ever ship, payment processing will go through a standard provider (for example Stripe). We will not sell browsing data to fund the product. License state, if any, stays on your device unless you explicitly opt into a sync feature that does not exist yet.

Contact

Questions about this policy: brandon.gatz@gmail.com.

← back