mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
* docs: rebrand from image-only to multi-modality across docs and metadata SnapOtter expanded from image-only to 157 tools across 5 modalities (image, video, audio, document/PDF, data). Update all product-level copy, metadata, and i18n that still framed it as an image-only tool. - README, package.json, root llms.txt: multi-modality framing, 157 tools - OpenAPI info + tags, generated /llms.txt tagline (docs.ts) - VitePress docs site: hero, getting-started, architecture, security, deployment, configuration, developer, supported-formats - i18n: 10 product keys across all 21 locales (hero, app description, privacy notes, AI features, progress messages, getting-started) - web/demo/landing meta + privacy copy, COMMUNITY_GUIDE, .env.example Stale tool counts (53/50+/52/70+/35) corrected to 157 throughout. Database/container deployment claims left unchanged (out of scope). * docs: fix stale post-rebrand test assertions and README language list - tests/e2e-docs/homepage.spec.ts: assert the current docs homepage (file toolkit, 157 tools, 5 modalities) instead of the old image-only strings - tests/unit/api/docs-route.test.ts: sync the reproduced llms.txt tagline with docs.ts - README.md: 21 languages with the correct list (add Swedish and Chinese Traditional, drop Czech which is not supported) * docs: correct 2.0 architecture references (Postgres 17 + Redis 8, 3-container stack) The docs and metadata still described the 1.x stack (SQLite, single container, p-queue). Update them to the current 2.0 reality. - README: replace the broken single-container `docker run` quick-start with the real Docker Compose stack (app + Postgres 17 + Redis 8); fix the "no Redis, no Postgres" feature bullet - package.json: description no longer claims a single container - apps/docs: rewrite database.md for Postgres; configuration.md DB_PATH -> DATABASE_URL + REDIS_URL; architecture.md SQLite/p-queue/better-sqlite3 -> Postgres/BullMQ/pg and add media-engine + doc-engine; developer/security/deployment/docker-tags/getting-started/contributing compose examples now include postgres + redis; index.md + api/ai.md AI count 16 -> 19 - SECURITY.md: Drizzle (SQLite) -> (PostgreSQL) - landing: enterprise/FeatureHighlights single-container wording; TrustSignals/ToolGrid 150+ -> 157 (dynamic); Pricing/FAQ 15 -> 19 AI tools * docs(api): document all video, audio, document, and data tool endpoints in OpenAPI The spec covered only image tools; the Scalar UI and the generated /llms.txt and /llms-full.txt inherited that gap. Add the 104 missing tool endpoints so the API docs match the code. - Video: 29 endpoints (most long/async; auto-subtitles is AI) - Audio: 17 (transcribe-audio is AI) - Document/PDF: 36 (ocr-pdf is AI; conversions are long/async) - Data: 10 - Image: 12 newer tools (background-replace, blur-background AI; histogram/lqip-placeholder/sprite-sheet custom responses; barcode-generate uses a JSON body) Each schema is derived from the tool's Zod validator and executionHint (fast -> 200, long -> 202+SSE, AI adds 501 FeatureNotInstalledError, multi-file inputs as arrays), referencing the existing shared schemas. Tool path entries: 64 -> 168. Spec parses as valid YAML with no duplicate paths and only known $refs.
262 lines
11 KiB
Plaintext
262 lines
11 KiB
Plaintext
# 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_<key> (API keys are prefixed si_)
|
|
|
|
API keys support scoped permissions that intersect with user role permissions.
|
|
|
|
Processing a file:
|
|
POST /api/v1/tools/: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/: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
|