feat: rebrand user-facing strings from ashim to SnapOtter

This commit is contained in:
ashim-hq
2026-04-24 14:47:17 +08:00
parent a57e84ab28
commit d299aa8a72
11 changed files with 26 additions and 26 deletions
+2 -2
View File
@@ -3,12 +3,12 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ashim</title>
<title>SnapOtter</title>
<meta name="description" content="Open-source, self-hosted image processing platform" />
<meta name="theme-color" content="#3b82f6" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="manifest" href="/manifest.json" />
<meta property="og:title" content="ashim" />
<meta property="og:title" content="SnapOtter" />
<meta property="og:description" content="Open-source, self-hosted image processing platform" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/og-image.png" />
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "ashim",
"short_name": "ashim",
"name": "SnapOtter",
"short_name": "SnapOtter",
"icons": [
{ "src": "/logo-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/logo-512.png", "sizes": "512x512", "type": "image/png" }
+1 -1
View File
@@ -78,7 +78,7 @@ export function Dropzone({
>
<div className={cn("flex flex-col items-center", compact ? "gap-2 p-4" : "gap-4 p-8")}>
<div className="text-3xl font-bold text-muted-foreground/30">
<span className="text-primary/30">ashim</span>
<span className="text-primary/30">SnapOtter</span>
</div>
<button
type="button"
+1 -1
View File
@@ -139,7 +139,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
{/* Version */}
<div className="text-xs text-muted-foreground pt-2 border-t border-border">
ashim v{APP_VERSION}
SnapOtter v{APP_VERSION}
</div>
</div>
</div>
@@ -70,7 +70,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2">
<OtterLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground">
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</span>
</div>
)}
@@ -123,7 +123,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2">
<OtterLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground">
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</span>
</div>
)}
@@ -303,7 +303,7 @@ function GeneralSection() {
</SettingRow>
{/* Version */}
<SettingRow label="App Version" description="Current version of ashim">
<SettingRow label="App Version" description="Current version of SnapOtter">
<span className="text-sm font-mono text-muted-foreground">{APP_VERSION}</span>
</SettingRow>
@@ -348,7 +348,7 @@ function SystemSection() {
.catch(() => {
// Fallback defaults if endpoint not ready
setSettings({
appName: "ashim",
appName: "SnapOtter",
fileUploadLimitMb: "100",
defaultTheme: "system",
defaultLocale: "en",
@@ -1314,7 +1314,7 @@ function ApiKeysSection() {
<div>
<h3 className="text-lg font-semibold text-foreground">API Keys</h3>
<p className="text-sm text-muted-foreground mt-1">
Manage API keys for programmatic access to ashim.
Manage API keys for programmatic access to SnapOtter.
</p>
</div>
@@ -2456,7 +2456,7 @@ function AnalyticsSection() {
<div>
<h3 className="text-sm font-medium text-foreground">Product Analytics</h3>
<p className="text-xs text-muted-foreground mt-1">
Share anonymous usage data to help improve ashim.
Share anonymous usage data to help improve SnapOtter.
</p>
<p className="text-xs text-muted-foreground">Your images never leave your machine.</p>
</div>
@@ -2513,7 +2513,7 @@ function AboutSection() {
<div className="flex items-center gap-3">
<OtterLogo className="h-8 w-8 text-primary" />
<div className="text-2xl font-bold text-foreground">
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</div>
</div>
<p className="text-sm text-muted-foreground">
@@ -129,7 +129,7 @@ function UploadArea() {
>
<div className="flex flex-col items-center gap-4 p-8">
<div className="text-3xl font-bold text-muted-foreground/30">
<span className="text-primary/30">ashim</span>
<span className="text-primary/30">SnapOtter</span>
</div>
<button
type="button"
+1 -1
View File
@@ -115,7 +115,7 @@ export function ChangePasswordPage() {
<div className="w-full max-w-md space-y-8">
<div>
<h1 className="text-3xl font-bold text-foreground">
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</h1>
<h2 className="text-2xl font-bold mt-4 text-foreground">Change your password</h2>
<p className="text-sm text-muted-foreground mt-2">
+1 -1
View File
@@ -85,7 +85,7 @@ export function FullscreenGridPage() {
className="flex items-center gap-2 text-lg font-bold text-foreground shrink-0"
>
<OtterLogo className="h-6 w-6 text-primary" />
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</Link>
{/* Search */}
+1 -1
View File
@@ -45,7 +45,7 @@ export function LoginPage() {
<div className="w-full max-w-md space-y-8">
<div>
<h1 className="text-3xl font-bold text-foreground">
<span className="text-primary">ashim</span>
<span className="text-primary">SnapOtter</span>
</h1>
<h2 className="text-2xl font-bold mt-4 text-foreground">Login</h2>
</div>
+9 -9
View File
@@ -20,7 +20,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Overview</h2>
<p>
ashim is a self-hosted, open-source image processing application. Your instance is
SnapOtter is a self-hosted, open-source image processing application. Your instance is
operated and controlled entirely by whoever deployed it. This policy describes how the
software itself handles your data.
</p>
@@ -29,7 +29,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Local Processing</h2>
<p>
All image processing happens entirely on the server where ashim is deployed. Your
All image processing happens entirely on the server where SnapOtter is deployed. Your
images are never sent to external services or third-party APIs. When you upload an
image for processing, it is handled in memory or in temporary storage on the host
machine and is not retained after the operation completes.
@@ -39,8 +39,8 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Product Analytics</h2>
<p>
ashim includes optional, anonymous product analytics. When you choose to participate,
the following is collected:
SnapOtter includes optional, anonymous product analytics. When you choose to
participate, the following is collected:
</p>
<ul className="list-disc pl-5 mt-2 space-y-1">
<li>Which tools you use (e.g., "crop tool used")</li>
@@ -109,17 +109,17 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Open Source</h2>
<p>
ashim 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.
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 ashim 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.
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>