v0.1.0
First tagged release. Unmark is a browser-first web client for guillaumemeyer/watermarks-remover — independent, not affiliated with the upstream project.
What this release pins
The whole point of a tag here is the parity anchor. The JavaScript engines are ports of two upstream Python modules, and a test suite asserts identical output. This release was verified against these exact upstream files:
| upstream file | sha256 | last changed by |
|---|---|---|
service/scripts/text_unicode.py |
cd21c5700184a6bb4a43089f546531a2692bf140413954ea9b93f4a67f1f3a5e |
c1d1e5a (#96) |
service/scripts/image_meta.py |
422dbbea5eff172b78a6f38ade753d11857d62ff4811b97084000062c5622e4a |
360c8e8 (#127) |
274 parity assertions pass against upstream main: same characters kept and stripped, same bytes out of the image parsers, same findings strings. scripts/check-upstream.mjs exits 0 against those hashes, and a scheduled workflow re-checks daily and files an issue when either signal moves.
What is in the box
- Text (Layer A) — invisible Unicode: zero-width and bidi controls, variation selectors, tag characters, PUA, other
Cf; space homoglyphs; optional NFKC and Latin confusables. Load-bearing invisibles are preserved exactly as upstream does — emoji ZWJ/VS16, Persian and Indic ZWNJ, flag tags, Mongolian FVS, Khmer vowels, Hangul fillers, ArabicCf. - Image metadata — PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF and TIFF (classic and BigTIFF). C2PA, EXIF, XMP, text chunks. Byte-level container surgery; pixels are never re-encoded.
- PNG generator detection —
Software,Creatorandparameterstext-chunk values are matched against known AI generator product names, including inside zlib-compressedzTXtandiTXtchunks. Deliberately key-scoped: "Gemini", "Sora" and "Firefly" in free text are not evidence of anything. - Three locales — English, 繁體中文, 简体中文. Light and dark. Keyboard accessible.
- Optional AI rewrite — see below.
Two things to be clear about
This repository does not contain a server. server.py belongs to upstream. What ships here is the web UI plus serve_local.py, a loopback-only static server and reverse proxy. To use the server-backed formats (PDF, DOCX, ODT, EPUB, full container cleaning) you run upstream's service and point this UI at it.
The AI rewrite is local-only and off by default. It appears only when you run serve_local.py --llm-upstream … against an OpenAI-compatible endpoint of your own; the key stays server-side and never enters the browser. It cannot work on the hosted GitHub Pages build, because browsers block an HTTPS page from calling a plain-HTTP local endpoint. Cleaning itself is unaffected and still never leaves the page.
Install
There is nothing to build and nothing to install. Clone the repository, or open https://ivanusto.github.io/unmark-web/. No package.json, no runtime dependencies; serve_local.py is Python stdlib only. The source archives below are generated by GitHub from the tag.
MIT. The character tables, decision rules and container parsers are derived from watermarks-remover, © watermarks-remover contributors, MIT — see NOTICE.