Digital Garden

Surveying doubao-nomark: The Lightweight Truth of a Watermark Remover

2026-10-16 · ~4 min read · doubao-nomark · project survey · Linux · lightweight deployment · watermark removal

Not every city needs heavy guards. Some tools’ elegance lies precisely in their lightness — this survey of the Doubao watermark remover, with six pure Python packages and a hundred-some MB of memory, explains the engineering philosophy of “good enough.”

I. Can it run on Linux: a first-class citizen

The README’s installation notes explicitly write source .venv/bin/activate # Linux/Mac — Linux is not barely supported but a first-class citizen. Triple verification ruled out hidden platform limits: requirements.txt has only six pure Python packages (cryptography, fastapi, uvicorn[standard], httpx, pydantic, pydantic-settings), all with Linux wheels and no Windows-specific dependencies; the repo has no platform-specific binaries like .dll/.exe, all Python source and web extension; the Dockerfile is based on python:3.11-slim (Debian Linux), and Docker Hub has a ready image — it is itself a product of containerized deployment. Three run methods任选: uv (officially recommended), pip, Docker, Python 3.10+, listening on port 8000 after startup, and the browser extension (Chrome MV3/Edge/Tampermonkey) is OS-agnostic.

II. High usage: light with no floor

The user’s second question led to code-layer verification. The conclusion is very lightweight — essentially just a small FastAPI async web API, touching no heavy resource components. The whole job is only three things: fetch share-page HTML asynchronously with httpx, extract embedded JSON with regex, parse out the original image/video URLs and return them — the actual media files are pulled directly from the Doubao CDN by the browser extension, not passing through this service, so memory doesn’t spike with file size. No browser engine (many同类 watermark removers run Chromium, the real memory hog), no PIL/OpenCV/ffmpeg image/video processing libraries, and the decryption is only URL token-level (video_crypto.py uses cryptography to decrypt one video address token, single request in milliseconds), with no cache, no subprocess, no resident threads. Magnitude reference: a single-worker uvicorn process idles at about 100-200 MB RSS (Python itself plus library import overhead), stable operation not growing significantly with request volume; CPU near zero when idle; disk is a few MB of code with no log bloat. This means a 1-core 1G cheap VPS or even a Raspberry Pi runs it, Docker deployment can give it a very low memory limit (e.g., 256m), and to handle concurrency, just start a few more workers for horizontal scaling.

Real coordinates

Comments

← Digital Garden