A Dockerized web interface for removing invisible AI watermarks from Google Gemini-generated images.
RM Banana provides a clean, modern web UI for the removebanana library. All processing happens locally in your Docker environment with complete privacy.
Upstream Project: https://github.com/denuwanpro/removebanana
- Drag & Drop Interface - Easy image upload with visual feedback
- Privacy First - All processing happens locally in your Docker environment
- Mathematical Precision - Uses inverse alpha blending (no AI guessing)
- Responsive Design - Works on desktop and mobile devices
- NPM Integration - Designed to work with existing Nginx Proxy Manager setups
- Health Checks - Built-in container health monitoring
See docs/diagrams/ for editable
.drawiosource files.
- Docker & Docker Compose installed
- Existing Nginx Proxy Manager on the
shared_netDocker network
git clone https://github.com/yourusername/rmbanana.git
cd rmbanana
# Create shared network if not exists
docker network create shared_net
# Start the container
docker-compose up -dIn your NPM admin panel:
- Go to Hosts → Proxy Hosts → Add Proxy Host
- Configure:
- Domain Names:
removebanana.yourdomain.com - Scheme:
http - Forward Hostname / IP:
removebanana - Forward Port:
3000
- Domain Names:
- Save
- (Optional) Enable SSL under the SSL tab
Visit: https://removebanana.yourdomain.com
- Upload - Drag and drop or click to select a PNG, JPEG, or WebP image
- Process - Click "Remove Watermark" to process the image
- Download - Save the cleaned image to your device
The watermark removal uses a mathematical inverse of Google's alpha blending:
Google's watermarking:
watermarked = α × logo + (1 - α) × original
RemoveBanana reversal:
original = (watermarked - α × logo) / (1 - α)
No AI or machine learning is involved - it's pure mathematical reconstruction of the original pixels.
| Source | Support |
|---|---|
| Google Gemini (all versions) | Full |
| Imagen 2 | Full |
| Imagen 3 | Full |
| Nano Banana AI | Full |
| Endpoint | Method | Description |
|---|---|---|
/api/health |
GET | Health check endpoint |
/api/remove-watermark |
POST | Upload and process an image |
/api/download/:id |
GET | Download processed image |
curl -X POST http://localhost:3000/api/remove-watermark \
-F "image=@watermarked-image.png"Response:
{
"success": true,
"downloadUrl": "/api/download/abc123",
"filename": "cleaned-image.png",
"meta": {
"width": 1024,
"height": 1024
}
}curl http://localhost:3000/api/healthResponse:
{
"status": "healthy",
"timestamp": "2024-01-15T10:30:00.000Z"
}| Variable | Default | Description |
|---|---|---|
NODE_ENV |
production |
Node environment |
PORT |
3000 |
API server port |
| Path | Description |
|---|---|
./backend/uploads |
Temporary upload storage |
./backend/outputs |
Temporary output storage |
Uses the external shared_net Docker network (must already exist). The container has no exposed ports on the host - all access goes through your existing Nginx Proxy Manager.
rmbanana/
├── backend/
│ ├── package.json # Node dependencies
│ ├── server.js # Express API server
│ ├── uploads/ # Temp uploads (auto-cleaned)
│ └── outputs/ # Temp outputs (auto-cleaned)
├── frontend/
│ ├── index.html # Main HTML
│ ├── styles.css # Styles
│ ├── app.js # Frontend logic
│ └── logo.svg # Logo asset
├── docs/
│ └── diagrams/ # Architecture diagrams
├── Dockerfile # Container build
├── docker-compose.yml # Service orchestration
└── README.md # This file
# Install dependencies
cd backend && npm install
# Start the server
npm startdocker build -t rmbanana .# RemoveBanana app logs
docker logs -f removebanana
# All services
docker-compose logs -fdocker-compose pull
docker-compose up -ddocker-compose restart# Stop and remove container
docker-compose down
# Remove container and volumes
docker-compose down -v# Check logs
docker logs removebanana
# Ensure shared_net exists
docker network ls
# Rebuild
docker-compose down
docker-compose build --no-cache
docker-compose up -d- Verify both containers are on
shared_net:docker network inspect shared_net
- Check the container is healthy:
docker ps
- Test from NPM container:
docker exec <npm_container_name> curl http://removebanana:3000/api/health
- Ensure the image is PNG, JPEG, or WebP format
- Check file size is under 10MB
- Check container logs:
docker logs -f removebanana
- The removebanana container has no exposed ports on the host
- All external traffic goes through your existing Nginx Proxy Manager
- Temporary files are auto-deleted after 5 minutes
- No data persists between restarts
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Watermark Removal Engine: removebanana by Denuwan Thilakarathna
- Web UI & Dockerization: This project (RM Banana)
MIT License - see the LICENSE file for details.
Made with care for privacy-conscious users who want control over their AI-generated images.