High-performance image processing built on a Rust core with SIMD acceleration. Accepts uploads directly or pulls from MinIO, applies transformations (resize, crop, rotate, format convert, watermark, EXIF strip), and stores outputs back to MinIO. Hasura Remote Schema mutations let your frontend trigger image operations via GraphQL without building a separate media pipeline.
MinIO (object storage) must be enabled. Run nself service enable storage before installing this plugin.
nself service enable storage # MinIO required
nself plugin install nself-image
nself build
nself start| Variable | Required | Default | Description |
|---|---|---|---|
IMAGE_MAX_UPLOAD_MB | No | 20 | Maximum upload size in megabytes |
IMAGE_STORAGE_BUCKET | No | nself-images | MinIO bucket for processed image outputs |
IMAGE_DEFAULT_QUALITY | No | 85 | JPEG/WebP quality (1–100) for lossy conversions |
IMAGE_STRIP_EXIF | No | true | Remove EXIF metadata (GPS, device info) on all outputs |
IMAGE_MAX_DIMENSION | No | 8000 | Maximum allowed pixel dimension (width or height) for inputs |
IMAGE_WORKER_THREADS | No | 4 | Rust worker thread count for parallel processing |
IMAGE_RATE_RPM | No | 120 | Per-user processing requests per minute |
# Upload + transform in one request
curl -X POST https://api.yoursite.com/image/process \
-H "Authorization: Bearer $TOKEN" \
-F "file=@photo.jpg" \
-F 'ops=[{"op":"resize","width":800},{"op":"convert","format":"webp"}]'
# Returns: {"url": "https://storage.yoursite.com/nself-images/out/xxxx.webp"}
# Transform an image already in storage
curl -X POST https://api.yoursite.com/image/transform \
-H "Authorization: Bearer $TOKEN" \
-d '{
"source_key": "uploads/avatar.png",
"ops": [
{"op": "crop", "x": 0, "y": 0, "width": 400, "height": 400},
{"op": "resize", "width": 200, "height": 200},
{"op": "convert", "format": "webp"}
],
"dest_key": "avatars/user-123.webp"
}'| Operation | Parameters | Description |
|---|---|---|
resize | width, height, fit | Resize with fit modes: contain, cover, fill, inside, outside |
crop | x, y, width, height | Pixel-coordinate crop |
rotate | degrees | Rotate 90, 180, or 270 degrees |
flip | axis | Horizontal or vertical flip |
convert | format, quality | Convert to JPEG, PNG, WebP, AVIF, or GIF |
watermark | text or image_key, position, opacity | Overlay text or image watermark |
blur | sigma | Gaussian blur |
strip_exif | — | Remove all EXIF metadata |
| Endpoint | Method | Description |
|---|---|---|
/image/process | POST | Upload a file and apply a pipeline of operations |
/image/transform | POST | Apply operations to an existing MinIO object |
/image/info/:key | GET | Get dimensions, format, size, and EXIF data for a stored image |
/image/health | GET | Rust worker readiness and MinIO connectivity |
np_image_jobs — processing job records with input key, ops, output key, and statusPro Plugin — ɳSelf+ | Port: 3827 | v0.1.0