← Back to Blog

SnapOtter — Self-Host Your Own Image Editor with 48 AI-Powered Tools in One Docker Container

SnapOtter — Self-Host Your Own Image Editor with 48 AI-Powered Tools in One Docker Container

What is SnapOtter?

SnapOtter is an open-source, self-hosted image manipulation platform that packs 48 image processing tools and local AI capabilities into a single Docker container. No cloud dependencies, no external services — your images never leave your machine.

GitHub: github.com/snapotter-hq/snapotter
Stars: ⭐ 1,250+
License: AGPL-3.0 / Commercial
Language: TypeScript (Fastify backend + React frontend), Python (AI bridge)

Why this matters: Self-hosting an image editor usually means either running heavy desktop software (GIMP, Photoshop) or relying on cloud APIs that charge per image. SnapOtter gives you a professional-grade image processing suite — including AI features like background removal and upscaling — that runs entirely on your own hardware. One docker run and you have 48 tools at your fingertips.

Key Features

Feature Details
48 Image Tools Resize, crop, compress, convert, watermark, color adjust, vectorize, GIF creation, duplicate finder, passport photo generator, and more
Local AI Background removal (rembg/BiRefNet), upscaling (RealESRGAN), face enhancement (GFPGAN), object erasing (LaMa), OCR (PaddleOCR), photo restoration, colorization
Pipelines Chain multiple tools into reusable workflows — process entire folders in batch
REST API Every tool available via HTTP with API key authentication. Interactive Swagger docs at /api/docs
Single Container No Redis, no Postgres, no external databases — just one Docker container with SQLite
Multi-arch AMD64 and ARM64 (Intel, Apple Silicon, Raspberry Pi)
GPU Acceleration Optional NVIDIA GPU support for faster AI inference
Privacy First Everything runs locally. Optional anonymous analytics (opt-in, no image data)

Architecture Overview

SnapOtter packs a full-featured web application into a single container. The Fastify backend serves both the React SPA frontend and the REST API, routing requests to either the Image Engine (Sharp-based worker pool for standard operations) or the AI Engine (Python dispatcher bridge for ML tasks).

SnapOtter Architecture

Here's how the request flow works:

  1. Browser / Client sends an HTTP request to the Fastify API Server (port 1349) with an image file
  2. The API validates input with Zod, authenticates the user, and routes the request
  3. Standard tools (resize, crop, convert, compress) are offloaded to Piscina worker threads running Sharp — these don't block the main event loop
  4. AI tools (background removal, upscaling, OCR) are sent to the Python Dispatcher Bridge, which runs ML models on demand
  5. The Python bridge loads model weights from disk (/opt/models/) for the specific tool, runs inference, and releases memory
  6. SQLite (via Drizzle ORM) stores user accounts, job history, file metadata, and runtime settings
  7. Docker volumes persist uploaded images and processed results in /data/

The architecture is designed for low idle memory — at rest, only the Fastify server runs (~100-150 MB). Worker threads and the Python dispatcher start on first use and terminate after 30 seconds idle.

Prerequisites

  • A server or VPS with Docker and Docker Compose installed
  • At least 1 GB RAM (2 GB+ recommended for AI features)
  • 10 GB+ free disk space (model weights take ~5-7 GB)
  • Optional: NVIDIA GPU with Container Toolkit for GPU acceleration

Step-by-Step Setup

Step 1: Quick Start with Docker (One-Liner)

The fastest way to try SnapOtter:

docker run -d \
--name snapotter \
-p 1349:1349 \
-v snapotter-data:/data \
snapotter/snapotter:latest

Open http://your-server-ip:1349 in your browser. Default credentials:

  • Username: admin
  • Password: admin

You'll be prompted to change the password on first login.

Step 2: Docker Compose Setup (Recommended for Production)

Create a docker-compose.yml file:

version: "3.8"

services:
  snapotter:
    image: snapotter/snapotter:latest
    container_name: snapotter
    ports:
      - "1349:1349"
    volumes:
      - snapotter-data:/data
      - snapotter-workspace:/tmp/workspace
    environment:
      - DEFAULT_USERNAME=admin
      - DEFAULT_PASSWORD=your_secure_password
      - MAX_UPLOAD_SIZE_MB=50
      - AUTH_ENABLED=true
      - LOG_LEVEL=info
      - SESSION_DURATION_HOURS=24
      - RATE_LIMIT_PER_MIN=60
    restart: unless-stopped

volumes:
  snapotter-data:
  snapotter-workspace:

Start it:

docker compose up -d

Step 3: With NVIDIA GPU Acceleration

If you have an NVIDIA GPU, add --gpus all:

services:
snapotter:
  image: snapotter/snapotter:latest
  container_name: snapotter
  ports:
    - "1349:1349"
  volumes:
    - snapotter-data:/data
    - snapotter-workspace:/tmp/workspace
  environment:
    - DEFAULT_USERNAME=admin
    - DEFAULT_PASSWORD=your_secure_password
    - MAX_UPLOAD_SIZE_MB=50
    - AUTH_ENABLED=true
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: all
            capabilities: [gpu]
  restart: unless-stopped

The container falls back to CPU automatically if no GPU is detected.

Step 4: Configuration Options

SnapOtter exposes these environment variables for customization:

Variable Default Description
PORT 1349 HTTP server port
DEFAULT_USERNAME admin Initial admin username
DEFAULT_PASSWORD admin Initial admin password
AUTH_ENABLED true Enable/disable authentication
MAX_UPLOAD_SIZE_MB 20 Maximum file upload size
MAX_BATCH_SIZE 50 Maximum images in batch processing
CONCURRENT_JOBS 3 Parallel job processing limit
SESSION_DURATION_HOURS 24 Session TTL
RATE_LIMIT_PER_MIN 100 API rate limit per IP
LOG_LEVEL info Logging verbosity
CORS_ORIGIN * CORS allowed origins
TRUST_PROXY false Enable if behind a reverse proxy
ANALYTICS_ENABLED true Anonymous usage analytics (opt-in)
STORAGE_MODE local Storage backend (only local currently)

Step 5: Reverse Proxy with Nginx (Optional)

Place SnapOtter behind a reverse proxy for HTTPS and a clean domain:

server {
    listen 443 ssl;
    server_name snapotter.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/snapotter.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/snapotter.yourdomain.com/privkey.pem;

    client_max_body_size 500M;

    location / {
        proxy_pass http://127.0.0.1:1349;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

If using a reverse proxy, set TRUST_PROXY=true so SnapOtter uses the correct client IP for rate limiting.

Step 6: Using SnapOtter

Once running, here's what you can do:

Standard image operations:

  • Upload an image and choose: Resize, Crop, Rotate, Flip, Convert (PNG/JPEG/WebP/AVIF), Compress, Strip EXIF metadata
  • Adjust colors: Brightness, Contrast, Saturation, Grayscale, Sepia, Invert

AI-powered operations:

  • Remove Background — One-click background removal for portraits and product photos
  • Upscale Image — Increase resolution with RealESRGAN
  • Enhance Faces — Restore and enhance facial details with GFPGAN
  • Erase Object — Remove unwanted objects with LaMa inpainting
  • OCR — Extract text from images with PaddleOCR
  • Restore Photo — Colorize and restore old black-and-white photos
  • Blur Faces — Automatically detect and blur faces for privacy

Pipelines:

  • Go to the Pipelines tab
  • Chain multiple tools together (e.g., Upscale → Remove Background → Convert to WebP)
  • Save as a reusable workflow
  • Run on individual images or entire folders in batch

API Access:

  • Generate an API key in Settings
  • Use the REST API to integrate SnapOtter into your own scripts
# Example: Remove background via API
curl -X POST http://localhost:1349/api/v1/tools/remove-background \
  -H "X-API-Key: your-api-key" \
  -F "file=@photo.jpg"

Step 7: Resource Management

SnapOtter is efficient with resources:

  • Idle: ~100-150 MB RAM (only Fastify server running)
  • Standard tool use: Worker threads spawn on demand, terminate after 30 seconds idle
  • AI tool use: Python dispatcher starts on first AI request; model weights loaded per-request, released after
  • Disk space: ~5-7 GB for model weight files, plus your images

Model weights are pre-downloaded during the Docker build, so the container works fully offline.

Troubleshooting

Cannot access the web UI on port 1349

  • Check if the container is running: docker ps | grep snapotter
  • Verify the port mapping: docker logs snapotter | grep "listening"
  • Check firewall rules: ufw status (allow port 1349 if needed)

AI tools are slow

  • First AI request triggers a cold start (Python dispatcher initialization + model loading)
  • Subsequent requests are faster as the dispatcher stays warm
  • Consider GPU acceleration with --gpus all

"Max upload size exceeded"

  • Increase MAX_UPLOAD_SIZE_MB in the environment variables
  • Also increase Nginx client_max_body_size if behind a reverse proxy

Container keeps restarting

  • Check logs: docker logs snapotter
  • Ensure /data volume is writable: docker exec snapotter touch /data/.test
  • Verify port 1349 is not already in use

Comparison: SnapOtter vs. Alternatives

SnapOtter

  • Self-hosted: ✅ Yes (local only)
  • AI Features: ✅ 15 AI tools (local)
  • Offline: ✅ Fully offline
  • Price: ✅ Free (AGPL)
  • Batch Processing: ✅ Yes, with pipelines
  • REST API: ✅ Full API + Swagger
  • Single Container: ✅ Yes
  • GPU Support: ✅ Optional NVIDIA

Imaginary Cloud

  • Self-hosted: ❌ Cloud-only
  • AI Features: ✅ (cloud API)
  • Offline: ❌ Requires internet
  • Price: 💰 Pay-per-image
  • Batch Processing: ❌ Limited
  • REST API: ✅ API available
  • Single Container: ❌ Multi-service
  • GPU Support: ✅ Cloud GPU

Photopea

  • Self-hosted: ❌ Cloud-only
  • AI Features: ❌ No
  • Offline: ❌ Requires internet
  • Price: 💰 Premium
  • Batch Processing: ❌ No
  • REST API: ❌ No
  • Single Container: ❌ N/A
  • GPU Support: ❌ No

Resources

← Retour au Blog

SnapOtter — Hébergez Votre Propre Éditeur d'Images avec 48 Outils Propulsés par l'IA dans un Conteneur Docker

SnapOtter — Hébergez Votre Propre Éditeur d'Images avec 48 Outils Propulsés par l'IA dans un Conteneur Docker

Qu'est-ce que SnapOtter ?

SnapOtter est une plateforme open-source d'édition d'images auto-hébergée qui regroupe 48 outils de traitement d'image et des capacités d'IA locale dans un seul conteneur Docker. Pas de dépendances cloud, pas de services externes — vos images ne quittent jamais votre machine.

GitHub : github.com/snapotter-hq/snapotter
Stars : ⭐ 1 250+
Licence : AGPL-3.0 / Commerciale
Langage : TypeScript (backend Fastify + frontend React), Python (pont IA)

Pourquoi c'est important : Auto-héberger un éditeur d'images signifie généralement soit utiliser un logiciel lourd (GIMP, Photoshop), soit dépendre d'API cloud qui facturent par image. SnapOtter vous offre une suite de traitement d'images professionnelle — incluant des fonctionnalités IA comme la suppression d'arrière-plan et l'upscaling — qui fonctionne entièrement sur votre propre matériel. Un simple docker run et vous avez 48 outils à portée de main.

Fonctionnalités Clés

Fonctionnalité Détails
48 Outils d'Image Redimensionner, recadrer, compresser, convertir, filigrane, ajuster les couleurs, vectoriser, créer des GIFs, trouver les doublons, générer des photos d'identité, et plus
IA Locale Suppression d'arrière-plan (rembg/BiRefNet), upscaling (RealESRGAN), amélioration des visages (GFPGAN), effacement d'objets (LaMa), OCR (PaddleOCR), restauration de photos, colorisation
Pipelines Enchaînez plusieurs outils en flux de travail réutilisables — traitez des dossiers entiers en lot
API REST Chaque outil disponible via HTTP avec authentification par clé API. Documentation Swagger interactive à /api/docs
Conteneur Unique Pas de Redis, pas de Postgres, pas de base de données externe — un seul conteneur Docker avec SQLite
Multi-architecture AMD64 et ARM64 (Intel, Apple Silicon, Raspberry Pi)
Accélération GPU Support NVIDIA GPU optionnel pour une inférence IA plus rapide
Confidentialité Tout fonctionne localement. Analytics anonymes optionnels (opt-in, aucune donnée image)

Architecture

SnapOtter embarque une application web complète dans un seul conteneur. Le backend Fastify sert à la fois le frontend React (SPA) et l'API REST, en routant les requêtes vers le Moteur d'Images (pool de workers Sharp pour les opérations standard) ou le Moteur IA (pont Python pour les tâches de ML).

Architecture SnapOtter

Voici comment fonctionne le flux de requêtes :

  1. Le navigateur envoie une requête HTTP au serveur Fastify (port 1349) avec un fichier image
  2. L'API valide les entrées avec Zod, authentifie l'utilisateur et route la requête
  3. Les outils standard (redimensionner, recadrer, convertir, compresser) sont délégués aux workers Piscina utilisant Sharp — ils ne bloquent pas la boucle d'événements principale
  4. Les outils IA (suppression d'arrière-plan, upscaling, OCR) sont envoyés au Pont Dispatcher Python, qui exécute les modèles ML à la demande
  5. Le pont Python charge les poids du modèle depuis le disque (/opt/models/) pour l'outil spécifique, exécute l'inférence et libère la mémoire
  6. SQLite (via Drizzle ORM) stocke les comptes utilisateurs, l'historique des travaux, les métadonnées des fichiers et les paramètres d'exécution
  7. Les volumes Docker persistent les images téléchargées et les résultats traités dans /data/

L'architecture est conçue pour une faible consommation mémoire au repos — seul le serveur Fastify tourne (~100-150 Mo). Les workers et le dispatcher Python démarrent lors de la première utilisation et se terminent après 30 secondes d'inactivité.

Prérequis

  • Un serveur ou VPS avec Docker et Docker Compose installés
  • Au moins 1 Go de RAM (2 Go+ recommandé pour les fonctionnalités IA)
  • 10 Go+ d'espace disque libre (les poids des modèles prennent ~5-7 Go)
  • Optionnel : GPU NVIDIA avec Container Toolkit pour l'accélération GPU

Installation Pas à Pas

Étape 1 : Démarrage Rapide avec Docker (Une Commande)

Le moyen le plus rapide d'essayer SnapOtter :

docker run -d \
--name snapotter \
-p 1349:1349 \
-v snapotter-data:/data \
snapotter/snapotter:latest

Ouvrez http://adresse-de-votre-serveur:1349 dans votre navigateur. Identifiants par défaut :

  • Nom d'utilisateur : admin
  • Mot de passe : admin

Vous devrez changer le mot de passe lors de la première connexion.

Étape 2 : Configuration avec Docker Compose (Recommandé pour la Production)

Créez un fichier docker-compose.yml :

version: "3.8"

services:
  snapotter:
    image: snapotter/snapotter:latest
    container_name: snapotter
    ports:
      - "1349:1349"
    volumes:
      - snapotter-data:/data
      - snapotter-workspace:/tmp/workspace
    environment:
      - DEFAULT_USERNAME=admin
      - DEFAULT_PASSWORD=votre_mot_de_passe_securise
      - MAX_UPLOAD_SIZE_MB=50
      - AUTH_ENABLED=true
      - LOG_LEVEL=info
      - SESSION_DURATION_HOURS=24
      - RATE_LIMIT_PER_MIN=60
    restart: unless-stopped

volumes:
  snapotter-data:
  snapotter-workspace:

Lancez-le :

docker compose up -d

Étape 3 : Avec Accélération GPU NVIDIA

Si vous avez un GPU NVIDIA, ajoutez --gpus all :

services:
snapotter:
  image: snapotter/snapotter:latest
  container_name: snapotter
  ports:
    - "1349:1349"
  volumes:
    - snapotter-data:/data
    - snapotter-workspace:/tmp/workspace
  environment:
    - DEFAULT_USERNAME=admin
    - DEFAULT_PASSWORD=votre_mot_de_passe_securise
    - MAX_UPLOAD_SIZE_MB=50
    - AUTH_ENABLED=true
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: all
            capabilities: [gpu]
  restart: unless-stopped

Le conteneur bascule automatiquement sur CPU si aucun GPU n'est détecté.

Étape 4 : Options de Configuration

SnapOtter expose ces variables d'environnement pour la personnalisation :

Variable Défaut Description
PORT 1349 Port du serveur HTTP
DEFAULT_USERNAME admin Nom d'utilisateur admin initial
DEFAULT_PASSWORD admin Mot de passe admin initial
AUTH_ENABLED true Activer/désactiver l'authentification
MAX_UPLOAD_SIZE_MB 20 Taille maximale de fichier uploadé
MAX_BATCH_SIZE 50 Nombre max d'images en traitement par lot
CONCURRENT_JOBS 3 Limite de travaux parallèles
SESSION_DURATION_HOURS 24 Durée de vie de la session
RATE_LIMIT_PER_MIN 100 Limite de taux API par IP
LOG_LEVEL info Niveau de journalisation
CORS_ORIGIN * Origines CORS autorisées
TRUST_PROXY false Activer si derrière un proxy inverse
ANALYTICS_ENABLED true Analytics anonymes (opt-in)
STORAGE_MODE local Backend de stockage

Étape 5 : Proxy Inverse avec Nginx (Optionnel)

Placez SnapOtter derrière un proxy inverse pour HTTPS et un nom de domaine propre :

server {
    listen 443 ssl;
    server_name snapotter.votredomaine.com;

    ssl_certificate /etc/letsencrypt/live/snapotter.votredomaine.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/snapotter.votredomaine.com/privkey.pem;

    client_max_body_size 500M;

    location / {
        proxy_pass http://127.0.0.1:1349;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

Si vous utilisez un proxy inverse, définissez TRUST_PROXY=true pour que SnapOtter utilise la bonne IP client pour la limitation de débit.

Étape 6 : Utiliser SnapOtter

Une fois lancé, voici ce que vous pouvez faire :

Opérations d'image standard :

  • Téléchargez une image et choisissez : Redimensionner, Recadrer, Pivoter, Retourner, Convertir (PNG/JPEG/WebP/AVIF), Compresser, Supprimer les métadonnées EXIF
  • Ajustez les couleurs : Luminosité, Contraste, Saturation, Niveaux de gris, Sépia, Inverser

Opérations IA :

  • Supprimer l'arrière-plan — Suppression en un clic pour les portraits et photos de produits
  • Améliorer la résolution — Augmentez la résolution avec RealESRGAN
  • Améliorer les visages — Restaurez et améliorez les détails du visage avec GFPGAN
  • Effacer un objet — Supprimez les objets indésirables avec LaMa inpainting
  • OCR — Extrayez le texte des images avec PaddleOCR
  • Restaurer une photo — Colorisez et restaurez les vieilles photos noir et blanc
  • Flouter les visages — Détectez et floutez automatiquement les visages pour la confidentialité

Pipelines :

  • Allez dans l'onglet Pipelines
  • Enchaînez plusieurs outils (ex : Améliorer → Supprimer l'arrière-plan → Convertir en WebP)
  • Sauvegardez comme flux de travail réutilisable
  • Exécutez sur des images individuelles ou des dossiers entiers en lot

Accès API :

  • Générez une clé API dans les Paramètres
  • Utilisez l'API REST pour intégrer SnapOtter dans vos propres scripts
# Exemple : Supprimer l'arrière-plan via l'API
curl -X POST http://localhost:1349/api/v1/tools/remove-background \
  -H "X-API-Key: votre-cle-api" \
  -F "file=@photo.jpg"

Étape 7 : Gestion des Ressources

SnapOtter est efficace en termes de ressources :

  • Au repos : ~100-150 Mo de RAM (seul le serveur Fastify tourne)
  • Utilisation d'outils standard : Les workers se lancent à la demande, se terminent après 30 secondes d'inactivité
  • Utilisation d'outils IA : Le dispatcher Python démarre sur la première requête IA ; les poids des modèles sont chargés par requête, libérés après
  • Espace disque : ~5-7 Go pour les fichiers de poids des modèles, plus vos images

Les poids des modèles sont pré-téléchargés pendant la construction Docker, donc le conteneur fonctionne entièrement hors ligne.

Dépannage

Impossible d'accéder à l'interface web sur le port 1349

  • Vérifiez si le conteneur tourne : docker ps | grep snapotter
  • Vérifiez le mappage de port : docker logs snapotter | grep "listening"
  • Vérifiez les règles du pare-feu : ufw status (autorisez le port 1349 si nécessaire)

Les outils IA sont lents

  • La première requête IA déclenche un démarrage à froid (initialisation du dispatcher Python + chargement du modèle)
  • Les requêtes suivantes sont plus rapides car le dispatcher reste chaud
  • Envisagez l'accélération GPU avec --gpus all

"Max upload size exceeded"

  • Augmentez MAX_UPLOAD_SIZE_MB dans les variables d'environnement
  • Augmentez aussi client_max_body_size de Nginx si derrière un proxy inverse

Le conteneur redémarre sans cesse

  • Vérifiez les logs : docker logs snapotter
  • Assurez-vous que le volume /data est accessible en écriture : docker exec snapotter touch /data/.test
  • Vérifiez que le port 1349 n'est pas déjà utilisé

Comparaison : SnapOtter vs. Alternatives

SnapOtter

  • Auto-hébergé: ✅ Oui (local uniquement)
  • Fonctionnalités IA: ✅ 15 outils IA (locaux)
  • Hors ligne: ✅ Complètement hors ligne
  • Prix: ✅ Gratuit (AGPL)
  • Traitement par lot: ✅ Oui, avec pipelines
  • API REST: ✅ API complète + Swagger
  • Conteneur unique: ✅ Oui
  • Support GPU: ✅ NVIDIA optionnel

Imaginary Cloud

  • Auto-hébergé: ❌ Cloud uniquement
  • Fonctionnalités IA: ✅ (API cloud)
  • Hors ligne: ❌ Nécessite internet
  • Prix: 💰 Payant par image
  • Traitement par lot: ❌ Limité
  • API REST: ✅ API disponible
  • Conteneur unique: ❌ Multi-service
  • Support GPU: ✅ GPU cloud

Photopea

  • Auto-hébergé: ❌ Cloud uniquement
  • Fonctionnalités IA: ❌ Non
  • Hors ligne: ❌ Nécessite internet
  • Prix: 💰 Premium
  • Traitement par lot: ❌ Non
  • API REST: ❌ Non
  • Conteneur unique: ❌ N/A
  • Support GPU: ❌ Non

Ressources