Privacy
Short, because there is very little to describe.
Files you process
Your images and videos are read in your browser with the File API, decoded to a canvas, and processed by JavaScript running on your own device. In normal use they are never transmitted: there is no storage bucket and no processing queue.
Nothing is written to disk unless you press download, and the browser tab discards everything when you close it.
The first exception: codec conversion
Some videos cannot be opened in a browser at all. H.265/HEVC — the default recording format on most modern phones — has no decoder in Chrome on Android and several other browsers. No amount of local JavaScript can read those files.
When that happens, and only when it happens, you are offered a button to convert that single file on our server. Pressing it uploads that one file. Declining sends nothing at all.
If you use it, this is exactly what occurs:
- The file is received into the operating system's temporary directory under a random name.
ffmpegre-encodes it to H.264/AAC.- The converted video is streamed back to your browser.
- Both the original and the converted file are deleted before the response completes. This runs on a shutdown handler, so it happens even if the conversion fails or errors.
Nothing about the file is logged, indexed or kept. No copy is retained, and the watermark removal itself still happens locally afterwards — the server only ever changes the container and codec.
The endpoint is /api/transcode.php. If you would rather it did not exist at all,
set TRANSCODE_ENABLED to false in includes/config.php,
or delete the file. The rest of the tool is unaffected; unsupported videos then simply report
that they cannot be decoded.
The second exception: chat share links
The chat to PDF tool can fetch a share link for
you, and that link goes through this server. It has to: a browser is not allowed to read
another website’s pages from a script, so the only way to turn a
chatgpt.com/share/… address into a transcript is for the server to request it.
That means the conversation on that link passes through this server on its way back to you. It is a page that is already public — a share link can be opened by anyone who has it — but it is your content, and you should know where it goes.
What happens, exactly:
- It runs only when you paste a link and press the button. Nothing is fetched on its own.
- Only share links from the supported chatbots are fetched at all — the host list is checked before a connection is opened, and redirects elsewhere are refused.
- The page is requested, handed straight back to your browser, and forgotten. It is not stored, not cached and not logged, and the transcript is built on your device.
The endpoint is /api/chat-fetch.php. Set CHAT_FETCH_ENABLED to
false in includes/config.php and it stops existing; the tool then offers only
its paste box. Pasting a conversation never touches the server — that path is
entirely local, like the rest of the site.
What is stored on your device
unmarkai-themeinlocalStorage— whether you chose light or dark.- Advertising cookies set by Google. The ads on this site are served by Google AdSense, which stores cookies on your device to select ads, cap how often you see the same one, and measure clicks.
No session is created and no fingerprint is taken by this site. The advertising cookies above are set by Google, not by us, and are the one thing here that follows you beyond this page — see below.
Analytics and third parties
This site uses Google Analytics to count page views and see which pages people find useful. It records the page you viewed, roughly where in the world you are, and what kind of device and browser you used.
It runs without cookies. Analytics is configured with
client_storage: 'none', so nothing is written to your device and you are
not given an identifier that follows you between visits. The trade-off is ours, not
yours: repeat visits cannot be linked, so the visitor numbers are an estimate.
Advertising features are switched off explicitly in analytics:
allow_google_signals and allow_ad_personalization_signals are both
false, so the page-view data is not joined to a Google advertising profile.
That applies to analytics only — the ad script described below is a separate thing
and does feed ad targeting.
This never includes your files. Analytics sees which pages loaded. It does not and cannot see the images or video you process, because those are never sent anywhere — they are read and rebuilt inside your browser. Analytics is not told what you opened, how large it was, or whether a watermark was found.
To turn it off entirely, clear GA_MEASUREMENT_ID in
includes/config.php. No script is then loaded and no request is made. Browser
tracking protection, an ad blocker, or a Do Not Track extension will also stop it, and
nothing on the site depends on it working.
Advertising
This site is funded by ads served through Google AdSense. Being straight about what that costs you: it is the one part of this site that tracks people, and it works nothing like the analytics above.
Google and its partners use cookies to serve those ads. Google uses them to show ads based on your previous visits to this and other websites. You can opt out of personalised advertising at Google’s Ads Settings, and review the wider list of vendors at aboutads.info/choices. How Google handles data from sites that use its services is described in Google’s partner-sites policy.
This still never includes your files. The ad script runs in the page like any other script; it has no access to the images or video you process, because those are decoded to a canvas in your browser and never sent anywhere. What advertising sees is that a page was loaded — the same thing any site with ads on it sees.
An ad blocker will stop it, and nothing on this site depends on it running: watermark
removal works exactly the same with ads blocked. To remove ads entirely, clear
ADSENSE_CLIENT in includes/config.php — no script is then
loaded and no request is made.
The image upscaler
The image upscaler works the same way as the remover: your image is decoded and processed inside your browser and never uploaded. To run its AI model the page downloads two things the first time you use it — the model file, from this site, and ONNX Runtime, the open-source engine that executes it, from the jsDelivr CDN. Those requests fetch code. They carry nothing about your image, and jsDelivr sees only what any CDN sees: that a file was requested. Your browser caches both afterwards.
The image compressor
The image compressor is the most self-contained tool here: your image is decoded, re-encoded and measured by your own browser, and the page downloads nothing at all to do it — no model, no runtime, no third-party script. Nothing about the image is transmitted.
The circle image cropper
The circle image cropper is the same: the photo is decoded, cropped and written out by your browser, and the page downloads nothing to do it. Nothing about the image is transmitted.
The background remover
The background remover works the same way: your image is processed inside your browser and never uploaded. The first time you use it, the page downloads its AI model from this site and ONNX Runtime from the jsDelivr CDN. Those requests fetch code and carry nothing about your image.
Server logs
Whoever hosts this deployment may keep standard web-server access logs — IP address, timestamp, requested path, user agent — as almost every web server does by default. Those logs record that you loaded a page. They cannot record what you processed, because what you processed never reached the server.
Verifying this
Do not take the above on trust. Open your browser's network tab, process a file, and watch the request list stay empty. Or load the page once, disconnect from the internet, and remove a watermark offline.
The only requests you will ever see carrying anything of yours are the two described above — the codec conversion and the chat share link — and each happens only after you press the button that tells you about it.
Contact
This is a self-hosted, open build. Questions about a specific deployment go to whoever runs that deployment.