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.
132 lines
5.6 KiB
TypeScript
132 lines
5.6 KiB
TypeScript
import { ArrowLeft } from "lucide-react";
|
|
import { Link } from "react-router-dom";
|
|
import { useTranslation } from "@/contexts/i18n-context";
|
|
|
|
export function PrivacyPolicyPage() {
|
|
const { t } = useTranslation();
|
|
return (
|
|
<div className="min-h-screen bg-background text-foreground">
|
|
<div className="max-w-2xl mx-auto px-6 py-12">
|
|
<Link
|
|
to="/"
|
|
className="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors mb-8"
|
|
>
|
|
<ArrowLeft className="h-4 w-4" />
|
|
{t.common.back}
|
|
</Link>
|
|
|
|
<h1 className="text-3xl font-bold mb-2">{t.common.privacyPolicy}</h1>
|
|
<p className="text-sm text-muted-foreground mb-8">Last updated: April 22, 2026</p>
|
|
|
|
<div className="space-y-6 text-sm leading-relaxed text-muted-foreground">
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Overview</h2>
|
|
<p>
|
|
SnapOtter is a self-hosted, open-source file processing application. Your instance is
|
|
operated and controlled entirely by whoever deployed it. This policy describes how the
|
|
software itself handles your data.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Local Processing</h2>
|
|
<p>
|
|
All file processing happens entirely on the server where SnapOtter is deployed. Your
|
|
files are never sent to external services or third-party APIs. When you upload a file
|
|
for processing, it is handled in memory or in temporary storage on the host machine
|
|
and is not retained after the operation completes.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Product Analytics</h2>
|
|
<p>
|
|
SnapOtter includes optional, anonymous product analytics. When you choose to
|
|
participate, the following is collected:
|
|
</p>
|
|
<ul className="list-disc ps-5 mt-2 space-y-1">
|
|
<li>Which tools you use (e.g., "crop tool used")</li>
|
|
<li>Error reports without file data</li>
|
|
<li>App version and performance metrics</li>
|
|
</ul>
|
|
<p className="mt-2 font-medium">What is never collected:</p>
|
|
<ul className="list-disc ps-5 mt-2 space-y-1">
|
|
<li>Your images, PDFs, and files</li>
|
|
<li>File names and contents</li>
|
|
<li>Any personal information or IP addresses</li>
|
|
</ul>
|
|
<p className="mt-2">
|
|
Analytics data is sent to{" "}
|
|
<a
|
|
href="https://posthog.com"
|
|
className="text-primary hover:underline"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
PostHog
|
|
</a>{" "}
|
|
(usage analytics) and{" "}
|
|
<a
|
|
href="https://sentry.io"
|
|
className="text-primary hover:underline"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Sentry
|
|
</a>{" "}
|
|
(error tracking) — both open-source projects.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Your Choice</h2>
|
|
<p>
|
|
Each user is asked individually on first login whether to participate. You can change
|
|
your choice anytime in Settings. Server administrators can disable analytics entirely
|
|
by setting{" "}
|
|
<code className="text-xs bg-muted px-1 py-0.5 rounded">ANALYTICS_ENABLED=false</code>.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Data Storage</h2>
|
|
<p>
|
|
If authentication is enabled, the application stores user accounts (usernames and
|
|
hashed passwords) in a PostgreSQL database on the host machine. If you use the Files
|
|
feature, uploaded files are stored on the server's filesystem. All stored data remains
|
|
entirely under the control of the instance operator.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Third-Party Services</h2>
|
|
<p>
|
|
All processing happens locally; your files are never sent anywhere. If you opt in to
|
|
product analytics, anonymous usage data is sent to PostHog and Sentry as described
|
|
above. AI-powered features run locally using bundled models. No other external
|
|
services are contacted.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Open Source</h2>
|
|
<p>
|
|
SnapOtter is fully open source. You can audit the source code to verify these claims
|
|
at any time. Transparency is a core principle of this project.
|
|
</p>
|
|
</section>
|
|
|
|
<section>
|
|
<h2 className="text-lg font-semibold text-foreground mb-2">Your Control</h2>
|
|
<p>
|
|
Because SnapOtter is self-hosted, the instance operator has full control over all
|
|
data. You can delete your data at any time by removing files from the server or
|
|
deleting the database. No data exists outside of your infrastructure.
|
|
</p>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|