User Tools

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"
    devices:
      - nvidia.com/gpu=all
    annotations:
      run.oci.keep_original_groups: "true" # required for GPU acceleration
    volumes:
      - /data/snapotter:/data
    environment:
      - AUTH_ENABLED=true
      - DEFAULT_USERNAME=admin
      - DEFAULT_PASSWORD=password
    networks:
      - snapotter-network

networks:
  snapotter-network: {}

The devices section is to enable GPU passtrough, see Open WebUI and Ollama for more details.

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