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> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <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="description" content="Open-source, self-hosted image processing platform" />
<meta name="theme-color" content="#3b82f6" /> <meta name="theme-color" content="#3b82f6" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="manifest" href="/manifest.json" /> <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:description" content="Open-source, self-hosted image processing platform" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:image" content="/og-image.png" /> <meta property="og:image" content="/og-image.png" />
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "ashim", "name": "SnapOtter",
"short_name": "ashim", "short_name": "SnapOtter",
"icons": [ "icons": [
{ "src": "/logo-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/logo-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/logo-512.png", "sizes": "512x512", "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={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"> <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> </div>
<button <button
type="button" type="button"
+1 -1
View File
@@ -139,7 +139,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
{/* Version */} {/* Version */}
<div className="text-xs text-muted-foreground pt-2 border-t border-border"> <div className="text-xs text-muted-foreground pt-2 border-t border-border">
ashim v{APP_VERSION} SnapOtter v{APP_VERSION}
</div> </div>
</div> </div>
</div> </div>
@@ -70,7 +70,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<OtterLogo className="h-5 w-5 text-primary" /> <OtterLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground"> <span className="text-sm font-bold text-foreground">
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</span> </span>
</div> </div>
)} )}
@@ -123,7 +123,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<OtterLogo className="h-5 w-5 text-primary" /> <OtterLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground"> <span className="text-sm font-bold text-foreground">
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</span> </span>
</div> </div>
)} )}
@@ -303,7 +303,7 @@ function GeneralSection() {
</SettingRow> </SettingRow>
{/* Version */} {/* 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> <span className="text-sm font-mono text-muted-foreground">{APP_VERSION}</span>
</SettingRow> </SettingRow>
@@ -348,7 +348,7 @@ function SystemSection() {
.catch(() => { .catch(() => {
// Fallback defaults if endpoint not ready // Fallback defaults if endpoint not ready
setSettings({ setSettings({
appName: "ashim", appName: "SnapOtter",
fileUploadLimitMb: "100", fileUploadLimitMb: "100",
defaultTheme: "system", defaultTheme: "system",
defaultLocale: "en", defaultLocale: "en",
@@ -1314,7 +1314,7 @@ function ApiKeysSection() {
<div> <div>
<h3 className="text-lg font-semibold text-foreground">API Keys</h3> <h3 className="text-lg font-semibold text-foreground">API Keys</h3>
<p className="text-sm text-muted-foreground mt-1"> <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> </p>
</div> </div>
@@ -2456,7 +2456,7 @@ function AnalyticsSection() {
<div> <div>
<h3 className="text-sm font-medium text-foreground">Product Analytics</h3> <h3 className="text-sm font-medium text-foreground">Product Analytics</h3>
<p className="text-xs text-muted-foreground mt-1"> <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>
<p className="text-xs text-muted-foreground">Your images never leave your machine.</p> <p className="text-xs text-muted-foreground">Your images never leave your machine.</p>
</div> </div>
@@ -2513,7 +2513,7 @@ function AboutSection() {
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<OtterLogo className="h-8 w-8 text-primary" /> <OtterLogo className="h-8 w-8 text-primary" />
<div className="text-2xl font-bold text-foreground"> <div className="text-2xl font-bold text-foreground">
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</div> </div>
</div> </div>
<p className="text-sm text-muted-foreground"> <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="flex flex-col items-center gap-4 p-8">
<div className="text-3xl font-bold text-muted-foreground/30"> <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> </div>
<button <button
type="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 className="w-full max-w-md space-y-8">
<div> <div>
<h1 className="text-3xl font-bold text-foreground"> <h1 className="text-3xl font-bold text-foreground">
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</h1> </h1>
<h2 className="text-2xl font-bold mt-4 text-foreground">Change your password</h2> <h2 className="text-2xl font-bold mt-4 text-foreground">Change your password</h2>
<p className="text-sm text-muted-foreground mt-2"> <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" className="flex items-center gap-2 text-lg font-bold text-foreground shrink-0"
> >
<OtterLogo className="h-6 w-6 text-primary" /> <OtterLogo className="h-6 w-6 text-primary" />
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</Link> </Link>
{/* Search */} {/* Search */}
+1 -1
View File
@@ -45,7 +45,7 @@ export function LoginPage() {
<div className="w-full max-w-md space-y-8"> <div className="w-full max-w-md space-y-8">
<div> <div>
<h1 className="text-3xl font-bold text-foreground"> <h1 className="text-3xl font-bold text-foreground">
<span className="text-primary">ashim</span> <span className="text-primary">SnapOtter</span>
</h1> </h1>
<h2 className="text-2xl font-bold mt-4 text-foreground">Login</h2> <h2 className="text-2xl font-bold mt-4 text-foreground">Login</h2>
</div> </div>
+9 -9
View File
@@ -20,7 +20,7 @@ export function PrivacyPolicyPage() {
<section> <section>
<h2 className="text-lg font-semibold text-foreground mb-2">Overview</h2> <h2 className="text-lg font-semibold text-foreground mb-2">Overview</h2>
<p> <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 operated and controlled entirely by whoever deployed it. This policy describes how the
software itself handles your data. software itself handles your data.
</p> </p>
@@ -29,7 +29,7 @@ export function PrivacyPolicyPage() {
<section> <section>
<h2 className="text-lg font-semibold text-foreground mb-2">Local Processing</h2> <h2 className="text-lg font-semibold text-foreground mb-2">Local Processing</h2>
<p> <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 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 image for processing, it is handled in memory or in temporary storage on the host
machine and is not retained after the operation completes. machine and is not retained after the operation completes.
@@ -39,8 +39,8 @@ export function PrivacyPolicyPage() {
<section> <section>
<h2 className="text-lg font-semibold text-foreground mb-2">Product Analytics</h2> <h2 className="text-lg font-semibold text-foreground mb-2">Product Analytics</h2>
<p> <p>
ashim includes optional, anonymous product analytics. When you choose to participate, SnapOtter includes optional, anonymous product analytics. When you choose to
the following is collected: participate, the following is collected:
</p> </p>
<ul className="list-disc pl-5 mt-2 space-y-1"> <ul className="list-disc pl-5 mt-2 space-y-1">
<li>Which tools you use (e.g., "crop tool used")</li> <li>Which tools you use (e.g., "crop tool used")</li>
@@ -109,17 +109,17 @@ export function PrivacyPolicyPage() {
<section> <section>
<h2 className="text-lg font-semibold text-foreground mb-2">Open Source</h2> <h2 className="text-lg font-semibold text-foreground mb-2">Open Source</h2>
<p> <p>
ashim is fully open source. You can audit the source code to verify these claims at SnapOtter is fully open source. You can audit the source code to verify these claims
any time. Transparency is a core principle of this project. at any time. Transparency is a core principle of this project.
</p> </p>
</section> </section>
<section> <section>
<h2 className="text-lg font-semibold text-foreground mb-2">Your Control</h2> <h2 className="text-lg font-semibold text-foreground mb-2">Your Control</h2>
<p> <p>
Because ashim is self-hosted, the instance operator has full control over all data. Because SnapOtter is self-hosted, the instance operator has full control over all
You can delete your data at any time by removing files from the server or deleting the data. You can delete your data at any time by removing files from the server or
database. No data exists outside of your infrastructure. deleting the database. No data exists outside of your infrastructure.
</p> </p>
</section> </section>
</div> </div>