mirror of
https://github.com/ashim-hq/ashim
synced 2026-04-21 13:37:52 +00:00
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:
parent
da4411330f
commit
85b1cfc10a
117 changed files with 710 additions and 713 deletions
|
|
@ -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
4
.github/FUNDING.yml
vendored
|
|
@ -1,2 +1,2 @@
|
|||
github: stirling-image
|
||||
ko_fi: stirling-image
|
||||
github: ashim-hq
|
||||
ko_fi: ashim-hq
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
|
@ -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.
|
||||
|
|
|
|||
6
.github/pull_request_template.md
vendored
6
.github/pull_request_template.md
vendored
|
|
@ -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.
|
||||
|
|
|
|||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
2
.github/workflows/deploy-docs.yml
vendored
2
.github/workflows/deploy-docs.yml
vendored
|
|
@ -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:
|
||||
|
|
|
|||
10
.github/workflows/release.yml
vendored
10
.github/workflows/release.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
812
CHANGELOG.md
812
CHANGELOG.md
File diff suppressed because it is too large
Load diff
|
|
@ -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.
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -1,4 +1,4 @@
|
|||
Stirling Image
|
||||
ashim
|
||||
Copyright (C) 2025-present Siddharth Kumar Sah
|
||||
|
||||
This software is dual-licensed:
|
||||
|
|
|
|||
45
README.md
45
README.md
|
|
@ -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 →</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>
|
||||
|
||||

|
||||

|
||||
|
||||
## 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.
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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: /
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "@stirling-image/docs",
|
||||
"name": "@ashim/docs",
|
||||
"version": "1.14.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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" }
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import {
|
|||
type PassportDocumentSpec,
|
||||
type PassportRegion,
|
||||
type PassportSpec,
|
||||
} from "@stirling-image/shared";
|
||||
} from "@ashim/shared";
|
||||
import {
|
||||
Check,
|
||||
ChevronDown,
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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 ──────────────────────────────────────
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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 */}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -25,6 +25,6 @@ export const useThemeStore = create<ThemeStore>()(
|
|||
set({ theme, resolvedTheme: resolved });
|
||||
},
|
||||
}),
|
||||
{ name: "stirling-image-theme" },
|
||||
{ name: "ashim-theme" },
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 "$@"
|
||||
|
|
|
|||
|
|
@ -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 .",
|
||||
|
|
|
|||
|
|
@ -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": {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue