chore: rename Stirling-Image to ashim across entire codebase

Complete rebrand from Stirling-Image to ashim following the project
move to https://github.com/ashim-hq/ashim.

Changes across 117 files:
- Package scope: @stirling-image/* → @ashim/*
- GitHub URLs: stirling-image/stirling-image → ashim-hq/ashim
- Docker Hub: stirlingimage/stirling-image → ashimhq/ashim
- GitHub Pages: stirling-image.github.io → ashim-hq.github.io
- All branding text: "Stirling Image" → "ashim"
- Docker service/volumes/user: stirling → ashim
- Database: stirling.db → ashim.db
- localStorage keys: stirling-token → ashim-token
- Environment variables: STIRLING_GPU → ASHIM_GPU
- Python cache dirs: .cache/stirling-image → .cache/ashim
- SVG filter IDs, test prefixes, and all other references
This commit is contained in:
Siddharth Kumar Sah 2026-04-14 20:55:42 +08:00
parent da4411330f
commit 85b1cfc10a
117 changed files with 710 additions and 713 deletions

View file

@ -14,9 +14,9 @@ MAX_MEGAPIXELS=100
RATE_LIMIT_PER_MIN=100
# Set to true in CI/dev to skip the forced password-change on the default admin
# SKIP_MUST_CHANGE_PASSWORD=false
DB_PATH=./data/stirling.db
DB_PATH=./data/ashim.db
WORKSPACE_PATH=./tmp/workspace
FILES_STORAGE_PATH=./data/files
DEFAULT_THEME=light
DEFAULT_LOCALE=en
APP_NAME=Stirling Image
APP_NAME=ashim

4
.github/FUNDING.yml vendored
View file

@ -1,2 +1,2 @@
github: stirling-image
ko_fi: stirling-image
github: ashim-hq
ko_fi: ashim-hq

View file

@ -9,7 +9,7 @@ body:
options:
- label: I searched existing issues and didn't find a duplicate
required: true
- label: I'm running the latest version of Stirling Image
- label: I'm running the latest version of ashim
required: true
- type: textarea

View file

@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Documentation
url: https://stirling-image.github.io/stirling-image/
url: https://ashim-hq.github.io/ashim/
about: Check the docs for setup guides, configuration, and API reference.
- name: Security vulnerability
url: https://github.com/stirling-image/stirling-image/security/advisories/new
url: https://github.com/ashim-hq/ashim/security/advisories/new
about: Report security issues privately through GitHub Security Advisories.

View file

@ -1,12 +1,12 @@
<!--
Thanks for your interest in Stirling Image.
Thanks for your interest in ashim.
We don't accept pull requests. All development is handled internally to maintain architectural consistency and code quality.
If you've found a bug or have a feature idea, please open an issue instead:
https://github.com/stirling-image/stirling-image/issues
https://github.com/ashim-hq/ashim/issues
Your feedback is valuable and directly shapes the project.
-->
**This project does not accept pull requests.** Please close this PR and [open an issue](https://github.com/stirling-image/stirling-image/issues/new/choose) instead. See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
**This project does not accept pull requests.** Please close this PR and [open an issue](https://github.com/ashim-hq/ashim/issues/new/choose) instead. See [CONTRIBUTING.md](CONTRIBUTING.md) for details.

View file

@ -92,6 +92,6 @@ jobs:
context: .
file: docker/Dockerfile
push: false
tags: stirling-image:ci
tags: ashim:ci
cache-from: type=gha,scope=unified
cache-to: type=gha,mode=max,scope=unified

View file

@ -35,7 +35,7 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Docs
run: pnpm --filter @stirling-image/docs docs:build
run: pnpm --filter @ashim/docs docs:build
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:

View file

@ -100,7 +100,7 @@ jobs:
uses: docker/metadata-action@v5
with:
images: |
stirlingimage/stirling-image
ashimhq/ashim
ghcr.io/${{ github.repository }}
- name: Build and push by digest
@ -111,7 +111,7 @@ jobs:
file: docker/Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,"name=stirlingimage/stirling-image,ghcr.io/${{ github.repository }}",push-by-digest=true,name-canonical=true,push=true
outputs: type=image,"name=ashimhq/ashim,ghcr.io/${{ github.repository }}",push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=${{ env.PLATFORM_PAIR }}
cache-to: type=gha,mode=max,scope=${{ env.PLATFORM_PAIR }}
@ -159,7 +159,7 @@ jobs:
uses: docker/metadata-action@v5
with:
images: |
stirlingimage/stirling-image
ashimhq/ashim
ghcr.io/${{ github.repository }}
tags: |
type=semver,pattern={{version}},value=v${{ needs.release.outputs.new_version }}
@ -171,8 +171,8 @@ jobs:
working-directory: /tmp/digests
run: |
docker buildx imagetools create \
$(jq -cr '.tags | map(select(startswith("stirlingimage/")) | "-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf 'stirlingimage/stirling-image@sha256:%s ' *)
$(jq -cr '.tags | map(select(startswith("ashimhq/")) | "-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf 'ashimhq/ashim@sha256:%s ' *)
- name: Create GHCR manifest
working-directory: /tmp/digests

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
# Contributing to Stirling Image
# Contributing to ashim
Thanks for your interest in the project. Community feedback helps shape Stirling Image, and there are several ways to get involved.
Thanks for your interest in the project. Community feedback helps shape ashim, and there are several ways to get involved.
## How to contribute
The best way to contribute is through [GitHub Issues](https://github.com/stirling-image/stirling-image/issues):
The best way to contribute is through [GitHub Issues](https://github.com/ashim-hq/ashim/issues):
- **Bug reports** - Found something broken? Open a bug report with steps to reproduce, your Docker setup, and what you expected to happen.
- **Feature requests** - Have an idea for a new tool or improvement? Describe the problem you want solved and why it matters to you.
@ -18,8 +18,8 @@ If you've found a bug, please open an issue describing it rather than submitting
## Forking
You're welcome to fork the project for your own use under the terms of the [AGPLv3 license](LICENSE). The [Developer Guide](https://stirling-image.github.io/stirling-image/guide/developer) covers setup, architecture, and how to add new tools.
You're welcome to fork the project for your own use under the terms of the [AGPLv3 license](LICENSE). The [Developer Guide](https://ashim-hq.github.io/ashim/guide/developer) covers setup, architecture, and how to add new tools.
## Security
If you discover a security vulnerability, please report it privately through [GitHub Security Advisories](https://github.com/stirling-image/stirling-image/security/advisories/new) rather than opening a public issue.
If you discover a security vulnerability, please report it privately through [GitHub Security Advisories](https://github.com/ashim-hq/ashim/security/advisories/new) rather than opening a public issue.

View file

@ -1,4 +1,4 @@
Stirling Image
ashim
Copyright (C) 2025-present Siddharth Kumar Sah
This software is dual-licensed:

View file

@ -1,27 +1,26 @@
<blockquote>
<p align="center">
<strong>We're renaming!</strong> The Stirling PDF team asked us to pick a new name, and we want you to choose it.<br>
<a href="https://github.com/stirling-image/stirling-image/discussions/8?sort=top">Vote on the new name &rarr;</a><br>
<sub>Voting closes April 10, 2026</sub>
<strong>We've renamed!</strong> Formerly Stirling Image, now <strong>ashim</strong>.<br>
<a href="https://github.com/ashim-hq/ashim">github.com/ashim-hq/ashim</a>
</p>
</blockquote>
<p align="center">
<img src="apps/web/public/logo-192.png" width="80" alt="Stirling Image logo">
<img src="apps/web/public/logo-192.png" width="80" alt="ashim logo">
</p>
<h1 align="center">Stirling Image</h1>
<h1 align="center">ashim</h1>
<p align="center">Stirling-PDF but for images. 30+ tools and local AI in a single Docker container.</p>
<p align="center">ashim but for images. 30+ tools and local AI in a single Docker container.</p>
<p align="center">
<a href="https://hub.docker.com/r/stirlingimage/stirling-image"><img src="https://img.shields.io/badge/Docker-Hub-blue?logo=docker" alt="Docker"></a>
<a href="https://github.com/stirling-image/stirling-image/actions"><img src="https://img.shields.io/github/actions/workflow/status/stirling-image/stirling-image/ci.yml?label=CI" alt="CI"></a>
<a href="https://github.com/stirling-image/stirling-image/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-AGPLv3-blue" alt="License"></a>
<a href="https://github.com/stirling-image/stirling-image/stargazers"><img src="https://img.shields.io/github/stars/stirling-image/stirling-image?style=social" alt="Stars"></a>
<a href="https://hub.docker.com/r/ashimhq/ashim"><img src="https://img.shields.io/badge/Docker-Hub-blue?logo=docker" alt="Docker"></a>
<a href="https://github.com/ashim-hq/ashim/actions"><img src="https://img.shields.io/github/actions/workflow/status/ashim-hq/ashim/ci.yml?label=CI" alt="CI"></a>
<a href="https://github.com/ashim-hq/ashim/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-AGPLv3-blue" alt="License"></a>
<a href="https://github.com/ashim-hq/ashim/stargazers"><img src="https://img.shields.io/github/stars/ashim-hq/ashim?style=social" alt="Stars"></a>
</p>
![Stirling Image - Dashboard](images/dashboard.png)
![ashim - Dashboard](images/dashboard.png)
## Key Features
@ -36,7 +35,7 @@
## Quick Start
```bash
docker run -d -p 1349:1349 -v stirling-data:/data stirlingimage/stirling-image:latest
docker run -d -p 1349:1349 -v ashim-data:/data ashimhq/ashim:latest
```
Open http://localhost:1349 in your browser.
@ -48,10 +47,10 @@ Open http://localhost:1349 in your browser.
Add `--gpus all` for GPU-accelerated background removal, upscaling, and OCR:
```bash
docker run -d -p 1349:1349 --gpus all -v stirling-data:/data stirlingimage/stirling-image:latest
docker run -d -p 1349:1349 --gpus all -v ashim-data:/data ashimhq/ashim:latest
```
> Requires an NVIDIA GPU and [Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html). Falls back to CPU if no GPU is found. See [Docker Tags](https://stirling-image.github.io/stirling-image/guide/docker-tags) for benchmarks and Docker Compose examples.
> Requires an NVIDIA GPU and [Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html). Falls back to CPU if no GPU is found. See [Docker Tags](https://ashim-hq.github.io/ashim/guide/docker-tags) for benchmarks and Docker Compose examples.
</details>
@ -64,20 +63,20 @@ docker run -d -p 1349:1349 --gpus all -v stirling-data:/data stirlingimage/stirl
You will be asked to change your password on first login. This is enforced for all new accounts and cannot be skipped in production.
For Docker Compose, persistent storage, and other setup options, see the [Getting Started Guide](https://stirling-image.github.io/stirling-image/guide/getting-started). For GPU acceleration and tag details, see [Docker Tags](https://stirling-image.github.io/stirling-image/guide/docker-tags).
For Docker Compose, persistent storage, and other setup options, see the [Getting Started Guide](https://ashim-hq.github.io/ashim/guide/getting-started). For GPU acceleration and tag details, see [Docker Tags](https://ashim-hq.github.io/ashim/guide/docker-tags).
## Documentation
- [Getting Started](https://stirling-image.github.io/stirling-image/guide/getting-started)
- [Configuration](https://stirling-image.github.io/stirling-image/guide/configuration)
- [REST API](https://stirling-image.github.io/stirling-image/api/rest)
- [Architecture](https://stirling-image.github.io/stirling-image/guide/architecture)
- [Developer Guide](https://stirling-image.github.io/stirling-image/guide/developer)
- [Translation Guide](https://stirling-image.github.io/stirling-image/guide/translations)
- [Getting Started](https://ashim-hq.github.io/ashim/guide/getting-started)
- [Configuration](https://ashim-hq.github.io/ashim/guide/configuration)
- [REST API](https://ashim-hq.github.io/ashim/api/rest)
- [Architecture](https://ashim-hq.github.io/ashim/guide/architecture)
- [Developer Guide](https://ashim-hq.github.io/ashim/guide/developer)
- [Translation Guide](https://ashim-hq.github.io/ashim/guide/translations)
## Feedback
Found a bug or have a feature idea? Open a [GitHub Issue](https://github.com/stirling-image/stirling-image/issues). We don't accept pull requests, but your feedback directly shapes the project. See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
Found a bug or have a feature idea? Open a [GitHub Issue](https://github.com/ashim-hq/ashim/issues). We don't accept pull requests, but your feedback directly shapes the project. See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
<!-- TODO: Add sponsorship links once Ko-fi and GitHub Sponsors are set up -->
@ -86,4 +85,4 @@ Found a bug or have a feature idea? Open a [GitHub Issue](https://github.com/sti
This project is dual-licensed under the [AGPLv3](LICENSE) and a commercial license.
- **AGPLv3 (free):** You may use, modify, and distribute this software under the AGPLv3. If you run a modified version as a network service, you must make your source code available under the AGPLv3. This applies to personal use, open-source projects, and any use that complies with AGPLv3 terms.
- **Commercial license (paid):** If you want to use Stirling Image in proprietary software or SaaS without the AGPLv3 source-disclosure requirement, a commercial license is available. Contact me for pricing and terms.
- **Commercial license (paid):** If you want to use ashim in proprietary software or SaaS without the AGPLv3 source-disclosure requirement, a commercial license is available. Contact me for pricing and terms.

View file

@ -5,6 +5,6 @@ export default defineConfig({
out: "./drizzle",
dialect: "sqlite",
dbCredentials: {
url: process.env.DB_PATH || "./data/stirling.db",
url: process.env.DB_PATH || "./data/ashim.db",
},
});

View file

@ -1,5 +1,5 @@
{
"name": "@stirling-image/api",
"name": "@ashim/api",
"version": "1.14.0",
"private": true,
"type": "module",
@ -18,9 +18,9 @@
"@fastify/static": "^8.1.0",
"@neplex/vectorizer": "^0.0.5",
"@scalar/fastify-api-reference": "^1.49.5",
"@stirling-image/ai": "workspace:*",
"@stirling-image/image-engine": "workspace:*",
"@stirling-image/shared": "workspace:*",
"@ashim/ai": "workspace:*",
"@ashim/image-engine": "workspace:*",
"@ashim/shared": "workspace:*",
"archiver": "^7.0.1",
"better-sqlite3": "^11.7.0",
"dotenv": "^16.4.0",

View file

@ -1,7 +1,7 @@
import cors from "@fastify/cors";
import rateLimit from "@fastify/rate-limit";
import { isGpuAvailable } from "@stirling-image/ai";
import { APP_VERSION } from "@stirling-image/shared";
import { isGpuAvailable } from "@ashim/ai";
import { APP_VERSION } from "@ashim/shared";
import Fastify from "fastify";
import { env } from "./config.js";
import { db, schema } from "./db/index.js";
@ -165,7 +165,7 @@ const cleanupCron = startCleanupCron();
// Start
try {
await app.listen({ port: env.PORT, host: "0.0.0.0" });
console.log(`Stirling Image API running on port ${env.PORT}`);
console.log(`ashim API running on port ${env.PORT}`);
} catch (err) {
app.log.error(err);
process.exit(1);
@ -202,7 +202,7 @@ async function shutdown(signal: string) {
}
try {
const { shutdownDispatcher } = await import("@stirling-image/ai");
const { shutdownDispatcher } = await import("@ashim/ai");
shutdownDispatcher();
console.log("Python dispatcher shut down");
} catch {

View file

@ -20,12 +20,12 @@ const envSchema = z.object({
CONCURRENT_JOBS: z.coerce.number().default(3),
MAX_MEGAPIXELS: z.coerce.number().default(100),
RATE_LIMIT_PER_MIN: z.coerce.number().default(100),
DB_PATH: z.string().default("./data/stirling.db"),
DB_PATH: z.string().default("./data/ashim.db"),
FILES_STORAGE_PATH: z.string().default("./data/files"),
WORKSPACE_PATH: z.string().default("./tmp/workspace"),
DEFAULT_THEME: z.enum(["light", "dark"]).default("light"),
DEFAULT_LOCALE: z.string().default("en"),
APP_NAME: z.string().default("Stirling Image"),
APP_NAME: z.string().default("ashim"),
CORS_ORIGIN: z.string().default(""),
MAX_USERS: z.coerce.number().default(5),
LOG_LEVEL: z.enum(["fatal", "error", "warn", "info", "debug", "trace"]).default("info"),

View file

@ -1,9 +1,9 @@
openapi: 3.1.0
info:
title: Stirling Image API
title: ashim API
version: 0.9.0
description: |
REST API for Stirling Image, a self-hosted image processing platform with 30+ tools.
REST API for ashim, a self-hosted image processing platform with 30+ tools.
## Authentication
@ -16,7 +16,7 @@ info:
Endpoints marked with a lock icon require authentication. Admin-only endpoints are noted in their description.
license:
name: AGPL-3.0
url: https://github.com/stirling-image/stirling-image/blob/main/LICENSE
url: https://github.com/ashim-hq/ashim/blob/main/LICENSE
servers:
- url: /

View file

@ -1,4 +1,4 @@
import type { Permission, Role } from "@stirling-image/shared";
import type { Permission, Role } from "@ashim/shared";
import type { FastifyReply, FastifyRequest } from "fastify";
import { getAuthUser } from "./plugins/auth.js";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { blurFaces } from "@stirling-image/ai";
import { blurFaces } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -7,7 +7,7 @@ import {
grayscale,
invert,
sepia,
} from "@stirling-image/image-engine";
} from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { colorize } from "@stirling-image/ai";
import { colorize } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,4 +1,4 @@
import { compress } from "@stirling-image/image-engine";
import { compress } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { seamCarve } from "@stirling-image/ai";
import { seamCarve } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -1,5 +1,5 @@
import { extname } from "node:path";
import { convert } from "@stirling-image/image-engine";
import { convert } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,4 +1,4 @@
import { crop } from "@stirling-image/image-engine";
import { crop } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { enhanceFaces } from "@stirling-image/ai";
import { enhanceFaces } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { inpaint } from "@stirling-image/ai";
import { inpaint } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -1,4 +1,4 @@
import { analyzeImage, applyCorrections } from "@stirling-image/image-engine";
import { analyzeImage, applyCorrections } from "@ashim/image-engine";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,4 +1,4 @@
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import { eq } from "drizzle-orm";
import type { FastifyInstance } from "fastify";
import { db, schema } from "../../db/index.js";

View file

@ -1,6 +1,6 @@
import { randomUUID } from "node:crypto";
import { join } from "node:path";
import { noiseRemoval } from "@stirling-image/ai";
import { noiseRemoval } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -1,6 +1,6 @@
import { randomUUID } from "node:crypto";
import { basename } from "node:path";
import { extractText } from "@stirling-image/ai";
import { extractText } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { validateImageBuffer } from "../../lib/file-validation.js";

View file

@ -1,5 +1,5 @@
import { extname } from "node:path";
import { optimizeForWeb } from "@stirling-image/image-engine";
import { optimizeForWeb } from "@ashim/image-engine";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,8 +1,8 @@
import { randomUUID } from "node:crypto";
import { readFile, writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { detectFaceLandmarks, removeBackground } from "@stirling-image/ai";
import { PASSPORT_SPECS, PRINT_LAYOUTS } from "@stirling-image/shared";
import { detectFaceLandmarks, removeBackground } from "@ashim/ai";
import { PASSPORT_SPECS, PRINT_LAYOUTS } from "@ashim/shared";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { removeRedEye } from "@stirling-image/ai";
import { removeRedEye } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { readFile, writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { removeBackground } from "@stirling-image/ai";
import { removeBackground } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";
import { autoOrient } from "../../lib/auto-orient.js";

View file

@ -1,4 +1,4 @@
import { resize } from "@stirling-image/image-engine";
import { resize } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { restorePhoto } from "@stirling-image/ai";
import { restorePhoto } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,4 +1,4 @@
import { flip, rotate } from "@stirling-image/image-engine";
import { flip, rotate } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,4 +1,4 @@
import { sharpenAdvanced } from "@stirling-image/image-engine";
import { sharpenAdvanced } from "@ashim/image-engine";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,5 +1,5 @@
import { detectFaces } from "@stirling-image/ai";
import { SMART_CROP_FACE_PRESETS } from "@stirling-image/shared";
import { detectFaces } from "@ashim/ai";
import { SMART_CROP_FACE_PRESETS } from "@ashim/shared";
import type { FastifyInstance } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,5 +1,5 @@
import { basename } from "node:path";
import { parseExif, parseGps, parseXmp, stripMetadata } from "@stirling-image/image-engine";
import { parseExif, parseGps, parseXmp, stripMetadata } from "@ashim/image-engine";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -1,7 +1,7 @@
import { randomUUID } from "node:crypto";
import { writeFile } from "node:fs/promises";
import { basename, join } from "node:path";
import { upscale } from "@stirling-image/ai";
import { upscale } from "@ashim/ai";
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import sharp from "sharp";
import { z } from "zod";

View file

@ -2,23 +2,23 @@ import { defineConfig } from "vitepress";
import llmstxt from "vitepress-plugin-llms";
export default defineConfig({
title: "Stirling Image",
description: "Documentation for Stirling Image, a self-hosted image processing suite.",
base: "/stirling-image/",
title: "ashim",
description: "Documentation for ashim, a self-hosted image processing suite.",
base: "/ashim/",
srcDir: ".",
outDir: "./.vitepress/dist",
ignoreDeadLinks: [/localhost/],
head: [
["meta", { name: "theme-color", content: "#3b82f6" }],
["link", { rel: "icon", type: "image/svg+xml", href: "/stirling-image/favicon.svg" }],
["link", { rel: "llms-txt", href: "/stirling-image/llms.txt" }],
["link", { rel: "icon", type: "image/svg+xml", href: "/ashim/favicon.svg" }],
["link", { rel: "llms-txt", href: "/ashim/llms.txt" }],
],
vite: {
plugins: [
llmstxt({
domain: "https://stirling-image.github.io",
domain: "https://ashim-hq.github.io",
customLLMsTxtTemplate: `# {title}
{description}
@ -41,7 +41,7 @@ export default defineConfig({
## Source
- [GitHub](https://github.com/stirling-image/stirling-image)
- [GitHub](https://github.com/ashim-hq/ashim)
- License: AGPLv3 (commercial license also available)
`,
customTemplateVariables: {
@ -93,13 +93,13 @@ export default defineConfig({
footer: {
message:
'Released under the <a href="https://github.com/stirling-image/stirling-image/blob/main/LICENSE">AGPLv3 License</a>.',
'Released under the <a href="https://github.com/ashim-hq/ashim/blob/main/LICENSE">AGPLv3 License</a>.',
copyright:
'AI-friendly docs available at <a href="/stirling-image/llms.txt">/llms.txt</a> · <a href="/stirling-image/llms-full.txt">/llms-full.txt</a>',
'AI-friendly docs available at <a href="/ashim/llms.txt">/llms.txt</a> · <a href="/ashim/llms-full.txt">/llms-full.txt</a>',
},
editLink: {
pattern: "https://github.com/stirling-image/stirling-image/edit/main/apps/docs/:path",
pattern: "https://github.com/ashim-hq/ashim/edit/main/apps/docs/:path",
text: "Edit this page on GitHub",
},
},

View file

@ -2,11 +2,11 @@
import { onMounted, ref } from "vue";
const stars = ref<string | null>(null);
const repo = "https://github.com/stirling-image/stirling-image";
const repo = "https://github.com/ashim-hq/ashim";
onMounted(async () => {
try {
const res = await fetch("https://api.github.com/repos/stirling-image/stirling-image");
const res = await fetch("https://api.github.com/repos/ashim-hq/ashim");
if (!res.ok) return;
const data = await res.json();
const count = data.stargazers_count;

View file

@ -1,6 +1,6 @@
# AI engine
The `@stirling-image/ai` package wraps Python ML models in TypeScript functions. A persistent Python dispatcher process pre-imports heavy ML libraries at startup and keeps them warm in memory, eliminating the cold-start latency that would otherwise occur on every request. If the dispatcher is unavailable, the bridge falls back to spawning a fresh subprocess per call.
The `@ashim/ai` package wraps Python ML models in TypeScript functions. A persistent Python dispatcher process pre-imports heavy ML libraries at startup and keeps them warm in memory, eliminating the cold-start latency that would otherwise occur on every request. If the dispatcher is unavailable, the bridge falls back to spawning a fresh subprocess per call.
All model weights are bundled in the Docker image during the build. No downloads happen at runtime.

View file

@ -1,6 +1,6 @@
# Image engine
The `@stirling-image/image-engine` package handles all non-AI image operations. It wraps [Sharp](https://sharp.pixelplumbing.com/) and runs entirely in-process with no external dependencies.
The `@ashim/image-engine` package handles all non-AI image operations. It wraps [Sharp](https://sharp.pixelplumbing.com/) and runs entirely in-process with no external dependencies.
## Operations

View file

@ -3,7 +3,7 @@
The API server runs on port 1349 by default and serves all endpoints under `/api`.
::: tip Full API Reference
Your Stirling Image instance includes a complete interactive API reference at `/api/docs` (e.g. `http://your-host:1349/api/docs`) with all 80+ endpoints, request/response schemas, and examples.
Your ashim instance includes a complete interactive API reference at `/api/docs` (e.g. `http://your-host:1349/api/docs`) with all 80+ endpoints, request/response schemas, and examples.
:::
::: info LLM-friendly docs

View file

@ -1,11 +1,11 @@
# Architecture
Stirling Image is a monorepo managed with pnpm workspaces and Turborepo. Everything ships as a single Docker container.
ashim is a monorepo managed with pnpm workspaces and Turborepo. Everything ships as a single Docker container.
## Project structure
```
Stirling-Image/
ashim/
├── apps/
│ ├── api/ # Fastify backend
│ ├── web/ # React + Vite frontend
@ -19,13 +19,13 @@ Stirling-Image/
## Packages
### `@stirling-image/image-engine`
### `@ashim/image-engine`
The core image processing library built on [Sharp](https://sharp.pixelplumbing.com/). It handles all non-AI operations: resize, crop, rotate, flip, convert, compress, strip metadata, and color adjustments (brightness, contrast, saturation, grayscale, sepia, invert, color channels).
This package has no network dependencies and runs entirely in-process.
### `@stirling-image/ai`
### `@ashim/ai`
A bridge layer that calls Python scripts for ML operations. On first use, the bridge starts a persistent Python dispatcher process that pre-imports heavy libraries (rembg, OpenCV, NumPy) and keeps them warm in memory. Subsequent AI calls skip the import overhead entirely. If the dispatcher is unavailable, the bridge falls back to spawning a fresh Python subprocess per request.
@ -38,7 +38,7 @@ Supported operations:
Python scripts live in `packages/ai/python/`. The Docker image pre-downloads all model weights during the build so the container works offline.
### `@stirling-image/shared`
### `@ashim/shared`
Shared TypeScript types, constants (like `APP_VERSION` and tool definitions), and i18n translation strings used by both the frontend and backend.

View file

@ -1,6 +1,6 @@
# Configuration
All configuration is done through environment variables. Every variable has a sensible default, so Stirling Image works out of the box without setting any of them.
All configuration is done through environment variables. Every variable has a sensible default, so ashim works out of the box without setting any of them.
## Environment variables
@ -24,7 +24,7 @@ All configuration is done through environment variables. Every variable has a se
| Variable | Default | Description |
|---|---|---|
| `STORAGE_MODE` | `local` | `local` or `s3`. Only local storage is currently implemented. |
| `DB_PATH` | `./data/stirling.db` | Path to the SQLite database file. |
| `DB_PATH` | `./data/ashim.db` | Path to the SQLite database file. |
| `WORKSPACE_PATH` | `./tmp/workspace` | Directory for temporary files during processing. Cleaned up automatically. |
| `FILES_STORAGE_PATH` | `./data/files` | Directory for persistent user files (uploaded images, saved results). |
@ -48,7 +48,7 @@ All configuration is done through environment variables. Every variable has a se
| Variable | Default | Description |
|---|---|---|
| `APP_NAME` | `Stirling Image` | Display name shown in the UI. |
| `APP_NAME` | `ashim` | Display name shown in the UI. |
| `DEFAULT_THEME` | `light` | Default theme for new sessions. `light` or `dark`. |
| `DEFAULT_LOCALE` | `en` | Default interface language. |
@ -56,13 +56,13 @@ All configuration is done through environment variables. Every variable has a se
```yaml
services:
stirling-image:
image: stirlingimage/stirling-image:latest
ashim:
image: ashimhq/ashim:latest
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
environment:
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin

View file

@ -1,8 +1,8 @@
# Database
Stirling Image uses SQLite with [Drizzle ORM](https://orm.drizzle.team/) for data persistence. The schema is defined in `apps/api/src/db/schema.ts`.
ashim uses SQLite with [Drizzle ORM](https://orm.drizzle.team/) for data persistence. The schema is defined in `apps/api/src/db/schema.ts`.
The database file lives at the path set by `DB_PATH` (defaults to `./data/stirling.db`). In Docker, mount the `/data` volume to persist it across container restarts.
The database file lives at the path set by `DB_PATH` (defaults to `./data/ashim.db`). In Docker, mount the `/data` volume to persist it across container restarts.
## Tables
@ -90,7 +90,7 @@ Key-value store for server-wide settings that admins can change from the UI.
Drizzle handles schema migrations. The config is in `apps/api/drizzle.config.ts`. During development, run:
```bash
pnpm --filter @stirling-image/api drizzle-kit push
pnpm --filter @ashim/api drizzle-kit push
```
In production, the schema is applied automatically on startup.

View file

@ -1,6 +1,6 @@
# Deployment
Stirling Image ships as a single Docker container. The image supports **linux/amd64** (with NVIDIA CUDA) and **linux/arm64** (CPU), so it runs natively on Intel/AMD servers, Apple Silicon Macs, and ARM devices like the Raspberry Pi 4/5.
ashim ships as a single Docker container. The image supports **linux/amd64** (with NVIDIA CUDA) and **linux/arm64** (CPU), so it runs natively on Intel/AMD servers, Apple Silicon Macs, and ARM devices like the Raspberry Pi 4/5.
See [Docker Image](./docker-tags) for GPU setup, Docker Compose examples, and version pinning.
@ -8,14 +8,14 @@ See [Docker Image](./docker-tags) for GPU setup, Docker Compose examples, and ve
```yaml
services:
stirling-image:
image: stirlingimage/stirling-image:latest
container_name: stirling-image
ashim:
image: ashimhq/ashim:latest
container_name: ashim
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
environment:
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin
@ -23,8 +23,8 @@ services:
restart: unless-stopped
volumes:
stirling-data:
stirling-workspace:
ashim-data:
ashim-workspace:
```
```bash
@ -81,12 +81,12 @@ The `/data` volume is the important one. Without it, you lose all user accounts
The container includes a health check that hits `GET /api/v1/health`. Docker uses this to report container status:
```bash
docker inspect --format='{{.State.Health.Status}}' stirling-image
docker inspect --format='{{.State.Health.Status}}' ashim
```
## Reverse proxy
If you're running Stirling Image behind nginx or Caddy, point it at port 1349. Example nginx config:
If you're running ashim behind nginx or Caddy, point it at port 1349. Example nginx config:
```nginx
server {
@ -113,7 +113,7 @@ Set `client_max_body_size` to match your `MAX_UPLOAD_SIZE_MB` value.
The GitHub repository has three workflows:
- **ci.yml** -- Runs automatically on every push and PR. Lints, typechecks, tests, builds, and validates the Docker image (without pushing).
- **release.yml** -- Triggered manually via `workflow_dispatch`. Runs semantic-release to create a version tag and GitHub release, then builds a multi-arch Docker image (amd64 + arm64) and pushes to Docker Hub (`stirlingimage/stirling-image`) and GitHub Container Registry (`ghcr.io/stirling-image/stirling-image`).
- **release.yml** -- Triggered manually via `workflow_dispatch`. Runs semantic-release to create a version tag and GitHub release, then builds a multi-arch Docker image (amd64 + arm64) and pushes to Docker Hub (`ashimhq/ashim`) and GitHub Container Registry (`ghcr.io/ashim-hq/ashim`).
- **deploy-docs.yml** -- Builds this documentation site and deploys it to GitHub Pages on push to `main`.
To create a release, go to **Actions > Release > Run workflow** in the GitHub UI, or run:

View file

@ -1,6 +1,6 @@
# Developer guide
How to set up a local development environment and contribute code to Stirling Image.
How to set up a local development environment and contribute code to ashim.
## Prerequisites
@ -14,8 +14,8 @@ Python 3.10+ is only needed if you are working on the AI/ML sidecar (background
## Setup
```bash
git clone https://github.com/stirling-image/stirling-image.git
cd stirling-image
git clone https://github.com/ashim-hq/ashim.git
cd ashim
pnpm install
pnpm dev
```
@ -72,7 +72,7 @@ pnpm test:coverage # tests with coverage report
## Database
SQLite via Drizzle ORM. The database file lives at `./data/stirling.db` by default.
SQLite via Drizzle ORM. The database file lives at `./data/ashim.db` by default.
```bash
cd apps/api
@ -195,13 +195,13 @@ Add a `data-testid` attribute to your action button (as shown above) so e2e test
Build the full production image locally:
```bash
docker build -f docker/Dockerfile -t stirling-image:latest .
docker build -f docker/Dockerfile -t ashim:latest .
```
Use BuildKit cache mounts for faster rebuilds:
```bash
DOCKER_BUILDKIT=1 docker build -f docker/Dockerfile -t stirling-image:latest .
DOCKER_BUILDKIT=1 docker build -f docker/Dockerfile -t ashim:latest .
```
## Environment variables

View file

@ -1,11 +1,11 @@
# Docker Image
Stirling Image ships as a single Docker image that works on all platforms.
ashim ships as a single Docker image that works on all platforms.
## Quick start
```bash
docker run -d -p 1349:1349 -v stirling-data:/data stirlingimage/stirling-image:latest
docker run -d -p 1349:1349 -v ashim-data:/data ashimhq/ashim:latest
```
The app is available at `http://localhost:1349`.
@ -15,7 +15,7 @@ The app is available at `http://localhost:1349`.
The image includes CUDA support on amd64. If you have an NVIDIA GPU with the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) installed, add `--gpus all`:
```bash
docker run -d --gpus all -p 1349:1349 -v stirling-data:/data stirlingimage/stirling-image:latest
docker run -d --gpus all -p 1349:1349 -v ashim-data:/data ashimhq/ashim:latest
```
The image auto-detects your GPU at runtime. Without `--gpus all`, it runs on CPU. Same image either way.
@ -56,13 +56,13 @@ GET /api/v1/admin/health
```yaml
services:
stirling-image:
image: stirlingimage/stirling-image:latest
ashim:
image: ashimhq/ashim:latest
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
restart: unless-stopped
logging:
driver: json-file
@ -71,21 +71,21 @@ services:
max-file: "3"
volumes:
stirling-data:
stirling-workspace:
ashim-data:
ashim-workspace:
```
For GPU acceleration via Docker Compose, add the deploy section:
```yaml
services:
stirling-image:
image: stirlingimage/stirling-image:latest
ashim:
image: ashimhq/ashim:latest
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
deploy:
resources:
reservations:
@ -96,8 +96,8 @@ services:
restart: unless-stopped
volumes:
stirling-data:
stirling-workspace:
ashim-data:
ashim-workspace:
```
## Version pinning

View file

@ -2,14 +2,14 @@
## Run with Docker
The fastest way to get Stirling Image running:
The fastest way to get ashim running:
```bash
docker run -d \
--name stirling-image \
--name ashim \
-p 1349:1349 \
-v stirling-data:/data \
stirlingimage/stirling-image:latest
-v ashim-data:/data \
ashimhq/ashim:latest
```
Open `http://localhost:1349` in your browser. Log in with `admin` / `admin`.
@ -18,7 +18,7 @@ Open `http://localhost:1349` in your browser. Log in with `admin` / `admin`.
Have an NVIDIA GPU? Add `--gpus all` to accelerate background removal (2.7x), upscaling (3x), and OCR (1.5x):
```bash
docker run -d --gpus all -p 1349:1349 -v stirling-data:/data stirlingimage/stirling-image:latest
docker run -d --gpus all -p 1349:1349 -v ashim-data:/data ashimhq/ashim:latest
```
Requires [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html). Falls back to CPU if no GPU is found. See [Docker Tags](./docker-tags) for details and benchmarks.
@ -30,14 +30,14 @@ Create a `docker-compose.yml`:
```yaml
services:
stirling-image:
image: stirlingimage/stirling-image:latest
container_name: stirling-image
ashim:
image: ashimhq/ashim:latest
container_name: ashim
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
environment:
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin
@ -45,8 +45,8 @@ services:
restart: unless-stopped
volumes:
stirling-data:
stirling-workspace:
ashim-data:
ashim-workspace:
```
```bash
@ -60,8 +60,8 @@ See [Configuration](./configuration) for the full list of environment variables.
Requirements: Node.js 22+, pnpm 9+, Python 3.10+
```bash
git clone https://github.com/stirling-image/stirling-image.git
cd stirling-image
git clone https://github.com/ashim-hq/ashim.git
cd ashim
pnpm install
```
@ -86,4 +86,4 @@ Some things to try first:
- Batch process a folder of images through any tool
- Save results to the Files page for later
Every tool is also available through the [REST API](../api/rest), so you can script workflows or plug Stirling Image into other systems.
Every tool is also available through the [REST API](../api/rest), so you can script workflows or plug ashim into other systems.

View file

@ -1,6 +1,6 @@
# Translation guide
Stirling Image ships with English by default. The i18n system is designed so adding a new language is straightforward. This page walks you through the process.
ashim ships with English by default. The i18n system is designed so adding a new language is straightforward. This page walks you through the process.
## How translations work

View file

@ -2,7 +2,7 @@
layout: home
hero:
name: "Stirling Image"
name: "ashim"
text: "Self-hosted image processing"
tagline: Resize, compress, convert, remove backgrounds, and more. All on your own server, no data leaves your machine.
actions:

View file

@ -1,5 +1,5 @@
{
"name": "@stirling-image/docs",
"name": "@ashim/docs",
"version": "1.14.0",
"private": true,
"scripts": {

View file

@ -3,12 +3,12 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Stirling Image</title>
<title>ashim</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="Stirling Image" />
<meta property="og:title" content="ashim" />
<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" />

View file

@ -1,5 +1,5 @@
{
"name": "@stirling-image/web",
"name": "@ashim/web",
"version": "1.14.0",
"private": true,
"type": "module",
@ -15,7 +15,7 @@
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@stirling-image/shared": "workspace:*",
"@ashim/shared": "workspace:*",
"clsx": "^2.1.0",
"fflate": "^0.8.2",
"jszip": "^3.10.1",

View file

@ -10,6 +10,5 @@
<line x1="40" y1="48" x2="100" y2="48" stroke="#3b82f6" stroke-width="1.5" opacity="0.4"/>
</g>
<!-- Wordmark -->
<text x="56" y="30" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif" font-weight="700" font-size="24" letter-spacing="-0.5" fill="#0f172a">Stirling </text>
<text x="160" y="30" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif" font-weight="700" font-size="24" letter-spacing="-0.5" fill="#3b82f6">Image</text>
<text x="56" y="30" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif" font-weight="700" font-size="24" letter-spacing="-0.5" fill="#3b82f6">ashim</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 996 B

View file

@ -1,6 +1,6 @@
{
"name": "Stirling Image",
"short_name": "Stirling Image",
"name": "ashim",
"short_name": "ashim",
"icons": [
{ "src": "/logo-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/logo-512.png", "sizes": "512x512", "type": "image/png" }

View file

@ -69,7 +69,7 @@ export function Dropzone({ onFiles, accept, multiple = true, currentFiles = [] }
>
<div className="flex flex-col items-center gap-4 p-8">
<div className="text-3xl font-bold text-muted-foreground/30">
Stirling <span className="text-primary/30">Image</span>
<span className="text-primary/30">ashim</span>
</div>
<button
type="button"

View file

@ -1,4 +1,4 @@
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import * as icons from "lucide-react";
import { ArrowRight, ChevronDown, ChevronRight, Download, Undo2 } from "lucide-react";
import { useMemo, useState } from "react";

View file

@ -1,4 +1,4 @@
import type { Tool } from "@stirling-image/shared";
import type { Tool } from "@ashim/shared";
import * as icons from "lucide-react";
import { FileImage, Star } from "lucide-react";
import { Link } from "react-router-dom";

View file

@ -1,4 +1,4 @@
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import { FileImage } from "lucide-react";
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";

View file

@ -1,4 +1,4 @@
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import type { UserFile } from "@/lib/api";
import { cn } from "@/lib/utils";
import { useFilesPageStore } from "@/stores/files-page-store";

View file

@ -1,4 +1,4 @@
import { APP_VERSION } from "@stirling-image/shared";
import { APP_VERSION } from "@ashim/shared";
import { BookOpen, ExternalLink, Github, Keyboard, X } from "lucide-react";
import { useEffect } from "react";
import { formatShortcut } from "@/hooks/use-keyboard-shortcuts";
@ -99,7 +99,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
</div>
<div className="flex flex-col gap-1.5">
<a
href="https://github.com/stirling-image/stirling-image"
href="https://github.com/ashim-hq/ashim"
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
@ -108,7 +108,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
<ExternalLink className="h-3 w-3" />
</a>
<a
href="https://github.com/stirling-image/stirling-image/issues"
href="https://github.com/ashim-hq/ashim/issues"
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
@ -117,7 +117,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
<ExternalLink className="h-3 w-3" />
</a>
<a
href="https://stirling-image.github.io/stirling-image/"
href="https://ashim-hq.github.io/ashim/"
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-1.5 text-sm text-primary hover:underline"
@ -139,7 +139,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) {
{/* Version */}
<div className="text-xs text-muted-foreground pt-2 border-t border-border">
Stirling Image v{APP_VERSION}
ashim v{APP_VERSION}
</div>
</div>
</div>

View file

@ -61,7 +61,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2">
<GemLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground">
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</span>
</span>
</div>
)}
@ -109,7 +109,7 @@ export function AppLayout({ children, showToolPanel = true, onFiles }: AppLayout
<div className="flex items-center gap-2">
<GemLogo className="h-5 w-5 text-primary" />
<span className="text-sm font-bold text-foreground">
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</span>
</span>
</div>
)}

View file

@ -1,4 +1,4 @@
import { CATEGORIES, TOOLS } from "@stirling-image/shared";
import { CATEGORIES, TOOLS } from "@ashim/shared";
import { useEffect, useMemo, useState } from "react";
import { useSettingsStore } from "@/stores/settings-store";
import { SearchBar } from "../common/search-bar";

View file

@ -1,4 +1,4 @@
import { APP_VERSION, CATEGORIES, TOOLS } from "@stirling-image/shared";
import { APP_VERSION, CATEGORIES, TOOLS } from "@ashim/shared";
import {
Check,
Copy,
@ -182,7 +182,7 @@ function GeneralSection() {
// Fallback to localStorage if session endpoint fails
setUser({
id: 0,
username: localStorage.getItem("stirling-username") || "",
username: localStorage.getItem("ashim-username") || "",
role: "unknown",
});
})
@ -191,7 +191,7 @@ function GeneralSection() {
const handleLogout = () => {
clearToken();
localStorage.removeItem("stirling-username");
localStorage.removeItem("ashim-username");
window.location.href = "/login";
};
@ -239,7 +239,7 @@ function GeneralSection() {
</SettingRow>
{/* Version */}
<SettingRow label="App Version" description="Current version of Stirling Image">
<SettingRow label="App Version" description="Current version of ashim">
<span className="text-sm font-mono text-muted-foreground">{APP_VERSION}</span>
</SettingRow>
</div>
@ -260,7 +260,7 @@ function SystemSection() {
.catch(() => {
// Fallback defaults if endpoint not ready
setSettings({
appName: "Stirling Image",
appName: "ashim",
fileUploadLimitMb: "100",
defaultTheme: "system",
defaultLocale: "en",
@ -1184,7 +1184,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 Stirling Image.
Manage API keys for programmatic access to ashim.
</p>
</div>
@ -1708,7 +1708,7 @@ function AboutSection() {
<div className="flex items-center gap-3">
<GemLogo className="h-8 w-8 text-primary" />
<div className="text-2xl font-bold text-foreground">
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</span>
</div>
</div>
<p className="text-sm text-muted-foreground">
@ -1725,7 +1725,7 @@ function AboutSection() {
<h4 className="text-sm font-medium text-foreground">Links</h4>
<div className="flex flex-col gap-1.5">
<a
href="https://github.com/stirling-image/stirling-image"
href="https://github.com/ashim-hq/ashim"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-primary hover:underline"
@ -1733,7 +1733,7 @@ function AboutSection() {
GitHub Repository
</a>
<a
href="https://stirling-image.github.io/stirling-image/"
href="https://ashim-hq.github.io/ashim/"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-primary hover:underline"

View file

@ -106,7 +106,7 @@ function UploadArea() {
>
<div className="flex flex-col items-center gap-4 p-8">
<div className="text-3xl font-bold text-muted-foreground/30">
Stirling <span className="text-primary/30">Image</span>
<span className="text-primary/30">ashim</span>
</div>
<button
type="button"

View file

@ -105,9 +105,9 @@ export function ColorControls({
if (exposure !== 0) parts.push(`brightness(${1 + exposure / 200})`);
if (saturation !== 0) parts.push(`saturate(${1 + saturation / 100})`);
if (hue !== 0) parts.push(`hue-rotate(${hue}deg)`);
if (hasTempTint) parts.push("url(#stirling-temp-tint-filter)");
if (hasChannelChanges) parts.push("url(#stirling-channel-filter)");
if (sharpness > 0) parts.push("url(#stirling-sharpen-filter)");
if (hasTempTint) parts.push("url(#ashim-temp-tint-filter)");
if (hasChannelChanges) parts.push("url(#ashim-channel-filter)");
if (sharpness > 0) parts.push("url(#ashim-sharpen-filter)");
if (effect === "grayscale") parts.push("grayscale(1)");
if (effect === "sepia") parts.push("sepia(1)");
if (effect === "invert") parts.push("invert(1)");
@ -150,7 +150,7 @@ export function ColorControls({
{/* Hidden SVG filters for live preview */}
{hasTempTint && (
<svg width="0" height="0" style={{ position: "absolute" }}>
<filter id="stirling-temp-tint-filter" colorInterpolationFilters="sRGB">
<filter id="ashim-temp-tint-filter" colorInterpolationFilters="sRGB">
<feColorMatrix
type="matrix"
values={`${1 + tempT * 0.15 + tintN * 0.1} 0 0 0 0 0 ${1 + tempT * 0.05 - tintN * 0.15} 0 0 0 0 0 ${1 - tempT * 0.15 + tintN * 0.1} 0 0 0 0 0 1 0`}
@ -160,7 +160,7 @@ export function ColorControls({
)}
{hasChannelChanges && (
<svg width="0" height="0" style={{ position: "absolute" }}>
<filter id="stirling-channel-filter" colorInterpolationFilters="sRGB">
<filter id="ashim-channel-filter" colorInterpolationFilters="sRGB">
<feColorMatrix
type="matrix"
values={`${red / 100} 0 0 0 0 0 ${green / 100} 0 0 0 0 0 ${blue / 100} 0 0 0 0 0 1 0`}
@ -170,7 +170,7 @@ export function ColorControls({
)}
{sharpness > 0 && (
<svg width="0" height="0" style={{ position: "absolute" }}>
<filter id="stirling-sharpen-filter" colorInterpolationFilters="sRGB">
<filter id="ashim-sharpen-filter" colorInterpolationFilters="sRGB">
<feConvolveMatrix
order="3"
preserveAlpha="true"

View file

@ -216,10 +216,10 @@ export function ImageEnhancementControls({
parts.push(`saturate(${1 + adj / 100})`);
}
if (toggles.whiteBalance && Math.abs(c.temperature) > 2) {
parts.push("url(#stirling-enhance-temp-filter)");
parts.push("url(#ashim-enhance-temp-filter)");
}
if (toggles.sharpness && c.sharpness > 2) {
parts.push("url(#stirling-enhance-sharpen-filter)");
parts.push("url(#ashim-enhance-sharpen-filter)");
}
onPreviewFilter(parts.join(" "));
@ -245,7 +245,7 @@ export function ImageEnhancementControls({
{/* Hidden SVG filters for preview */}
{toggles.whiteBalance && Math.abs(tempAdj) > 0.02 && (
<svg width="0" height="0" style={{ position: "absolute" }}>
<filter id="stirling-enhance-temp-filter" colorInterpolationFilters="sRGB">
<filter id="ashim-enhance-temp-filter" colorInterpolationFilters="sRGB">
<feColorMatrix
type="matrix"
values={`${1 + tempAdj * 0.15} 0 0 0 0 0 ${1 + tempAdj * 0.05} 0 0 0 0 0 ${1 - tempAdj * 0.15} 0 0 0 0 0 1 0`}
@ -255,7 +255,7 @@ export function ImageEnhancementControls({
)}
{toggles.sharpness && sharpAdj > 0.02 && (
<svg width="0" height="0" style={{ position: "absolute" }}>
<filter id="stirling-enhance-sharpen-filter" colorInterpolationFilters="sRGB">
<filter id="ashim-enhance-sharpen-filter" colorInterpolationFilters="sRGB">
<feConvolveMatrix
order="3"
preserveAlpha="true"

View file

@ -3,7 +3,7 @@ import {
type PassportDocumentSpec,
type PassportRegion,
type PassportSpec,
} from "@stirling-image/shared";
} from "@ashim/shared";
import {
Check,
ChevronDown,

View file

@ -14,7 +14,7 @@ import {
verticalListSortingStrategy,
} from "@dnd-kit/sortable";
import { CSS } from "@dnd-kit/utilities";
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import * as icons from "lucide-react";
import { GripVertical, Plus, X } from "lucide-react";
import { useEffect, useMemo, useState } from "react";

View file

@ -1,4 +1,4 @@
import { SOCIAL_MEDIA_PRESETS } from "@stirling-image/shared";
import { SOCIAL_MEDIA_PRESETS } from "@ashim/shared";
import { Download, Info, Link, Unlink } from "lucide-react";
import { useCallback, useEffect, useRef, useState } from "react";
import { ProgressCard } from "@/components/common/progress-card";

View file

@ -1,4 +1,4 @@
import { SMART_CROP_FACE_PRESETS, SOCIAL_MEDIA_PRESETS } from "@stirling-image/shared";
import { SMART_CROP_FACE_PRESETS, SOCIAL_MEDIA_PRESETS } from "@ashim/shared";
import { ArrowLeftRight, Info } from "lucide-react";
import { useEffect, useRef, useState } from "react";
import { ProgressCard } from "@/components/common/progress-card";

View file

@ -55,7 +55,7 @@ export function useAuth() {
}
// Auth is enabled — check if we have a valid session
const token = localStorage.getItem("stirling-token");
const token = localStorage.getItem("ashim-token");
if (!token) {
setState({
loading: false,
@ -84,7 +84,7 @@ export function useAuth() {
permissions: session.user?.permissions ?? [],
});
} else {
localStorage.removeItem("stirling-token");
localStorage.removeItem("ashim-token");
setState({
loading: false,
authEnabled: true,

View file

@ -1,4 +1,4 @@
import { PYTHON_SIDECAR_TOOLS } from "@stirling-image/shared";
import { PYTHON_SIDECAR_TOOLS } from "@ashim/shared";
import { useCallback, useEffect, useRef, useState } from "react";
import { formatHeaders } from "@/lib/api";
import { generateId } from "@/lib/utils";

View file

@ -4,7 +4,7 @@ const API_BASE = "/api";
function getToken(): string {
try {
return localStorage.getItem("stirling-token") || "";
return localStorage.getItem("ashim-token") || "";
} catch {
return "";
}
@ -71,11 +71,11 @@ export async function apiDelete<T>(path: string): Promise<T> {
}
export function setToken(token: string) {
localStorage.setItem("stirling-token", token);
localStorage.setItem("ashim-token", token);
}
export function clearToken() {
localStorage.removeItem("stirling-token");
localStorage.removeItem("ashim-token");
}
// ── File Upload / Download ──────────────────────────────────────

View file

@ -99,7 +99,7 @@ export function ChangePasswordPage() {
}
// Trigger browser password save prompt via real form submission + navigation
const username = localStorage.getItem("stirling-username") || "admin";
const username = localStorage.getItem("ashim-username") || "admin";
triggerBrowserPasswordSave(username, newPassword);
return; // navigation happens inside triggerBrowserPasswordSave
} catch {
@ -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">
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</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">
@ -133,7 +133,7 @@ export function ChangePasswordPage() {
type="text"
name="username"
autoComplete="username"
value={localStorage.getItem("stirling-username") || "admin"}
value={localStorage.getItem("ashim-username") || "admin"}
readOnly
className="w-full px-4 py-3 rounded-lg border border-border bg-muted text-muted-foreground cursor-not-allowed"
/>

View file

@ -1,5 +1,5 @@
import type { CategoryInfo, Tool } from "@stirling-image/shared";
import { CATEGORIES, TOOLS } from "@stirling-image/shared";
import type { CategoryInfo, Tool } from "@ashim/shared";
import { CATEGORIES, TOOLS } from "@ashim/shared";
import * as icons from "lucide-react";
import { Eye, EyeOff, FileImage, LayoutGrid, List, Search } from "lucide-react";
import { useEffect, useMemo, useState } from "react";
@ -69,7 +69,7 @@ export function FullscreenGridPage() {
className="flex items-center gap-2 text-lg font-bold text-foreground shrink-0"
>
<GemLogo className="h-6 w-6 text-primary" />
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</span>
</Link>
{/* Search */}

View file

@ -1,4 +1,4 @@
import { CATEGORIES, TOOLS } from "@stirling-image/shared";
import { CATEGORIES, TOOLS } from "@ashim/shared";
import * as icons from "lucide-react";
import { Loader2 } from "lucide-react";
import { useCallback, useEffect } from "react";

View file

@ -25,7 +25,7 @@ export function LoginPage() {
const data = await res.json();
setToken(data.token);
// Store username for settings display
localStorage.setItem("stirling-username", data.user?.username || username);
localStorage.setItem("ashim-username", data.user?.username || username);
// Redirect to password change if required, otherwise go home
if (data.user?.mustChangePassword) {
window.location.href = "/change-password";
@ -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">
Stirling <span className="text-primary">Image</span>
<span className="text-primary">ashim</span>
</h1>
<h2 className="text-2xl font-bold mt-4 text-foreground">Login</h2>
</div>

View file

@ -20,7 +20,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Overview</h2>
<p>
Stirling Image is a self-hosted, open-source image processing application. Your
ashim 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 Stirling Image is deployed.
All image processing happens entirely on the server where ashim 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">No Tracking or Analytics</h2>
<p>
Stirling Image does not include any telemetry, analytics, or tracking. No data is
collected about your usage patterns, and no information is sent to Stirling Image
ashim does not include any telemetry, analytics, or tracking. No data is
collected about your usage patterns, and no information is sent to ashim
developers or any third party. There are no cookies used for tracking purposes.
</p>
</section>
@ -58,7 +58,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">No Third-Party Services</h2>
<p>
Stirling Image does not integrate with or send data to any external services.
ashim does not integrate with or send data to any external services.
AI-powered features (background removal, upscaling, OCR) run locally using bundled
models. No cloud APIs are involved.
</p>
@ -67,7 +67,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Open Source</h2>
<p>
Stirling Image is fully open source. You can audit the source code to verify these
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.
</p>
</section>
@ -75,7 +75,7 @@ export function PrivacyPolicyPage() {
<section>
<h2 className="text-lg font-semibold text-foreground mb-2">Your Control</h2>
<p>
Because Stirling Image is self-hosted, the instance operator has full control over all
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.
</p>

View file

@ -1,4 +1,4 @@
import { TOOLS } from "@stirling-image/shared";
import { TOOLS } from "@ashim/shared";
import * as icons from "lucide-react";
import { CheckCircle2, ChevronLeft, ChevronRight, Download, Loader2 } from "lucide-react";
import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";

View file

@ -25,6 +25,6 @@ export const useThemeStore = create<ThemeStore>()(
set({ theme, resolvedTheme: resolved });
},
}),
{ name: "stirling-image-theme" },
{ name: "ashim-theme" },
),
);

View file

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1
# ============================================
# Stirling Image - Unified Production Dockerfile
# ashim - Unified Production Dockerfile
# Single image: GPU auto-detected on amd64, CPU on arm64
# ============================================
@ -33,7 +33,7 @@ COPY . .
# Build only the web frontend (API runs from TS source via tsx)
RUN --mount=type=cache,id=turbo-cache,target=/app/.turbo \
pnpm --filter @stirling-image/web build
pnpm --filter @ashim/web build
# ============================================
# Stage 2: Build caire (content-aware resize)
@ -199,13 +199,13 @@ ENV PORT=1349 \
DEFAULT_USERNAME=admin \
DEFAULT_PASSWORD=admin \
STORAGE_MODE=local \
DB_PATH=/data/stirling.db \
DB_PATH=/data/ashim.db \
WORKSPACE_PATH=/tmp/workspace \
FILES_STORAGE_PATH=/data/files \
PYTHON_VENV_PATH=/opt/venv \
DEFAULT_THEME=light \
DEFAULT_LOCALE=en \
APP_NAME="Stirling Image" \
APP_NAME="ashim" \
FILE_MAX_AGE_HOURS=24 \
CLEANUP_INTERVAL_MINUTES=30 \
MAX_UPLOAD_SIZE_MB=100 \
@ -225,10 +225,10 @@ ENV PYTHONWARNINGS=ignore \
PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK=True
# Create non-root user for runtime
RUN groupadd -r stirling && useradd -r -g stirling -d /app -s /sbin/nologin stirling
RUN chown -R stirling:stirling /app /data /tmp/workspace /opt/venv /opt/models
RUN groupadd -r ashim && useradd -r -g ashim -d /app -s /sbin/nologin ashim
RUN chown -R ashim:ashim /app /data /tmp/workspace /opt/venv /opt/models
# Entrypoint fixes volume permissions then drops to stirling via gosu
# Entrypoint fixes volume permissions then drops to ashim via gosu
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

View file

@ -1,5 +1,5 @@
# ============================================
# Stirling Image - Test Dockerfile
# ashim - Test Dockerfile
# Runs the full test suite (unit + integration)
# ============================================
@ -30,7 +30,7 @@ ENV NODE_ENV=test \
AUTH_ENABLED=true \
DEFAULT_USERNAME=admin \
DEFAULT_PASSWORD=admin \
DB_PATH=/tmp/test-stirling.db \
DB_PATH=/tmp/test-ashim.db \
WORKSPACE_PATH=/tmp/test-workspace \
MAX_MEGAPIXELS=100 \
MAX_UPLOAD_SIZE_MB=100 \

View file

@ -8,14 +8,14 @@ services:
build:
context: ..
dockerfile: docker/Dockerfile.test
container_name: stirling-test-unit
container_name: ashim-test-unit
command: ["pnpm", "test:ci"]
environment:
- NODE_ENV=test
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin
- DEFAULT_PASSWORD=admin
- DB_PATH=/tmp/test-stirling.db
- DB_PATH=/tmp/test-ashim.db
- WORKSPACE_PATH=/tmp/test-workspace
- MAX_MEGAPIXELS=100
- RATE_LIMIT_PER_MIN=1000
@ -28,14 +28,14 @@ services:
build:
context: ..
dockerfile: docker/Dockerfile.test
container_name: stirling-test-e2e
container_name: ashim-test-e2e
command: ["sh", "-c", "npx playwright install --with-deps chromium && pnpm test:e2e"]
environment:
- NODE_ENV=test
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin
- DEFAULT_PASSWORD=admin
- DB_PATH=/tmp/test-stirling.db
- DB_PATH=/tmp/test-ashim.db
- WORKSPACE_PATH=/tmp/test-workspace
- MAX_MEGAPIXELS=100
- RATE_LIMIT_PER_MIN=1000

View file

@ -1,15 +1,15 @@
services:
stirling-image:
ashim:
build:
context: ..
dockerfile: docker/Dockerfile
image: stirlingimage/stirling-image:latest
container_name: stirling-image
image: ashimhq/ashim:latest
container_name: ashim
ports:
- "1349:1349"
volumes:
- stirling-data:/data
- stirling-workspace:/tmp/workspace
- ashim-data:/data
- ashim-workspace:/tmp/workspace
environment:
- AUTH_ENABLED=true
- DEFAULT_USERNAME=admin
@ -22,5 +22,5 @@ services:
max-file: "3"
volumes:
stirling-data:
stirling-workspace:
ashim-data:
ashim-workspace:

View file

@ -9,7 +9,7 @@ import urllib.request
# Some servers (e.g. Berkeley) block the default Python-urllib User-Agent.
_opener = urllib.request.build_opener()
_opener.addheaders = [("User-Agent", "Stirling-Image/1.0")]
_opener.addheaders = [("User-Agent", "ashim/1.0")]
urllib.request.install_opener(_opener)
# Force CPU mode during build - no GPU driver available at build time.

View file

@ -1,13 +1,13 @@
#!/bin/sh
set -e
# Fix ownership of mounted volumes so the non-root stirling user can write.
# This runs as root, fixes permissions, then drops to stirling via gosu.
# Fix ownership of mounted volumes so the non-root ashim user can write.
# This runs as root, fixes permissions, then drops to ashim via gosu.
if [ "$(id -u)" = "0" ]; then
chown -R stirling:stirling /data /tmp/workspace 2>&1 || \
chown -R ashim:ashim /data /tmp/workspace 2>&1 || \
echo "WARNING: Could not fix volume permissions. If processing fails, check your volume mount permissions." >&2
exec gosu stirling "$@"
exec gosu ashim "$@"
fi
# Already running as stirling (e.g. Kubernetes runAsUser)
# Already running as ashim (e.g. Kubernetes runAsUser)
exec "$@"

View file

@ -1,11 +1,11 @@
{
"name": "stirling-image",
"name": "ashim",
"version": "1.14.0",
"private": true,
"packageManager": "pnpm@9.15.4",
"scripts": {
"dev": "turbo dev",
"docs:dev": "pnpm --filter @stirling-image/docs docs:dev",
"docs:dev": "pnpm --filter @ashim/docs docs:dev",
"build": "turbo build",
"lint": "turbo lint",
"lint:fix": "biome check --write .",

View file

@ -1,5 +1,5 @@
{
"name": "@stirling-image/ai",
"name": "@ashim/ai",
"version": "1.14.0",
"private": true,
"type": "module",
@ -10,7 +10,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@stirling-image/shared": "workspace:*",
"@ashim/shared": "workspace:*",
"sharp": "^0.33.0"
},
"devDependencies": {

View file

@ -176,7 +176,7 @@ def enhance_with_codeformer(img_array, fidelity_weight):
# CodeFormer selects its device during module-level init and inside
# inference_app(). It has no device= parameter, so to respect
# STIRLING_GPU=false we temporarily override torch.cuda.is_available
# ASHIM_GPU=false we temporarily override torch.cuda.is_available
# so all internal device checks see False. When use_gpu is True
# (the common path) no override happens.
_orig_cuda_check = torch.cuda.is_available

View file

@ -7,7 +7,7 @@ import os
def gpu_available():
"""Return True if a usable CUDA GPU is present at runtime."""
# Allow explicit disable via env var (set to "false" or "0")
override = os.environ.get("STIRLING_GPU")
override = os.environ.get("ASHIM_GPU")
if override is not None and override.lower() in ("0", "false", "no"):
return False

View file

@ -14,7 +14,7 @@ def emit_progress(percent, stage):
# For local dev, check a user-writable cache dir.
LAMA_MODEL_DIR = os.environ.get("LAMA_MODEL_DIR", "/opt/models/lama")
LAMA_MODEL_PATH = os.path.join(LAMA_MODEL_DIR, "lama_fp32.onnx")
LAMA_LOCAL_CACHE = os.path.join(os.path.expanduser("~"), ".cache", "stirling-image", "lama")
LAMA_LOCAL_CACHE = os.path.join(os.path.expanduser("~"), ".cache", "ashim", "lama")
LAMA_LOCAL_PATH = os.path.join(LAMA_LOCAL_CACHE, "lama_fp32.onnx")
LAMA_HF_URL = "https://huggingface.co/Carve/LaMa-ONNX/resolve/main/lama_fp32.onnx"

View file

@ -21,7 +21,7 @@ NAFNET_MODEL_PATH = os.environ.get(
)
# Local cache for dev installs
_CACHE_DIR = os.path.join(os.path.expanduser("~"), ".cache", "stirling-image", "models")
_CACHE_DIR = os.path.join(os.path.expanduser("~"), ".cache", "ashim", "models")
# GitHub release URLs for auto-download
SCUNET_URL = "https://github.com/cszn/KAIR/releases/download/v1.0/scunet_color_real_psnr.pth"

View file

@ -24,13 +24,13 @@ def emit_progress(percent, stage):
LAMA_MODEL_DIR = os.environ.get("LAMA_MODEL_DIR", "/opt/models/lama")
LAMA_MODEL_PATH = os.path.join(LAMA_MODEL_DIR, "lama_fp32.onnx")
LAMA_LOCAL_CACHE = os.path.join(os.path.expanduser("~"), ".cache", "stirling-image", "lama")
LAMA_LOCAL_CACHE = os.path.join(os.path.expanduser("~"), ".cache", "ashim", "lama")
LAMA_LOCAL_PATH = os.path.join(LAMA_LOCAL_CACHE, "lama_fp32.onnx")
CODEFORMER_MODEL_DIR = os.environ.get("CODEFORMER_MODEL_DIR", "/opt/models/codeformer")
CODEFORMER_MODEL_PATH = os.path.join(CODEFORMER_MODEL_DIR, "codeformer.onnx")
CODEFORMER_LOCAL_CACHE = os.path.join(
os.path.expanduser("~"), ".cache", "stirling-image", "codeformer"
os.path.expanduser("~"), ".cache", "ashim", "codeformer"
)
CODEFORMER_LOCAL_PATH = os.path.join(CODEFORMER_LOCAL_CACHE, "codeformer.onnx")

Some files were not shown because too many files have changed in this diff Show more