# gargantuax/gemini-watermark-remover architecture

> Architecture diagram of the GitHub repository gargantuax/gemini-watermark-remover, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gargantuax/gemini-watermark-remover
- Repository: https://github.com/gargantuax/gemini-watermark-remover

## Overview

Gemini Watermark Remover is a local-first image and video watermark-cleanup product, exposed through a browser app, CLI/SDK, Chrome extension, and userscript. The main workflow accepts media, detects the watermark geometry, applies reverse-alpha restoration and candidate evaluation, then returns a downloadable or page-replaced result. Video has a separate detection, backend, and export path. The tree and README establish these product surfaces; sampled source confirms selected image-pipeline, worker, and userscript relationships, so unsampled subsystem wiring is shown conservatively.

Main entry points: [`src/core/watermarkEngine.js`](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/watermarkEngine.js) (Watermark engine), [`src/video-app.js`](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video-app.js) (Video app), [`src/userscript/index.js`](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/index.js) (Userscript entry), [`src/app.js`](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/app.js) (Browser app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_image["Image restoration"]
  node_engine["Watermark engine<br/>[watermarkEngine.js]"]
  node_pipeline["Image pipeline"]
  node_context["Initial context"]
  node_selection["Candidate selection"]
  node_quality["Candidate quality"]
  node_config["Watermark config<br/>[watermarkConfig.js]"]
end

subgraph group_video["Video cleanup"]
  node_videoapp["Video app<br/>[video-app.js]"]
  node_videodetect["Video detection"]
  node_veodetect["Veo text detection"]
  node_videobackends["Video backends"]
  node_videoexport["Video export<br/>[videoExport.js]"]
end

subgraph group_interfaces["User interfaces"]
  node_browserapp["Browser app<br/>[app.js]"]
  node_worker["Image worker<br/>[watermarkWorker.js]"]
  node_cli["CLI<br/>[gwrCli.js]"]
  node_removecommand["Remove command"]
end

subgraph group_page["Gemini integration"]
  node_extension["Chrome extension<br/>[contentMain.js]"]
  node_userscript["Userscript entry<br/>[index.js]"]
  node_processing["Userscript processing"]
  node_pagebridge["Page process bridge"]
end

subgraph group_api["Developer API"]
  node_sdk["SDK exports<br/>[index.js]"]
end

node_user(("User"))
node_media["Image or video"]
node_geminipage(("Gemini page"))
node_result["Cleaned media"]

node_user -->|"selects media"| node_browserapp
node_media -->|"uploads"| node_browserapp
node_browserapp -->|"processes image"| node_engine
node_engine -->|"runs restoration"| node_pipeline
node_pipeline -->|"creates context"| node_context
node_context -->|"detects geometry"| node_config
node_pipeline -->|"selects candidates"| node_selection
node_selection -->|"evaluates candidates"| node_quality
node_engine -->|"returns cleaned image"| node_result
node_browserapp -.->|"dispatches image work"| node_worker
node_worker -->|"processes image"| node_engine
node_user -->|"runs command"| node_cli
node_cli -->|"dispatches removal"| node_removecommand
node_removecommand -->|"removes watermark"| node_engine
node_removecommand -->|"writes output"| node_result
node_user -->|"calls API"| node_sdk
node_sdk -->|"exposes image engine"| node_engine
node_user -->|"selects video"| node_videoapp
node_videoapp -->|"detects watermark"| node_videodetect
node_videoapp -->|"detects text mark"| node_veodetect
node_videoapp -->|"cleans frames"| node_videobackends
node_videoapp -->|"exports video"| node_videoexport
node_videoexport -->|"produces cleaned video"| node_result
node_geminipage -->|"provides page images"| node_extension
node_extension -->|"processes images"| node_engine
node_geminipage -->|"provides page actions"| node_userscript
node_userscript -->|"initializes processing"| node_processing
node_userscript -->|"creates bridge client"| node_pagebridge
node_pagebridge -.->|"falls back to processing"| node_processing
node_userscript -->|"replaces previews"| node_geminipage

click node_browserapp "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/app.js"
click node_worker "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/workers/watermarkWorker.js"
click node_engine "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/watermarkEngine.js"
click node_pipeline "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/imageWatermarkPipeline.js"
click node_context "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineInitialContext.js"
click node_selection "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineInitialSelection.js"
click node_quality "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineCandidateQuality.js"
click node_config "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/watermarkConfig.js"
click node_cli "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/cli/gwrCli.js"
click node_removecommand "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/cli/gwrRemoveCommand.js"
click node_sdk "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/sdk/index.js"
click node_videoapp "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video-app.js"
click node_videodetect "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoWatermarkDetector.js"
click node_veodetect "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/veoTextWatermarkDetector.js"
click node_videobackends "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoCleanupBackends.js"
click node_videoexport "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoExport.js"
click node_extension "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/extension/contentMain.js"
click node_userscript "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/index.js"
click node_processing "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/processingRuntime.js"
click node_pagebridge "https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/pageProcessBridge.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_engine,node_pipeline,node_context,node_selection,node_quality,node_config,node_user toneBlue
class node_videoapp,node_videodetect,node_veodetect,node_videobackends,node_videoexport toneAmber
class node_browserapp,node_worker,node_cli,node_removecommand toneMint
class node_extension,node_userscript,node_processing,node_pagebridge toneRose
class node_sdk,node_media,node_geminipage,node_result toneIndigo
```

## Components

### Image restoration

- [Watermark engine](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/watermarkEngine.js): `src/core/watermarkEngine.js`
- [Image pipeline](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/imageWatermarkPipeline.js): `src/core/imageWatermarkPipeline.js`
- [Initial context](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineInitialContext.js): `src/core/pipelineInitialContext.js`
- [Candidate selection](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineInitialSelection.js): `src/core/pipelineInitialSelection.js`
- [Candidate quality](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/pipelineCandidateQuality.js): `src/core/pipelineCandidateQuality.js`
- [Watermark config](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/core/watermarkConfig.js): `src/core/watermarkConfig.js`

### Video cleanup

- [Video app](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video-app.js): `src/video-app.js`
- [Video detection](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoWatermarkDetector.js): `src/video/videoWatermarkDetector.js`
- [Veo text detection](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/veoTextWatermarkDetector.js): `src/video/veoTextWatermarkDetector.js`
- [Video backends](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoCleanupBackends.js): `src/video/videoCleanupBackends.js`
- [Video export](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/video/videoExport.js): `src/video/videoExport.js`

### User interfaces

- [Browser app](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/app.js): `src/app.js`
- [Image worker](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/workers/watermarkWorker.js): `src/workers/watermarkWorker.js`
- [CLI](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/cli/gwrCli.js): `src/cli/gwrCli.js`
- [Remove command](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/cli/gwrRemoveCommand.js): `src/cli/gwrRemoveCommand.js`

### Gemini integration

- [Chrome extension](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/extension/contentMain.js): `src/extension/contentMain.js`
- [Userscript entry](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/index.js): `src/userscript/index.js`
- [Userscript processing](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/processingRuntime.js): `src/userscript/processingRuntime.js`
- [Page process bridge](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/userscript/pageProcessBridge.js): `src/userscript/pageProcessBridge.js`

### Developer API

- [SDK exports](https://github.com/gargantuax/gemini-watermark-remover/blob/main/src/sdk/index.js): `src/sdk/index.js`

### Other components

- **User**
- **Image or video**
- **Gemini page**
- **Cleaned media**

## Connections

- User → Browser app: selects media
- Image or video → Browser app: uploads
- Browser app → Watermark engine: processes image
- Watermark engine → Image pipeline: runs restoration
- Image pipeline → Initial context: creates context
- Initial context → Watermark config: detects geometry
- Image pipeline → Candidate selection: selects candidates
- Candidate selection → Candidate quality: evaluates candidates
- Watermark engine → Cleaned media: returns cleaned image
- Browser app → Image worker: dispatches image work
- Image worker → Watermark engine: processes image
- User → CLI: runs command
- CLI → Remove command: dispatches removal
- Remove command → Watermark engine: removes watermark
- Remove command → Cleaned media: writes output
- User → SDK exports: calls API
- SDK exports → Watermark engine: exposes image engine
- User → Video app: selects video
- Video app → Video detection: detects watermark
- Video app → Veo text detection: detects text mark
- Video app → Video backends: cleans frames
- Video app → Video export: exports video
- Video export → Cleaned media: produces cleaned video
- Gemini page → Chrome extension: provides page images
- Chrome extension → Watermark engine: processes images
- Gemini page → Userscript entry: provides page actions
- Userscript entry → Userscript processing: initializes processing
- Userscript entry → Page process bridge: creates bridge client
- Page process bridge → Userscript processing: falls back to processing
- Userscript entry → Gemini page: replaces previews
