Cookie Policy
Effective: May 10, 2026 · Updated: October 8, 2026 · Version 1.3
Notice of change. From October 25, 2026 (00:00 UTC), our first-party analytics also records how each page load started, and one event when a tool finishes a run (§3.4). Neither is recorded before then.
This Cookie Policy explains what storage technologies Loft Tools uses on your device, what they’re for, and how to control them. It supplements our Privacy Policy.
1. The short version
Loft Tools sets no advertising cookies, no third-party trackers, and no cross-site fingerprinting. We run our own first-party analytics on a same-origin endpoint (/_/c) — no data leaves Cloudflare, our infrastructure provider. For each page view we record the path, UTC timestamp, country (from request headers), referring site host, how the page load started, and a one-way SHA-256 hash of (rotating daily salt + IP + User-Agent + site host). When a tool finishes a run, we also record the tool’s id, how long the run took, the input size rounded down to a coarse step, and whether it succeeded. Section 3.4 lists every field. No file name or file content is ever sent. The salt is regenerated every 24 hours and the previous salt is destroyed, so the hash cannot be linked across days. Raw IP, User-Agent, and any file content are never written to disk.
We do use device-local storage (localStorage, IndexedDB, and a Service Worker cache) to make tools work offline and to remember your preferences. None of this data leaves your browser or is shared with us or anyone else.
We will update this page at least 14 days before anything material changes — for example, before we change analytics providers or before we serve any advertising.
2. The terminology, briefly
When privacy laws (the EU ePrivacy Directive, the UK PECR, the CCPA, etc.) talk about “cookies,” they often mean any technology used to read or store information on your device. That includes:
| Technology |
What it is |
| Cookies |
Small text files set by a website and sent back to the server with each request. |
| localStorage |
A larger key-value store kept by your browser per site. Stays until cleared. |
| sessionStorage |
Like localStorage but cleared when you close the tab. |
| IndexedDB |
A larger structured database kept by your browser per site. |
| Service Worker cache |
Files saved by your browser so the site can work offline. |
| Pixels / web beacons |
Tiny invisible images that report back when loaded. |
| Browser fingerprinting |
Building a “fingerprint” from the combination of your browser settings and capabilities. |
We refer to all of these as “storage technologies” below. Where a particular law uses the word “cookies” we mean it in the broad sense.
3. What we use today
3.1 Strictly necessary device-local storage (no consent required)
We use the following storage technologies, all of which are strictly necessary to provide a function you’ve explicitly requested. Under the ePrivacy Directive (recital 25 / Art. 5(3)) and equivalent rules, strictly necessary storage does not require prior consent.
| What |
Where |
Purpose |
Lifetime |
| App shell cache |
Service Worker cache |
Make the Service work offline and load fast |
Until you clear browser site data, or we update the cached version |
| Tool preferences |
localStorage / IndexedDB |
Remember your last-used unit, theme (dark/light), most-recently-used tools, draft text in a notepad-style tool |
Until you clear browser site data |
| Recent files index (where applicable) |
IndexedDB |
Show “recent” entries inside a tool that you reopened. Files themselves are not stored unless the tool offers an explicit “save” option. |
Until you clear browser site data |
These do not identify you, are not shared with anyone, and are not used for advertising or analytics.
3.2 First-party security cookies (set automatically by our hosting provider)
Cloudflare, our hosting provider, may set the following cookies for security and abuse prevention. These are considered strictly necessary and do not require prior consent under EU/UK rules.
| Cookie |
Set by |
Purpose |
Lifetime |
__cf_bm |
Cloudflare |
Bot management — distinguish humans from automated traffic |
30 minutes |
cf_clearance |
Cloudflare |
Records that you have passed a security challenge so you don’t have to repeat it |
30 days (only set when triggered) |
We don’t read or share these cookies. Cloudflare’s cookie policy: cloudflare.com/cookie-policy.
When you open the sponsorship checkout on /sponsor, Stripe loads its hosted Checkout form inside an iframe served from js.stripe.com and checkout.stripe.com. Stripe sets cookies on its own domains to operate that form — for example, to maintain your checkout session, to fingerprint for fraud detection, and to remember “Link” saved cards across other Stripe-powered sites. Those cookies are governed by Stripe’s Privacy Policy and Stripe’s Cookie Settings, not by us. We do not read or share Stripe’s cookies.
3.4 First-party analytics (/_/c)
We run our own analytics on a same-origin endpoint. No third-party scripts, no advertising cookies, no fingerprinting, no cross-site tracking. We record how each page load started, and tool_run events, from October 25, 2026 (00:00 UTC).
What we collect per page view:
- URL path (e.g.
/tools/pdf-tools/compare-pdf/)
- UTC timestamp
- Country code (two-letter, from request headers)
- Referring site host (no path, no query)
- How the page load started:
navigate (a link or a typed address), reload, back_forward, prerender (a page your browser loaded ahead of time, counted only once you open it), or update (the reload that applies a new version of the site)
- Campaign tags the link carried, if any:
utm_source, utm_medium and utm_campaign, plus a yes/no flag for an ad click ID (the ID itself is not sent)
- A one-way SHA-256 hash of (rotating-daily salt + your IP + your User-Agent + our domain)
What we collect when you use a tool:
- Tool runs (
tool_run). One event when a tool finishes a run. It holds the tool’s id (for example compare-pdf), the run time in whole milliseconds, the input size rounded down to one of eight steps (0, 1 KB, 10 KB, 100 KB, 1 MB, 10 MB, 100 MB or 1 GB), and whether the run succeeded.
- Named goals. One event when you complete a specific action, such as saving a file (
tool_saved_as), exporting a PDF (pdf_export_done), pinning a tool for offline use (tool_pinned) or installing the app (pwa_app_installed). It holds the action’s name and, where the action has them, the same run time, size step and success flag.
Each event also carries the page path, timestamp, country and visitor hash listed above. From the request, our server adds the browser family, operating-system family and device type (phone, tablet or desktop), and the Cloudflare data centre that answered. For a page view it also notes whether the view started a new session (after 30 minutes without one) and the session’s first page.
What we DO NOT collect:
- Your IP address with any event (rate limiting briefly keeps a request counter keyed on it; see the Privacy Policy §3.2)
- Your full User-Agent string: each event keeps only its first 240 characters, in Workers Analytics Engine for three months, to filter bots and tell browsers apart, and never next to your IP
- Any cookie identifier
- Any file name or file content you process with our tools
- Any cross-site browsing history
Device storage for the update label: just before the site reloads a tab to apply an update, it writes a timestamp to sessionStorage (loft:nav:update-reload). The next page view reads and deletes it, so that load is labelled update and not counted as a visit. The timestamp never leaves your browser.
Salt rotation: the daily salt is regenerated every 24 hours and the previous salt is destroyed. This means the visitor hash cannot be linked across days — your visit on Monday cannot be associated with your visit on Tuesday by us or anyone else, even with database access.
Storage: events are written to our Cloudflare D1 database (managed by Cloudflare, region pair selected at infrastructure-provision time) and to Cloudflare Workers Analytics Engine. Raw event rows are retained for 90 days in D1 and for three months in Analytics Engine; aggregate daily counts are kept indefinitely.
Lawful basis (GDPR): Article 6(1)(f) — legitimate interest in audience measurement, with CNIL Article 82 audience-measurement exemption criteria met (first-party, no cross-site tracking, anonymised, no third-party sharing). We do not consider this analytics setup to require a prior consent banner.
To opt out: enable the Global Privacy Control (GPC) signal in your browser (we honour Sec-GPC: 1 server-side — when the header is present we drop every event entirely, page views, tool runs and goals alike, before any hashing or storage), or use a privacy extension that blocks lofttools.com/_/c. See §6.
Rate limit: we apply a per-IP soft cap (120 page views / minute) at the beacon endpoint. Excess beacons are silently dropped — no error is returned to the client — and never stored.
When you click through to another third-party donation platform (Buy Me a Coffee, Ko-fi, GitHub Sponsors, or similar), that platform may set its own cookies on its own domain, governed by its own cookie/privacy policy. We do not see or share those cookies.
4. What we do not use
For clarity, we do not currently use:
- Google Analytics, Adobe Analytics, Mixpanel, Heap, or any similar analytics product;
- Meta Pixel, TikTok Pixel, Pinterest Tag, LinkedIn Insight Tag, X (Twitter) Pixel, or any other advertising pixel;
- Google Ads, Microsoft Ads, Meta Ads, programmatic ad networks, or any header bidding;
- A/B testing or feature-flagging tools;
- Session replay or heatmap tools (Hotjar, FullStory, LogRocket, etc.);
- Tag managers (Google Tag Manager, Adobe Launch);
- Browser fingerprinting libraries;
- Cross-site tracking of any kind.
We will update this list and section 5 before any of this changes.
5. What changes when we add ads
We expect to add the following:
5.1 Advertising
We are honest about our roadmap: advertising is planned for free-tier surfaces (likely a small number of category and tool pages). When advertising goes live:
- this page will list the ad networks and partners we use;
- a consent banner will be shown to visitors in the EEA, UK, Switzerland, Brazil, and any other jurisdiction with a prior-consent requirement, asking for granular opt-in before any non-essential cookies are set;
- visitors in the U.S. will be able to use the Global Privacy Control (GPC) browser signal to opt out of “sale” or “sharing” of personal information, and we will provide a “Do Not Sell or Share My Personal Information” link in the site footer;
- the Privacy Policy will be updated with the categories of advertising partners and how to exercise your rights with each.
We do not plan to use any of the following: tracking children under 13, building cross-device identity graphs, retargeting based on sensitive categories (health, religion, sexual orientation, financial distress), or selling personal data for monetary consideration.
6. Your choices
You can control storage technologies through your browser. Each browser handles this slightly differently; the major ones are:
- Google Chrome — Settings → Privacy and security → Cookies and other site data
- Mozilla Firefox — Settings → Privacy & Security → Cookies and Site Data
- Apple Safari — Settings → Privacy
- Microsoft Edge — Settings → Cookies and site permissions
- Brave — Settings → Shields & Privacy
You can also:
- Clear Loft Tools’ device-local storage at any time (which will reset preferences and the offline cache);
- Block all third-party cookies (which we recommend in general — none of our functionality depends on third-party cookies);
- Use a browser-level Global Privacy Control signal (we honour
Sec-GPC: 1 server-side: when present, the analytics beacon write is dropped before any data is processed, regardless of jurisdiction);
- Use a private/incognito window (which discards storage when the window closes).
If you block strictly necessary cookies (e.g., the Cloudflare bot-management cookie), parts of the Service may not work correctly.
7. Changes to this Cookie Policy
Material changes will be highlighted at the top of this page for at least 30 days, and announced via a banner on the home page. We will not enable any new tracking, analytics, or advertising technology without first updating this page and giving at least 14 days’ advance notice.
A complete change history is available on request to [email protected].
Email: [email protected]
Postal address for formal legal notices: available on request at the same address.