This is an old revision of the document!
SnapOtter
SnapOtter provides:
- 51 image tools - Resize, crop, compress, convert, watermark, color adjust, beautify screenshots, generate memes, vectorize, create GIFs, find duplicates, generate passport photos, and more. Supports 55+ input formats (including 23 camera RAW formats) and 14 output formats,
- Local AI - Remove backgrounds, upscale images, restore and colorize old photos, erase objects, blur faces, enhance faces, extract text (OCR). All on your hardware - no internet required
- Pipelines - Chain tools into reusable workflows with unlimited steps. Batch process unlimited images at once
- REST API - Every tool available via API with API key auth. Interactive docs at /api/docs
- Single container - One docker run, no Redis, no Postgres, no external services
- Multi-arch - Runs on AMD64 and ARM64 (Intel, Apple Silicon, Raspberry Pi)
- Privacy first - Your images never leave your machine. SnapOtter asks once whether you'd like to share anonymous product analytics (which tools are used, errors encountered — never file data). Change anytime in Settings, or set ANALYTICS_ENABLED=false to disable completely
Installation
As usual, you need to create the snapotter user:
useradd -d /data/daemons/snapotter -m snapotter mkdir /data/snapotter chown snapotter:snapotter /data/snapotter
Then, as user snapotter, create the following docker compose yaml (see this compose file here):
- docker-compose.yml
services: SnapOtter: image: snapotter/snapotter:latest ports: - "1349:1349" volumes: - /data/snapotter:/data environment: - AUTH_ENABLED=true - DEFAULT_USERNAME=admin - DEFAULT_PASSWORD=password networks: - snapotter-network networks: snapotter-network: {}
After the first run, you can (and should) remove DEFAULT_USERNAME and DEFAULT_PASSWORD from the compose file.
Set a proper port for your needs, one that is free from all your other services.
And then pull the images:
su - snapotter
podman compose pull
Reverse Proxy
I am running SnapOtter on https://otter.mydomain.com.
This is my recomended one for NGINX:
- otter.conf
server { server_name otter.mydomain.com; listen 8443 ssl; listen 443 ssl; access_log /var/log/nginx/otter.mydomain.com_access_log main; error_log /var/log/nginx/otter.mydomain.com_error_log info; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_http_version 1.1; proxy_pass http://127.0.0.1:1349; proxy_redirect http:// https://; } include com.mydomain/certbot.conf; }
Autostart
To start it, and set it up on boot, as usual follow my indications Using Containers on Gentoo, so link the user-containers init script:
ln -s /etc/init.d/user-containers /etc/init.d/user-containers.snapotter
and create the following config file:
- /etc/conf.d/user-containers.snapotter
USER=snapotter DESCRIPTION="The snapotter server"
Add the service to the default runlevel and start it now:
rc-update add user-containers.snapotter default rc-service user-containers.snapotter start