mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
chore: bump version to 1.17.0 and update docs for release
- Bump all workspace package versions to 1.17.0 - Update APP_VERSION constant and OpenAPI spec - Update AI tool count from 15 to 16 across docs and i18n - Update tool table with AI Canvas Expand, Meme Generator, Beautify - Add image editor, OIDC, and 20 languages to README features - Add release notes for v1.17.0 - Add JSON-LD structured data and SEO improvements to landing/docs
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
## Highlights
|
||||
|
||||
Five new tools, a full image editor, SSO login, 20 languages. Probably should have been three separate releases, but here we are.
|
||||
|
||||
## New features
|
||||
|
||||
- **Image editor** -- Layers, brushes, shapes, adjustments, filters, curves, keyboard shortcuts. Runs in your browser, processes on your hardware.
|
||||
- **OIDC / SSO authentication** -- Login with Google, GitHub, Okta, or any OpenID Connect provider. Set a few env vars and your team uses their existing accounts.
|
||||
- **Meme generator** -- 100 built-in templates with text rendering via opentype.js. Or upload your own image.
|
||||
- **Beautify** -- Drop a screenshot in, get a polished image out. Device frames (macOS, Windows, browser), shadows, gradients, social media presets.
|
||||
- **Color blindness simulation** -- Preview how images look with protanopia, deuteranopia, tritanopia, and other color vision deficiencies.
|
||||
- **PNG transparency fixer** -- Detects fake-transparent PNGs and fixes them with BiRefNet HR-matting. Optional watermark removal via LaMa inpainting.
|
||||
- **AI canvas expand** -- Extend image boundaries with AI fill. Three quality tiers (fast, balanced, quality) depending on how much GPU time you want to trade.
|
||||
- **20 languages** -- Arabic, Chinese (Simplified/Traditional), Czech, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Thai, Turkish, Ukrainian, Vietnamese. RTL works for Arabic.
|
||||
- **URL import** -- Paste URLs into the dropzone or bulk-import from a list. Server-side fetch with SSRF protection.
|
||||
- **Multi-file eraser** -- Draw erase masks across multiple images, process them all with one click. Strokes persist per-image.
|
||||
- **Pipeline import/export** -- Save tool chains as JSON, share them with others.
|
||||
- **17 new camera RAW formats** via exiftool, plus QOI, JP2, EPS, DDS, CUR, DPX, FITS, PPM/PGM/PBM, SVGZ, and APNG input. New output codecs for BMP, ICO, JP2, QOI. AVIF, TIFF, GIF, JXL, and PSD export recovered from a previously lost branch.
|
||||
|
||||
## Improvements
|
||||
|
||||
- **Image enhancement** -- Replaced the old pipeline with CLAHE + normalise + gamma. New Deep Enhance toggle uses the AI model for more aggressive results.
|
||||
- **Restore photo** -- Scratch detection rewritten with 8-angle Otsu filtering. LaMa inpainting now runs at native resolution. The confusing mode selector is gone, replaced with a colorize strength slider.
|
||||
- **Exotic formats everywhere** -- OCR, image-to-PDF, favicon generator, composition, stitch, and vectorize all decode HEIC, RAW, PSD now. Previously they just errored out.
|
||||
- **Compress** -- Target-size tolerance tightened from 5% to 1%. Target size is the default mode. Added stepper buttons and KB/MB unit selector.
|
||||
- **Sentry cleanup** -- 644 non-actionable events filtered. Real errors (non-ASCII filename crashes, EPIPE on dispatcher, EACCES on storage) now handled properly.
|
||||
- **GPU detection** -- Better diagnostics for containers where CUDA is present but nvidia-smi is not.
|
||||
- **DNG/RAW metadata** -- Image info reads EXIF from RAW files without full decode.
|
||||
- **Auth-disabled mode** -- Anonymous user is seeded in the DB with admin role. API keys, pipelines, and user files no longer break on FK constraints.
|
||||
- **2,705+ new tests** across unit, integration, and E2E.
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- **Upscale on CPU** -- No longer times out on NAS boxes and low-power hardware.
|
||||
- **QR code logo** -- Adding a logo no longer makes the preview vanish permanently.
|
||||
- **Crop overflow** -- Tall portrait images stay inside the viewport.
|
||||
- **TIFF alpha** -- Files needing alpha correctly force PNG output instead of producing corruption.
|
||||
- **HDR/EXR decode** -- Converts to 8-bit before CLAHE, fixing decode failures.
|
||||
- **Face landmarks** -- Input buffers converted to PNG before the Python sidecar, fixing crashes.
|
||||
- **Find duplicates** -- Mixed-format batches no longer crash. Network errors handled.
|
||||
- **Beautify preview** -- Updates in real time, no longer collapses when frame or watermark is active.
|
||||
- **Progress bars** -- Stitch and vectorize show progress during processing.
|
||||
- **SVGZ** -- SVG-to-raster handles gzip-compressed SVGs.
|
||||
- **Non-ASCII filenames** -- X-File-Results header is percent-encoded, fixing downloads for non-Latin names.
|
||||
|
||||
## Upgrade
|
||||
|
||||
```bash
|
||||
docker pull snapotter/snapotter:1.17.0
|
||||
```
|
||||
|
||||
Or with Docker Compose:
|
||||
|
||||
```bash
|
||||
docker compose pull && docker compose up -d
|
||||
```
|
||||
|
||||
**Full Changelog**: https://github.com/snapotter-hq/SnapOtter/compare/v1.16.0...v1.17.0
|
||||
@@ -15,13 +15,16 @@
|
||||
|
||||
## Key Features
|
||||
|
||||
- **52 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
|
||||
- **52 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
|
||||
- **Image editor** -- Layer-based editor with brushes, shapes, adjustments, filters, curves, and keyboard shortcuts. Runs in your browser, processes on your hardware
|
||||
- **Local AI** -- Remove backgrounds, upscale images, restore and colorize old photos, erase objects, blur faces, enhance faces, extract text (OCR), expand canvas, fix transparency. All on your hardware, no internet required
|
||||
- **OIDC / SSO** -- Login with Google, GitHub, Okta, or any OpenID Connect provider
|
||||
- **20 languages** -- Arabic, Chinese, Czech, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Thai, Turkish, Ukrainian, Vietnamese. RTL support for Arabic
|
||||
- **Pipelines** -- Chain tools into reusable workflows with unlimited steps. Import/export as JSON. 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
|
||||
|
||||
## Quick Start
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/api",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
openapi: 3.1.0
|
||||
info:
|
||||
title: SnapOtter API
|
||||
version: 1.16.0
|
||||
version: 1.17.0
|
||||
description: |
|
||||
REST API for SnapOtter, a self-hosted image processing platform with 52 tools.
|
||||
|
||||
|
||||
@@ -12,14 +12,24 @@ export default defineConfig({
|
||||
outDir: "./.vitepress/dist",
|
||||
ignoreDeadLinks: [/localhost/],
|
||||
|
||||
sitemap: { hostname: "https://docs.snapotter.com" },
|
||||
|
||||
head: [
|
||||
["meta", { name: "theme-color", content: "#3b82f6" }],
|
||||
["link", { rel: "icon", type: "image/png", sizes: "48x48", href: "/favicon.png" }],
|
||||
["link", { rel: "icon", type: "image/x-icon", href: "/favicon.ico" }],
|
||||
["link", { rel: "apple-touch-icon", sizes: "180x180", href: "/apple-touch-icon.png" }],
|
||||
["link", { rel: "llms-txt", href: "/llms.txt" }],
|
||||
["meta", { property: "og:image", content: "https://docs.snapotter.com/logo.png" }],
|
||||
["meta", { property: "og:type", content: "website" }],
|
||||
["meta", { property: "og:site_name", content: "SnapOtter Docs" }],
|
||||
["meta", { property: "og:image", content: "https://docs.snapotter.com/og-image.png" }],
|
||||
["meta", { property: "og:image:width", content: "1280" }],
|
||||
["meta", { property: "og:image:height", content: "640" }],
|
||||
["meta", { property: "og:image:alt", content: "SnapOtter - Self-Hosted Image Processing" }],
|
||||
["meta", { property: "og:url", content: "https://docs.snapotter.com" }],
|
||||
["meta", { property: "og:locale", content: "en_US" }],
|
||||
["meta", { name: "twitter:card", content: "summary_large_image" }],
|
||||
["meta", { name: "twitter:image", content: "https://docs.snapotter.com/og-image.png" }],
|
||||
],
|
||||
|
||||
vite: {
|
||||
|
||||
+5
-1
@@ -1,8 +1,12 @@
|
||||
---
|
||||
description: AI engine reference with all local ML tools. Background removal, upscaling, OCR, face detection, photo restoration, and more.
|
||||
---
|
||||
|
||||
# AI Engine Reference
|
||||
|
||||
The `@snapotter/ai` package bridges Node.js to a **persistent Python sidecar** for all ML operations. The dispatcher process stays alive between requests for fast warm-start performance. GPU is auto-detected at startup and used when available.
|
||||
|
||||
15 AI tool routes. All models run locally - no internet required after initial model download.
|
||||
16 AI tool routes. All models run locally - no internet required after initial model download.
|
||||
|
||||
## Architecture
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
description: Monorepo structure, app and package architecture, request lifecycle, and resource footprint of SnapOtter.
|
||||
---
|
||||
|
||||
# Architecture
|
||||
|
||||
SnapOtter is a monorepo managed with pnpm workspaces and Turborepo. Everything ships as a single Docker container.
|
||||
@@ -43,7 +47,7 @@ Shared TypeScript types, constants (like `APP_VERSION` and tool definitions), an
|
||||
|
||||
### API (`apps/api`)
|
||||
|
||||
A Fastify v5 server exposing 52 tool routes (36 standard image operations + 15 AI-powered + editor) that handles:
|
||||
A Fastify v5 server exposing 52 tool routes (36 standard image operations + 16 AI-powered) that handles:
|
||||
- File uploads, temporary workspace management, and persistent file storage
|
||||
- User file library with version chains (`user_files` table) -- each processed result links back to its source file and records which tool was applied, with auto-generated thumbnails for the Files page
|
||||
- Tool execution (routes each tool request to the image engine or AI bridge)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
description: Install SnapOtter with Docker in one command. Includes Docker Compose setup, building from source, and a full feature overview.
|
||||
---
|
||||
|
||||
# Getting Started
|
||||
|
||||
## Quick Start
|
||||
@@ -71,10 +75,10 @@ pnpm dev
|
||||
| **Essentials** | Resize, Crop, Rotate & Flip, Convert, Compress |
|
||||
| **Optimization** | Optimize for Web, Strip Metadata, Edit Metadata, Bulk Rename, Image to PDF, Favicon Generator |
|
||||
| **Adjustments** | Adjust Colors, Sharpening, Replace Color, Color Blindness Simulation |
|
||||
| **AI Tools** | Remove Background, Upscale, Erase Object, OCR, Blur Faces, Smart Crop, Image Enhancement, Enhance Faces, Colorize, Noise Removal, Red Eye Removal, Restore Photo, Passport Photo, Content-Aware Resize, PNG Transparency Fixer |
|
||||
| **Watermark & Overlay** | Text Watermark, Image Watermark, Text Overlay, Image Composition |
|
||||
| **AI Tools** | Remove Background, Upscale, Erase Object, OCR, Blur Faces, Smart Crop, Image Enhancement, Enhance Faces, Colorize, Noise Removal, Red Eye Removal, Restore Photo, Passport Photo, Content-Aware Resize, AI Canvas Expand, PNG Transparency Fixer |
|
||||
| **Watermark & Overlay** | Text Watermark, Image Watermark, Text Overlay, Image Composition, Meme Generator |
|
||||
| **Utilities** | Image Info, Compare, Find Duplicates, Color Palette, QR Code Generator, Barcode Reader, Image to Base64 |
|
||||
| **Layout** | Collage, Stitch, Split, Border & Frame |
|
||||
| **Layout** | Collage, Stitch, Split, Border & Frame, Beautify |
|
||||
| **Format** | SVG to Raster, Vectorize, GIF Tools, PDF to Image |
|
||||
|
||||
### Pipelines
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ features:
|
||||
- title: 52 Image Tools
|
||||
details: Resize, crop, compress, convert, watermark, color adjust, vectorize, create GIFs, build collages, generate passport photos, find duplicates, and more.
|
||||
- title: Local AI
|
||||
details: 15 AI-powered tools - remove backgrounds, upscale, enhance images, restore and colorize old photos, erase objects, blur faces, enhance faces, extract text (OCR), fix fake transparency. All on your hardware, no internet required.
|
||||
details: 16 AI-powered tools - remove backgrounds, upscale, enhance images, restore and colorize old photos, erase objects, blur faces, enhance faces, extract text (OCR), fix fake transparency, expand canvas with AI fill. All on your hardware, no internet required.
|
||||
- title: Pipelines
|
||||
details: Chain tools into reusable workflows with unlimited steps. Batch process unlimited images at once with a single request.
|
||||
- title: REST API
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/docs",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docs:dev": "vitepress dev .",
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 180 KiB |
@@ -0,0 +1,4 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://docs.snapotter.com/sitemap.xml
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/landing",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 180 KiB |
@@ -0,0 +1,4 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://snapotter.com/sitemap.xml
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://snapotter.com/</loc>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://snapotter.com/faq</loc>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://snapotter.com/contact</loc>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://snapotter.com/privacy</loc>
|
||||
<priority>0.3</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://snapotter.com/terms</loc>
|
||||
<priority>0.3</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
@@ -0,0 +1,12 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Contact | SnapOtter",
|
||||
description:
|
||||
"Book a demo, get deployment help, or discuss enterprise licensing for SnapOtter self-hosted image processing.",
|
||||
alternates: { canonical: "https://snapotter.com/contact" },
|
||||
};
|
||||
|
||||
export default function ContactLayout({ children }: { children: React.ReactNode }) {
|
||||
return children;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "FAQ | SnapOtter",
|
||||
description:
|
||||
"Frequently asked questions about SnapOtter. Privacy, pricing, AI features, file limits, updates, and enterprise licensing.",
|
||||
alternates: { canonical: "https://snapotter.com/faq" },
|
||||
};
|
||||
|
||||
export default function FaqLayout({ children }: { children: React.ReactNode }) {
|
||||
return children;
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import { useState } from "react";
|
||||
|
||||
import { FadeIn } from "@/components/fade-in";
|
||||
import { Footer } from "@/components/footer";
|
||||
import { JsonLd } from "@/components/json-ld";
|
||||
import { Navbar } from "@/components/navbar";
|
||||
|
||||
const faqs = [
|
||||
@@ -71,9 +72,23 @@ function FaqItem({ question, answer }: { question: string; answer: string }) {
|
||||
);
|
||||
}
|
||||
|
||||
const faqJsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
mainEntity: faqs.map((faq) => ({
|
||||
"@type": "Question",
|
||||
name: faq.question,
|
||||
acceptedAnswer: {
|
||||
"@type": "Answer",
|
||||
text: faq.answer,
|
||||
},
|
||||
})),
|
||||
};
|
||||
|
||||
export default function FaqPage() {
|
||||
return (
|
||||
<>
|
||||
<JsonLd data={faqJsonLd} />
|
||||
<Navbar />
|
||||
<main className="pt-16">
|
||||
<section className="px-6 py-24 md:py-32">
|
||||
|
||||
@@ -28,12 +28,13 @@ export const metadata: Metadata = {
|
||||
url: "https://snapotter.com",
|
||||
siteName: "SnapOtter",
|
||||
type: "website",
|
||||
locale: "en_US",
|
||||
images: [
|
||||
{
|
||||
url: "/og-image.svg",
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: "SnapOtter | Self-Hosted Image Processing",
|
||||
url: "/og-image.png",
|
||||
width: 1280,
|
||||
height: 640,
|
||||
alt: "SnapOtter - Self-Hosted Image Processing Suite",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -42,7 +43,7 @@ export const metadata: Metadata = {
|
||||
title: "SnapOtter | Self-Hosted Image Processing",
|
||||
description:
|
||||
"52 image processing tools with local AI. Runs 100% offline. No data leaves your network.",
|
||||
images: ["/og-image.svg"],
|
||||
images: ["/og-image.png"],
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,16 +1,55 @@
|
||||
import type { Metadata } from "next";
|
||||
|
||||
import { BentoGrid } from "@/components/bento-grid";
|
||||
import { Enterprise } from "@/components/enterprise";
|
||||
import { Footer } from "@/components/footer";
|
||||
import { Hero } from "@/components/hero";
|
||||
import { HowItWorks } from "@/components/how-it-works";
|
||||
import { JsonLd } from "@/components/json-ld";
|
||||
import { Navbar } from "@/components/navbar";
|
||||
import { OpenSource } from "@/components/open-source";
|
||||
import { Pricing } from "@/components/pricing";
|
||||
import { WhyChoose } from "@/components/why-choose";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
alternates: { canonical: "https://snapotter.com" },
|
||||
};
|
||||
|
||||
const organizationJsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
name: "SnapOtter",
|
||||
url: "https://snapotter.com",
|
||||
logo: "https://snapotter.com/logo.png",
|
||||
sameAs: ["https://github.com/snapotter-hq/snapotter", "https://discord.gg/hr3s7HPUsr"],
|
||||
};
|
||||
|
||||
const softwareJsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
name: "SnapOtter",
|
||||
description:
|
||||
"52 image processing tools with local AI. Runs 100% offline. No data leaves your network. Open source and free forever.",
|
||||
applicationCategory: "MultimediaApplication",
|
||||
operatingSystem: "Linux, macOS, Windows (via Docker)",
|
||||
offers: {
|
||||
"@type": "Offer",
|
||||
price: "0",
|
||||
priceCurrency: "USD",
|
||||
},
|
||||
license: "https://www.gnu.org/licenses/agpl-3.0.en.html",
|
||||
url: "https://snapotter.com",
|
||||
downloadUrl: "https://hub.docker.com/r/snapotter/snapotter",
|
||||
screenshot: "https://snapotter.com/og-image.png",
|
||||
featureList:
|
||||
"Image Resize, Image Crop, Image Compression, Format Conversion, Watermarking, Background Removal, Image Upscaling, OCR, Face Detection, Photo Restoration, Batch Processing, REST API, Pipeline Automation",
|
||||
};
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<>
|
||||
<JsonLd data={organizationJsonLd} />
|
||||
<JsonLd data={softwareJsonLd} />
|
||||
<Navbar />
|
||||
<main>
|
||||
<Hero />
|
||||
|
||||
@@ -8,6 +8,7 @@ export const metadata: Metadata = {
|
||||
title: "Privacy Policy | SnapOtter",
|
||||
description:
|
||||
"SnapOtter is self-hosted software. We do not process, store, or have access to your images or data. Learn about our privacy practices.",
|
||||
alternates: { canonical: "https://snapotter.com/privacy" },
|
||||
};
|
||||
|
||||
export default function PrivacyPage() {
|
||||
|
||||
@@ -8,6 +8,7 @@ export const metadata: Metadata = {
|
||||
title: "Terms and Conditions | SnapOtter",
|
||||
description:
|
||||
"Terms governing your use of the SnapOtter website and self-hosted image processing software.",
|
||||
alternates: { canonical: "https://snapotter.com/terms" },
|
||||
};
|
||||
|
||||
export default function TermsPage() {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
export function JsonLd({ data }: { data: Record<string, unknown> }) {
|
||||
return (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
// biome-ignore lint/security/noDangerouslySetInnerHtml: static build-time data only, no user input
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -12,7 +12,7 @@ const phrases = [
|
||||
"Works fully offline.",
|
||||
"Unlimited batch processing.",
|
||||
"52 image tools.",
|
||||
"15 AI models. Your hardware.",
|
||||
"16 AI models. Your hardware.",
|
||||
"Lightning fast. Built on Sharp.",
|
||||
"Air-gapped ready.",
|
||||
"One Docker container.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/web",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
+18
-1
@@ -1,7 +1,24 @@
|
||||
{
|
||||
"name": "snapotter",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"description": "Self-hosted image processing suite with 52 tools and local AI. Single Docker container, no external services.",
|
||||
"homepage": "https://snapotter.com",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/snapotter-hq/snapotter.git"
|
||||
},
|
||||
"keywords": [
|
||||
"image-processing",
|
||||
"self-hosted",
|
||||
"docker",
|
||||
"ai",
|
||||
"background-removal",
|
||||
"image-resize",
|
||||
"image-compression",
|
||||
"ocr",
|
||||
"open-source"
|
||||
],
|
||||
"packageManager": "pnpm@9.15.4",
|
||||
"scripts": {
|
||||
"dev": "turbo dev",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/ai",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "./src/index.ts",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/image-engine",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "./src/index.ts",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snapotter/shared",
|
||||
"version": "1.16.0",
|
||||
"version": "1.17.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "./src/index.ts",
|
||||
|
||||
@@ -1228,7 +1228,7 @@ export const PRINT_LAYOUTS: PrintLayout[] = [
|
||||
{ id: "none", label: "None", width: 0, height: 0 },
|
||||
];
|
||||
|
||||
export const APP_VERSION = "1.16.0";
|
||||
export const APP_VERSION = "1.17.0";
|
||||
|
||||
/**
|
||||
* Tool IDs that require the Python sidecar (AI/ML tools).
|
||||
|
||||
@@ -1719,7 +1719,7 @@ export const de: TranslationKeys = {
|
||||
"Funktioniert komplett offline.",
|
||||
"Unbegrenzte Stapelverarbeitung.",
|
||||
"51 Bildwerkzeuge.",
|
||||
"15 AI-Modelle. Ihre Hardware.",
|
||||
"16 AI-Modelle. Ihre Hardware.",
|
||||
"Blitzschnell. Basiert auf Sharp.",
|
||||
"Geeignet fuer abgeschottete Netzwerke.",
|
||||
"Ein einziger Docker-Container.",
|
||||
|
||||
@@ -1651,7 +1651,7 @@ export const en = {
|
||||
"Works fully offline.",
|
||||
"Unlimited batch processing.",
|
||||
"52 image tools.",
|
||||
"15 AI models. Your hardware.",
|
||||
"16 AI models. Your hardware.",
|
||||
"Lightning fast. Built on Sharp.",
|
||||
"Air-gapped ready.",
|
||||
"One Docker container.",
|
||||
|
||||
@@ -1689,7 +1689,7 @@ export const hi: TranslationKeys = {
|
||||
"पूरी तरह ऑफलाइन काम करता है।",
|
||||
"असीमित बैच प्रोसेसिंग।",
|
||||
"51 इमेज टूल्स।",
|
||||
"15 AI मॉडल। आपका हार्डवेयर।",
|
||||
"16 AI मॉडल। आपका हार्डवेयर।",
|
||||
"बिजली की तरह तेज़। Sharp पर बनाया गया।",
|
||||
"एयर-गैप्ड नेटवर्क के लिए तैयार।",
|
||||
"एक Docker कंटेनर।",
|
||||
|
||||
@@ -1707,7 +1707,7 @@ export const nl: TranslationKeys = {
|
||||
"Werkt volledig offline.",
|
||||
"Onbeperkte batchverwerking.",
|
||||
"51 afbeeldingstools.",
|
||||
"15 AI-modellen. Jouw hardware.",
|
||||
"16 AI-modellen. Jouw hardware.",
|
||||
"Razendsnel. Gebouwd op Sharp.",
|
||||
"Geschikt voor air-gapped netwerken.",
|
||||
"Een enkele Docker-container.",
|
||||
|
||||
@@ -1706,7 +1706,7 @@ export const ru: TranslationKeys = {
|
||||
"Работает полностью офлайн.",
|
||||
"Пакетная обработка без ограничений.",
|
||||
"51 инструмент для изображений.",
|
||||
"15 AI-моделей. На Вашем оборудовании.",
|
||||
"16 AI-моделей. На Вашем оборудовании.",
|
||||
"Молниеносная скорость. На базе Sharp.",
|
||||
"Готов к изолированным сетям.",
|
||||
"Один Docker-контейнер.",
|
||||
|
||||
@@ -1702,7 +1702,7 @@ export const sv: TranslationKeys = {
|
||||
"Fungerar helt offline.",
|
||||
"Obegransad batchbearbetning.",
|
||||
"51 bildverktyg.",
|
||||
"15 AI-modeller. Din hardvara.",
|
||||
"16 AI-modeller. Din hardvara.",
|
||||
"Blixtsnabb. Byggd pa Sharp.",
|
||||
"Fungerar i slutna natverk.",
|
||||
"En enda Docker-container.",
|
||||
|
||||
@@ -1711,7 +1711,7 @@ export const tr: TranslationKeys = {
|
||||
"Tamamen çevrimdışı çalışır.",
|
||||
"Sınırsız toplu işleme.",
|
||||
"51 görüntü aracı.",
|
||||
"15 AI modeli. Sizin donanımınız.",
|
||||
"16 AI modeli. Sizin donanımınız.",
|
||||
"Yıldırım hızında. Sharp ile geliştirildi.",
|
||||
"Hava boşluklu ağlar için hazır.",
|
||||
"Tek Docker konteyneri.",
|
||||
|
||||
@@ -1707,7 +1707,7 @@ export const uk: TranslationKeys = {
|
||||
"Повністю працює офлайн.",
|
||||
"Пакетна обробка без обмежень.",
|
||||
"51 інструмент для зображень.",
|
||||
"15 AI-моделей. На Вашому обладнанні.",
|
||||
"16 AI-моделей. На Вашому обладнанні.",
|
||||
"Блискавична швидкість. На базі Sharp.",
|
||||
"Готовий до ізольованих мереж.",
|
||||
"Один Docker-контейнер.",
|
||||
|
||||
Reference in New Issue
Block a user