# SnapOtter Open-source, self-hostable file manipulation suite with 157 tools across image, video, audio, document, and data. Single Docker container, no external services required. Dual-licensed AGPLv3 and commercial. All processing happens locally. Files never leave your infrastructure. ## Quick Start (Docker) docker run -d --name snapotter -p 1349:1349 -v snapotter-data:/data snapotter/snapotter:latest Default credentials: admin / admin (must change on first login). Add --gpus all for NVIDIA GPU acceleration on AI tools. Multi-arch: AMD64 and ARM64 (Intel, Apple Silicon, Raspberry Pi). ## Tools 157 tools across 5 modalities: image (64), video (29), audio (17), document/PDF (37), and data (10). 19 are local AI tools (no cloud APIs). ### Image (64 tools) #### Essentials - resize: Resize by pixels, percentage, or social media presets - crop: Freeform crop, aspect ratio presets, shape crop - circle-crop: Crop to a centered circle - rotate: Rotate, flip, and straighten images - convert: Convert between image formats - compress: Reduce file size by quality or target size - image-pad: Pad to a target aspect ratio #### Optimization - optimize-for-web: Smart format selection and quality tuning for web delivery - strip-metadata: Remove EXIF, GPS, and camera info for privacy - edit-metadata: View and edit EXIF, IPTC, and XMP fields - bulk-rename: Pattern-based batch renaming with variables - image-to-pdf: Combine images into multi-page PDFs - favicon: Generate all favicon and app icon sizes from one image - lqip-placeholder: Generate tiny low-quality image placeholders #### Adjustments and Effects - adjust-colors: Brightness, contrast, saturation, temperature, and effects - sharpening: Adaptive, unsharp mask, and high-pass sharpening - replace-color: Swap colors with tolerance control or invert - color-blindness: Simulate 8 types of color vision deficiency - duotone: Two-color duotone effect - pixelate: Pixelation effect, full image or region - vignette: Adjustable vignette effect - histogram: Generate an RGB histogram chart #### AI Tools (local ML, no cloud APIs) - remove-background: AI background removal (rembg) - upscale: 2x/4x AI super-resolution (RealESRGAN) - erase-object: AI inpainting to remove unwanted objects (LaMa) - ocr: Extract text from images (PaddleOCR, 80+ languages) - blur-faces: AI face detection with blur for GDPR compliance - smart-crop: Subject-aware and face-centered cropping - image-enhancement: One-click auto-fix for exposure, contrast, color - enhance-faces: AI face restoration for blurry or low-res portraits - colorize: Convert B&W photos to full color with AI - noise-removal: AI denoising for ISO noise, JPEG artifacts, grain - red-eye-removal: Automatic red-eye detection and correction - restore-photo: AI repair of scratches, tears, and damage - passport-photo: Compliant passport/ID photos for 30+ countries - content-aware-resize: Seam carving that preserves subjects - ai-canvas-expand: Outpainting to extend image borders with AI - transparency-fixer: Fix PNGs with fake transparent backgrounds - background-replace: Replace the background with a solid color - blur-background: Blur the background while keeping the subject sharp #### Watermark and Overlay - watermark-text: Add text watermarks with tiling and opacity - watermark-image: Overlay logos with position and opacity control - text-overlay: Add styled text, captions, and titles - compose: Layer and composite multiple images with blending - meme-generator: Create memes with custom text and templates #### Utilities - info: View dimensions, EXIF, GPS, color space, file details - compare: Side-by-side image comparison with slider overlay - find-duplicates: Perceptual hashing for near-duplicate detection - color-palette: Extract dominant colors as hex/RGB values - qr-generate: Custom QR codes with colors, logos, and patterns - html-to-image: Capture webpages as high-quality images - barcode-read: Decode QR, Code 128, EAN-13 and more from images - barcode-generate: Generate Code 128, EAN-13, UPC-A and more - image-to-base64: Generate data URIs for HTML/CSS embedding #### Layout and Composition - collage: 25+ grid templates for photo collages - stitch: Join images side by side, stacked, or in grids - split: Cut images into grid tiles for Instagram and print - border: Add borders, rounded corners, and drop shadows - beautify: Screenshot mockups with device frames and backgrounds - sprite-sheet: Combine images into a sprite sheet #### Format and Conversion - svg-to-raster: Convert SVG to PNG/JPEG/WebP at custom scale/DPI - vectorize: Trace raster images to SVG vector paths - gif-tools: Resize, optimize, reverse, extract GIF frames - gif-webp: Convert between animated GIF and WebP - pdf-to-image: Convert PDF pages to images at custom DPI ### Video (29 tools) - convert-video: Convert between MP4, MOV, WebM and more - compress-video: Shrink file size with quality control - trim-video: Cut a clip from a video - mute-video: Remove the audio track - video-to-gif: Turn a clip into an animated GIF - resize-video: Scale to a new resolution or preset - crop-video: Crop a region from video - rotate-video: Rotate or flip - change-fps: Change the frame rate - video-color: Brightness, contrast, saturation, gamma - video-speed: Speed up or slow down - reverse-video: Play backwards - video-loudnorm: Normalize audio to broadcast loudness - aspect-pad: Add solid-color bars for a target aspect ratio - blur-pad: Add blurred-copy bars for padding - watermark-video: Burn a text watermark onto frames - stabilize-video: Two-pass camera shake reduction - gif-to-video: Convert an animated GIF to MP4/WebM - video-to-webp: Convert a clip to animated WebP - video-to-frames: Extract frames as a ZIP of images - merge-videos: Join multiple clips into one - replace-audio: Swap the video audio track - burn-subtitles: Render subtitles onto frames - embed-subtitles: Mux a subtitle track into the container - extract-subtitles: Pull a subtitle track out as SRT - images-to-video: Build a slideshow video from images - video-metadata: Strip metadata from video - extract-audio: Pull the audio track from a video - auto-subtitles: Generate subtitles from speech with AI ### Audio (17 tools) - convert-audio: Convert between MP3, WAV, OGG, FLAC and more - trim-audio: Cut a section from audio - volume-adjust: Increase or decrease volume by gain - normalize-audio: Even out loudness to broadcast levels - fade-audio: Add fade-in and fade-out - reverse-audio: Play backwards - audio-speed: Speed up or slow down playback - pitch-shift: Shift pitch without changing speed - audio-channels: Mono/stereo conversion and channel swap - silence-removal: Strip silent sections - noise-reduction: FFT-based background noise reduction - merge-audio: Combine multiple files into one - split-audio: Split by time, parts, or silence - ringtone-maker: Create a ringtone clip from audio - waveform-image: Generate a waveform PNG visualization - audio-metadata: View, edit, or strip ID3 tags - transcribe-audio: Speech-to-text with AI (faster-whisper) ### Document / PDF (37 tools) - pdf-to-image: Convert PDF pages to images - merge-pdf: Combine multiple PDFs into one - split-pdf: Extract pages or split into parts - compress-pdf: Shrink PDF file size - rotate-pdf: Rotate pages - convert-document: Convert between Word, ODT, RTF, TXT - convert-presentation: Convert between PowerPoint and ODP - convert-spreadsheet: Convert between Excel, ODS, CSV - excel-to-pdf: Convert spreadsheets to PDF - word-to-pdf: Convert Word documents to PDF - extract-pages: Pull selected pages into a new PDF - remove-pages: Delete specific pages - organize-pdf: Reorder pages - protect-pdf: AES-256 password protection - unlock-pdf: Remove password protection - repair-pdf: Fix damaged or corrupted PDFs - linearize-pdf: Linearize for fast web viewing - grayscale-pdf: Convert colors to grayscale - pdfa-convert: Convert to archival PDF/A-2 - crop-pdf: Crop pages with a uniform margin - nup-pdf: Place multiple pages per sheet - booklet-pdf: Arrange pages for folding into a booklet - watermark-pdf: Add a text watermark to every page - pdf-page-numbers: Add page numbers - flatten-pdf: Bake forms and annotations into page content - redact-pdf: Permanently remove text (true redaction) - pdf-to-text: Extract plain text - pdf-to-word: Convert a PDF to a Word document - pdf-metadata: Read and write document metadata - powerpoint-to-pdf: Convert presentations to PDF - html-to-pdf: Convert an HTML file to PDF - markdown-to-docx: Convert Markdown to a Word document - markdown-to-html: Convert Markdown to standalone HTML - markdown-to-pdf: Convert Markdown to a styled PDF - epub-convert: Convert EPUB to PDF/DOCX/HTML/Markdown - to-epub: Convert Word/Markdown/HTML/TXT to EPUB - ocr-pdf: Extract text from scanned PDFs with AI ### Data (10 tools) - chart-maker: Bar, line, and pie charts from CSV/JSON - csv-excel: Convert between CSV and Excel - csv-json: Convert between CSV and JSON - json-xml: Convert between JSON and XML - split-csv: Split a CSV by row count - merge-csvs: Combine CSVs with matching columns - yaml-json: Convert between YAML and JSON - xml-to-csv: Extract XML elements into a CSV table - create-zip: Bundle files into a ZIP archive - extract-zip: Safely extract a ZIP (with bomb protection) ## REST API Base URL: http://localhost:1349/api/v1 Interactive docs: http://localhost:1349/api/docs (Swagger UI) Machine-readable spec: http://localhost:1349/api/docs/json (OpenAPI 3.1) OpenAPI YAML: http://localhost:1349/api/v1/openapi.yaml LLM-optimized spec: http://localhost:1349/llms.txt (generated from OpenAPI at runtime) Full plain-text API docs: http://localhost:1349/llms-full.txt Authentication methods: - Session cookie (browser login) - Bearer token: Authorization: Bearer si_ (API keys are prefixed si_) API keys support scoped permissions that intersect with user role permissions. Processing a file: POST /api/v1/tools/:section/:toolId Content-Type: multipart/form-data Body: file (binary), settings (JSON string) Response: { jobId, downloadUrl, originalSize, processedSize } Long-running tools (video, audio, AI) return 202 Accepted and stream progress via SSE: GET /api/v1/jobs/:jobId/progress (EventSource) Pipelines (chained tool workflows): POST /api/v1/pipeline/execute (run a pipeline on uploaded files) POST /api/v1/pipeline/save GET /api/v1/pipeline/list DELETE /api/v1/pipeline/:id POST /api/v1/pipeline/batch Batch processing: POST /api/v1/tools/:section/:toolId/batch (multiple files in, ZIP archive out). ## Tech Stack Frontend: React 19, Vite 6, Tailwind CSS 4, Zustand Backend: Fastify 5; Sharp (images), FFmpeg (video/audio), qpdf and LibreOffice (documents); Drizzle ORM AI/ML: Python sidecar (rembg, RealESRGAN, PaddleOCR, faster-whisper, MediaPipe, LaMa) Auth: Session-based with OIDC/SSO support (Google, GitHub, Okta, any OIDC provider) Languages: 21 locales with RTL support ## Key Features - Pipelines: chain tools into reusable workflows, import/export as JSON - Batch processing: process hundreds of files at once - Image editor: layer-based editor with brushes, shapes, filters, curves - OIDC/SSO: Google, GitHub, Okta, or any OpenID Connect provider - Role-based access: admin, editor, user roles with 14 granular permissions - Custom roles and API key scoping ## Links - Source code: https://github.com/snapotter-hq/snapotter - Documentation: https://docs.snapotter.com - Live demo: https://demo.snapotter.com - Docker Hub: https://hub.docker.com/r/snapotter/snapotter - GHCR: ghcr.io/snapotter-hq/snapotter - Discord: https://discord.gg/hr3s7HPUsr - Website: https://snapotter.com