Skip to content

Configuration API Reference

This page documents the complete configuration options available in imgx. The configuration can be defined in an imgx.config.ts or imgx.config.js file in your project root.

Configuration Structure

The imgx configuration object follows this structure:

ts
interface ImgxConfig {
  // Core settings
  verbose: boolean | string[]
  cache: boolean
  cacheDir: string
  concurrent: number
  skipOptimized: boolean

  // Default image processing settings
  quality?: number
  format?: 'jpeg' | 'png' | 'webp' | 'avif'
  progressive?: boolean
  preserveMetadata?: boolean

  // Feature-specific configurations
  appIcon?: AppIconConfig
  responsive?: ResponsiveConfig
  sprites?: SpritesConfig
  placeholders?: PlaceholdersConfig
  batch?: BatchConfig
  optimization?: OptimizationConfig
  conversion?: ConversionConfig
  social?: SocialConfig
  transformations?: TransformationsConfig
  watermark?: WatermarkConfig
  svg?: SvgConfig
}

Core Settings

These settings control the general behavior of imgx:

ts
{
  // Enable verbose logging
  // Can be boolean or array of specific modules to log
  verbose: true,

  // Enable caching of processed images
  cache: true,

  // Directory to store cached images
  cacheDir: '.imgx-cache',

  // Number of concurrent processing operations
  concurrent: 4,

  // Skip already optimized images
  skipOptimized: false,
}

Default Image Processing Settings

These settings apply to all image processing operations unless overridden:

ts
{
  // Default quality setting (1-100)
  quality: 80,

  // Default output format
  format: 'webp',

  // Enable progressive mode if format supports it
  progressive: true,

  // Preserve image metadata (EXIF, etc.)
  preserveMetadata: false,
}

Feature-Specific Configurations

App Icon Generation

ts
{
  appIcon: {
    // Output directory for generated app icons
    outputDir: 'assets/app-icons',

    // Target platform (macos, ios, or all)
    platform: 'all',
  }
}

Responsive Images

ts
{
  responsive: {
    // Array of widths to generate
    sizes: [320, 640, 960, 1280, 1920],

    // Array of formats to generate for each size
    formats: ['webp', 'jpeg'],

    // Quality setting (1-100)
    quality: 80,

    // Generate srcset attributes for HTML
    generateSrcset: true,

    // Template for output filenames
    filenameTemplate: '[name]-[width].[ext]',
  }
}

Sprite Sheets

ts
{
  sprites: {
    // Padding between sprites in pixels
    padding: 2,

    // Maximum width of sprite sheet
    maxWidth: 2048,

    // Prefix for generated CSS classes
    prefix: 'sprite',

    // Output format
    format: 'png',

    // Quality setting (1-100)
    quality: 90,

    // Scale factor
    scale: 1,
  }
}

Placeholders

ts
{
  placeholders: {
    // Width of generated placeholder in pixels
    width: 20,

    // Quality setting (1-100)
    quality: 50,

    // Output format
    format: 'webp',

    // Blur strength (for blur strategy)
    blurLevel: 40,

    // Output as base64-encoded data URL
    base64Encode: true,

    // Use ThumbHash algorithm instead of blurring
    useThumbhash: false,

    // Placeholder generation strategy
    strategy: 'blur', // 'blur', 'pixelate', 'thumbhash', 'dominant-color'

    // Saturation adjustment for dominant-color strategy
    saturation: 1.2,

    // Generate CSS filter property
    cssFilter: false,
  }
}

Batch Processing

ts
{
  batch: {
    // Array of formats to convert to
    formats: ['webp'],

    // Quality setting (1-100) or format-specific settings
    quality: 80, // or { webp: 80, avif: 70, jpeg: 85 }

    // Resize options
    resize: { width: 1200, height: 800 },

    // Process subdirectories recursively
    recursive: false,

    // Regex pattern string to filter files
    filter: '\.(jpe?g|png|gif|bmp|tiff?)$',

    // Skip existing output files
    skipExisting: true,

    // Number of files to process concurrently
    concurrency: 4,

    // Preserve directory structure in output
    preserveStructure: true,

    // Template for output filenames
    filenameTemplate: '[name].[format]',

    // Preserve image metadata
    preserveMetadata: false,

    // Optimization preset
    optimizationPreset: 'web', // 'web', 'quality', 'performance'
  }
}

Image Optimization

ts
{
  optimization: {
    // Global settings
    quality: 80,
    lossless: false,
    progressive: true,
    effort: 7, // Compression effort (1-10)
    preserveMetadata: false,

    // Format-specific settings
    jpeg: {
      quality: 85,
      progressive: true,
      optimizeCoding: true,
      mozjpeg: true,
      chromaSubsampling: '4:2:0',
    },
    png: {
      quality: 80,
      progressive: true,
      compressionLevel: 9,
      effort: 7,
      palette: true, // Convert to palette-based PNG if possible
      adaptiveFiltering: true,
    },
    webp: {
      quality: 80,
      lossless: false,
      effort: 6,
      smartSubsample: true, // Reduce chroma subsampling in detailed areas
    },
    avif: {
      quality: 70,
      lossless: false,
      effort: 7,
    },
  }
}

Format Conversion

ts
{
  conversion: {
    quality: 80,
    lossless: false,
    progressive: true,
    filenamePrefix: '',
    filenameSuffix: '',
    preserveMetadata: false,
    optimizationLevel: 6,
    effort: 6,
    chromaSubsampling: '4:2:0',
    smartSubsample: true,
  }
}

Social Image Generation

ts
{
  social: {
    quality: 85,
    customSizes: {
      'og-github': { width: 1280, height: 640 },
      'og-facebook': { width: 1200, height: 630 },
      'og-twitter': { width: 1200, height: 600 },
      'og-linkedin': { width: 1104, height: 736 },
      'og-instagram': { width: 1080, height: 1080 },
    },
  }
}

Image Transformations

ts
{
  transformations: {
    // Default transformation chains that can be referred to by name
    presets: {
      webOptimized: [
        { type: 'resize', options: { width: 1200, withoutEnlargement: true } },
      ],
      thumbnail: [
        { type: 'resize', options: { width: 300, height: 300, fit: 'inside' } },
      ],
      grayscale: [
        { type: 'grayscale' },
      ],
      sharpen: [
        { type: 'sharpen', options: { sigma: 1 } },
      ],
    },
  }
}

Watermarking

ts
{
  watermark: {
    // Default text for watermarks (if not specified)
    defaultText: '© 2023 My Company',

    // Default image for watermarks (if not specified)
    defaultImage: 'path/to/watermark.png',

    // Position of the watermark
    position: 'bottom-right', // 'center', 'top', 'bottom', 'left', 'right', 'top-left', 'top-right', 'bottom-left', 'bottom-right'

    // Opacity of the watermark (0-1)
    opacity: 0.5,

    // Margin from the edge (in pixels)
    margin: 20,

    // Scale factor for image watermarks
    scale: 0.2,

    // Text watermark options
    textOptions: {
      font: 'sans-serif',
      fontSize: 24,
      color: 'rgba(255, 255, 255, 0.7)',
      background: 'rgba(0, 0, 0, 0.3)',
      padding: 10,
    },
  }
}

SVG Optimization

ts
{
  svg: {
    // Format SVG code (less compression but more readable)
    prettify: false,

    // Floating point precision
    precision: 3,

    // Apply multiple optimization passes
    multipass: true,

    // Remove comments
    removeComments: true,

    // Remove metadata
    removeMetadata: true,

    // Remove viewBox attribute
    removeViewBox: false,

    // Remove width/height attributes
    removeDimensions: true,

    // Remove hidden elements
    removeHiddenElements: true,

    // Remove empty attributes
    removeEmptyAttrs: true,

    // Remove empty containers
    removeEmptyContainers: true,

    // Remove unused namespaces
    removeUnusedNS: true,

    // Clean up IDs
    cleanupIDs: true,

    // Clean up numeric values
    cleanupNumericValues: true,

    // Clean up list of values
    cleanupListOfValues: true,

    // Collapse groups
    collapseGroups: true,

    // Convert colors to hex/rgba
    convertColors: true,

    // Optimize path data
    convertPathData: true,

    // Convert shapes to paths
    convertShapeToPath: true,

    // Convert style attributes to attributes
    convertStyleToAttrs: true,

    // Optimize transformations
    convertTransform: true,

    // Inline styles
    inlineStyles: true,

    // Minify styles
    minifyStyles: true,

    // Merge paths
    mergePaths: true,

    // Add prefix to IDs
    prefixIds: false, // or string prefix

    // Add prefix to class names
    prefixClassNames: false, // or string prefix

    // Remove xmlns attribute
    removeXMLNS: false,

    // Remove elements that are positioned off-canvas
    removeOffCanvasPaths: true,

    // Reuse identical paths
    reusePaths: true,

    // Sort attribute values
    sortAttrs: true,

    // Sort children of <defs>
    sortDefsChildren: true,

    // Remove DOCTYPE
    removeDoctype: true,

    // Remove XML processing instructions
    removeXMLProcInst: true,

    // Remove <title>
    removeTitle: false,

    // Remove <desc>
    removeDesc: false,

    // Remove <script>
    removeScriptElement: true,

    // Remove <style>
    removeStyleElement: false,
  }
}

Complete Example Configuration

Here's a complete example of an imgx configuration file:

ts
// imgx.config.ts
import type { ImgxConfig } from '@stacksjs/imgx'

const config: ImgxConfig = {
  // Core settings
  verbose: true,
  cache: true,
  cacheDir: '.imgx-cache',
  concurrent: 4,
  skipOptimized: false,

  // Default settings
  quality: 80,
  format: 'webp',
  progressive: true,
  preserveMetadata: false,

  // App icon generation
  appIcon: {
    outputDir: 'assets/app-icons',
    platform: 'all',
  },

  // Responsive images
  responsive: {
    sizes: [320, 640, 960, 1280, 1920],
    formats: ['webp', 'jpeg'],
    quality: 80,
    generateSrcset: true,
    filenameTemplate: '[name]-[width].[ext]',
  },

  // Placeholder images
  placeholders: {
    width: 20,
    quality: 50,
    format: 'webp',
    blurLevel: 40,
    base64Encode: true,
    useThumbhash: true,
    strategy: 'thumbhash',
  },

  // Format-specific optimization settings
  optimization: {
    jpeg: {
      quality: 85,
      progressive: true,
      mozjpeg: true,
    },
    webp: {
      quality: 80,
      lossless: false,
      effort: 6,
    },
    avif: {
      quality: 70,
      lossless: false,
      effort: 7,
    },
  },

  // SVG optimization
  svg: {
    removeComments: true,
    removeDimensions: true,
    removeViewBox: false,
    cleanupIDs: true,
  },
}

export default config

Environment-specific Configuration

You can create environment-specific configuration by using environment variables or conditions:

ts
// imgx.config.ts
import type { ImgxConfig } from '@stacksjs/imgx'

const isDev = process.env.NODE_ENV === 'development'

const config: ImgxConfig = {
  // Core settings
  verbose: isDev,
  cache: !isDev,

  // Development settings override production quality for faster processing
  quality: isDev ? 60 : 80,

  // Use different optimization settings in production
  optimization: {
    jpeg: {
      quality: isDev ? 70 : 85,
      progressive: !isDev, // Only enable progressive in production
    },
  },
}

export default config

Configuration Loading

imgx automatically looks for a configuration file in the following order:

  1. imgx.config.ts in the current directory
  2. imgx.config.js in the current directory
  3. imgx property in package.json

You can also specify a custom configuration file path using the --config CLI option:

bash
imgx optimize image.jpg --config ./custom-config.js

Released under the MIT License.