Skip to content

v0.1.0

Choose a tag to compare

@ivanusto ivanusto released this 19 Aug 05:21
· 13 commits to main since this release

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, Arabic Cf.
  • 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 detectionSoftware, Creator and parameters text-chunk values are matched against known AI generator product names, including inside zlib-compressed zTXt and iTXt chunks. 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.