Files
SnapOtter/apps/docs/guide/configuration.md
T
AshimandGitHub 97938bdc47 feat: API sync and documentation audit - 100% endpoint coverage (#94)
Code quality:
- Add Zod validation to 14 route handlers that used raw JSON.parse
  (favicon, find-duplicates, barcode-read, upscale, blur-faces,
  erase-object, colorize, enhance-faces, red-eye-removal,
  remove-background/effects, auth, api-keys, roles, teams,
  analytics, settings, user-files)
- Standardize error responses to safeParse + formatZodErrors pattern
- Replace unsafe `as` type casts with schema validation

OpenAPI spec (89 -> 115 operations):
- Add 14 missing tool endpoints (adjust-colors, sharpening,
  optimize-for-web, image-enhancement, noise-removal, red-eye-removal,
  restore-photo, passport-photo, colorize, enhance-faces, image-to-base64)
- Add 12 missing non-tool endpoints (analytics, features, audit-log,
  roles, admin-health)
- Add typed error schemas for 401/403/409 responses
- Add descriptions to all path parameters
- Bump version from 0.9.0 to 1.15.9

Documentation:
- Fix 8 incorrect env var defaults in configuration guide
- Add 15 undocumented env vars to configuration guide
- Fix tool ID mismatch (color-adjustments -> adjust-colors)
- Add 4 new API sections (Roles, Audit Log, Analytics, Features)
- Add image-enhancement to AI engine reference
- Update AI tool count from 13 to 14 across all docs
- Add 6 missing doc links to README
2026-04-23 20:26:58 +08:00

4.8 KiB

Configuration

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

Server

Variable Default Description
PORT 1349 Port the server listens on.
RATE_LIMIT_PER_MIN 0 (disabled) Maximum requests per minute per IP. Set to 0 to disable rate limiting.
CORS_ORIGIN (empty) Comma-separated allowed origins for CORS, or empty for same-origin only.
LOG_LEVEL info Log verbosity. One of: fatal, error, warn, info, debug, trace.
TRUST_PROXY true Trust X-Forwarded-For headers from a reverse proxy. Set to false if not behind a proxy.

Authentication

Variable Default Description
AUTH_ENABLED false Set to true to require login. The Docker image defaults to true.
DEFAULT_USERNAME admin Username for the initial admin account. Only used on first run.
DEFAULT_PASSWORD admin Password for the initial admin account. Change this after first login.
MAX_USERS 0 (unlimited) Maximum number of registered user accounts. Set to 0 for unlimited.
SESSION_DURATION_HOURS 168 Login session lifetime in hours (default is 7 days).
SKIP_MUST_CHANGE_PASSWORD - Set to any non-empty value to bypass the forced password-change prompt on first login

Storage

Variable Default Description
STORAGE_MODE local local or s3. Only local storage is currently implemented.
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).

Processing limits

Variable Default Description
MAX_UPLOAD_SIZE_MB 0 (unlimited) Maximum file size per upload in megabytes. Set to 0 for unlimited.
MAX_BATCH_SIZE 0 (unlimited) Maximum number of files in a single batch request. Set to 0 for unlimited.
CONCURRENT_JOBS 0 (auto) Number of batch jobs that run in parallel. Set to 0 to auto-detect based on available CPU cores.
MAX_MEGAPIXELS 0 (unlimited) Maximum image resolution allowed in megapixels. Set to 0 for unlimited.
MAX_WORKER_THREADS 0 (auto) Maximum worker threads for image processing. Set to 0 to auto-detect based on available CPU cores.
PROCESSING_TIMEOUT_S 0 (no limit) Maximum processing time per request in seconds. Set to 0 for no timeout.
MAX_PIPELINE_STEPS 0 (no limit) Maximum number of steps in a pipeline. Set to 0 for no limit.
MAX_CANVAS_PIXELS 0 (no limit) Maximum canvas size in pixels for output images. Set to 0 for no limit.
MAX_SVG_SIZE_MB 0 (unlimited) Maximum SVG file size in megabytes. Set to 0 for unlimited.
MAX_LOGO_SIZE_KB 500 Maximum custom branding logo size in kilobytes.
MAX_SPLIT_GRID 100 Maximum grid dimension for the image split tool.
MAX_PDF_PAGES 0 (unlimited) Maximum number of PDF pages for PDF-to-image conversion. Set to 0 for unlimited.

Cleanup

Variable Default Description
FILE_MAX_AGE_HOURS 72 How long temporary files are kept before automatic deletion.
CLEANUP_INTERVAL_MINUTES 60 How often the cleanup job runs.

Appearance

Variable Default Description
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.

Docker permissions

Variable Default Description
PUID 999 Run the container process as this UID. Set to match your host user for bind mounts (id -u).
PGID 999 Run the container process as this GID. Set to match your host group for bind mounts (id -g).

Docker example

services:
  ashim:
    image: ashimhq/ashim:latest
    ports:
      - "1349:1349"
    volumes:
      - ashim-data:/data
      - ashim-workspace:/tmp/workspace
    environment:
      - AUTH_ENABLED=true
      - DEFAULT_USERNAME=admin
      - DEFAULT_PASSWORD=changeme
      - MAX_UPLOAD_SIZE_MB=200
      - CONCURRENT_JOBS=4
      - FILE_MAX_AGE_HOURS=12
    restart: unless-stopped

Volumes

The Docker container uses two volumes:

  • /data -- Persistent storage for the SQLite database and user files. Mount this to keep users, API keys, saved pipelines, and uploaded images across container restarts.
  • /tmp/workspace -- Temporary storage for images being processed. This can be ephemeral, but mounting it avoids filling up the container's writable layer.