Digital Garden
Surveying doubao-nomark: The Lightweight Truth of a Watermark Remover
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
- Project: ihmily/doubao-nomark, FastAPI + 6 pure-Python dependencies (cryptography/fastapi/uvicorn/httpx/pydantic/pydantic-settings)
- Linux support: README explicitly shows the uv install including Linux/Mac steps; no .dll/.exe platform binaries; Dockerfile based on python:3.11-slim + ready Docker Hub image ihmily/doubao-nomark; Python 3.10+, port 8000, cross-platform browser extension
- Lightweight truth: httpx fetches share-page HTML + regex extracts embedded JSON, media files pulled directly from CDN by the browser extension not passing through the service; no Playwright/Selenium, no PIL/OpenCV/ffmpeg; video_crypto.py only URL token-level decryption; single worker idles at 100-200 MB RSS, CPU near zero, disk a few MB
- Deployment conclusion: runs on a 1-core 1G VPS/Raspberry Pi; Docker —memory=256m feasible; multi-worker horizontal scaling with no bottleneck
Comments