{
 "version": "0.1.0-alpha.1",
 "tools": [
  {
   "id": "image.convert",
   "name": "Convert Images",
   "description": "Convert images between PNG, JPEG, WebP, AVIF, GIF, BMP, TIFF, ICO, TGA, QOI and more, in bulk",
   "category": "image",
   "keywords": [
    "convert",
    "format",
    "png to jpg",
    "jpg to png",
    "webp",
    "avif",
    "heic",
    "batch",
    "transcode"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      },
      {
       "value": "heic",
       "label": "HEIC (ImageMagick)"
      },
      {
       "value": "jxl",
       "label": "JPEG XL (ImageMagick)"
      },
      {
       "value": "jp2",
       "label": "JPEG 2000 (ImageMagick)"
      },
      {
       "value": "psd",
       "label": "PSD (ImageMagick)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 85,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "jpg",
       "webp",
       "avif",
       "heic",
       "jxl",
       "jp2"
      ]
     }
    },
    {
     "name": "lossless",
     "label": "Lossless",
     "description": "Lossless WebP encoding",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "webp"
      ]
     }
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Background used when flattening transparency (e.g. PNG → JPEG)",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.resize",
   "name": "Resize Images",
   "description": "Resize images in bulk by width, height or percentage with contain/cover/fill/exact fit modes",
   "category": "image",
   "keywords": [
    "resize",
    "scale",
    "shrink",
    "enlarge",
    "dimensions",
    "batch",
    "downscale"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Target width in pixels",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "description": "Target height in pixels",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "percent",
     "label": "Percent",
     "description": "Scale by percentage instead of pixel size",
     "type": "number",
     "min": 0.1,
     "max": 10000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "fit",
     "label": "Fit",
     "description": "How to fit when both width and height are given",
     "type": "enum",
     "options": [
      {
       "value": "contain",
       "label": "Contain (fit inside, keep aspect)"
      },
      {
       "value": "cover",
       "label": "Cover (fill box, crop overflow)"
      },
      {
       "value": "fill",
       "label": "Fill (fit inside, pad to exact size)"
      },
      {
       "value": "exact",
       "label": "Exact (stretch to size)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "contain",
     "advanced": false,
     "primary": false
    },
    {
     "name": "filter",
     "label": "Filter",
     "type": "enum",
     "options": [
      {
       "value": "lanczos",
       "label": "Lanczos (sharpest)"
      },
      {
       "value": "bicubic",
       "label": "Bicubic"
      },
      {
       "value": "bilinear",
       "label": "Bilinear"
      },
      {
       "value": "gaussian",
       "label": "Gaussian"
      },
      {
       "value": "nearest",
       "label": "Nearest neighbor (pixel art)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "lanczos",
     "advanced": true,
     "primary": false
    },
    {
     "name": "no_upscale",
     "label": "Don't enlarge",
     "description": "Never make images larger than the original",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      },
      {
       "value": "heic",
       "label": "HEIC (ImageMagick)"
      },
      {
       "value": "jxl",
       "label": "JPEG XL (ImageMagick)"
      },
      {
       "value": "jp2",
       "label": "JPEG 2000 (ImageMagick)"
      },
      {
       "value": "psd",
       "label": "PSD (ImageMagick)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 85,
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Padding color for 'fill' and flattening for JPEG",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.thumbnail",
   "name": "Create Thumbnails",
   "description": "Generate small thumbnails for many images at once (square crop or fit inside a box)",
   "category": "image",
   "keywords": [
    "thumbnail",
    "thumb",
    "preview",
    "small",
    "batch"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "size",
     "label": "Size",
     "description": "Maximum edge length in pixels",
     "type": "integer",
     "min": 8,
     "max": 4096,
     "required": false,
     "default": 256,
     "advanced": false,
     "primary": false
    },
    {
     "name": "square",
     "label": "Square",
     "description": "Center-crop to a square",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "jpg",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 80,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.compress",
   "name": "Compress Images",
   "description": "Reduce image file size: lossy JPEG/WebP/AVIF re-encoding and lossless PNG optimization (oxipng), in bulk",
   "category": "image",
   "keywords": [
    "compress",
    "optimize",
    "reduce size",
    "smaller",
    "oxipng",
    "tinypng",
    "shrink",
    "batch"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 75,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "png",
       "label": "PNG (lossless)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_dimension",
     "label": "Max dimension",
     "description": "Also downscale so the longest edge is at most this many pixels",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "png_level",
     "label": "Png level",
     "description": "Lossless PNG optimization effort (0–6)",
     "type": "integer",
     "min": 0,
     "max": 6,
     "required": false,
     "default": 2,
     "advanced": true,
     "primary": false
    },
    {
     "name": "keep_if_larger",
     "label": "Keep original if smaller",
     "description": "Return the original file when re-encoding would make it larger",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.info",
   "name": "Image Info",
   "description": "Show image dimensions, format, color type, bit depth, transparency, DPI, frame count, file size and aspect ratio",
   "category": "image",
   "keywords": [
    "info",
    "dimensions",
    "size",
    "resolution",
    "inspect",
    "properties",
    "bit depth"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.colorspace",
   "name": "Convert Color Space",
   "description": "Convert images between sRGB, CMYK, Lab, grayscale and linear RGB using ImageMagick, optionally with an ICC profile",
   "category": "image",
   "keywords": [
    "cmyk",
    "rgb",
    "lab",
    "colorspace",
    "color space",
    "print",
    "grayscale",
    "icc"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "colorspace",
     "label": "Colorspace",
     "type": "enum",
     "options": [
      {
       "value": "sRGB",
       "label": "sRGB"
      },
      {
       "value": "CMYK",
       "label": "CMYK (print)"
      },
      {
       "value": "Lab",
       "label": "CIE Lab"
      },
      {
       "value": "Gray",
       "label": "Grayscale"
      },
      {
       "value": "RGB",
       "label": "Linear RGB"
      },
      {
       "value": "HSL",
       "label": "HSL"
      },
      {
       "value": "YCbCr",
       "label": "YCbCr"
      }
     ],
     "multi": false,
     "required": false,
     "default": "CMYK",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto (TIFF for CMYK/Lab)"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "same",
       "label": "Same as input"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "profile",
     "label": "ICC profile",
     "description": "Optional target ICC profile (.icc/.icm) for accurate conversion",
     "type": "file",
     "accept": [
      ".icc",
      ".icm"
     ],
     "multiple": false,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 85,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "imagemagick"
   ],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.gif_frames",
   "name": "Extract Animation Frames",
   "description": "Extract the frames of an animated GIF, WebP or APNG as PNG images, with their delays",
   "category": "image",
   "keywords": [
    "gif",
    "frames",
    "extract",
    "animation",
    "split gif",
    "apng",
    "webp"
   ],
   "params": [
    {
     "name": "input",
     "label": "Animation",
     "type": "file",
     "accept": [
      ".gif",
      ".webp",
      ".png",
      ".apng"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "every",
     "label": "Every Nth frame",
     "description": "Keep every Nth frame",
     "type": "integer",
     "min": 1,
     "max": 1000,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_frames",
     "label": "Max frames",
     "description": "Stop after this many extracted frames",
     "type": "integer",
     "min": 1,
     "max": 2000,
     "required": false,
     "default": 300,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.icons",
   "name": "Generate Icons",
   "description": "Generate square PNG icons in many sizes plus a multi-resolution .ico from one image or SVG",
   "category": "image",
   "keywords": [
    "icon",
    "ico",
    "app icon",
    "sizes",
    "png icons",
    "windows icon"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "sizes",
     "label": "Sizes",
     "type": "enum",
     "options": [
      {
       "value": "16",
       "label": "16"
      },
      {
       "value": "24",
       "label": "24"
      },
      {
       "value": "32",
       "label": "32"
      },
      {
       "value": "48",
       "label": "48"
      },
      {
       "value": "64",
       "label": "64"
      },
      {
       "value": "96",
       "label": "96"
      },
      {
       "value": "128",
       "label": "128"
      },
      {
       "value": "180",
       "label": "180"
      },
      {
       "value": "192",
       "label": "192"
      },
      {
       "value": "256",
       "label": "256"
      },
      {
       "value": "512",
       "label": "512"
      },
      {
       "value": "1024",
       "label": "1024"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "16",
      "32",
      "48",
      "64",
      "128",
      "256",
      "512"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "ico",
     "label": "Also create .ico",
     "description": "Multi-size Windows icon (sizes up to 256)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "pad",
       "label": "Fit and pad to square"
      },
      {
       "value": "crop",
       "label": "Center-crop to square"
      },
      {
       "value": "stretch",
       "label": "Stretch"
      }
     ],
     "multi": false,
     "required": false,
     "default": "pad",
     "advanced": false,
     "primary": false
    },
    {
     "name": "padding",
     "label": "Padding",
     "description": "Inner padding as a fraction of the size (0–0.4)",
     "type": "number",
     "min": 0,
     "max": 0.4,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Background (default transparent)",
     "type": "color",
     "required": false,
     "default": "#00000000",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.favicon",
   "name": "Favicon Generator",
   "description": "Create a complete favicon package: favicon.ico, PNG favicons, Apple touch icon, Android icons, site.webmanifest and HTML tags",
   "category": "image",
   "keywords": [
    "favicon",
    "ico",
    "apple-touch-icon",
    "webmanifest",
    "website icon",
    "pwa"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "app_name",
     "label": "App name",
     "description": "Name used in site.webmanifest",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "My Site",
     "advanced": false,
     "primary": false
    },
    {
     "name": "short_name",
     "label": "Short name",
     "description": "Short name for home screens",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "theme_color",
     "label": "Theme color",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "background_color",
     "label": "Background color",
     "description": "Background of the Apple touch icon and PWA splash",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "apple_padding",
     "label": "Apple padding",
     "description": "Padding around the Apple touch icon content (fraction)",
     "type": "number",
     "min": 0,
     "max": 0.4,
     "required": false,
     "default": 0.1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "path_prefix",
     "label": "Path prefix",
     "description": "URL prefix for the icon links, e.g. /static/",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "/",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.crop",
   "name": "Crop Image",
   "description": "Crop images to a rectangle or to an aspect ratio (centered or anchored)",
   "category": "image",
   "keywords": [
    "crop",
    "trim",
    "cut",
    "aspect ratio",
    "square"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "rect",
       "label": "Rectangle"
      },
      {
       "value": "aspect",
       "label": "Aspect ratio"
      }
     ],
     "multi": false,
     "required": false,
     "default": "rect",
     "advanced": false,
     "primary": false
    },
    {
     "name": "x",
     "label": "X",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "rect"
      ]
     }
    },
    {
     "name": "y",
     "label": "Y",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "rect"
      ]
     }
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "rect"
      ]
     }
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "rect"
      ]
     }
    },
    {
     "name": "aspect",
     "label": "Aspect ratio",
     "description": "Ratio like 1:1, 4:3, 16:9 or a decimal",
     "type": "text",
     "multiline": false,
     "placeholder": "16:9",
     "required": false,
     "default": "1:1",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "aspect"
      ]
     }
    },
    {
     "name": "anchor",
     "label": "Anchor",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "top-left",
       "label": "Top left"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "left",
       "label": "Left"
      },
      {
       "value": "right",
       "label": "Right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "bottom-right",
       "label": "Bottom right"
      }
     ],
     "multi": false,
     "required": false,
     "default": "center",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "aspect"
      ]
     }
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "ui": "crop",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.rotate_flip",
   "name": "Rotate & Flip",
   "description": "Rotate images by 90/180/270 degrees or any angle, and flip horizontally or vertically, in bulk",
   "category": "image",
   "keywords": [
    "rotate",
    "flip",
    "mirror",
    "turn",
    "straighten",
    "orientation"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "angle",
     "label": "Angle",
     "description": "Clockwise rotation in degrees (90, 180, 270 are lossless in pixels; others expand the canvas)",
     "type": "number",
     "min": -360,
     "max": 360,
     "required": false,
     "default": 90,
     "advanced": false,
     "primary": false
    },
    {
     "name": "flip_horizontal",
     "label": "Flip horizontal",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "flip_vertical",
     "label": "Flip vertical",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Fill for corners exposed by arbitrary angles",
     "type": "color",
     "required": false,
     "default": "#00000000",
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.adjust",
   "name": "Adjust & Filter",
   "description": "Adjust brightness, contrast, saturation, hue and gamma; apply grayscale, sepia, invert, blur or sharpen, in bulk",
   "category": "image",
   "keywords": [
    "brightness",
    "contrast",
    "saturation",
    "hue",
    "gamma",
    "grayscale",
    "black and white",
    "sepia",
    "invert",
    "blur",
    "sharpen",
    "filter"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "brightness",
     "label": "Brightness",
     "type": "number",
     "min": -100,
     "max": 100,
     "step": 1,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "contrast",
     "label": "Contrast",
     "type": "number",
     "min": -100,
     "max": 100,
     "step": 1,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "saturation",
     "label": "Saturation",
     "type": "number",
     "min": -100,
     "max": 100,
     "step": 1,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "hue",
     "label": "Hue shift (°)",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 1,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "gamma",
     "label": "Gamma",
     "type": "number",
     "min": 0.1,
     "max": 5,
     "step": 0.05,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "grayscale",
     "label": "Grayscale",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sepia",
     "label": "Sepia",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "invert",
     "label": "Invert",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "blur",
     "label": "Blur radius (σ)",
     "type": "number",
     "min": 0,
     "max": 100,
     "step": 0.5,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sharpen",
     "label": "Sharpen amount",
     "type": "number",
     "min": 0,
     "max": 10,
     "step": 0.1,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.watermark",
   "name": "Watermark Images",
   "description": "Add a text or image watermark to many images, with position, opacity, rotation and tiling",
   "category": "image",
   "keywords": [
    "watermark",
    "logo",
    "copyright",
    "stamp",
    "overlay",
    "brand",
    "protect"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "text",
       "label": "Text"
      },
      {
       "value": "image",
       "label": "Image / logo"
      }
     ],
     "multi": false,
     "required": false,
     "default": "text",
     "advanced": false,
     "primary": false
    },
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "© Dogubako",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "font_size",
     "label": "Text size (% of image width)",
     "type": "number",
     "min": 0.5,
     "max": 50,
     "required": false,
     "default": 5,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "color",
     "label": "Color",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "watermark",
     "label": "Watermark image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "image"
      ]
     }
    },
    {
     "name": "scale",
     "label": "Logo width (% of image width)",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 20,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "image"
      ]
     }
    },
    {
     "name": "opacity",
     "label": "Opacity",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "required": false,
     "default": 0.5,
     "advanced": false,
     "primary": false
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "top-left",
       "label": "Top left"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "left",
       "label": "Left"
      },
      {
       "value": "right",
       "label": "Right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "bottom-right",
       "label": "Bottom right"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bottom-right",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin (% of width)",
     "type": "number",
     "min": 0,
     "max": 25,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "tile",
     "label": "Tile",
     "description": "Repeat the watermark across the whole image",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "rotation",
     "label": "Rotation (°)",
     "type": "number",
     "min": -180,
     "max": 180,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "spacing",
     "label": "Spacing",
     "description": "Gap between tiles relative to the watermark size",
     "type": "number",
     "min": 0,
     "max": 5,
     "required": false,
     "default": 0.6,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "tile",
      "values": [
       true
      ]
     }
    },
    {
     "name": "shadow",
     "label": "Shadow",
     "description": "Add a subtle dark shadow behind text for legibility",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.combine",
   "name": "Combine Images",
   "description": "Stitch images side by side, top to bottom or into a grid",
   "category": "image",
   "keywords": [
    "combine",
    "merge",
    "stitch",
    "collage",
    "join",
    "side by side",
    "grid",
    "montage"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images (in order)",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "direction",
     "label": "Direction",
     "type": "enum",
     "options": [
      {
       "value": "horizontal",
       "label": "Horizontal"
      },
      {
       "value": "vertical",
       "label": "Vertical"
      },
      {
       "value": "grid",
       "label": "Grid"
      }
     ],
     "multi": false,
     "required": false,
     "default": "horizontal",
     "advanced": false,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Columns",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "direction",
      "values": [
       "grid"
      ]
     }
    },
    {
     "name": "match_size",
     "label": "Match size",
     "description": "Scale images to the same height (horizontal), width (vertical) or cell (grid)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "spacing",
     "label": "Spacing",
     "description": "Gap between images in pixels",
     "type": "integer",
     "min": 0,
     "max": 1000,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "align",
     "label": "Align",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "start",
       "label": "Start (top/left)"
      },
      {
       "value": "end",
       "label": "End (bottom/right)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "center",
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.split",
   "name": "Split Image into Tiles",
   "description": "Cut an image into a grid of tiles by rows × columns or by tile size (e.g. for Instagram grids)",
   "category": "image",
   "keywords": [
    "split",
    "slice",
    "tiles",
    "grid",
    "cut",
    "instagram grid",
    "chop"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "grid",
       "label": "Rows × columns"
      },
      {
       "value": "size",
       "label": "Tile size"
      }
     ],
     "multi": false,
     "required": false,
     "default": "grid",
     "advanced": false,
     "primary": false
    },
    {
     "name": "rows",
     "label": "Rows",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "grid"
      ]
     }
    },
    {
     "name": "columns",
     "label": "Columns",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "grid"
      ]
     }
    },
    {
     "name": "tile_width",
     "label": "Tile width",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 512,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "size"
      ]
     }
    },
    {
     "name": "tile_height",
     "label": "Tile height",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 512,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "size"
      ]
     }
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.compare",
   "name": "Compare Images",
   "description": "Compare two images: highlighted difference image, % of differing pixels, MSE, PSNR and SSIM",
   "category": "image",
   "keywords": [
    "compare",
    "diff",
    "difference",
    "psnr",
    "ssim",
    "visual regression",
    "similarity"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image A",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "other",
     "label": "Image B",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "tolerance",
     "label": "Tolerance",
     "description": "Per-channel difference (0–255) ignored as noise",
     "type": "integer",
     "min": 0,
     "max": 255,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "resize_to_match",
     "label": "Resize to match",
     "description": "Resize B to A's size if dimensions differ",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.contact_sheet",
   "name": "Contact Sheet",
   "description": "Lay out many images as labeled thumbnails on a single sheet",
   "category": "image",
   "keywords": [
    "contact sheet",
    "overview",
    "thumbnails",
    "proof sheet",
    "index print",
    "gallery"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "columns",
     "label": "Columns",
     "type": "integer",
     "min": 1,
     "max": 50,
     "required": false,
     "default": 5,
     "advanced": false,
     "primary": false
    },
    {
     "name": "thumb_size",
     "label": "Thumb size",
     "description": "Thumbnail cell size in pixels",
     "type": "integer",
     "min": 16,
     "max": 2048,
     "required": false,
     "default": 240,
     "advanced": false,
     "primary": false
    },
    {
     "name": "labels",
     "label": "Labels",
     "description": "Print file names under the thumbnails",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "title",
     "label": "Title",
     "description": "Optional heading at the top",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "spacing",
     "label": "Spacing",
     "type": "integer",
     "min": 0,
     "max": 200,
     "required": false,
     "default": 12,
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": true,
     "primary": false
    },
    {
     "name": "text_color",
     "label": "Text color",
     "type": "color",
     "required": false,
     "default": "#222222",
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "png",
       "label": "PNG"
      }
     ],
     "multi": false,
     "required": false,
     "default": "jpg",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.sprite_sheet",
   "name": "Sprite Sheet",
   "description": "Pack images into a CSS sprite sheet with generated CSS classes and JSON coordinates",
   "category": "image",
   "keywords": [
    "sprite",
    "spritesheet",
    "css sprite",
    "atlas",
    "texture atlas",
    "game"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "layout",
     "label": "Layout",
     "type": "enum",
     "options": [
      {
       "value": "grid",
       "label": "Grid"
      },
      {
       "value": "horizontal",
       "label": "Horizontal strip"
      },
      {
       "value": "vertical",
       "label": "Vertical strip"
      }
     ],
     "multi": false,
     "required": false,
     "default": "grid",
     "advanced": false,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Columns",
     "description": "Grid columns (empty = square-ish)",
     "type": "integer",
     "min": 1,
     "max": 1000,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "layout",
      "values": [
       "grid"
      ]
     }
    },
    {
     "name": "padding",
     "label": "Padding",
     "description": "Pixels between sprites",
     "type": "integer",
     "min": 0,
     "max": 256,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "cell_size",
     "label": "Cell size",
     "description": "Resize every sprite to fit this square cell (empty = keep sizes)",
     "type": "integer",
     "min": 1,
     "max": 4096,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "class_prefix",
     "label": "Class prefix",
     "description": "CSS class prefix",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "sprite",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.redact",
   "name": "Redact Regions",
   "description": "Blur, pixelate or black out rectangular regions of an image (faces, license plates, personal data)",
   "category": "image",
   "keywords": [
    "redact",
    "blur",
    "pixelate",
    "censor",
    "anonymize",
    "hide",
    "privacy",
    "black box"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "regions",
     "label": "Regions",
     "description": "JSON list of {x, y, width, height} rectangles in pixels",
     "type": "json",
     "schema": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "x": {
         "type": "number"
        },
        "y": {
         "type": "number"
        },
        "width": {
         "type": "number"
        },
        "height": {
         "type": "number"
        }
       },
       "required": [
        "x",
        "y",
        "width",
        "height"
       ]
      }
     },
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "blur",
       "label": "Blur"
      },
      {
       "value": "pixelate",
       "label": "Pixelate"
      },
      {
       "value": "fill",
       "label": "Solid box"
      }
     ],
     "multi": false,
     "required": false,
     "default": "blur",
     "advanced": false,
     "primary": false
    },
    {
     "name": "strength",
     "label": "Strength",
     "description": "Blur radius / pixel block size relative to the region (%)",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 25,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "blur",
       "pixelate"
      ]
     }
    },
    {
     "name": "color",
     "label": "Box color",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "fill"
      ]
     }
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "face-redact",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.denoise",
   "name": "Reduce Noise",
   "description": "Remove image noise with an edge-preserving bilateral filter or a median filter (great for salt-and-pepper noise)",
   "category": "image",
   "keywords": [
    "denoise",
    "noise reduction",
    "grain",
    "median",
    "bilateral",
    "smooth",
    "clean"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "bilateral",
       "label": "Bilateral (edge preserving)"
      },
      {
       "value": "median",
       "label": "Median (salt & pepper)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bilateral",
     "advanced": false,
     "primary": false
    },
    {
     "name": "radius",
     "label": "Radius",
     "type": "integer",
     "min": 1,
     "max": 10,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "strength",
     "label": "Strength",
     "description": "Color similarity range for the bilateral filter",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 25,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "method",
      "values": [
       "bilateral"
      ]
     }
    },
    {
     "name": "format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO (max 256px)"
      },
      {
       "value": "tga",
       "label": "TGA"
      },
      {
       "value": "qoi",
       "label": "QOI"
      },
      {
       "value": "ppm",
       "label": "PPM/PNM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.metadata",
   "name": "View Image Metadata",
   "description": "Inspect EXIF metadata (camera, lens, date, GPS location...) natively, or all metadata (XMP, IPTC, ICC, maker notes) with ExifTool",
   "category": "image",
   "keywords": [
    "exif",
    "metadata",
    "xmp",
    "iptc",
    "gps",
    "camera",
    "location",
    "exiftool",
    "inspect"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "engine",
     "label": "Engine",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto (ExifTool if installed)"
      },
      {
       "value": "native",
       "label": "Built-in EXIF reader"
      },
      {
       "value": "exiftool",
       "label": "ExifTool (all metadata)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.strip_metadata",
   "name": "Remove Image Metadata",
   "description": "Remove EXIF, GPS location, XMP, IPTC and comments from photos without re-encoding (JPEG, PNG, WebP natively; other formats via ExifTool)",
   "category": "image",
   "keywords": [
    "strip",
    "remove exif",
    "privacy",
    "gps",
    "metadata",
    "clean",
    "anonymize",
    "location"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "keep_orientation",
     "label": "Keep orientation",
     "description": "Keep the EXIF orientation so photos stay upright",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "keep_icc",
     "label": "Keep color profile",
     "description": "Keep the embedded ICC color profile",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.svg_to_raster",
   "name": "SVG to PNG/JPEG/WebP",
   "description": "Rasterize SVG files to PNG, JPEG, WebP or other formats at any size or scale",
   "category": "image",
   "keywords": [
    "svg",
    "rasterize",
    "png",
    "vector",
    "render",
    "export"
   ],
   "params": [
    {
     "name": "input",
     "label": "SVG files",
     "type": "file",
     "accept": [
      ".svg",
      ".svgz",
      "image/svg+xml"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      },
      {
       "value": "avif",
       "label": "AVIF"
      },
      {
       "value": "bmp",
       "label": "BMP"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      },
      {
       "value": "ico",
       "label": "ICO"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Output width in pixels (keeps aspect ratio if height is empty)",
     "type": "integer",
     "min": 1,
     "max": 20000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "description": "Output height in pixels",
     "type": "integer",
     "min": 1,
     "max": 20000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "scale",
     "label": "Scale",
     "description": "Scale factor relative to the SVG's own size (used when width/height are empty)",
     "type": "number",
     "min": 0.01,
     "max": 64,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Background color; leave empty for transparent",
     "type": "color",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 85,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.svg_optimize",
   "name": "Optimize SVG",
   "description": "Safely minify SVG files: strip comments, metadata, editor data (Inkscape, Illustrator, Sketch...) and whitespace, optionally round numbers",
   "category": "image",
   "keywords": [
    "svg",
    "minify",
    "svgo",
    "compress",
    "clean",
    "vector"
   ],
   "params": [
    {
     "name": "input",
     "label": "SVG files",
     "type": "file",
     "accept": [
      ".svg",
      "image/svg+xml"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "precision",
     "label": "Precision",
     "description": "Round coordinates to this many decimals (empty = keep numbers exactly)",
     "type": "integer",
     "min": 0,
     "max": 8,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_metadata",
     "label": "Remove metadata",
     "description": "Remove <metadata> blocks (RDF, licenses embedded by editors)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_editor_data",
     "label": "Remove editor data",
     "description": "Remove Inkscape/Sodipodi/Illustrator/Sketch/Figma namespaced elements and attributes",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_comments",
     "label": "Remove comments",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "collapse_whitespace",
     "label": "Collapse whitespace",
     "description": "Remove whitespace between tags (text content is preserved)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.face_detect",
   "name": "Detect Faces",
   "description": "Find faces in a photo locally (SeetaFace model) and return their bounding boxes with an annotated preview",
   "category": "image",
   "keywords": [
    "face",
    "detect",
    "faces",
    "find faces",
    "privacy",
    "people"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "min_face_size",
     "label": "Min face size",
     "description": "Smallest face to look for, in pixels",
     "type": "integer",
     "min": 20,
     "max": 2000,
     "required": false,
     "default": 40,
     "advanced": true,
     "primary": false
    },
    {
     "name": "threshold",
     "label": "Threshold",
     "description": "Detection score threshold (higher = fewer false positives)",
     "type": "number",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 2,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "requires_model": "face-detection",
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "model",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.face_blur",
   "name": "Blur Faces",
   "description": "Automatically detect and blur, pixelate or black out faces in photos; returns the regions for review",
   "category": "image",
   "keywords": [
    "blur faces",
    "anonymize",
    "privacy",
    "pixelate faces",
    "censor",
    "gdpr",
    "redact"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "blur",
       "label": "Blur"
      },
      {
       "value": "pixelate",
       "label": "Pixelate"
      },
      {
       "value": "fill",
       "label": "Solid box"
      }
     ],
     "multi": false,
     "required": false,
     "default": "blur",
     "advanced": false,
     "primary": false
    },
    {
     "name": "strength",
     "label": "Strength",
     "description": "Blur radius / pixel block size relative to the region (%)",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 25,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "blur",
       "pixelate"
      ]
     }
    },
    {
     "name": "color",
     "label": "Box color",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "fill"
      ]
     }
    },
    {
     "name": "padding",
     "label": "Padding",
     "description": "Grow each face box by this percentage",
     "type": "number",
     "min": 0,
     "max": 100,
     "required": false,
     "default": 20,
     "advanced": false,
     "primary": false
    },
    {
     "name": "extra_regions",
     "label": "Extra regions",
     "description": "Additional {x, y, width, height} rectangles to redact (first image)",
     "type": "json",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "min_face_size",
     "label": "Min face size",
     "description": "Smallest face to look for, in pixels",
     "type": "integer",
     "min": 20,
     "max": 2000,
     "required": false,
     "default": 40,
     "advanced": true,
     "primary": false
    },
    {
     "name": "threshold",
     "label": "Threshold",
     "description": "Detection score threshold (higher = fewer false positives)",
     "type": "number",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 2,
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Quality for lossy formats (JPEG, WebP, AVIF), 1–100",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 92,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "requires_model": "face-detection",
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "model",
   "version": "1.0.0",
   "ui": "face-redact",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.ocr",
   "name": "Extract Text (OCR)",
   "description": "Recognize text in images with Tesseract OCR: plain text, word boxes with confidence, TSV or hOCR",
   "category": "image",
   "keywords": [
    "ocr",
    "text recognition",
    "extract text",
    "scan",
    "tesseract",
    "image to text",
    "read text"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "languages",
     "label": "Languages",
     "description": "Tesseract language codes joined with '+', e.g. eng+deu",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "eng",
     "advanced": false,
     "primary": false
    },
    {
     "name": "psm",
     "label": "Page segmentation",
     "type": "enum",
     "options": [
      {
       "value": "3",
       "label": "Automatic page layout"
      },
      {
       "value": "4",
       "label": "Single column of text"
      },
      {
       "value": "6",
       "label": "Single uniform block"
      },
      {
       "value": "7",
       "label": "Single line"
      },
      {
       "value": "8",
       "label": "Single word"
      },
      {
       "value": "11",
       "label": "Sparse text"
      },
      {
       "value": "12",
       "label": "Sparse text with OSD"
      }
     ],
     "multi": false,
     "required": false,
     "default": "3",
     "advanced": false,
     "primary": false
    },
    {
     "name": "output",
     "label": "Output",
     "type": "enum",
     "options": [
      {
       "value": "txt",
       "label": "Plain text"
      },
      {
       "value": "tsv",
       "label": "TSV with word boxes"
      },
      {
       "value": "hocr",
       "label": "hOCR (HTML)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "txt",
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_confidence",
     "label": "Min confidence",
     "description": "Hide word boxes below this confidence (0–100)",
     "type": "number",
     "min": 0,
     "max": 100,
     "required": false,
     "default": 30,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "tesseract"
   ],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.remove_background",
   "name": "Remove Background",
   "description": "Cut out the subject and make the background transparent using local rembg (U²-Net / IS-Net models)",
   "category": "image",
   "keywords": [
    "remove background",
    "background eraser",
    "cutout",
    "transparent",
    "rembg",
    "remove bg",
    "segmentation"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "model",
     "label": "Model",
     "type": "enum",
     "options": [
      {
       "value": "u2net",
       "label": "U²-Net (general)"
      },
      {
       "value": "u2netp",
       "label": "U²-Net lite (fast)"
      },
      {
       "value": "u2net_human_seg",
       "label": "Human segmentation"
      },
      {
       "value": "isnet-general-use",
       "label": "IS-Net (general, sharper)"
      },
      {
       "value": "isnet-anime",
       "label": "IS-Net anime"
      },
      {
       "value": "silueta",
       "label": "Silueta (small)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "u2net",
     "advanced": false,
     "primary": false
    },
    {
     "name": "alpha_matting",
     "label": "Alpha matting",
     "description": "Refine soft edges such as hair (slower)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "mask_only",
     "label": "Mask only",
     "description": "Output the black/white mask instead of the cutout",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "rembg"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.upscale",
   "name": "AI Upscale",
   "description": "Enlarge images 2×, 3× or 4× with Real-ESRGAN, restoring detail locally on the GPU (Vulkan)",
   "category": "image",
   "keywords": [
    "upscale",
    "super resolution",
    "enlarge",
    "esrgan",
    "enhance",
    "ai",
    "increase resolution"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "scale",
     "label": "Scale",
     "type": "enum",
     "options": [
      {
       "value": "2",
       "label": "2×"
      },
      {
       "value": "3",
       "label": "3×"
      },
      {
       "value": "4",
       "label": "4×"
      }
     ],
     "multi": false,
     "required": false,
     "default": "4",
     "advanced": false,
     "primary": false
    },
    {
     "name": "model",
     "label": "Model",
     "type": "enum",
     "options": [
      {
       "value": "realesrgan-x4plus",
       "label": "Photo (Real-ESRGAN x4plus)"
      },
      {
       "value": "realesrgan-x4plus-anime",
       "label": "Illustration / anime"
      },
      {
       "value": "realesr-animevideov3",
       "label": "Anime video frames (fast)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "realesrgan-x4plus",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "realesrgan"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "image.dominant_colors",
   "name": "Dominant Colors",
   "description": "Find the dominant colors of an image with their share of the picture (median cut + k-means)",
   "category": "image",
   "keywords": [
    "dominant color",
    "main colors",
    "average color",
    "color analysis",
    "kmeans"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "count",
     "label": "Count",
     "type": "integer",
     "min": 1,
     "max": 16,
     "required": false,
     "default": 5,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "color",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.convert",
   "name": "Convert Video",
   "description": "Convert videos between containers and codecs (MP4/H.264, H.265, WebM/VP9, AV1, MKV, MOV, AVI, GIF) with quality control and optional GPU encoding",
   "category": "video",
   "keywords": [
    "transcode",
    "mp4",
    "webm",
    "mkv",
    "mov",
    "avi",
    "h264",
    "h265",
    "hevc",
    "vp9",
    "av1",
    "prores",
    "format"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "mp4",
       "label": "MP4"
      },
      {
       "value": "webm",
       "label": "WebM"
      },
      {
       "value": "mkv",
       "label": "MKV (Matroska)"
      },
      {
       "value": "mov",
       "label": "MOV (QuickTime)"
      },
      {
       "value": "avi",
       "label": "AVI"
      },
      {
       "value": "gif",
       "label": "Animated GIF"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp4",
     "advanced": false,
     "primary": false
    },
    {
     "name": "video_codec",
     "label": "Video codec",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto (best for container)"
      },
      {
       "value": "h264",
       "label": "H.264 / AVC"
      },
      {
       "value": "h265",
       "label": "H.265 / HEVC"
      },
      {
       "value": "vp9",
       "label": "VP9"
      },
      {
       "value": "av1",
       "label": "AV1"
      },
      {
       "value": "vp8",
       "label": "VP8"
      },
      {
       "value": "mpeg4",
       "label": "MPEG-4 Part 2"
      },
      {
       "value": "prores",
       "label": "Apple ProRes"
      },
      {
       "value": "copy",
       "label": "Copy (no re-encode)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp4",
       "webm",
       "mkv",
       "mov",
       "avi"
      ]
     }
    },
    {
     "name": "audio_codec",
     "label": "Audio codec",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto"
      },
      {
       "value": "aac",
       "label": "AAC"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "vorbis",
       "label": "Vorbis"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "pcm",
       "label": "PCM (uncompressed)"
      },
      {
       "value": "ac3",
       "label": "AC-3"
      },
      {
       "value": "copy",
       "label": "Copy"
      },
      {
       "value": "none",
       "label": "Remove audio"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp4",
       "webm",
       "mkv",
       "mov",
       "avi"
      ]
     }
    },
    {
     "name": "quality",
     "label": "Quality",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Small file"
      },
      {
       "value": "custom",
       "label": "Custom CRF"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": false,
     "primary": false
    },
    {
     "name": "crf",
     "label": "Crf",
     "description": "Codec-native constant quality value (lower = better)",
     "type": "integer",
     "min": 0,
     "max": 63,
     "required": false,
     "default": 23,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "quality",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "speed",
     "label": "Speed",
     "type": "enum",
     "options": [
      {
       "value": "fast",
       "label": "Fast"
      },
      {
       "value": "medium",
       "label": "Medium"
      },
      {
       "value": "slow",
       "label": "Slow (smaller)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    },
    {
     "name": "audio_bitrate",
     "label": "Audio bitrate (kbit/s)",
     "type": "integer",
     "min": 32,
     "max": 512,
     "required": false,
     "default": 160,
     "advanced": true,
     "primary": false
    },
    {
     "name": "hardware",
     "label": "Hardware",
     "description": "Use a hardware encoder when present (falls back to software)",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "Software only"
      },
      {
       "value": "auto",
       "label": "Auto (use GPU if available)"
      },
      {
       "value": "nvenc",
       "label": "NVIDIA NVENC"
      },
      {
       "value": "qsv",
       "label": "Intel Quick Sync"
      },
      {
       "value": "vaapi",
       "label": "VA-API"
      },
      {
       "value": "videotoolbox",
       "label": "Apple VideoToolbox"
      },
      {
       "value": "amf",
       "label": "AMD AMF"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.compress",
   "name": "Compress Video",
   "description": "Shrink videos by quality level or to a target file size (two-pass bitrate), optionally capping the resolution",
   "category": "video",
   "keywords": [
    "reduce size",
    "smaller",
    "shrink",
    "target size",
    "bitrate",
    "2-pass",
    "email",
    "discord"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "quality",
       "label": "By quality level"
      },
      {
       "value": "size",
       "label": "To a target file size"
      }
     ],
     "multi": false,
     "required": false,
     "default": "quality",
     "advanced": false,
     "primary": false
    },
    {
     "name": "level",
     "label": "Level",
     "type": "enum",
     "options": [
      {
       "value": "light",
       "label": "Light (best quality)"
      },
      {
       "value": "balanced",
       "label": "Balanced"
      },
      {
       "value": "strong",
       "label": "Strong (smallest)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "balanced",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "quality"
      ]
     }
    },
    {
     "name": "target_mb",
     "label": "Target size (MB)",
     "type": "number",
     "min": 0.1,
     "max": 100000,
     "required": false,
     "default": 25,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "size"
      ]
     }
    },
    {
     "name": "max_resolution",
     "label": "Max resolution",
     "description": "Cap the shorter side of the video",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "2160",
       "label": "4K (2160p)"
      },
      {
       "value": "1440",
       "label": "1440p"
      },
      {
       "value": "1080",
       "label": "1080p"
      },
      {
       "value": "720",
       "label": "720p"
      },
      {
       "value": "480",
       "label": "480p"
      },
      {
       "value": "360",
       "label": "360p"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": false,
     "primary": false
    },
    {
     "name": "codec",
     "label": "Codec",
     "type": "enum",
     "options": [
      {
       "value": "h264",
       "label": "H.264 (MP4, most compatible)"
      },
      {
       "value": "h265",
       "label": "H.265 (MP4, smaller)"
      },
      {
       "value": "av1",
       "label": "AV1 (MP4, smallest, slow)"
      },
      {
       "value": "vp9",
       "label": "VP9 (WebM)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "h264",
     "advanced": false,
     "primary": false
    },
    {
     "name": "audio_kbps",
     "label": "Audio bitrate (kbit/s)",
     "type": "integer",
     "min": 16,
     "max": 320,
     "required": false,
     "default": 128,
     "advanced": true,
     "primary": false
    },
    {
     "name": "speed",
     "label": "Speed",
     "type": "enum",
     "options": [
      {
       "value": "fast",
       "label": "Fast"
      },
      {
       "value": "medium",
       "label": "Medium"
      },
      {
       "value": "slow",
       "label": "Slow (smaller)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    },
    {
     "name": "hardware",
     "label": "Hardware",
     "description": "Use a hardware encoder when present (falls back to software)",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "Software only"
      },
      {
       "value": "auto",
       "label": "Auto (use GPU if available)"
      },
      {
       "value": "nvenc",
       "label": "NVIDIA NVENC"
      },
      {
       "value": "qsv",
       "label": "Intel Quick Sync"
      },
      {
       "value": "vaapi",
       "label": "VA-API"
      },
      {
       "value": "videotoolbox",
       "label": "Apple VideoToolbox"
      },
      {
       "value": "amf",
       "label": "AMD AMF"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.resize",
   "name": "Resize Video",
   "description": "Scale videos to a preset (4K…240p), custom size or percentage, keeping aspect ratio with fit, fill (crop) or pad modes",
   "category": "video",
   "keywords": [
    "scale",
    "resolution",
    "1080p",
    "720p",
    "downscale",
    "upscale",
    "dimensions",
    "letterbox"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "size",
     "label": "Size",
     "description": "Presets set the shorter side of the video",
     "type": "enum",
     "options": [
      {
       "value": "2160",
       "label": "4K (2160p)"
      },
      {
       "value": "1440",
       "label": "1440p"
      },
      {
       "value": "1080",
       "label": "1080p"
      },
      {
       "value": "720",
       "label": "720p"
      },
      {
       "value": "480",
       "label": "480p"
      },
      {
       "value": "360",
       "label": "360p"
      },
      {
       "value": "240",
       "label": "240p"
      },
      {
       "value": "custom",
       "label": "Custom width/height"
      },
      {
       "value": "percent",
       "label": "Percentage"
      }
     ],
     "multi": false,
     "required": false,
     "default": "720",
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Leave empty to derive from height",
     "type": "integer",
     "min": 16,
     "max": 8192,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "size",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "height",
     "label": "Height",
     "description": "Leave empty to derive from width",
     "type": "integer",
     "min": 16,
     "max": 8192,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "size",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "percent",
     "label": "Percent",
     "type": "number",
     "min": 1,
     "max": 400,
     "required": false,
     "default": 50,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "size",
      "values": [
       "percent"
      ]
     }
    },
    {
     "name": "fit",
     "label": "Fit",
     "type": "enum",
     "options": [
      {
       "value": "fit",
       "label": "Fit (keep aspect)"
      },
      {
       "value": "fill",
       "label": "Fill (crop to exact size)"
      },
      {
       "value": "pad",
       "label": "Pad (letterbox to exact size)"
      },
      {
       "value": "stretch",
       "label": "Stretch"
      }
     ],
     "multi": false,
     "required": false,
     "default": "fit",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "size",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "pad_color",
     "label": "Pad color",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "fit",
      "values": [
       "pad"
      ]
     }
    },
    {
     "name": "upscale",
     "label": "Upscale",
     "description": "Allow making videos larger than the source",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.fps",
   "name": "Change Frame Rate",
   "description": "Change a video's frame rate by dropping/duplicating, blending or motion-interpolating frames",
   "category": "video",
   "keywords": [
    "framerate",
    "fps",
    "60fps",
    "30fps",
    "24fps",
    "interpolate",
    "slow motion",
    "smooth"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "fps",
     "label": "Frames per second",
     "type": "number",
     "min": 1,
     "max": 240,
     "required": true,
     "default": 30,
     "advanced": false,
     "primary": false
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "drop",
       "label": "Drop / duplicate frames (fast)"
      },
      {
       "value": "blend",
       "label": "Blend frames"
      },
      {
       "value": "interpolate",
       "label": "Motion interpolation (slow)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "drop",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.trim",
   "name": "Trim Video",
   "description": "Keep only part of a video by start/end time or duration — fast keyframe stream copy or frame-accurate re-encode",
   "category": "video",
   "keywords": [
    "cut",
    "clip",
    "shorten",
    "start",
    "end",
    "extract part",
    "segment"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "start",
     "label": "Start",
     "description": "Start time (seconds or HH:MM:SS.mmm)",
     "type": "text",
     "multiline": false,
     "placeholder": "00:00:10 or 10",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "end",
     "label": "End",
     "description": "End time (takes precedence over duration)",
     "type": "text",
     "multiline": false,
     "placeholder": "00:01:00",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "duration",
     "label": "Duration",
     "description": "Length of the clip",
     "type": "text",
     "multiline": false,
     "placeholder": "30",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "accurate",
       "label": "Accurate (re-encode)"
      },
      {
       "value": "copy",
       "label": "Fast (stream copy, cuts on keyframes)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "accurate",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.cut",
   "name": "Cut / Split Video",
   "description": "Remove a section from a video, or split it into several files at timestamps or every N seconds",
   "category": "video",
   "keywords": [
    "split",
    "remove part",
    "delete segment",
    "chop",
    "chunks",
    "segments"
   ],
   "params": [
    {
     "name": "input",
     "label": "Video",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "operation",
     "label": "Operation",
     "type": "enum",
     "options": [
      {
       "value": "remove",
       "label": "Remove a section"
      },
      {
       "value": "split",
       "label": "Split at timestamps"
      },
      {
       "value": "every",
       "label": "Split every N seconds"
      }
     ],
     "multi": false,
     "required": false,
     "default": "remove",
     "advanced": false,
     "primary": false
    },
    {
     "name": "start",
     "label": "Start",
     "description": "Start of the section to remove",
     "type": "text",
     "multiline": false,
     "placeholder": "00:00:10",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "remove"
      ]
     }
    },
    {
     "name": "end",
     "label": "End",
     "description": "End of the section to remove",
     "type": "text",
     "multiline": false,
     "placeholder": "00:00:20",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "remove"
      ]
     }
    },
    {
     "name": "points",
     "label": "Points",
     "description": "Split points (comma separated)",
     "type": "text",
     "multiline": false,
     "placeholder": "00:01:00, 00:02:30",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "split"
      ]
     }
    },
    {
     "name": "every_seconds",
     "label": "Every seconds",
     "type": "number",
     "min": 1,
     "max": 86400,
     "required": false,
     "default": 60,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "every"
      ]
     }
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "accurate",
       "label": "Accurate (re-encode)"
      },
      {
       "value": "copy",
       "label": "Fast (stream copy, cuts on keyframes)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "accurate",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.crop",
   "name": "Crop Video",
   "description": "Crop videos to a rectangle, a centered aspect ratio (16:9, 9:16, 1:1…) or automatically remove black bars (cropdetect)",
   "category": "video",
   "keywords": [
    "crop",
    "black bars",
    "letterbox",
    "aspect ratio",
    "square",
    "vertical",
    "9:16",
    "cropdetect"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "aspect",
       "label": "Aspect ratio (centered)"
      },
      {
       "value": "manual",
       "label": "Rectangle"
      },
      {
       "value": "auto",
       "label": "Auto-detect black bars"
      }
     ],
     "multi": false,
     "required": false,
     "default": "aspect",
     "advanced": false,
     "primary": false
    },
    {
     "name": "aspect",
     "label": "Aspect",
     "type": "enum",
     "options": [
      {
       "value": "16:9",
       "label": "16:9"
      },
      {
       "value": "9:16",
       "label": "9:16"
      },
      {
       "value": "1:1",
       "label": "1:1"
      },
      {
       "value": "4:3",
       "label": "4:3"
      },
      {
       "value": "3:4",
       "label": "3:4"
      },
      {
       "value": "4:5",
       "label": "4:5"
      },
      {
       "value": "21:9",
       "label": "21:9"
      },
      {
       "value": "2:1",
       "label": "2:1"
      }
     ],
     "multi": false,
     "required": false,
     "default": "1:1",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "aspect"
      ]
     }
    },
    {
     "name": "x",
     "label": "X",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "manual"
      ]
     }
    },
    {
     "name": "y",
     "label": "Y",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "manual"
      ]
     }
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 2,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "manual"
      ]
     }
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 2,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "manual"
      ]
     }
    },
    {
     "name": "threshold",
     "label": "Threshold",
     "description": "Black level threshold for auto-detection",
     "type": "integer",
     "min": 0,
     "max": 255,
     "required": false,
     "default": 24,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "auto"
      ]
     }
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.rotate",
   "name": "Rotate / Flip Video",
   "description": "Rotate videos by 90/180/270 degrees or mirror them; optionally change only the rotation metadata (instant, lossless)",
   "category": "video",
   "keywords": [
    "rotate",
    "flip",
    "mirror",
    "portrait",
    "landscape",
    "orientation",
    "sideways",
    "upside down"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "rotation",
     "label": "Rotation",
     "type": "enum",
     "options": [
      {
       "value": "cw90",
       "label": "90° clockwise"
      },
      {
       "value": "ccw90",
       "label": "90° counter-clockwise"
      },
      {
       "value": "180",
       "label": "180°"
      },
      {
       "value": "hflip",
       "label": "Flip horizontally"
      },
      {
       "value": "vflip",
       "label": "Flip vertically"
      }
     ],
     "multi": false,
     "required": false,
     "default": "cw90",
     "advanced": false,
     "primary": false
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "reencode",
       "label": "Re-encode (works everywhere)"
      },
      {
       "value": "metadata",
       "label": "Metadata only (lossless, instant)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "reencode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.merge",
   "name": "Merge Videos",
   "description": "Join videos end to end — lossless stream copy when they match, or re-encode to a common resolution and frame rate",
   "category": "video",
   "keywords": [
    "join",
    "concatenate",
    "combine",
    "append",
    "concat"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "description": "Videos in the order they should be joined (at least two)",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto (copy when compatible)"
      },
      {
       "value": "copy",
       "label": "Stream copy (identical formats only)"
      },
      {
       "value": "reencode",
       "label": "Re-encode (any inputs)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "resolution",
     "label": "Resolution",
     "type": "enum",
     "options": [
      {
       "value": "first",
       "label": "Same as first video"
      },
      {
       "value": "largest",
       "label": "Largest input"
      },
      {
       "value": "1080",
       "label": "1080p"
      },
      {
       "value": "720",
       "label": "720p"
      },
      {
       "value": "480",
       "label": "480p"
      }
     ],
     "multi": false,
     "required": false,
     "default": "first",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "auto",
       "reencode"
      ]
     }
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as first video"
      },
      {
       "value": "mp4",
       "label": "MP4"
      },
      {
       "value": "mkv",
       "label": "MKV"
      },
      {
       "value": "webm",
       "label": "WebM"
      },
      {
       "value": "mov",
       "label": "MOV"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.extract_audio",
   "name": "Extract Audio from Video",
   "description": "Save the soundtrack of videos as audio — lossless stream copy or MP3, AAC, WAV, FLAC, Opus or Ogg",
   "category": "video",
   "keywords": [
    "rip audio",
    "soundtrack",
    "video to mp3",
    "mp4 to mp3",
    "demux",
    "audio track"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "copy",
       "label": "Original (no re-encode)"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "ogg",
       "label": "Ogg Vorbis"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp3",
     "advanced": false,
     "primary": false
    },
    {
     "name": "bitrate",
     "label": "Bitrate (kbit/s)",
     "type": "integer",
     "min": 32,
     "max": 320,
     "required": false,
     "default": 192,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp3",
       "m4a",
       "opus"
      ]
     }
    },
    {
     "name": "track",
     "label": "Track",
     "description": "Audio track number (0 = first)",
     "type": "integer",
     "min": 0,
     "max": 64,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.remove_audio",
   "name": "Remove Audio",
   "description": "Strip all audio tracks from videos without re-encoding the picture",
   "category": "video",
   "keywords": [
    "mute",
    "silent",
    "strip audio",
    "no sound",
    "remove sound"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.replace_audio",
   "name": "Replace Audio",
   "description": "Put a new soundtrack on videos — end at the shorter stream, loop or pad the audio, delay it, or mix it with the original sound",
   "category": "video",
   "keywords": [
    "add music",
    "background music",
    "soundtrack",
    "dub",
    "voiceover",
    "mix audio"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "audio",
     "label": "New audio",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "fit",
     "label": "Fit",
     "type": "enum",
     "options": [
      {
       "value": "shortest",
       "label": "End with the shorter stream"
      },
      {
       "value": "loop",
       "label": "Loop audio to video length"
      },
      {
       "value": "pad",
       "label": "Pad audio with silence to video length"
      }
     ],
     "multi": false,
     "required": false,
     "default": "pad",
     "advanced": false,
     "primary": false
    },
    {
     "name": "mix_original",
     "label": "Mix original",
     "description": "Mix the new audio with the video's existing sound instead of replacing it",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "original_volume",
     "label": "Original volume",
     "type": "number",
     "min": 0,
     "max": 4,
     "required": false,
     "default": 0.3,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mix_original",
      "values": [
       true
      ]
     }
    },
    {
     "name": "new_volume",
     "label": "New volume",
     "type": "number",
     "min": 0,
     "max": 4,
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "offset",
     "label": "Offset",
     "description": "Delay before the new audio starts",
     "type": "text",
     "multiline": false,
     "placeholder": "0",
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.extract_frames",
   "name": "Extract Frames",
   "description": "Export frames as images: every N seconds, at a frame rate, at specific timestamps, at scene changes, keyframes only, or every frame — optionally zipped",
   "category": "video",
   "keywords": [
    "frames",
    "images",
    "screenshots",
    "stills",
    "png sequence",
    "scene detection",
    "keyframes"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "interval",
       "label": "Every N seconds"
      },
      {
       "value": "fps",
       "label": "Frames per second"
      },
      {
       "value": "timestamps",
       "label": "At timestamps"
      },
      {
       "value": "scene",
       "label": "At scene changes"
      },
      {
       "value": "keyframes",
       "label": "Keyframes only"
      },
      {
       "value": "all",
       "label": "Every frame"
      }
     ],
     "multi": false,
     "required": false,
     "default": "interval",
     "advanced": false,
     "primary": false
    },
    {
     "name": "interval",
     "label": "Interval (seconds)",
     "type": "number",
     "min": 0.01,
     "max": 86400,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "interval"
      ]
     }
    },
    {
     "name": "fps",
     "label": "Fps",
     "type": "number",
     "min": 0.001,
     "max": 240,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "fps"
      ]
     }
    },
    {
     "name": "timestamps",
     "label": "Timestamps",
     "type": "text",
     "multiline": false,
     "placeholder": "0:05, 0:30, 1:12.5",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "timestamps"
      ]
     }
    },
    {
     "name": "scene_threshold",
     "label": "Scene threshold",
     "description": "Scene change sensitivity (lower = more frames)",
     "type": "number",
     "min": 0.01,
     "max": 1,
     "required": false,
     "default": 0.3,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "scene"
      ]
     }
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Scale frames to this width (keeps aspect)",
     "type": "integer",
     "min": 16,
     "max": 8192,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_frames",
     "label": "Max frames",
     "type": "integer",
     "min": 1,
     "max": 20000,
     "required": false,
     "default": 300,
     "advanced": false,
     "primary": false
    },
    {
     "name": "zip",
     "label": "Zip",
     "description": "Return a single ZIP archive (automatic above 100 frames)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.thumbnail",
   "name": "Video Thumbnail",
   "description": "Grab a single frame as an image — at a time or percentage, or let FFmpeg's thumbnail filter pick the most representative frame",
   "category": "video",
   "keywords": [
    "poster",
    "cover",
    "preview image",
    "screenshot",
    "still",
    "frame grab"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "best",
       "label": "Most representative frame"
      },
      {
       "value": "time",
       "label": "At a specific time"
      }
     ],
     "multi": false,
     "required": false,
     "default": "best",
     "advanced": false,
     "primary": false
    },
    {
     "name": "time",
     "label": "Time",
     "description": "Time or percentage of the duration (for 'best', where to start looking)",
     "type": "text",
     "multiline": false,
     "placeholder": "10% or 00:00:05",
     "required": false,
     "default": "10%",
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Scale to this width (keeps aspect)",
     "type": "integer",
     "min": 16,
     "max": 8192,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "jpg",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.to_gif",
   "name": "Video to GIF",
   "description": "Turn video clips into high-quality animated GIFs (two-pass palette), animated WebP or APNG with frame rate, width, range, looping and dithering control",
   "category": "video",
   "keywords": [
    "gif",
    "animated",
    "meme",
    "webp",
    "apng",
    "palette",
    "convert to gif"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "start",
     "label": "Start",
     "description": "Start time",
     "type": "text",
     "multiline": false,
     "placeholder": "0",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "duration",
     "label": "Duration",
     "description": "Length (empty = until the end)",
     "type": "text",
     "multiline": false,
     "placeholder": "5",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "fps",
     "label": "Fps",
     "type": "integer",
     "min": 1,
     "max": 50,
     "required": false,
     "default": 12,
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Output width in pixels (0 = original)",
     "type": "integer",
     "min": 0,
     "max": 4096,
     "required": false,
     "default": 480,
     "advanced": false,
     "primary": false
    },
    {
     "name": "loop",
     "label": "Loop",
     "type": "enum",
     "options": [
      {
       "value": "forever",
       "label": "Loop forever"
      },
      {
       "value": "once",
       "label": "Play once"
      },
      {
       "value": "3",
       "label": "3 times"
      },
      {
       "value": "5",
       "label": "5 times"
      }
     ],
     "multi": false,
     "required": false,
     "default": "forever",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "gif",
       "label": "GIF"
      },
      {
       "value": "webp",
       "label": "Animated WebP"
      },
      {
       "value": "apng",
       "label": "Animated PNG"
      }
     ],
     "multi": false,
     "required": false,
     "default": "gif",
     "advanced": false,
     "primary": false
    },
    {
     "name": "dither",
     "label": "Dither",
     "type": "enum",
     "options": [
      {
       "value": "sierra2_4a",
       "label": "Sierra (default)"
      },
      {
       "value": "floyd_steinberg",
       "label": "Floyd–Steinberg"
      },
      {
       "value": "bayer",
       "label": "Bayer (ordered)"
      },
      {
       "value": "none",
       "label": "None"
      }
     ],
     "multi": false,
     "required": false,
     "default": "sierra2_4a",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "gif"
      ]
     }
    },
    {
     "name": "colors",
     "label": "Colors",
     "type": "integer",
     "min": 2,
     "max": 256,
     "required": false,
     "default": 256,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "gif"
      ]
     }
    },
    {
     "name": "palette_mode",
     "label": "Palette mode",
     "type": "enum",
     "options": [
      {
       "value": "diff",
       "label": "Optimize for motion"
      },
      {
       "value": "full",
       "label": "Whole frame"
      }
     ],
     "multi": false,
     "required": false,
     "default": "diff",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "gif"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.from_gif",
   "name": "GIF to Video",
   "description": "Convert animated GIF / WebP / APNG files to MP4 (H.264) or WebM (VP9) — much smaller and widely playable",
   "category": "video",
   "keywords": [
    "gif to mp4",
    "gif to webm",
    "animated",
    "convert gif"
   ],
   "params": [
    {
     "name": "input",
     "label": "Animations",
     "type": "file",
     "accept": [
      "image/gif",
      ".gif",
      ".webp",
      ".apng",
      ".png"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "mp4",
       "label": "MP4 (H.264)"
      },
      {
       "value": "webm",
       "label": "WebM (VP9)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp4",
     "advanced": false,
     "primary": false
    },
    {
     "name": "repeat",
     "label": "Repeat",
     "description": "Extra times to repeat the animation",
     "type": "integer",
     "min": 0,
     "max": 100,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.speed",
   "name": "Change Video Speed",
   "description": "Speed up or slow down videos (0.25×–4×), adjusting the audio tempo without changing pitch",
   "category": "video",
   "keywords": [
    "fast forward",
    "slow motion",
    "timelapse",
    "playback speed",
    "speed up",
    "slow down"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "factor",
     "label": "Factor",
     "description": "2 = twice as fast, 0.5 = half speed",
     "type": "number",
     "min": 0.25,
     "max": 4,
     "step": 0.05,
     "required": true,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "audio",
     "label": "Audio",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep (tempo adjusted, same pitch)"
      },
      {
       "value": "mute",
       "label": "Remove audio"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.stabilize",
   "name": "Stabilize Video",
   "description": "Reduce camera shake with two-pass vid.stab (vidstabdetect/vidstabtransform) when available, otherwise FFmpeg's deshake filter",
   "category": "video",
   "keywords": [
    "shaky",
    "stabilise",
    "deshake",
    "smooth",
    "handheld",
    "vidstab",
    "gimbal"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "strength",
     "label": "Strength",
     "type": "enum",
     "options": [
      {
       "value": "low",
       "label": "Low"
      },
      {
       "value": "medium",
       "label": "Medium"
      },
      {
       "value": "high",
       "label": "High"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": false,
     "primary": false
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto"
      },
      {
       "value": "vidstab",
       "label": "vid.stab (two-pass)"
      },
      {
       "value": "deshake",
       "label": "deshake (single pass)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "borders",
     "label": "Borders",
     "type": "enum",
     "options": [
      {
       "value": "zoom",
       "label": "Zoom to hide borders"
      },
      {
       "value": "black",
       "label": "Keep black borders"
      }
     ],
     "multi": false,
     "required": false,
     "default": "zoom",
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.info",
   "name": "Video Info",
   "description": "Inspect media files with ffprobe: container, duration, bitrate, every stream (codec, resolution, frame rate, audio layout, language), chapters and tags",
   "category": "video",
   "keywords": [
    "metadata",
    "ffprobe",
    "mediainfo",
    "codec",
    "resolution",
    "bitrate",
    "streams",
    "properties"
   ],
   "params": [
    {
     "name": "input",
     "label": "Media files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.preview",
   "name": "Video Preview Clip",
   "description": "Make a short preview / teaser made of N clips sampled evenly across each video",
   "category": "video",
   "keywords": [
    "teaser",
    "trailer",
    "highlight",
    "summary",
    "sample",
    "hover preview"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "segments",
     "label": "Segments",
     "type": "integer",
     "min": 1,
     "max": 30,
     "required": false,
     "default": 6,
     "advanced": false,
     "primary": false
    },
    {
     "name": "segment_seconds",
     "label": "Segment seconds",
     "type": "number",
     "min": 0.5,
     "max": 30,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "description": "Output width (0 = original)",
     "type": "integer",
     "min": 0,
     "max": 3840,
     "required": false,
     "default": 640,
     "advanced": false,
     "primary": false
    },
    {
     "name": "audio",
     "label": "Audio",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "mp4",
       "label": "MP4"
      },
      {
       "value": "webm",
       "label": "WebM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp4",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.hw_encoders",
   "name": "Hardware Encoders",
   "description": "List GPU/hardware video encoders and decoders FFmpeg supports here (NVENC, Quick Sync, VA-API, VideoToolbox, AMF) and test which actually work",
   "category": "video",
   "keywords": [
    "gpu",
    "nvenc",
    "qsv",
    "vaapi",
    "videotoolbox",
    "amf",
    "hardware acceleration",
    "hwaccel",
    "cuda"
   ],
   "params": [
    {
     "name": "test",
     "label": "Test",
     "description": "Run a tiny test encode for each compiled-in encoder",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg"
   ],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.watermark",
   "name": "Watermark Video",
   "description": "Overlay a logo image or a text watermark on videos with position, margin, size and opacity control",
   "category": "video",
   "keywords": [
    "logo",
    "overlay",
    "branding",
    "drawtext",
    "text overlay",
    "copyright"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "image",
       "label": "Image / logo"
      },
      {
       "value": "text",
       "label": "Text"
      }
     ],
     "multi": false,
     "required": false,
     "default": "text",
     "advanced": false,
     "primary": false
    },
    {
     "name": "image",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "image"
      ]
     }
    },
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": false,
     "max_len": 500,
     "placeholder": "© My Name",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "bottom-right",
       "label": "Bottom right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "top-left",
       "label": "Top left"
      },
      {
       "value": "center",
       "label": "Center"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bottom-right",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin",
     "type": "integer",
     "min": 0,
     "max": 2000,
     "required": false,
     "default": 16,
     "advanced": false,
     "primary": false
    },
    {
     "name": "opacity",
     "label": "Opacity",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "required": false,
     "default": 0.8,
     "advanced": false,
     "primary": false
    },
    {
     "name": "size",
     "label": "Size",
     "description": "Image width / text height as a percentage of the video width / height",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 15,
     "advanced": false,
     "primary": false
    },
    {
     "name": "color",
     "label": "Color",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "box",
     "label": "Box",
     "description": "Draw a translucent box behind the text",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.contact_sheet",
   "name": "Video Contact Sheet",
   "description": "Create a screenshot grid (contact sheet) of frames sampled evenly across each video",
   "category": "video",
   "keywords": [
    "screenshot grid",
    "thumbnails",
    "storyboard",
    "mosaic",
    "tile",
    "overview",
    "screen caps"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "columns",
     "label": "Columns",
     "type": "integer",
     "min": 1,
     "max": 12,
     "required": false,
     "default": 4,
     "advanced": false,
     "primary": false
    },
    {
     "name": "rows",
     "label": "Rows",
     "type": "integer",
     "min": 1,
     "max": 20,
     "required": false,
     "default": 4,
     "advanced": false,
     "primary": false
    },
    {
     "name": "tile_width",
     "label": "Tile width",
     "type": "integer",
     "min": 32,
     "max": 1920,
     "required": false,
     "default": 320,
     "advanced": false,
     "primary": false
    },
    {
     "name": "padding",
     "label": "Padding",
     "type": "integer",
     "min": 0,
     "max": 64,
     "required": false,
     "default": 4,
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "jpg",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.subtitles_add",
   "name": "Add Subtitles",
   "description": "Add one or more soft subtitle tracks (SRT, WebVTT, ASS) to a video with language tags — no re-encoding",
   "category": "video",
   "keywords": [
    "soft subtitles",
    "captions",
    "mux",
    "srt",
    "subtitle track",
    "embed subtitles",
    "closed captions"
   ],
   "params": [
    {
     "name": "input",
     "label": "Video",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "subtitles",
     "label": "Subtitles",
     "type": "file",
     "accept": [
      ".srt",
      ".vtt",
      ".ass",
      ".ssa"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "languages",
     "label": "Languages",
     "description": "ISO 639 language codes, one per subtitle file",
     "type": "text",
     "multiline": false,
     "placeholder": "eng, deu",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "default_track",
     "label": "Default track",
     "description": "Mark the first added track as default",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input (AVI → MKV)"
      },
      {
       "value": "mkv",
       "label": "MKV"
      },
      {
       "value": "mp4",
       "label": "MP4"
      },
      {
       "value": "mov",
       "label": "MOV"
      },
      {
       "value": "webm",
       "label": "WebM"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.subtitles_remove",
   "name": "Remove Subtitles",
   "description": "Remove embedded subtitle tracks from videos without re-encoding (all, or only selected languages)",
   "category": "video",
   "keywords": [
    "strip subtitles",
    "delete captions",
    "remove subtitle track"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "languages",
     "label": "Languages",
     "description": "Only remove these languages (empty = remove all)",
     "type": "text",
     "multiline": false,
     "placeholder": "eng, fre",
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.subtitles_burn",
   "name": "Burn In Subtitles",
   "description": "Permanently render subtitles into the picture (hard subs) from an SRT/VTT/ASS file or an embedded track, with font size, colour and position options",
   "category": "video",
   "keywords": [
    "hardsub",
    "hard subtitles",
    "open captions",
    "burn subtitles",
    "render captions"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "subtitles",
     "label": "Subtitles",
     "type": "file",
     "accept": [
      ".srt",
      ".vtt",
      ".ass",
      ".ssa"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "stream",
     "label": "Stream",
     "description": "…or burn this embedded subtitle track (0 = first)",
     "type": "integer",
     "min": 0,
     "max": 99,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "font_size",
     "label": "Font size",
     "description": "0 = automatic",
     "type": "integer",
     "min": 0,
     "max": 200,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "color",
     "label": "Color",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "outline_color",
     "label": "Outline color",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "middle",
       "label": "Middle"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bottom",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin",
     "type": "integer",
     "min": 0,
     "max": 500,
     "required": false,
     "default": 20,
     "advanced": true,
     "primary": false
    },
    {
     "name": "override_ass_style",
     "label": "Override ass style",
     "description": "Apply the style options to ASS files too",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "video.subtitles_extract",
   "name": "Extract Subtitles",
   "description": "List the subtitle tracks of videos and save them as SRT, WebVTT or ASS (or copy image-based tracks as-is)",
   "category": "video",
   "keywords": [
    "rip subtitles",
    "export captions",
    "srt",
    "subtitle track",
    "demux subtitles"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "ass",
       "label": "ASS"
      },
      {
       "value": "copy",
       "label": "Original format"
      }
     ],
     "multi": false,
     "required": false,
     "default": "srt",
     "advanced": false,
     "primary": false
    },
    {
     "name": "track",
     "label": "Track",
     "description": "Only this subtitle track (0 = first; empty = all)",
     "type": "integer",
     "min": 0,
     "max": 99,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "list_only",
     "label": "List only",
     "description": "Only list the tracks",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.convert",
   "name": "Convert Audio",
   "description": "Convert audio (or the soundtrack of videos) to MP3, AAC/M4A, Ogg Vorbis, Opus, FLAC, WAV, AIFF, ALAC, WMA or AC-3 with bitrate, VBR, sample rate, channel and bit-depth control",
   "category": "audio",
   "keywords": [
    "mp3",
    "wav",
    "flac",
    "aac",
    "m4a",
    "ogg",
    "opus",
    "aiff",
    "alac",
    "wma",
    "transcode",
    "format"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "ogg",
       "label": "Ogg Vorbis"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "flac",
       "label": "FLAC (lossless)"
      },
      {
       "value": "wav",
       "label": "WAV (uncompressed)"
      },
      {
       "value": "aiff",
       "label": "AIFF"
      },
      {
       "value": "alac",
       "label": "Apple Lossless (M4A)"
      },
      {
       "value": "wma",
       "label": "WMA"
      },
      {
       "value": "ac3",
       "label": "AC-3 (Dolby Digital)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp3",
     "advanced": false,
     "primary": false
    },
    {
     "name": "bitrate",
     "label": "Bitrate (kbit/s)",
     "type": "integer",
     "min": 32,
     "max": 640,
     "required": false,
     "default": 192,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp3",
       "m4a",
       "ogg",
       "opus",
       "wma",
       "ac3"
      ]
     }
    },
    {
     "name": "vbr_quality",
     "label": "VBR quality (0 = best, 9 = smallest)",
     "description": "Use variable bitrate instead of a fixed bitrate (MP3 / Vorbis)",
     "type": "integer",
     "min": 0,
     "max": 9,
     "required": false,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp3",
       "ogg"
      ]
     }
    },
    {
     "name": "sample_rate",
     "label": "Sample rate",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "8000",
       "label": "8 kHz"
      },
      {
       "value": "11025",
       "label": "11.025 kHz"
      },
      {
       "value": "16000",
       "label": "16 kHz"
      },
      {
       "value": "22050",
       "label": "22.05 kHz"
      },
      {
       "value": "24000",
       "label": "24 kHz"
      },
      {
       "value": "32000",
       "label": "32 kHz"
      },
      {
       "value": "44100",
       "label": "44.1 kHz"
      },
      {
       "value": "48000",
       "label": "48 kHz"
      },
      {
       "value": "88200",
       "label": "88.2 kHz"
      },
      {
       "value": "96000",
       "label": "96 kHz"
      },
      {
       "value": "192000",
       "label": "192 kHz"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": true,
     "primary": false
    },
    {
     "name": "channels",
     "label": "Channels",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "1",
       "label": "Mono"
      },
      {
       "value": "2",
       "label": "Stereo"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": true,
     "primary": false
    },
    {
     "name": "bit_depth",
     "label": "Bit depth",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep / default"
      },
      {
       "value": "16",
       "label": "16-bit"
      },
      {
       "value": "24",
       "label": "24-bit"
      },
      {
       "value": "32",
       "label": "32-bit integer"
      },
      {
       "value": "32f",
       "label": "32-bit float"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "wav",
       "flac",
       "aiff"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.compress",
   "name": "Compress Audio",
   "description": "Make audio files smaller by re-encoding to an efficient codec at a lower bitrate, optionally in mono (ideal for voice)",
   "category": "audio",
   "keywords": [
    "reduce size",
    "smaller",
    "shrink",
    "bitrate",
    "voice memo",
    "podcast"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "level",
     "label": "Level",
     "type": "enum",
     "options": [
      {
       "value": "light",
       "label": "Light (160 kbit/s)"
      },
      {
       "value": "balanced",
       "label": "Balanced (128 kbit/s)"
      },
      {
       "value": "strong",
       "label": "Strong (96 kbit/s)"
      },
      {
       "value": "voice",
       "label": "Voice (48 kbit/s mono)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "balanced",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "opus",
       "label": "Opus (best quality per size)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp3",
     "advanced": false,
     "primary": false
    },
    {
     "name": "mono",
     "label": "Mono",
     "description": "Downmix to mono (halves the size of stereo audio)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.trim",
   "name": "Trim Audio",
   "description": "Cut audio to a start/end time or duration, with optional fade in and fade out",
   "category": "audio",
   "keywords": [
    "cut",
    "clip",
    "shorten",
    "ringtone",
    "excerpt",
    "start",
    "end"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "start",
     "label": "Start",
     "type": "text",
     "multiline": false,
     "placeholder": "0:10",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "end",
     "label": "End",
     "type": "text",
     "multiline": false,
     "placeholder": "1:30",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "duration",
     "label": "Duration",
     "type": "text",
     "multiline": false,
     "placeholder": "30",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "fade_in",
     "label": "Fade in",
     "type": "number",
     "min": 0,
     "max": 600,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "fade_out",
     "label": "Fade out",
     "type": "number",
     "min": 0,
     "max": 600,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.split",
   "name": "Split Audio",
   "description": "Split audio into parts: fixed-length chunks, at given timestamps, or automatically at silences",
   "category": "audio",
   "keywords": [
    "chunks",
    "segments",
    "cut into pieces",
    "tracks",
    "silence split",
    "chapters"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "duration",
       "label": "Every N seconds"
      },
      {
       "value": "timestamps",
       "label": "At timestamps"
      },
      {
       "value": "silence",
       "label": "At silences"
      }
     ],
     "multi": false,
     "required": false,
     "default": "duration",
     "advanced": false,
     "primary": false
    },
    {
     "name": "chunk_seconds",
     "label": "Chunk seconds",
     "type": "number",
     "min": 1,
     "max": 86400,
     "required": false,
     "default": 600,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "duration"
      ]
     }
    },
    {
     "name": "points",
     "label": "Points",
     "type": "text",
     "multiline": false,
     "placeholder": "3:00, 7:30",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "timestamps"
      ]
     }
    },
    {
     "name": "threshold_db",
     "label": "Threshold db",
     "type": "number",
     "min": -100,
     "max": 0,
     "required": false,
     "default": -40,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "silence"
      ]
     }
    },
    {
     "name": "min_silence",
     "label": "Minimum silence (s)",
     "type": "number",
     "min": 0.05,
     "max": 60,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "silence"
      ]
     }
    },
    {
     "name": "min_part",
     "label": "Minimum part length (s)",
     "type": "number",
     "min": 0,
     "max": 3600,
     "required": false,
     "default": 5,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "silence"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.merge",
   "name": "Merge Audio",
   "description": "Join audio files end to end, with optional crossfades or gaps of silence between them",
   "category": "audio",
   "keywords": [
    "join",
    "concatenate",
    "combine",
    "crossfade",
    "mix tape",
    "append"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "description": "Files in playback order (at least two)",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "crossfade",
     "label": "Crossfade (s)",
     "type": "number",
     "min": 0,
     "max": 30,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "gap",
     "label": "Silence between files (s)",
     "type": "number",
     "min": 0,
     "max": 60,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as first file"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "ogg",
       "label": "Ogg Vorbis"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.normalize",
   "name": "Normalize Audio",
   "description": "Normalize loudness with two-pass EBU R128 (loudnorm: measure, then apply to a target LUFS / true peak / LRA) or peak-normalize to a dBFS level",
   "category": "audio",
   "keywords": [
    "loudness",
    "lufs",
    "ebu r128",
    "loudnorm",
    "volume leveling",
    "peak",
    "podcast",
    "spotify",
    "youtube"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "loudness",
       "label": "Loudness (EBU R128)"
      },
      {
       "value": "peak",
       "label": "Peak"
      }
     ],
     "multi": false,
     "required": false,
     "default": "loudness",
     "advanced": false,
     "primary": false
    },
    {
     "name": "preset",
     "label": "Preset",
     "type": "enum",
     "options": [
      {
       "value": "streaming",
       "label": "Streaming (−14 LUFS)"
      },
      {
       "value": "podcast",
       "label": "Podcast (−16 LUFS)"
      },
      {
       "value": "broadcast",
       "label": "Broadcast EBU R128 (−23 LUFS)"
      },
      {
       "value": "custom",
       "label": "Custom"
      }
     ],
     "multi": false,
     "required": false,
     "default": "streaming",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "loudness"
      ]
     }
    },
    {
     "name": "target_lufs",
     "label": "Target lufs",
     "type": "number",
     "min": -70,
     "max": -5,
     "required": false,
     "default": -16,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "preset",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "true_peak",
     "label": "True peak (dBTP)",
     "type": "number",
     "min": -9,
     "max": 0,
     "required": false,
     "default": -1.5,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "loudness"
      ]
     }
    },
    {
     "name": "lra",
     "label": "Loudness range (LU)",
     "type": "number",
     "min": 1,
     "max": 50,
     "required": false,
     "default": 11,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "loudness"
      ]
     }
    },
    {
     "name": "peak_db",
     "label": "Peak level (dBFS)",
     "type": "number",
     "min": -30,
     "max": 0,
     "required": false,
     "default": -1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "peak"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.volume",
   "name": "Change Volume",
   "description": "Make audio louder or quieter by decibels or a factor, with an optional limiter to prevent clipping",
   "category": "audio",
   "keywords": [
    "louder",
    "quieter",
    "gain",
    "amplify",
    "boost",
    "db",
    "attenuate"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "unit",
     "label": "Unit",
     "type": "enum",
     "options": [
      {
       "value": "db",
       "label": "Decibels"
      },
      {
       "value": "factor",
       "label": "Factor"
      }
     ],
     "multi": false,
     "required": false,
     "default": "db",
     "advanced": false,
     "primary": false
    },
    {
     "name": "amount",
     "label": "Amount",
     "description": "dB (e.g. +6, −3) or factor (e.g. 1.5, 0.5)",
     "type": "number",
     "min": -60,
     "max": 60,
     "required": false,
     "default": 6,
     "advanced": false,
     "primary": false
    },
    {
     "name": "limiter",
     "label": "Limiter",
     "description": "Prevent clipping with a limiter at −1 dBFS",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.sample_rate",
   "name": "Change Sample Rate",
   "description": "Resample audio to another sample rate (high-quality SoX resampler when available) and change the bit depth of WAV/FLAC/AIFF",
   "category": "audio",
   "keywords": [
    "resample",
    "44.1khz",
    "48khz",
    "96khz",
    "bit depth",
    "16-bit",
    "24-bit",
    "hz"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "rate",
     "label": "Rate",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "8000",
       "label": "8 kHz"
      },
      {
       "value": "11025",
       "label": "11.025 kHz"
      },
      {
       "value": "16000",
       "label": "16 kHz"
      },
      {
       "value": "22050",
       "label": "22.05 kHz"
      },
      {
       "value": "24000",
       "label": "24 kHz"
      },
      {
       "value": "32000",
       "label": "32 kHz"
      },
      {
       "value": "44100",
       "label": "44.1 kHz"
      },
      {
       "value": "48000",
       "label": "48 kHz"
      },
      {
       "value": "88200",
       "label": "88.2 kHz"
      },
      {
       "value": "96000",
       "label": "96 kHz"
      },
      {
       "value": "192000",
       "label": "192 kHz"
      }
     ],
     "multi": false,
     "required": false,
     "default": "48000",
     "advanced": false,
     "primary": false
    },
    {
     "name": "bit_depth",
     "label": "Bit depth",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep / default"
      },
      {
       "value": "16",
       "label": "16-bit"
      },
      {
       "value": "24",
       "label": "24-bit"
      },
      {
       "value": "32",
       "label": "32-bit integer"
      },
      {
       "value": "32f",
       "label": "32-bit float"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.channels",
   "name": "Audio Channels",
   "description": "Convert to mono or stereo, downmix surround to stereo, extract the left or right channel, or swap channels",
   "category": "audio",
   "keywords": [
    "mono",
    "stereo",
    "downmix",
    "left channel",
    "right channel",
    "swap",
    "5.1",
    "surround"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "operation",
     "label": "Operation",
     "type": "enum",
     "options": [
      {
       "value": "mono",
       "label": "Mix to mono"
      },
      {
       "value": "stereo",
       "label": "Make stereo"
      },
      {
       "value": "downmix",
       "label": "Downmix surround to stereo"
      },
      {
       "value": "left",
       "label": "Left channel only (mono)"
      },
      {
       "value": "right",
       "label": "Right channel only (mono)"
      },
      {
       "value": "swap",
       "label": "Swap left/right"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mono",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.remove_silence",
   "name": "Remove Silence",
   "description": "Trim silence from the start and end, or shorten every pause longer than a minimum duration",
   "category": "audio",
   "keywords": [
    "silence",
    "pauses",
    "dead air",
    "trim silence",
    "tighten",
    "silenceremove"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "edges",
       "label": "Start and end only"
      },
      {
       "value": "all",
       "label": "All pauses"
      }
     ],
     "multi": false,
     "required": false,
     "default": "edges",
     "advanced": false,
     "primary": false
    },
    {
     "name": "threshold_db",
     "label": "Threshold db",
     "description": "Audio below this level counts as silence",
     "type": "number",
     "min": -100,
     "max": 0,
     "required": false,
     "default": -50,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_silence",
     "label": "Minimum pause (s)",
     "type": "number",
     "min": 0.05,
     "max": 60,
     "required": false,
     "default": 0.5,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "all"
      ]
     }
    },
    {
     "name": "keep_silence",
     "label": "Pause to keep (s)",
     "type": "number",
     "min": 0,
     "max": 10,
     "required": false,
     "default": 0.25,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "all"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.detect_silence",
   "name": "Detect Silence",
   "description": "Find silent intervals in audio or video (FFmpeg silencedetect) and list their start, end and duration",
   "category": "audio",
   "keywords": [
    "silence",
    "pauses",
    "gaps",
    "silencedetect",
    "quiet parts",
    "dead air"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "threshold_db",
     "label": "Threshold db",
     "type": "number",
     "min": -100,
     "max": 0,
     "required": false,
     "default": -50,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_duration",
     "label": "Minimum duration (s)",
     "type": "number",
     "min": 0.01,
     "max": 600,
     "required": false,
     "default": 0.5,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.waveform",
   "name": "Audio Waveform",
   "description": "Render a waveform image (PNG) of audio with custom size, colors and scale, and optionally export min/max peak data as JSON",
   "category": "audio",
   "keywords": [
    "waveform",
    "visualize",
    "peaks",
    "soundwave",
    "image",
    "showwavespic",
    "podcast art"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 64,
     "max": 8000,
     "required": false,
     "default": 1800,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 32,
     "max": 4000,
     "required": false,
     "default": 280,
     "advanced": false,
     "primary": false
    },
    {
     "name": "color",
     "label": "Color",
     "type": "color",
     "required": false,
     "default": "#3b82f6",
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "transparent",
     "label": "Transparent",
     "description": "Transparent background instead of a color",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "split_channels",
     "label": "Split channels",
     "description": "Draw each channel separately",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "scale",
     "label": "Scale",
     "type": "enum",
     "options": [
      {
       "value": "lin",
       "label": "Linear"
      },
      {
       "value": "log",
       "label": "Logarithmic"
      },
      {
       "value": "sqrt",
       "label": "Square root"
      },
      {
       "value": "cbrt",
       "label": "Cube root"
      }
     ],
     "multi": false,
     "required": false,
     "default": "lin",
     "advanced": true,
     "primary": false
    },
    {
     "name": "peaks",
     "label": "Peaks",
     "description": "Also export peak data (JSON) for web players",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "points",
     "label": "Points",
     "type": "integer",
     "min": 10,
     "max": 100000,
     "required": false,
     "default": 1000,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "peaks",
      "values": [
       true
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.spectrogram",
   "name": "Audio Spectrogram",
   "description": "Render a spectrogram image (frequency over time) of audio with color scheme, scale and legend options",
   "category": "audio",
   "keywords": [
    "spectrum",
    "frequency",
    "fft",
    "visualize",
    "showspectrumpic",
    "analysis"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 64,
     "max": 8000,
     "required": false,
     "default": 1024,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 64,
     "max": 4000,
     "required": false,
     "default": 512,
     "advanced": false,
     "primary": false
    },
    {
     "name": "color",
     "label": "Color",
     "type": "enum",
     "options": [
      {
       "value": "intensity",
       "label": "intensity"
      },
      {
       "value": "rainbow",
       "label": "rainbow"
      },
      {
       "value": "magma",
       "label": "magma"
      },
      {
       "value": "viridis",
       "label": "viridis"
      },
      {
       "value": "plasma",
       "label": "plasma"
      },
      {
       "value": "cividis",
       "label": "cividis"
      },
      {
       "value": "fire",
       "label": "fire"
      },
      {
       "value": "cool",
       "label": "cool"
      },
      {
       "value": "green",
       "label": "green"
      },
      {
       "value": "channel",
       "label": "channel"
      },
      {
       "value": "moreland",
       "label": "moreland"
      },
      {
       "value": "nebulae",
       "label": "nebulae"
      },
      {
       "value": "terrain",
       "label": "terrain"
      }
     ],
     "multi": false,
     "required": false,
     "default": "intensity",
     "advanced": false,
     "primary": false
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "combined",
       "label": "All channels combined"
      },
      {
       "value": "separate",
       "label": "Channels separately"
      }
     ],
     "multi": false,
     "required": false,
     "default": "combined",
     "advanced": false,
     "primary": false
    },
    {
     "name": "scale",
     "label": "Scale",
     "type": "enum",
     "options": [
      {
       "value": "log",
       "label": "Logarithmic"
      },
      {
       "value": "sqrt",
       "label": "Square root"
      },
      {
       "value": "cbrt",
       "label": "Cube root"
      },
      {
       "value": "lin",
       "label": "Linear"
      }
     ],
     "multi": false,
     "required": false,
     "default": "log",
     "advanced": true,
     "primary": false
    },
    {
     "name": "frequency_scale",
     "label": "Frequency scale",
     "type": "enum",
     "options": [
      {
       "value": "lin",
       "label": "Linear"
      },
      {
       "value": "log",
       "label": "Logarithmic"
      }
     ],
     "multi": false,
     "required": false,
     "default": "lin",
     "advanced": true,
     "primary": false
    },
    {
     "name": "legend",
     "label": "Legend",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.info",
   "name": "Audio Info",
   "description": "Show audio format, codec, bitrate, sample rate, channels and tags; optionally measure loudness (EBU R128 integrated LUFS, LRA, true peak)",
   "category": "audio",
   "keywords": [
    "metadata",
    "tags",
    "bitrate",
    "sample rate",
    "lufs",
    "loudness",
    "ffprobe",
    "properties"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "loudness",
     "label": "Loudness",
     "description": "Measure loudness (decodes the whole file)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.tags",
   "name": "Audio Tags",
   "description": "Read or edit audio tags (title, artist, album, year, genre, track, comment…) and embed or remove cover art — without re-encoding",
   "category": "audio",
   "keywords": [
    "id3",
    "metadata",
    "mp3 tags",
    "cover art",
    "album art",
    "vorbis comment",
    "artist",
    "title",
    "tag editor"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "title",
     "label": "Title",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "artist",
     "label": "Artist",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "album",
     "label": "Album",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "album_artist",
     "label": "Album artist",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "year",
     "label": "Year",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "genre",
     "label": "Genre",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "track",
     "label": "Track",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "disc",
     "label": "Disc",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "composer",
     "label": "Composer",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "comment",
     "label": "Comment",
     "type": "text",
     "multiline": false,
     "max_len": 2000,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "cover",
     "label": "Cover image",
     "type": "file",
     "accept": [
      "image/jpeg",
      "image/png",
      "image/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_cover",
     "label": "Remove cover",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "clear_all",
     "label": "Clear all",
     "description": "Remove all existing tags before writing",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.denoise",
   "name": "Reduce Noise",
   "description": "Reduce background hiss and hum with FFmpeg's FFT denoiser (afftdn) or non-local-means (anlmdn), plus optional high-/low-pass filters",
   "category": "audio",
   "keywords": [
    "noise reduction",
    "hiss",
    "hum",
    "background noise",
    "clean audio",
    "afftdn",
    "anlmdn",
    "rumble"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "afftdn",
       "label": "FFT denoise (adaptive)"
      },
      {
       "value": "anlmdn",
       "label": "Non-local means"
      }
     ],
     "multi": false,
     "required": false,
     "default": "afftdn",
     "advanced": false,
     "primary": false
    },
    {
     "name": "strength",
     "label": "Strength",
     "type": "enum",
     "options": [
      {
       "value": "light",
       "label": "Light"
      },
      {
       "value": "medium",
       "label": "Medium"
      },
      {
       "value": "strong",
       "label": "Strong"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": false,
     "primary": false
    },
    {
     "name": "highpass",
     "label": "High-pass (Hz, 0 = off)",
     "description": "Remove rumble below this frequency",
     "type": "number",
     "min": 0,
     "max": 2000,
     "required": false,
     "default": 80,
     "advanced": false,
     "primary": false
    },
    {
     "name": "lowpass",
     "label": "Low-pass (Hz, 0 = off)",
     "type": "number",
     "min": 0,
     "max": 24000,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "noise_floor",
     "label": "Noise floor (dB)",
     "type": "number",
     "min": -80,
     "max": -20,
     "required": false,
     "default": -50,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "method",
      "values": [
       "afftdn"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.speed",
   "name": "Change Audio Speed / Pitch",
   "description": "Change tempo without affecting pitch (0.25×–4×) and/or shift pitch by semitones — uses Rubber Band when available",
   "category": "audio",
   "keywords": [
    "tempo",
    "pitch shift",
    "faster",
    "slower",
    "playback speed",
    "semitones",
    "nightcore",
    "chipmunk"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "tempo",
     "label": "Tempo",
     "type": "number",
     "min": 0.25,
     "max": 4,
     "step": 0.05,
     "required": false,
     "default": 1.25,
     "advanced": false,
     "primary": false
    },
    {
     "name": "pitch",
     "label": "Pitch (semitones)",
     "type": "number",
     "min": -24,
     "max": 24,
     "step": 0.5,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "engine",
     "label": "Engine",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto"
      },
      {
       "value": "rubberband",
       "label": "Rubber Band"
      },
      {
       "value": "atempo",
       "label": "FFmpeg atempo/asetrate"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.equalizer",
   "name": "Equalizer",
   "description": "Shape the sound with presets (bass boost, treble, voice clarity, podcast, loudness) or custom EQ bands, plus high-/low-pass filters",
   "category": "audio",
   "keywords": [
    "eq",
    "bass boost",
    "treble",
    "voice",
    "podcast",
    "highpass",
    "lowpass",
    "tone"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "preset",
     "label": "Preset",
     "type": "enum",
     "options": [
      {
       "value": "bass_boost",
       "label": "Bass boost"
      },
      {
       "value": "bass_cut",
       "label": "Bass cut"
      },
      {
       "value": "treble_boost",
       "label": "Treble boost"
      },
      {
       "value": "treble_cut",
       "label": "Treble cut"
      },
      {
       "value": "voice",
       "label": "Voice clarity"
      },
      {
       "value": "podcast",
       "label": "Podcast (voice + compression)"
      },
      {
       "value": "loudness",
       "label": "Loudness (smile curve)"
      },
      {
       "value": "none",
       "label": "None (custom only)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bass_boost",
     "advanced": false,
     "primary": false
    },
    {
     "name": "bands",
     "label": "Bands",
     "description": "Custom bands as frequency:gain_dB[:Q], comma separated",
     "type": "text",
     "multiline": false,
     "placeholder": "60:+4, 1000:-2, 8000:+3:1.5",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "highpass",
     "label": "High-pass (Hz, 0 = off)",
     "type": "number",
     "min": 0,
     "max": 5000,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "lowpass",
     "label": "Low-pass (Hz, 0 = off)",
     "type": "number",
     "min": 0,
     "max": 24000,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.fade",
   "name": "Fade In / Out",
   "description": "Add a fade-in at the start and/or a fade-out at the end of audio, with selectable fade curves",
   "category": "audio",
   "keywords": [
    "fade in",
    "fade out",
    "afade",
    "intro",
    "outro",
    "smooth"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "fade_in",
     "label": "Fade in (s)",
     "type": "number",
     "min": 0,
     "max": 600,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "fade_out",
     "label": "Fade out (s)",
     "type": "number",
     "min": 0,
     "max": 600,
     "required": false,
     "default": 3,
     "advanced": false,
     "primary": false
    },
    {
     "name": "curve",
     "label": "Curve",
     "type": "enum",
     "options": [
      {
       "value": "tri",
       "label": "Linear"
      },
      {
       "value": "qsin",
       "label": "Quarter sine"
      },
      {
       "value": "esin",
       "label": "Exponential sine"
      },
      {
       "value": "log",
       "label": "Logarithmic"
      },
      {
       "value": "exp",
       "label": "Exponential"
      },
      {
       "value": "par",
       "label": "Parabola"
      }
     ],
     "multi": false,
     "required": false,
     "default": "tri",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.reverse",
   "name": "Reverse Audio",
   "description": "Play audio backwards (the whole file is buffered in memory)",
   "category": "audio",
   "keywords": [
    "backwards",
    "reverse",
    "backmasking",
    "areverse"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio files",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "audio.extract_from_video",
   "name": "Extract Audio from Video",
   "description": "Save the soundtrack of videos as audio — lossless stream copy or MP3, AAC, WAV, FLAC, Opus or Ogg",
   "category": "audio",
   "keywords": [
    "rip audio",
    "soundtrack",
    "video to mp3",
    "mp4 to mp3",
    "demux",
    "audio track"
   ],
   "params": [
    {
     "name": "input",
     "label": "Videos",
     "type": "file",
     "accept": [
      "video/*",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv",
      ".gif"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "copy",
       "label": "Original (no re-encode)"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "ogg",
       "label": "Ogg Vorbis"
      }
     ],
     "multi": false,
     "required": false,
     "default": "mp3",
     "advanced": false,
     "primary": false
    },
    {
     "name": "bitrate",
     "label": "Bitrate (kbit/s)",
     "type": "integer",
     "min": 32,
     "max": 320,
     "required": false,
     "default": 192,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "mp3",
       "m4a",
       "opus"
      ]
     }
    },
    {
     "name": "track",
     "label": "Track",
     "description": "Audio track number (0 = first)",
     "type": "integer",
     "min": 0,
     "max": 64,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 10800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.transcript_convert",
   "name": "Convert Transcript / Subtitles",
   "description": "Convert transcripts and subtitles between SRT, WebVTT, JSON segments, plain text and Markdown",
   "category": "speech",
   "keywords": [
    "srt to vtt",
    "vtt to srt",
    "subtitles",
    "captions",
    "transcript",
    "json",
    "convert subtitles"
   ],
   "params": [
    {
     "name": "text",
     "label": "Transcript / subtitles",
     "description": "Paste SRT, WebVTT, JSON segments or plain text",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "File",
     "description": "…or choose a file",
     "type": "file",
     "accept": [
      ".srt",
      ".vtt",
      ".json",
      ".txt"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "input_format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "json",
       "label": "JSON segments / whisper.cpp JSON"
      },
      {
       "value": "txt",
       "label": "Plain text"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "json",
       "label": "JSON segments"
      },
      {
       "value": "txt",
       "label": "Plain text"
      },
      {
       "value": "md",
       "label": "Markdown"
      }
     ],
     "multi": false,
     "required": false,
     "default": "vtt",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.subtitle_shift",
   "name": "Shift Subtitle Timing",
   "description": "Fix out-of-sync subtitles: shift SRT/WebVTT cues by an offset, stretch them by a factor or frame-rate ratio, optionally from a given time on",
   "category": "speech",
   "keywords": [
    "sync subtitles",
    "delay",
    "offset",
    "subtitle timing",
    "resync",
    "framerate",
    "srt"
   ],
   "params": [
    {
     "name": "text",
     "label": "Transcript / subtitles",
     "description": "Paste SRT, WebVTT, JSON segments or plain text",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "File",
     "description": "…or choose a file",
     "type": "file",
     "accept": [
      ".srt",
      ".vtt",
      ".json",
      ".txt"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "input_format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "json",
       "label": "JSON segments / whisper.cpp JSON"
      },
      {
       "value": "txt",
       "label": "Plain text"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "offset",
     "label": "Offset (seconds, negative = earlier)",
     "type": "number",
     "min": -86400,
     "max": 86400,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "factor",
     "label": "Speed factor",
     "description": "Multiply all times (e.g. 1.001 or 25/23.976)",
     "type": "number",
     "min": 0.1,
     "max": 10,
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "fps_from",
     "label": "Convert from frame rate",
     "description": "Sets the factor to fps_from / fps_to",
     "type": "number",
     "min": 1,
     "max": 240,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "fps_to",
     "label": "…to frame rate",
     "type": "number",
     "min": 1,
     "max": 240,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "from_time",
     "label": "From time",
     "description": "Only shift cues starting at or after this time",
     "type": "text",
     "multiline": false,
     "placeholder": "00:10:00",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_format",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.transcribe",
   "name": "Transcribe Audio / Video",
   "description": "Offline speech-to-text with whisper.cpp: transcribe or translate audio and video to text, SRT, WebVTT, JSON or Markdown, with optional word timestamps, speaker turns and VAD",
   "category": "speech",
   "keywords": [
    "speech to text",
    "whisper",
    "transcription",
    "dictation",
    "captions",
    "subtitles",
    "stt",
    "asr",
    "meeting notes",
    "interview"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio / video",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "formats",
     "label": "Formats",
     "type": "enum",
     "options": [
      {
       "value": "txt",
       "label": "Text"
      },
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "md",
       "label": "Markdown"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "txt",
      "srt"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "model",
     "label": "Model",
     "description": "Whisper model (download models in Settings → Models)",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Best installed"
      },
      {
       "value": "whisper-tiny",
       "label": "Whisper tiny"
      },
      {
       "value": "whisper-tiny.en",
       "label": "Whisper tiny (English)"
      },
      {
       "value": "whisper-base",
       "label": "Whisper base"
      },
      {
       "value": "whisper-base.en",
       "label": "Whisper base (English)"
      },
      {
       "value": "whisper-small",
       "label": "Whisper small"
      },
      {
       "value": "whisper-small.en",
       "label": "Whisper small (English)"
      },
      {
       "value": "whisper-small.en-tdrz",
       "label": "Whisper small + tinydiarize"
      },
      {
       "value": "whisper-large-v3-turbo-q5_0",
       "label": "Whisper large-v3 turbo (q5)"
      },
      {
       "value": "whisper-large-v3-turbo",
       "label": "Whisper large-v3 turbo"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "language",
     "label": "Language",
     "description": "Spoken language code, or 'auto' to detect",
     "type": "text",
     "multiline": false,
     "max_len": 8,
     "placeholder": "auto, en, de, fr…",
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "translate",
     "label": "Translate",
     "description": "Translate the speech to English",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "vad",
     "label": "Vad",
     "description": "Skip non-speech with Silero VAD (needs the 'silero-vad' model)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "prompt",
     "label": "Prompt",
     "description": "Initial prompt: names, spelling or style hints",
     "type": "text",
     "multiline": true,
     "max_len": 2000,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "threads",
     "label": "Threads",
     "type": "integer",
     "min": 1,
     "max": 64,
     "required": false,
     "default": 4,
     "advanced": true,
     "primary": false
    },
    {
     "name": "word_timestamps",
     "label": "Word timestamps",
     "description": "Include per-word timings in the JSON / data",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "diarize",
     "label": "Diarize",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "Off"
      },
      {
       "value": "tinydiarize",
       "label": "Speaker turns (tinydiarize model)"
      },
      {
       "value": "stereo",
       "label": "Stereo: one speaker per channel"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "whisper",
    "ffmpeg",
    "ffprobe"
   ],
   "requires_model": "whisper",
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "model",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.detect_language",
   "name": "Detect Spoken Language",
   "description": "Identify the language spoken in audio or video with Whisper (analyses 30 seconds from the chosen offset)",
   "category": "speech",
   "keywords": [
    "language identification",
    "what language",
    "whisper",
    "lid",
    "spoken language"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio / video",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "model",
     "label": "Model",
     "description": "Whisper model (download models in Settings → Models)",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Best installed"
      },
      {
       "value": "whisper-tiny",
       "label": "Whisper tiny"
      },
      {
       "value": "whisper-tiny.en",
       "label": "Whisper tiny (English)"
      },
      {
       "value": "whisper-base",
       "label": "Whisper base"
      },
      {
       "value": "whisper-base.en",
       "label": "Whisper base (English)"
      },
      {
       "value": "whisper-small",
       "label": "Whisper small"
      },
      {
       "value": "whisper-small.en",
       "label": "Whisper small (English)"
      },
      {
       "value": "whisper-small.en-tdrz",
       "label": "Whisper small + tinydiarize"
      },
      {
       "value": "whisper-large-v3-turbo-q5_0",
       "label": "Whisper large-v3 turbo (q5)"
      },
      {
       "value": "whisper-large-v3-turbo",
       "label": "Whisper large-v3 turbo"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "offset",
     "label": "Offset",
     "description": "Where to start listening",
     "type": "text",
     "multiline": false,
     "placeholder": "0:00",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "threads",
     "label": "Threads",
     "type": "integer",
     "min": 1,
     "max": 64,
     "required": false,
     "default": 4,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "whisper",
    "ffmpeg",
    "ffprobe"
   ],
   "requires_model": "whisper",
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "model",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.subtitles",
   "name": "Generate Subtitles",
   "description": "Automatically create SRT/WebVTT subtitles from speech with whisper.cpp, optionally adding them to the video as a soft track or burning them in",
   "category": "speech",
   "keywords": [
    "auto subtitles",
    "captions",
    "closed captions",
    "srt",
    "vtt",
    "whisper",
    "accessibility",
    "auto caption"
   ],
   "params": [
    {
     "name": "input",
     "label": "Video / audio",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "srt",
       "label": "SRT"
      },
      {
       "value": "vtt",
       "label": "WebVTT"
      },
      {
       "value": "both",
       "label": "SRT + WebVTT"
      }
     ],
     "multi": false,
     "required": false,
     "default": "srt",
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_chars",
     "label": "Max characters per subtitle",
     "description": "0 = whisper's natural segments",
     "type": "integer",
     "min": 0,
     "max": 200,
     "required": false,
     "default": 42,
     "advanced": false,
     "primary": false
    },
    {
     "name": "embed",
     "label": "Embed",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "Subtitle file only"
      },
      {
       "value": "soft",
       "label": "Add to video as a track"
      },
      {
       "value": "burn",
       "label": "Burn into the video"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": false,
     "primary": false
    },
    {
     "name": "model",
     "label": "Model",
     "description": "Whisper model (download models in Settings → Models)",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Best installed"
      },
      {
       "value": "whisper-tiny",
       "label": "Whisper tiny"
      },
      {
       "value": "whisper-tiny.en",
       "label": "Whisper tiny (English)"
      },
      {
       "value": "whisper-base",
       "label": "Whisper base"
      },
      {
       "value": "whisper-base.en",
       "label": "Whisper base (English)"
      },
      {
       "value": "whisper-small",
       "label": "Whisper small"
      },
      {
       "value": "whisper-small.en",
       "label": "Whisper small (English)"
      },
      {
       "value": "whisper-small.en-tdrz",
       "label": "Whisper small + tinydiarize"
      },
      {
       "value": "whisper-large-v3-turbo-q5_0",
       "label": "Whisper large-v3 turbo (q5)"
      },
      {
       "value": "whisper-large-v3-turbo",
       "label": "Whisper large-v3 turbo"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "language",
     "label": "Language",
     "description": "Spoken language code, or 'auto' to detect",
     "type": "text",
     "multiline": false,
     "max_len": 8,
     "placeholder": "auto, en, de, fr…",
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "translate",
     "label": "Translate",
     "description": "Translate the speech to English",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "vad",
     "label": "Vad",
     "description": "Skip non-speech with Silero VAD (needs the 'silero-vad' model)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "prompt",
     "label": "Prompt",
     "description": "Initial prompt: names, spelling or style hints",
     "type": "text",
     "multiline": true,
     "max_len": 2000,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "threads",
     "label": "Threads",
     "type": "integer",
     "min": 1,
     "max": 64,
     "required": false,
     "default": 4,
     "advanced": true,
     "primary": false
    },
    {
     "name": "font_size",
     "label": "Font size",
     "description": "0 = automatic",
     "type": "integer",
     "min": 0,
     "max": 200,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "embed",
      "values": [
       "burn"
      ]
     }
    },
    {
     "name": "color",
     "label": "Color",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "embed",
      "values": [
       "burn"
      ]
     }
    },
    {
     "name": "outline_color",
     "label": "Outline color",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "embed",
      "values": [
       "burn"
      ]
     }
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "middle",
       "label": "Middle"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bottom",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "embed",
      "values": [
       "burn"
      ]
     }
    },
    {
     "name": "margin",
     "label": "Margin",
     "type": "integer",
     "min": 0,
     "max": 500,
     "required": false,
     "default": 20,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "embed",
      "values": [
       "burn"
      ]
     }
    },
    {
     "name": "quality",
     "label": "Quality",
     "description": "Encoding quality used when the video must be re-encoded",
     "type": "enum",
     "options": [
      {
       "value": "high",
       "label": "High (larger file)"
      },
      {
       "value": "medium",
       "label": "Balanced"
      },
      {
       "value": "low",
       "label": "Low (smaller file)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "medium",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "whisper",
    "ffmpeg",
    "ffprobe"
   ],
   "requires_model": "whisper",
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "model",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.tts",
   "name": "Text to Speech",
   "description": "Turn text into natural-sounding speech offline with Piper neural voices; save as WAV, MP3, Ogg, Opus, FLAC or M4A",
   "category": "speech",
   "keywords": [
    "tts",
    "read aloud",
    "voice",
    "narration",
    "speech synthesis",
    "piper",
    "audiobook"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "max_len": 200000,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "voice",
     "label": "Voice",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "First installed voice"
      },
      {
       "value": "piper-en_US-lessac-medium",
       "label": "Piper voice: English (US) Lessac, medium"
      },
      {
       "value": "piper-en_GB-alan-medium",
       "label": "Piper voice: English (UK) Alan, medium"
      },
      {
       "value": "piper-de_DE-thorsten-medium",
       "label": "Piper voice: German Thorsten, medium"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "speed",
     "label": "Speed",
     "type": "number",
     "min": 0.25,
     "max": 4,
     "step": 0.05,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sentence_pause",
     "label": "Pause between sentences (s)",
     "type": "number",
     "min": 0,
     "max": 5,
     "required": false,
     "default": 0.2,
     "advanced": true,
     "primary": false
    },
    {
     "name": "speaker",
     "label": "Speaker",
     "description": "Speaker id for multi-speaker voices",
     "type": "integer",
     "min": 0,
     "max": 1000,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "ogg",
       "label": "Ogg Vorbis"
      },
      {
       "value": "opus",
       "label": "Opus"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "wav",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "piper"
   ],
   "requires_model": "piper",
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": false,
   "execution": "model",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.vad",
   "name": "Voice Activity Detection",
   "description": "Find where people are speaking in audio or video using the WebRTC voice activity detector; returns speech segments and can export JSON, CSV, SRT or Audacity labels",
   "category": "speech",
   "keywords": [
    "vad",
    "speech detection",
    "voice detection",
    "speech segments",
    "webrtc",
    "talking",
    "non-speech"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "aggressiveness",
     "label": "Aggressiveness",
     "description": "0 = keep more audio as speech, 3 = strictest filtering of non-speech",
     "type": "integer",
     "min": 0,
     "max": 3,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_speech_ms",
     "label": "Minimum speech (ms)",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 250,
     "advanced": true,
     "primary": false
    },
    {
     "name": "min_silence_ms",
     "label": "Minimum silence (ms)",
     "description": "Shorter pauses are merged into the surrounding speech",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 300,
     "advanced": true,
     "primary": false
    },
    {
     "name": "padding_ms",
     "label": "Padding (ms)",
     "description": "Extra audio kept around each speech segment",
     "type": "integer",
     "min": 0,
     "max": 5000,
     "required": false,
     "default": 200,
     "advanced": true,
     "primary": false
    },
    {
     "name": "frame_ms",
     "label": "Frame ms",
     "description": "Analysis frame length (ms)",
     "type": "enum",
     "options": [
      {
       "value": "10",
       "label": "10"
      },
      {
       "value": "20",
       "label": "20"
      },
      {
       "value": "30",
       "label": "30"
      }
     ],
     "multi": false,
     "required": false,
     "default": "30",
     "advanced": true,
     "primary": false
    },
    {
     "name": "export",
     "label": "Export",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "None"
      },
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "csv",
       "label": "CSV"
      },
      {
       "value": "srt",
       "label": "SRT (one cue per segment)"
      },
      {
       "value": "audacity",
       "label": "Audacity labels"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.extract_segments",
   "name": "Extract Speech Segments",
   "description": "Detect speech with VAD and save each speech segment as its own file, or join all speech into one file (removes non-speech)",
   "category": "speech",
   "keywords": [
    "remove non-speech",
    "speech only",
    "cut pauses",
    "vad",
    "utterances",
    "dataset",
    "clips"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "concat",
       "label": "One file with speech only"
      },
      {
       "value": "files",
       "label": "One file per segment"
      }
     ],
     "multi": false,
     "required": false,
     "default": "concat",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "opus",
       "label": "Opus"
      }
     ],
     "multi": false,
     "required": false,
     "default": "wav",
     "advanced": false,
     "primary": false
    },
    {
     "name": "zip",
     "label": "Zip",
     "description": "Return segment files as a ZIP archive",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "files"
      ]
     }
    },
    {
     "name": "aggressiveness",
     "label": "Aggressiveness",
     "description": "0 = keep more audio as speech, 3 = strictest filtering of non-speech",
     "type": "integer",
     "min": 0,
     "max": 3,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_speech_ms",
     "label": "Minimum speech (ms)",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 250,
     "advanced": true,
     "primary": false
    },
    {
     "name": "min_silence_ms",
     "label": "Minimum silence (ms)",
     "description": "Shorter pauses are merged into the surrounding speech",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 300,
     "advanced": true,
     "primary": false
    },
    {
     "name": "padding_ms",
     "label": "Padding (ms)",
     "description": "Extra audio kept around each speech segment",
     "type": "integer",
     "min": 0,
     "max": 5000,
     "required": false,
     "default": 200,
     "advanced": true,
     "primary": false
    },
    {
     "name": "frame_ms",
     "label": "Frame ms",
     "description": "Analysis frame length (ms)",
     "type": "enum",
     "options": [
      {
       "value": "10",
       "label": "10"
      },
      {
       "value": "20",
       "label": "20"
      },
      {
       "value": "30",
       "label": "30"
      }
     ],
     "multi": false,
     "required": false,
     "default": "30",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "speech.split_by_speech",
   "name": "Split at Pauses",
   "description": "Split long recordings into chunks no longer than a maximum length, cutting in pauses between speech (found by VAD) — ideal before transcription or upload limits",
   "category": "speech",
   "keywords": [
    "split long audio",
    "chunk",
    "pauses",
    "vad",
    "podcast",
    "lecture",
    "transcription prep",
    "segment"
   ],
   "params": [
    {
     "name": "input",
     "label": "Audio file",
     "type": "file",
     "accept": [
      "audio/*",
      "video/*",
      ".mp3",
      ".m4a",
      ".aac",
      ".wav",
      ".flac",
      ".ogg",
      ".oga",
      ".opus",
      ".wma",
      ".aiff",
      ".aif",
      ".mka",
      ".ac3",
      ".amr",
      ".caf",
      ".mkv",
      ".mp4",
      ".mov",
      ".webm",
      ".avi",
      ".m4v",
      ".ts",
      ".mts",
      ".m2ts",
      ".flv",
      ".wmv",
      ".3gp",
      ".mpg",
      ".mpeg",
      ".ogv"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "max_seconds",
     "label": "Maximum chunk length (s)",
     "type": "number",
     "min": 5,
     "max": 86400,
     "required": false,
     "default": 300,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_seconds",
     "label": "Minimum chunk length (s)",
     "type": "number",
     "min": 0,
     "max": 3600,
     "required": false,
     "default": 10,
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "wav",
       "label": "WAV"
      },
      {
       "value": "flac",
       "label": "FLAC"
      },
      {
       "value": "mp3",
       "label": "MP3"
      },
      {
       "value": "m4a",
       "label": "AAC (M4A)"
      },
      {
       "value": "opus",
       "label": "Opus"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": false,
     "primary": false
    },
    {
     "name": "aggressiveness",
     "label": "Aggressiveness",
     "description": "0 = keep more audio as speech, 3 = strictest filtering of non-speech",
     "type": "integer",
     "min": 0,
     "max": 3,
     "required": false,
     "default": 2,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_speech_ms",
     "label": "Minimum speech (ms)",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 250,
     "advanced": true,
     "primary": false
    },
    {
     "name": "min_silence_ms",
     "label": "Minimum silence (ms)",
     "description": "Shorter pauses are merged into the surrounding speech",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 300,
     "advanced": true,
     "primary": false
    },
    {
     "name": "padding_ms",
     "label": "Padding (ms)",
     "description": "Extra audio kept around each speech segment",
     "type": "integer",
     "min": 0,
     "max": 5000,
     "required": false,
     "default": 200,
     "advanced": true,
     "primary": false
    },
    {
     "name": "frame_ms",
     "label": "Frame ms",
     "description": "Analysis frame length (ms)",
     "type": "enum",
     "options": [
      {
       "value": "10",
       "label": "10"
      },
      {
       "value": "20",
       "label": "20"
      },
      {
       "value": "30",
       "label": "30"
      }
     ],
     "multi": false,
     "required": false,
     "default": "30",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "ffmpeg",
    "ffprobe"
   ],
   "permissions": [],
   "timeout_secs": 14400,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.merge",
   "name": "Merge PDFs",
   "description": "Combine several PDFs into one document in the given order, optionally taking only some pages of each",
   "category": "pdf",
   "keywords": [
    "combine",
    "join",
    "concatenate",
    "append",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files (in order)",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "ranges",
     "label": "Page ranges",
     "description": "Optional: one page range per line, in file order (e.g. '1-3,5' or 'z-1'); blank line = all pages",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_name",
     "label": "Output file name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "merged.pdf",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.split",
   "name": "Split PDF",
   "description": "Split a PDF into several files: every N pages, single pages, or custom page ranges",
   "category": "pdf",
   "keywords": [
    "separate",
    "burst",
    "pages",
    "divide",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "every",
       "label": "Every N pages"
      },
      {
       "value": "single",
       "label": "Single pages"
      },
      {
       "value": "ranges",
       "label": "Custom ranges"
      }
     ],
     "multi": false,
     "required": false,
     "default": "every",
     "advanced": false,
     "primary": false
    },
    {
     "name": "every",
     "label": "Pages per file",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "every"
      ]
     }
    },
    {
     "name": "ranges",
     "label": "Ranges",
     "description": "One output file per group; separate groups with ';' or new lines, e.g. '1-3; 4-6; 7-z'",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "ranges"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.extract_pages",
   "name": "Extract Pages",
   "description": "Create a new PDF containing only the selected pages",
   "category": "pdf",
   "keywords": [
    "select",
    "pick",
    "subset",
    "pages",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "pages",
     "label": "Pages",
     "description": "Page range, e.g. '1-3,5,8-z'",
     "type": "text",
     "multiline": false,
     "placeholder": "1-3,5",
     "required": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.reorder",
   "name": "Reorder Pages",
   "description": "Rearrange the pages of a PDF in a new order, or reverse it (pages may be repeated or left out)",
   "category": "pdf",
   "keywords": [
    "order",
    "arrange",
    "reverse",
    "sort",
    "pages",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "order",
     "label": "New order",
     "description": "Page list in the desired order, e.g. '3,1,2,4-z'",
     "type": "text",
     "multiline": false,
     "placeholder": "3,1,2,4-z",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "reverse",
     "label": "Reverse all pages",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.rotate",
   "name": "Rotate Pages",
   "description": "Rotate all or selected pages of one or more PDFs by 90, 180 or 270 degrees",
   "category": "pdf",
   "keywords": [
    "turn",
    "orientation",
    "landscape",
    "portrait",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "angle",
     "label": "Angle",
     "type": "enum",
     "options": [
      {
       "value": "90",
       "label": "90° clockwise"
      },
      {
       "value": "180",
       "label": "180°"
      },
      {
       "value": "270",
       "label": "90° counter-clockwise"
      }
     ],
     "multi": false,
     "required": false,
     "default": "90",
     "advanced": false,
     "primary": false
    },
    {
     "name": "pages",
     "label": "Pages",
     "description": "Optional page range (default: all pages)",
     "type": "text",
     "multiline": false,
     "placeholder": "1-z",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "absolute",
     "label": "Set absolute rotation",
     "description": "Set the rotation to exactly this angle instead of adding to the current one",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.delete_pages",
   "name": "Delete Pages",
   "description": "Remove selected pages from a PDF",
   "category": "pdf",
   "keywords": [
    "remove",
    "drop",
    "pages",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "pages",
     "label": "Pages to delete",
     "type": "text",
     "multiline": false,
     "placeholder": "2,4-6",
     "required": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.repair",
   "name": "Repair PDF",
   "description": "Rebuild damaged PDFs (broken cross-reference tables, bad offsets) into clean, valid files",
   "category": "pdf",
   "keywords": [
    "fix",
    "recover",
    "corrupt",
    "broken",
    "damaged",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.linearize",
   "name": "Optimize for Web",
   "description": "Linearize PDFs (fast web view) so the first page displays before the whole file has downloaded",
   "category": "pdf",
   "keywords": [
    "linearize",
    "fast web view",
    "optimize",
    "web",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.flatten",
   "name": "Flatten Forms & Annotations",
   "description": "Bake form field values and annotations into the page content so they can no longer be edited",
   "category": "pdf",
   "keywords": [
    "flatten",
    "forms",
    "annotations",
    "comments",
    "burn in",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "which",
     "label": "Which",
     "type": "enum",
     "options": [
      {
       "value": "all",
       "label": "All annotations"
      },
      {
       "value": "print",
       "label": "Only those that print"
      },
      {
       "value": "screen",
       "label": "Only those shown on screen"
      }
     ],
     "multi": false,
     "required": false,
     "default": "all",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.protect",
   "name": "Protect PDF",
   "description": "Encrypt PDFs with AES-256: require a password to open and/or restrict printing, copying and editing",
   "category": "pdf",
   "keywords": [
    "encrypt",
    "password",
    "lock",
    "secure",
    "permissions",
    "aes",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "user_password",
     "label": "Open password",
     "description": "Required to open the document (leave empty to allow opening without a password)",
     "type": "secret",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "owner_password",
     "label": "Permissions password",
     "description": "Required to change permissions or remove the protection",
     "type": "secret",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "allow",
     "label": "Allowed actions",
     "type": "enum",
     "options": [
      {
       "value": "print",
       "label": "Print"
      },
      {
       "value": "modify",
       "label": "Modify content"
      },
      {
       "value": "copy",
       "label": "Copy text & images"
      },
      {
       "value": "annotate",
       "label": "Add comments"
      },
      {
       "value": "forms",
       "label": "Fill in forms"
      },
      {
       "value": "assemble",
       "label": "Assemble (insert, rotate, delete pages)"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "print",
      "copy"
     ],
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.unlock",
   "name": "Remove PDF Password",
   "description": "Remove password protection from a document you are authorized to open (the correct password is required)",
   "category": "pdf",
   "keywords": [
    "decrypt",
    "unlock",
    "password",
    "unprotect",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "password",
     "label": "Password",
     "description": "The document's open or permissions password",
     "type": "secret",
     "required": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.compress",
   "name": "Compress PDF",
   "description": "Shrink PDFs by downsampling images (Ghostscript) and packing objects into compressed streams (qpdf); keeps the smallest result",
   "category": "pdf",
   "keywords": [
    "compress",
    "reduce",
    "shrink",
    "smaller",
    "optimize",
    "size",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "preset",
     "label": "Preset",
     "type": "enum",
     "options": [
      {
       "value": "screen",
       "label": "Smallest (72 dpi images)"
      },
      {
       "value": "ebook",
       "label": "Balanced (150 dpi images)"
      },
      {
       "value": "printer",
       "label": "High quality (300 dpi images)"
      },
      {
       "value": "prepress",
       "label": "Prepress (300 dpi, color preserving)"
      },
      {
       "value": "lossless",
       "label": "Lossless only (no image changes)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "ebook",
     "advanced": false,
     "primary": false
    },
    {
     "name": "linearize",
     "label": "Optimize for web (linearize)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "grayscale",
     "label": "Convert to grayscale",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "ghostscript"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.extract_text",
   "name": "Extract Text",
   "description": "Extract the text layer of PDFs as plain text, optionally preserving the physical layout",
   "category": "pdf",
   "keywords": [
    "text",
    "pdftotext",
    "copy",
    "content",
    "txt",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "layout",
     "label": "Preserve layout",
     "description": "Keep the original column layout using spacing",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "first_page",
     "label": "First page",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "last_page",
     "label": "Last page",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler"
   ],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.extract_images",
   "name": "Extract Images",
   "description": "Save the images embedded in a PDF in their original formats (JPEG, PNG, JPEG 2000, ...)",
   "category": "pdf",
   "keywords": [
    "images",
    "pictures",
    "photos",
    "pdfimages",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "first_page",
     "label": "First page",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "last_page",
     "label": "Last page",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "min_size",
     "label": "Minimum size (px)",
     "description": "Skip images smaller than this in both dimensions",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.to_images",
   "name": "PDF to Images",
   "description": "Render PDF pages to PNG, JPEG or TIFF images at a chosen resolution",
   "category": "pdf",
   "keywords": [
    "render",
    "convert",
    "png",
    "jpg",
    "jpeg",
    "tiff",
    "rasterize",
    "pdftoppm",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpeg",
       "label": "JPEG"
      },
      {
       "value": "tiff",
       "label": "TIFF"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    },
    {
     "name": "dpi",
     "label": "Resolution (DPI)",
     "type": "integer",
     "min": 18,
     "max": 1200,
     "required": false,
     "default": 150,
     "advanced": false,
     "primary": false
    },
    {
     "name": "pages",
     "label": "Pages",
     "description": "Optional page range (default: all)",
     "type": "text",
     "multiline": false,
     "placeholder": "1-3,5",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "quality",
     "label": "JPEG quality",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 90,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "jpeg"
      ]
     }
    },
    {
     "name": "grayscale",
     "label": "Grayscale",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "transparent",
     "label": "Transparent background (PNG)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "png"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.info",
   "name": "PDF Info",
   "description": "Inspect a PDF: page count and sizes, PDF version, metadata, encryption, fonts, forms and more",
   "category": "pdf",
   "keywords": [
    "properties",
    "metadata",
    "pages",
    "fonts",
    "encryption",
    "version",
    "inspect",
    "pdfinfo"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler"
   ],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.compare_text",
   "name": "Compare PDF Text",
   "description": "Show the textual differences between two PDFs (line by line)",
   "category": "pdf",
   "keywords": [
    "diff",
    "compare",
    "changes",
    "versions",
    "pdf"
   ],
   "params": [
    {
     "name": "original",
     "label": "Original PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "changed",
     "label": "Changed PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/x-diff"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler"
   ],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "ui": "diff",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.from_images",
   "name": "Images to PDF",
   "description": "Combine images (JPEG, PNG, WebP, TIFF, GIF, BMP) into a PDF, one image per page; JPEGs are embedded without recompression",
   "category": "pdf",
   "keywords": [
    "jpg to pdf",
    "png to pdf",
    "photos",
    "scan",
    "convert",
    "combine",
    "images"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images (in order)",
     "type": "file",
     "accept": [
      "image/*"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "page_size",
     "label": "Page size",
     "type": "enum",
     "options": [
      {
       "value": "fit",
       "label": "Fit to image"
      },
      {
       "value": "a4",
       "label": "A4"
      },
      {
       "value": "letter",
       "label": "US Letter"
      },
      {
       "value": "legal",
       "label": "US Legal"
      },
      {
       "value": "a3",
       "label": "A3"
      },
      {
       "value": "a5",
       "label": "A5"
      }
     ],
     "multi": false,
     "required": false,
     "default": "fit",
     "advanced": false,
     "primary": false
    },
    {
     "name": "orientation",
     "label": "Orientation",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto (match image)"
      },
      {
       "value": "portrait",
       "label": "Portrait"
      },
      {
       "value": "landscape",
       "label": "Landscape"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin (mm)",
     "type": "number",
     "min": 0,
     "max": 100,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "dpi",
     "label": "Image DPI for 'fit'",
     "description": "Pixels per inch used to size 'fit' pages",
     "type": "integer",
     "min": 10,
     "max": 2400,
     "required": false,
     "default": 150,
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_name",
     "label": "Output file name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "images.pdf",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.ocr",
   "name": "OCR PDF",
   "description": "Make scanned PDFs searchable by adding an invisible OCR text layer (Tesseract), or extract the recognized text",
   "category": "pdf",
   "keywords": [
    "ocr",
    "scan",
    "searchable",
    "recognize",
    "text recognition",
    "tesseract",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "output",
     "label": "Output",
     "type": "enum",
     "options": [
      {
       "value": "pdf",
       "label": "Searchable PDF"
      },
      {
       "value": "text",
       "label": "Text only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "pdf",
     "advanced": false,
     "primary": false
    },
    {
     "name": "languages",
     "label": "Languages",
     "description": "Tesseract language codes joined with '+', e.g. 'eng+deu'",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "eng",
     "advanced": false,
     "primary": false
    },
    {
     "name": "dpi",
     "label": "Scan resolution (DPI)",
     "type": "integer",
     "min": 100,
     "max": 600,
     "required": false,
     "default": 300,
     "advanced": true,
     "primary": false
    },
    {
     "name": "pages",
     "label": "Pages",
     "description": "Optional page range (default: all)",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "image_format",
     "label": "Image format",
     "type": "enum",
     "options": [
      {
       "value": "jpeg",
       "label": "JPEG (smaller)"
      },
      {
       "value": "png",
       "label": "PNG (lossless)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "jpeg",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "output",
      "values": [
       "pdf"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf",
    "poppler",
    "tesseract"
   ],
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.watermark",
   "name": "Watermark PDF",
   "description": "Stamp a text or image watermark on all or selected pages, with opacity, rotation, size and colour",
   "category": "pdf",
   "keywords": [
    "watermark",
    "stamp",
    "confidential",
    "draft",
    "overlay",
    "logo",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "text",
       "label": "Text"
      },
      {
       "value": "image",
       "label": "Image"
      }
     ],
     "multi": false,
     "required": false,
     "default": "text",
     "advanced": false,
     "primary": false
    },
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "CONFIDENTIAL",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "image",
     "label": "Watermark image",
     "type": "file",
     "accept": [
      "image/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "image"
      ]
     }
    },
    {
     "name": "font_size",
     "label": "Font size (pt)",
     "type": "number",
     "min": 4,
     "max": 400,
     "required": false,
     "default": 60,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "color",
     "label": "Colour",
     "type": "color",
     "required": false,
     "default": "#ff0000",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "text"
      ]
     }
    },
    {
     "name": "scale",
     "label": "Image width (% of page)",
     "type": "number",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 50,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "image"
      ]
     }
    },
    {
     "name": "opacity",
     "label": "Opacity",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "required": false,
     "default": 0.3,
     "advanced": false,
     "primary": false
    },
    {
     "name": "rotation",
     "label": "Rotation (°)",
     "type": "number",
     "min": -360,
     "max": 360,
     "required": false,
     "default": 45,
     "advanced": false,
     "primary": false
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "bottom",
       "label": "Bottom"
      }
     ],
     "multi": false,
     "required": false,
     "default": "center",
     "advanced": true,
     "primary": false
    },
    {
     "name": "pages",
     "label": "Pages",
     "description": "Optional page range (default: all)",
     "type": "text",
     "multiline": false,
     "placeholder": "1-z",
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.page_numbers",
   "name": "Add Page Numbers",
   "description": "Number the pages of PDFs with a custom format like 'Page {n} of {total}' at a chosen position",
   "category": "pdf",
   "keywords": [
    "page numbers",
    "numbering",
    "pagination",
    "footer",
    "header",
    "bates",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "bottom-center",
       "label": "Bottom center"
      },
      {
       "value": "bottom-right",
       "label": "Bottom right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "top-center",
       "label": "Top center"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "top-left",
       "label": "Top left"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bottom-center",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "description": "Use {n} for the page number and {total} for the total",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "{n}",
     "advanced": false,
     "primary": false
    },
    {
     "name": "start",
     "label": "Start at",
     "type": "integer",
     "min": -1000000,
     "max": 1000000000,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "font_size",
     "label": "Font size (pt)",
     "type": "number",
     "min": 4,
     "max": 72,
     "required": false,
     "default": 10,
     "advanced": false,
     "primary": false
    },
    {
     "name": "color",
     "label": "Colour",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin (pt)",
     "type": "number",
     "min": 0,
     "max": 300,
     "required": false,
     "default": 28,
     "advanced": true,
     "primary": false
    },
    {
     "name": "skip_first",
     "label": "Skip first page",
     "description": "Leave the first page (e.g. a cover) unnumbered; numbering starts on page 2",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.metadata_edit",
   "name": "Edit PDF Metadata",
   "description": "Set or clear document properties (title, author, subject, keywords, creator, producer); can strip all metadata including XMP",
   "category": "pdf",
   "keywords": [
    "metadata",
    "properties",
    "title",
    "author",
    "privacy",
    "strip",
    "xmp",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF files",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "clear_all",
     "label": "Remove all metadata",
     "description": "Delete the document information dictionary and XMP metadata before applying any new values",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "title",
     "label": "Title",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "author",
     "label": "Author",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "subject",
     "label": "Subject",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "keywords",
     "label": "Keywords",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "creator",
     "label": "Creator",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "producer",
     "label": "Producer",
     "description": "Leave empty to keep the current value; use a single '-' to remove it",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 900,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.form_fields",
   "name": "List Form Fields",
   "description": "List the fillable form fields of a PDF with their names, types, current values and options",
   "category": "pdf",
   "keywords": [
    "form",
    "acroform",
    "fields",
    "fillable",
    "inspect",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.form_fill",
   "name": "Fill PDF Form",
   "description": "Fill text fields, checkboxes, radio buttons and choice fields of a PDF form from a JSON mapping of field names to values",
   "category": "pdf",
   "keywords": [
    "form",
    "fill",
    "acroform",
    "fields",
    "fillable",
    "pdf"
   ],
   "params": [
    {
     "name": "input",
     "label": "PDF",
     "type": "file",
     "accept": [
      "application/pdf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "values",
     "label": "Field values",
     "description": "JSON object mapping field names to values, e.g. {\"name\": \"Ada\", \"agree\": true}. Get the names with pdf.form_fields.",
     "type": "json",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "flatten",
     "label": "Flatten after filling",
     "description": "Make the filled values part of the page so they can no longer be edited",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "qpdf"
   ],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": false,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.convert_document",
   "name": "Convert Office Documents",
   "description": "Convert Word, Excel, PowerPoint and OpenDocument files to PDF or other office formats with LibreOffice (offline)",
   "category": "pdf",
   "keywords": [
    "docx to pdf",
    "word to pdf",
    "excel to pdf",
    "powerpoint to pdf",
    "odt",
    "office",
    "libreoffice",
    "convert"
   ],
   "params": [
    {
     "name": "input",
     "label": "Documents",
     "type": "file",
     "accept": [
      ".doc",
      ".docx",
      ".odt",
      ".rtf",
      ".txt",
      ".html",
      ".htm",
      ".wpd",
      ".pages",
      ".xls",
      ".xlsx",
      ".ods",
      ".csv",
      ".ppt",
      ".pptx",
      ".odp",
      ".odg",
      ".vsd",
      ".pub",
      ".fodt",
      ".fods",
      ".fodp",
      ".dotx",
      ".xlsm",
      ".docm",
      ".pptm"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "pdf",
       "label": "PDF"
      },
      {
       "value": "docx",
       "label": "Word (DOCX)"
      },
      {
       "value": "odt",
       "label": "OpenDocument Text (ODT)"
      },
      {
       "value": "rtf",
       "label": "Rich Text (RTF)"
      },
      {
       "value": "txt",
       "label": "Plain text"
      },
      {
       "value": "html",
       "label": "HTML"
      },
      {
       "value": "xlsx",
       "label": "Excel (XLSX)"
      },
      {
       "value": "ods",
       "label": "OpenDocument Spreadsheet (ODS)"
      },
      {
       "value": "csv",
       "label": "CSV (first sheet)"
      },
      {
       "value": "pptx",
       "label": "PowerPoint (PPTX)"
      },
      {
       "value": "odp",
       "label": "OpenDocument Presentation (ODP)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "pdf",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "libreoffice"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.convert_markup",
   "name": "Convert Markup Documents",
   "description": "Convert between Markdown, HTML, DOCX, ODT, EPUB, reStructuredText, LaTeX, Org and more with Pandoc",
   "category": "pdf",
   "keywords": [
    "pandoc",
    "markdown",
    "html",
    "docx",
    "epub",
    "rst",
    "latex",
    "org",
    "convert"
   ],
   "params": [
    {
     "name": "input",
     "label": "Documents",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste text",
     "type": "text",
     "multiline": true,
     "syntax": "markdown",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "from",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Detect from extension"
      },
      {
       "value": "markdown",
       "label": "Markdown (Pandoc)"
      },
      {
       "value": "gfm",
       "label": "GitHub Markdown"
      },
      {
       "value": "commonmark",
       "label": "CommonMark"
      },
      {
       "value": "html",
       "label": "HTML"
      },
      {
       "value": "docx",
       "label": "Word (DOCX)"
      },
      {
       "value": "odt",
       "label": "OpenDocument (ODT)"
      },
      {
       "value": "epub",
       "label": "EPUB"
      },
      {
       "value": "rst",
       "label": "reStructuredText"
      },
      {
       "value": "latex",
       "label": "LaTeX"
      },
      {
       "value": "org",
       "label": "Org mode"
      },
      {
       "value": "textile",
       "label": "Textile"
      },
      {
       "value": "mediawiki",
       "label": "MediaWiki"
      },
      {
       "value": "docbook",
       "label": "DocBook"
      },
      {
       "value": "rtf",
       "label": "RTF"
      },
      {
       "value": "ipynb",
       "label": "Jupyter notebook"
      },
      {
       "value": "csv",
       "label": "CSV"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "to",
     "label": "Output format",
     "type": "enum",
     "options": [
      {
       "value": "html",
       "label": "HTML"
      },
      {
       "value": "docx",
       "label": "Word (DOCX)"
      },
      {
       "value": "odt",
       "label": "OpenDocument (ODT)"
      },
      {
       "value": "epub",
       "label": "EPUB"
      },
      {
       "value": "markdown",
       "label": "Markdown (Pandoc)"
      },
      {
       "value": "gfm",
       "label": "GitHub Markdown"
      },
      {
       "value": "rst",
       "label": "reStructuredText"
      },
      {
       "value": "latex",
       "label": "LaTeX"
      },
      {
       "value": "org",
       "label": "Org mode"
      },
      {
       "value": "asciidoc",
       "label": "AsciiDoc"
      },
      {
       "value": "mediawiki",
       "label": "MediaWiki"
      },
      {
       "value": "textile",
       "label": "Textile"
      },
      {
       "value": "rtf",
       "label": "RTF"
      },
      {
       "value": "docbook",
       "label": "DocBook"
      },
      {
       "value": "plain",
       "label": "Plain text"
      },
      {
       "value": "typst",
       "label": "Typst"
      }
     ],
     "multi": false,
     "required": false,
     "default": "html",
     "advanced": false,
     "primary": false
    },
    {
     "name": "standalone",
     "label": "Standalone document",
     "description": "Produce a complete document with header (HTML/LaTeX/...)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "pandoc"
   ],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "pdf.markup_to_pdf",
   "name": "Markdown to PDF",
   "description": "Turn Markdown, HTML, reStructuredText and other markup into PDF (Pandoc → DOCX → LibreOffice)",
   "category": "pdf",
   "keywords": [
    "markdown to pdf",
    "md to pdf",
    "html to pdf",
    "pandoc",
    "libreoffice",
    "convert"
   ],
   "params": [
    {
     "name": "input",
     "label": "Documents",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste text",
     "type": "text",
     "multiline": true,
     "syntax": "markdown",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "from",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Detect from extension"
      },
      {
       "value": "markdown",
       "label": "Markdown (Pandoc)"
      },
      {
       "value": "gfm",
       "label": "GitHub Markdown"
      },
      {
       "value": "commonmark",
       "label": "CommonMark"
      },
      {
       "value": "html",
       "label": "HTML"
      },
      {
       "value": "docx",
       "label": "Word (DOCX)"
      },
      {
       "value": "odt",
       "label": "OpenDocument (ODT)"
      },
      {
       "value": "epub",
       "label": "EPUB"
      },
      {
       "value": "rst",
       "label": "reStructuredText"
      },
      {
       "value": "latex",
       "label": "LaTeX"
      },
      {
       "value": "org",
       "label": "Org mode"
      },
      {
       "value": "textile",
       "label": "Textile"
      },
      {
       "value": "mediawiki",
       "label": "MediaWiki"
      },
      {
       "value": "docbook",
       "label": "DocBook"
      },
      {
       "value": "rtf",
       "label": "RTF"
      },
      {
       "value": "ipynb",
       "label": "Jupyter notebook"
      },
      {
       "value": "csv",
       "label": "CSV"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [
    "pandoc",
    "libreoffice"
   ],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "external",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.hash",
   "name": "File Hash",
   "description": "Compute MD5, SHA-1, SHA-256, SHA-512, SHA3-256, BLAKE3, CRC32 or XXH3 checksums of files or text",
   "category": "files",
   "keywords": [
    "checksum",
    "hash",
    "md5",
    "sha256",
    "sha1",
    "sha512",
    "blake3",
    "crc32",
    "xxhash",
    "digest",
    "integrity"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or text",
     "description": "Hash this text (UTF-8) instead of / in addition to files",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "algorithms",
     "label": "Algorithms",
     "type": "enum",
     "options": [
      {
       "value": "md5",
       "label": "MD5"
      },
      {
       "value": "sha1",
       "label": "SHA-1"
      },
      {
       "value": "sha256",
       "label": "SHA-256"
      },
      {
       "value": "sha512",
       "label": "SHA-512"
      },
      {
       "value": "sha3-256",
       "label": "SHA3-256"
      },
      {
       "value": "blake3",
       "label": "BLAKE3"
      },
      {
       "value": "crc32",
       "label": "CRC32"
      },
      {
       "value": "xxh3",
       "label": "XXH3-64"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "sha256"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "uppercase",
     "label": "Uppercase hex",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.checksum_verify",
   "name": "Verify Checksums",
   "description": "Check files against a pasted checksum list (sha256sum/md5sum/BSD format) or a single expected hash; the algorithm is detected from the hash length",
   "category": "files",
   "keywords": [
    "verify",
    "checksum",
    "integrity",
    "sha256sum",
    "md5sum",
    "download",
    "compare hash"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "checksums",
     "label": "Checksums",
     "description": "Paste a SHA256SUMS-style list or a single hash",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.checksum_manifest",
   "name": "Checksum Manifest",
   "description": "Hash every file in a folder and produce a SHA256SUMS-style manifest (plus JSON) for later verification",
   "category": "files",
   "keywords": [
    "sha256sums",
    "manifest",
    "checksums",
    "folder",
    "integrity",
    "backup",
    "verify"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "algorithm",
     "label": "Algorithm",
     "type": "enum",
     "options": [
      {
       "value": "md5",
       "label": "MD5"
      },
      {
       "value": "sha1",
       "label": "SHA-1"
      },
      {
       "value": "sha256",
       "label": "SHA-256"
      },
      {
       "value": "sha512",
       "label": "SHA-512"
      },
      {
       "value": "sha3-256",
       "label": "SHA3-256"
      },
      {
       "value": "blake3",
       "label": "BLAKE3"
      },
      {
       "value": "crc32",
       "label": "CRC32"
      },
      {
       "value": "xxh3",
       "label": "XXH3-64"
      }
     ],
     "multi": false,
     "required": false,
     "default": "sha256",
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.type_detect",
   "name": "Detect File Type",
   "description": "Identify files by their content (magic bytes), show the MIME type and warn when the extension does not match",
   "category": "files",
   "keywords": [
    "file type",
    "magic",
    "mime",
    "identify",
    "extension",
    "what is this file",
    "signature"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 600,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.binary_info",
   "name": "Executable Info",
   "description": "Inspect ELF, PE (Windows .exe/.dll) and Mach-O binaries: architecture, entry point, sections, linked libraries, imports and exports",
   "category": "files",
   "keywords": [
    "elf",
    "pe",
    "exe",
    "dll",
    "mach-o",
    "binary",
    "executable",
    "readelf",
    "objdump",
    "architecture",
    "libraries"
   ],
   "params": [
    {
     "name": "input",
     "label": "Executable or library",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.hexdump",
   "name": "Hex Viewer",
   "description": "Show a hex + ASCII view of any part of a file",
   "category": "files",
   "keywords": [
    "hex",
    "hexdump",
    "xxd",
    "binary",
    "bytes",
    "viewer",
    "od"
   ],
   "params": [
    {
     "name": "input",
     "label": "File",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "offset",
     "label": "Offset (bytes)",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "length",
     "label": "Length (bytes)",
     "type": "integer",
     "min": 1,
     "max": 1048576,
     "required": false,
     "default": 1024,
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width",
     "type": "enum",
     "options": [
      {
       "value": "16",
       "label": "16 bytes per line"
      },
      {
       "value": "8",
       "label": "8 bytes per line"
      },
      {
       "value": "32",
       "label": "32 bytes per line"
      }
     ],
     "multi": false,
     "required": false,
     "default": "16",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.mime_types",
   "name": "MIME Type Lookup",
   "description": "Look up the MIME type for file extensions, or the extensions for a MIME type",
   "category": "files",
   "keywords": [
    "mime",
    "content-type",
    "media type",
    "extension",
    "lookup"
   ],
   "params": [
    {
     "name": "query",
     "label": "Extensions or MIME types",
     "type": "text",
     "multiline": false,
     "placeholder": "pdf, .webp, image/png",
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 10,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.compare",
   "name": "Compare Files",
   "description": "Check whether two files are identical; shows the first differing byte, and a line diff for text files",
   "category": "files",
   "keywords": [
    "compare",
    "diff",
    "identical",
    "cmp",
    "difference",
    "same file"
   ],
   "params": [
    {
     "name": "left",
     "label": "First file",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "right",
     "label": "Second file",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "diff",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.compare_dirs",
   "name": "Compare Folders",
   "description": "Compare two folders: files only on one side, files that differ (size or content hash) and identical files",
   "category": "files",
   "keywords": [
    "compare",
    "folders",
    "directories",
    "diff",
    "sync",
    "backup",
    "dircmp"
   ],
   "params": [
    {
     "name": "left",
     "label": "First folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "right",
     "label": "Second folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "compare_content",
     "label": "Compare file contents",
     "description": "Hash same-sized files (BLAKE3) to detect changed content",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "show_identical",
     "label": "List identical files",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.archive_list",
   "name": "List Archive Contents",
   "description": "Show what is inside a zip, tar, 7z or rar archive (sizes, compression ratios, dates) and flag suspicious entries",
   "category": "files",
   "keywords": [
    "zip",
    "tar",
    "7z",
    "rar",
    "contents",
    "list",
    "inspect",
    "archive",
    "unzip -l"
   ],
   "params": [
    {
     "name": "input",
     "label": "Archive",
     "type": "file",
     "accept": [
      ".zip",
      ".tar",
      ".tgz",
      ".gz",
      ".tbz",
      ".tbz2",
      ".bz2",
      ".txz",
      ".xz",
      ".zst",
      ".tzst",
      ".7z",
      ".rar",
      ".jar",
      ".apk",
      ".epub",
      ".docx",
      ".xlsx",
      ".pptx",
      ".odt",
      ".cbz",
      ".whl",
      ".nupkg",
      ".lzma"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "password",
     "label": "Password",
     "description": "For encrypted 7z/rar archives (zip listings do not need it)",
     "type": "secret",
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 1800,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.archive_extract",
   "name": "Extract Archive",
   "description": "Safely unpack zip, tar(.gz/.bz2/.xz/.zst), gz/bz2/xz/zst, 7z and rar archives; path traversal, links and decompression bombs are blocked",
   "category": "files",
   "keywords": [
    "unzip",
    "extract",
    "untar",
    "decompress",
    "unpack",
    "7z",
    "rar",
    "tar.gz",
    "tgz",
    "archive"
   ],
   "params": [
    {
     "name": "input",
     "label": "Archive",
     "type": "file",
     "accept": [
      ".zip",
      ".tar",
      ".tgz",
      ".gz",
      ".tbz",
      ".tbz2",
      ".bz2",
      ".txz",
      ".xz",
      ".zst",
      ".tzst",
      ".7z",
      ".rar",
      ".jar",
      ".apk",
      ".epub",
      ".docx",
      ".xlsx",
      ".pptx",
      ".odt",
      ".cbz",
      ".whl",
      ".nupkg",
      ".lzma"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "output",
     "label": "Output",
     "description": "Automatic returns individual files for up to 50 files, otherwise a single zip",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Automatic"
      },
      {
       "value": "files",
       "label": "Individual files"
      },
      {
       "value": "zip",
       "label": "One zip (keeps folders)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "password",
     "label": "Password",
     "description": "For encrypted zip / 7z / rar archives",
     "type": "secret",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_size_mb",
     "label": "Maximum extracted size (MB)",
     "description": "Stop if the archive expands beyond this (capped by the instance limit)",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.archive_create",
   "name": "Create Archive",
   "description": "Pack files into a zip (optionally AES-encrypted), tar, tar.gz, tar.bz2, tar.xz, tar.zst or 7z archive",
   "category": "files",
   "keywords": [
    "zip",
    "compress",
    "tar",
    "tar.gz",
    "tgz",
    "7z",
    "archive",
    "pack",
    "bundle"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "zip",
       "label": "ZIP"
      },
      {
       "value": "tar.gz",
       "label": "tar.gz"
      },
      {
       "value": "tar.xz",
       "label": "tar.xz"
      },
      {
       "value": "tar.zst",
       "label": "tar.zst"
      },
      {
       "value": "tar.bz2",
       "label": "tar.bz2"
      },
      {
       "value": "tar",
       "label": "tar (uncompressed)"
      },
      {
       "value": "7z",
       "label": "7z"
      }
     ],
     "multi": false,
     "required": false,
     "default": "zip",
     "advanced": false,
     "primary": false
    },
    {
     "name": "zip_method",
     "label": "Zip method",
     "type": "enum",
     "options": [
      {
       "value": "deflate",
       "label": "Deflate (compatible)"
      },
      {
       "value": "zstd",
       "label": "Zstandard"
      },
      {
       "value": "bzip2",
       "label": "bzip2"
      },
      {
       "value": "store",
       "label": "Store (no compression)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "deflate",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "format",
      "values": [
       "zip"
      ]
     }
    },
    {
     "name": "level",
     "label": "Compression level",
     "description": "Higher is smaller but slower (format-specific range; empty = default)",
     "type": "integer",
     "min": 0,
     "max": 22,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "password",
     "label": "Password",
     "description": "Encrypt the zip (AES-256) or 7z archive",
     "type": "secret",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "name",
     "label": "Archive name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "archive",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.compress",
   "name": "Compress File",
   "description": "Compress individual files with gzip, Zstandard, xz, bzip2 or Brotli",
   "category": "files",
   "keywords": [
    "gzip",
    "gz",
    "zstd",
    "xz",
    "bzip2",
    "brotli",
    "compress",
    "shrink"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "gzip",
       "label": "gzip (.gz)"
      },
      {
       "value": "zstd",
       "label": "Zstandard (.zst)"
      },
      {
       "value": "xz",
       "label": "xz (.xz)"
      },
      {
       "value": "bzip2",
       "label": "bzip2 (.bz2)"
      },
      {
       "value": "brotli",
       "label": "Brotli (.br)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "gzip",
     "advanced": false,
     "primary": false
    },
    {
     "name": "level",
     "label": "Level",
     "description": "gzip/bzip2/xz 1-9, zstd 1-22, brotli 0-11 (empty = default)",
     "type": "integer",
     "min": 0,
     "max": 22,
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.decompress",
   "name": "Decompress File",
   "description": "Decompress .gz, .zst, .xz, .bz2 and .br files (detected by content), with decompression-bomb protection",
   "category": "files",
   "keywords": [
    "gunzip",
    "unzstd",
    "unxz",
    "bunzip2",
    "brotli",
    "decompress",
    "gz",
    "zst"
   ],
   "params": [
    {
     "name": "input",
     "label": "Compressed files",
     "type": "file",
     "accept": [
      ".gz",
      ".zst",
      ".xz",
      ".bz2",
      ".br",
      ".tgz",
      ".zstd",
      ".lzma",
      ".gzip"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.dir_size",
   "name": "Folder Size",
   "description": "Measure a folder's total size and see which subfolders and files take the most space",
   "category": "files",
   "keywords": [
    "disk usage",
    "du",
    "folder size",
    "space",
    "storage",
    "what is using space"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.large_files",
   "name": "Find Large Files",
   "description": "Find the biggest files in a folder (recursively) above a minimum size",
   "category": "files",
   "keywords": [
    "large files",
    "big files",
    "disk space",
    "cleanup",
    "largest"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "min_size_mb",
     "label": "Minimum size (MB)",
     "type": "number",
     "min": 0,
     "required": false,
     "default": 100,
     "advanced": false,
     "primary": false
    },
    {
     "name": "limit",
     "label": "Show top",
     "type": "integer",
     "min": 1,
     "max": 10000,
     "required": false,
     "default": 50,
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.duplicates",
   "name": "Find Duplicate Files",
   "description": "Find files with identical content in a folder (size, then BLAKE3 hash) and how much space they waste; nothing is deleted",
   "category": "files",
   "keywords": [
    "duplicates",
    "dupes",
    "same files",
    "identical",
    "dedupe",
    "cleanup",
    "wasted space"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "min_size_kb",
     "label": "Ignore files smaller than (KB)",
     "type": "number",
     "min": 0,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.duplicates_uploaded",
   "name": "Find Duplicates Among Files",
   "description": "Find which of the given files have identical content (BLAKE3)",
   "category": "files",
   "keywords": [
    "duplicates",
    "identical",
    "same content",
    "dedupe"
   ],
   "params": [
    {
     "name": "input",
     "label": "Files",
     "type": "file",
     "accept": [],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.empty",
   "name": "Find Empty Files & Folders",
   "description": "List zero-byte files and folders that contain nothing (or only other empty folders)",
   "category": "files",
   "keywords": [
    "empty",
    "zero byte",
    "empty folders",
    "cleanup"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "both",
       "label": "Empty files and folders"
      },
      {
       "value": "files",
       "label": "Empty files only"
      },
      {
       "value": "dirs",
       "label": "Empty folders only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "both",
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.remove_empty",
   "name": "Remove Empty Files & Folders",
   "description": "Delete zero-byte files and empty folders; shows a preview unless 'apply' is enabled",
   "category": "files",
   "keywords": [
    "delete empty",
    "remove empty folders",
    "cleanup",
    "prune"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "both",
       "label": "Empty files and folders"
      },
      {
       "value": "files",
       "label": "Empty files only"
      },
      {
       "value": "dirs",
       "label": "Empty folders only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "both",
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    },
    {
     "name": "apply",
     "label": "Delete now",
     "description": "Off = preview only. On = permanently delete the listed items.",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read",
    "host_fs_write"
   ],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": true,
   "source": "builtin"
  },
  {
   "id": "files.search",
   "name": "Search Files",
   "description": "Search a folder for files by name (glob or regex) and/or by content (regex), with line numbers",
   "category": "files",
   "keywords": [
    "find",
    "grep",
    "search",
    "locate",
    "ripgrep",
    "content",
    "filename"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "name",
     "label": "File name pattern",
     "description": "Glob like '*.rs, *.toml' (or a regex when 'name_regex' is on)",
     "type": "text",
     "multiline": false,
     "placeholder": "*.txt",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "name_regex",
     "label": "Name pattern is a regex",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "content",
     "label": "Content (regex)",
     "type": "text",
     "multiline": false,
     "placeholder": "TODO|FIXME",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "case_sensitive",
     "label": "Case sensitive",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_file_size_mb",
     "label": "Skip files larger than (MB)",
     "type": "number",
     "min": 0.001,
     "required": false,
     "default": 10,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_results",
     "label": "Maximum results",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 1000,
     "advanced": true,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 3600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.manifest",
   "name": "File Manifest",
   "description": "Create a CSV or JSON inventory of a folder: path, size, modification time, MIME type and optional hash",
   "category": "files",
   "keywords": [
    "inventory",
    "manifest",
    "file list",
    "catalog",
    "csv",
    "listing",
    "index"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "type": "path",
     "kind": "dir",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "csv",
       "label": "CSV"
      },
      {
       "value": "json",
       "label": "JSON"
      }
     ],
     "multi": false,
     "required": false,
     "default": "csv",
     "advanced": false,
     "primary": false
    },
    {
     "name": "hash",
     "label": "Hash",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "No hash"
      },
      {
       "value": "sha256",
       "label": "SHA-256"
      },
      {
       "value": "blake3",
       "label": "BLAKE3"
      },
      {
       "value": "md5",
       "label": "MD5"
      },
      {
       "value": "xxh3",
       "label": "XXH3"
      }
     ],
     "multi": false,
     "required": false,
     "default": "none",
     "advanced": false,
     "primary": false
    },
    {
     "name": "include_dirs",
     "label": "Include folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "skip_hidden",
     "label": "Skip hidden files and folders",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_symlinks",
     "label": "Follow symbolic links",
     "description": "Off by default; links leaving the allowed folders are never followed",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "max_entries",
     "label": "Maximum entries to scan",
     "type": "integer",
     "min": 1,
     "max": 100000000,
     "required": false,
     "default": 1000000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read"
   ],
   "timeout_secs": 21600,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "files.batch_rename",
   "name": "Batch Rename",
   "description": "Rename many files at once with templates ({name}, {ext}, {n:03}, {date}), regex find/replace, case changes and numbering; previews by default",
   "category": "files",
   "keywords": [
    "rename",
    "batch rename",
    "bulk rename",
    "mass rename",
    "numbering",
    "regex",
    "files"
   ],
   "params": [
    {
     "name": "path",
     "label": "Folder",
     "description": "Rename the files directly inside this folder",
     "type": "path",
     "kind": "dir",
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "files",
     "label": "Or file paths",
     "description": "One file path per line (instead of a folder)",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "filter",
     "label": "Only files matching",
     "description": "Glob, e.g. '*.jpg' (folder mode)",
     "type": "text",
     "multiline": false,
     "placeholder": "*.jpg",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "template",
     "label": "New name",
     "description": "Placeholders: {name} (name without extension), {ext} (extension incl. dot), {n} / {n:03} (counter), {date} (modified date), {parent}, {original}",
     "type": "text",
     "multiline": false,
     "max_len": 1024,
     "required": false,
     "default": "{name}{ext}",
     "advanced": false,
     "primary": false
    },
    {
     "name": "find",
     "label": "Find (regex)",
     "description": "Applied to {name}",
     "type": "text",
     "multiline": false,
     "max_len": 1024,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "replace",
     "label": "Replace with",
     "description": "Use $1, $2 for capture groups",
     "type": "text",
     "multiline": false,
     "max_len": 1024,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "case",
     "label": "Case",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "lower",
       "label": "lowercase"
      },
      {
       "value": "upper",
       "label": "UPPERCASE"
      },
      {
       "value": "title",
       "label": "Title Case"
      }
     ],
     "multi": false,
     "required": false,
     "default": "keep",
     "advanced": false,
     "primary": false
    },
    {
     "name": "start",
     "label": "Counter start",
     "type": "integer",
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "step",
     "label": "Counter step",
     "type": "integer",
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "sort",
     "label": "Numbering order",
     "type": "enum",
     "options": [
      {
       "value": "name",
       "label": "Name"
      },
      {
       "value": "modified",
       "label": "Modified time"
      },
      {
       "value": "size",
       "label": "Size"
      }
     ],
     "multi": false,
     "required": false,
     "default": "name",
     "advanced": true,
     "primary": false
    },
    {
     "name": "apply",
     "label": "Rename now",
     "description": "Off = preview only. On = perform the renames (never overwrites).",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "host_fs_read",
    "host_fs_write"
   ],
   "timeout_secs": 1800,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": true,
   "source": "builtin"
  },
  {
   "id": "text.case",
   "name": "Change Case",
   "description": "Convert text to UPPER, lower, Title, Sentence, camelCase, snake_case, kebab-case and more",
   "category": "text",
   "keywords": [
    "uppercase",
    "lowercase",
    "title case",
    "camel",
    "snake",
    "kebab",
    "pascal",
    "constant",
    "capitalize"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "case",
     "label": "Case",
     "type": "enum",
     "options": [
      {
       "value": "upper",
       "label": "UPPER CASE"
      },
      {
       "value": "lower",
       "label": "lower case"
      },
      {
       "value": "title",
       "label": "Title Case"
      },
      {
       "value": "sentence",
       "label": "Sentence case"
      },
      {
       "value": "camel",
       "label": "camelCase"
      },
      {
       "value": "pascal",
       "label": "PascalCase"
      },
      {
       "value": "snake",
       "label": "snake_case"
      },
      {
       "value": "kebab",
       "label": "kebab-case"
      },
      {
       "value": "constant",
       "label": "CONSTANT_CASE"
      },
      {
       "value": "train",
       "label": "Train-Case"
      },
      {
       "value": "cobol",
       "label": "COBOL-CASE"
      },
      {
       "value": "dot",
       "label": "dot.case"
      },
      {
       "value": "path",
       "label": "path/case"
      },
      {
       "value": "words",
       "label": "space separated words"
      },
      {
       "value": "invert",
       "label": "iNVERT cASE"
      },
      {
       "value": "alternating",
       "label": "aLtErNaTiNg"
      }
     ],
     "multi": false,
     "required": false,
     "default": "upper",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.count",
   "name": "Word & Character Count",
   "description": "Count characters, words, lines, sentences, paragraphs and bytes; estimate reading and speaking time; list the most frequent words",
   "category": "text",
   "keywords": [
    "word count",
    "character count",
    "letters",
    "reading time",
    "statistics",
    "length"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "reading_wpm",
     "label": "Reading speed (words/min)",
     "type": "integer",
     "min": 50,
     "max": 1000,
     "required": false,
     "default": 238,
     "advanced": true,
     "primary": false
    },
    {
     "name": "speaking_wpm",
     "label": "Speaking speed (words/min)",
     "type": "integer",
     "min": 50,
     "max": 500,
     "required": false,
     "default": 150,
     "advanced": true,
     "primary": false
    },
    {
     "name": "top",
     "label": "Top words",
     "type": "integer",
     "min": 0,
     "max": 100,
     "required": false,
     "default": 10,
     "advanced": true,
     "primary": false
    },
    {
     "name": "ignore_stopwords",
     "label": "Ignore common English words in top words",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.sort_lines",
   "name": "Sort Lines",
   "description": "Sort lines alphabetically, naturally, numerically, by length or shuffle them; optionally reverse and remove duplicates",
   "category": "text",
   "keywords": [
    "sort",
    "order",
    "alphabetize",
    "shuffle",
    "randomize",
    "natural sort",
    "lines"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "alpha",
       "label": "Alphabetical"
      },
      {
       "value": "natural",
       "label": "Natural (file2 < file10)"
      },
      {
       "value": "numeric",
       "label": "Numeric"
      },
      {
       "value": "length",
       "label": "By length"
      },
      {
       "value": "random",
       "label": "Shuffle (random)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "natural",
     "advanced": false,
     "primary": false
    },
    {
     "name": "reverse",
     "label": "Reverse order",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "case_insensitive",
     "label": "Ignore case",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "unique",
     "label": "Remove duplicates",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_empty",
     "label": "Remove empty lines",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.dedupe_lines",
   "name": "Remove Duplicate Lines",
   "description": "Remove duplicate lines while keeping the original order, keeping the first or last occurrence",
   "category": "text",
   "keywords": [
    "duplicates",
    "unique",
    "dedupe",
    "distinct",
    "uniq"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "keep",
     "label": "Keep",
     "type": "enum",
     "options": [
      {
       "value": "first",
       "label": "Keep first occurrence"
      },
      {
       "value": "last",
       "label": "Keep last occurrence"
      }
     ],
     "multi": false,
     "required": false,
     "default": "first",
     "advanced": false,
     "primary": false
    },
    {
     "name": "ignore_case",
     "label": "Ignore case",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "ignore_whitespace",
     "label": "Ignore leading/trailing and repeated whitespace",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "keep_empty",
     "label": "Keep all empty lines",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.trim",
   "name": "Trim & Remove Whitespace",
   "description": "Trim leading/trailing spaces on every line, collapse repeated spaces and remove empty lines",
   "category": "text",
   "keywords": [
    "trim",
    "whitespace",
    "spaces",
    "strip",
    "empty lines",
    "blank lines",
    "tabs"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "lines",
     "label": "Trim each line",
     "type": "enum",
     "options": [
      {
       "value": "both",
       "label": "Trim both ends"
      },
      {
       "value": "leading",
       "label": "Trim leading"
      },
      {
       "value": "trailing",
       "label": "Trim trailing"
      },
      {
       "value": "none",
       "label": "Don't trim lines"
      }
     ],
     "multi": false,
     "required": false,
     "default": "both",
     "advanced": false,
     "primary": false
    },
    {
     "name": "collapse_spaces",
     "label": "Collapse repeated spaces/tabs into one space",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "empty_lines",
     "label": "Empty lines",
     "type": "enum",
     "options": [
      {
       "value": "keep",
       "label": "Keep"
      },
      {
       "value": "collapse",
       "label": "Collapse runs into one"
      },
      {
       "value": "remove",
       "label": "Remove all"
      }
     ],
     "multi": false,
     "required": false,
     "default": "collapse",
     "advanced": false,
     "primary": false
    },
    {
     "name": "tabs_to_spaces",
     "label": "Convert tabs to spaces",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.line_endings",
   "name": "Line Endings",
   "description": "Detect and convert line endings between LF (Unix), CRLF (Windows) and CR (classic Mac)",
   "category": "text",
   "keywords": [
    "crlf",
    "lf",
    "newline",
    "eol",
    "dos2unix",
    "unix2dos",
    "carriage return"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or upload a file",
     "description": "When a file is given, a converted file is produced",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "to",
     "label": "To",
     "type": "enum",
     "options": [
      {
       "value": "detect",
       "label": "Only detect"
      },
      {
       "value": "lf",
       "label": "LF (Unix, macOS)"
      },
      {
       "value": "crlf",
       "label": "CRLF (Windows)"
      },
      {
       "value": "cr",
       "label": "CR (classic Mac)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "lf",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.replace",
   "name": "Find & Replace",
   "description": "Find and replace plain text, optionally case-insensitive or whole words only",
   "category": "text",
   "keywords": [
    "find",
    "replace",
    "substitute",
    "search"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "find",
     "label": "Find",
     "type": "text",
     "multiline": false,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "replace",
     "label": "Replace with",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false
    },
    {
     "name": "case_sensitive",
     "label": "Case sensitive",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "whole_word",
     "label": "Whole words only",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.regex_replace",
   "name": "Regex Replace",
   "description": "Search and replace with a regular expression; use $1 or ${name} in the replacement to insert capture groups",
   "category": "text",
   "keywords": [
    "regex",
    "regular expression",
    "replace",
    "substitute",
    "sed",
    "capture groups"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "pattern",
     "label": "Pattern",
     "type": "text",
     "multiline": false,
     "placeholder": "(\\w+)@(\\w+)",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "replacement",
     "label": "Replacement",
     "type": "text",
     "multiline": false,
     "placeholder": "$2 at $1",
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false
    },
    {
     "name": "flags",
     "label": "Flags",
     "type": "enum",
     "options": [
      {
       "value": "i",
       "label": "i – ignore case"
      },
      {
       "value": "m",
       "label": "m – ^/$ match at line breaks"
      },
      {
       "value": "s",
       "label": "s – . matches newline"
      },
      {
       "value": "x",
       "label": "x – verbose (ignore whitespace, # comments)"
      }
     ],
     "multi": true,
     "required": false,
     "default": [],
     "advanced": false,
     "primary": false
    },
    {
     "name": "limit",
     "label": "Max replacements (0 = all)",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "literal",
     "label": "Treat replacement literally (no $ expansion)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.diff",
   "name": "Compare Text (Diff)",
   "description": "Compare two texts and highlight insertions and deletions by line, word or character; also produces a unified diff",
   "category": "text",
   "keywords": [
    "diff",
    "compare",
    "difference",
    "changes",
    "patch",
    "unified diff"
   ],
   "params": [
    {
     "name": "original",
     "label": "Original",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "changed",
     "label": "Changed",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "granularity",
     "label": "Granularity",
     "type": "enum",
     "options": [
      {
       "value": "line",
       "label": "Lines"
      },
      {
       "value": "word",
       "label": "Words"
      },
      {
       "value": "char",
       "label": "Characters"
      }
     ],
     "multi": false,
     "required": false,
     "default": "word",
     "advanced": false,
     "primary": false
    },
    {
     "name": "whitespace",
     "label": "Whitespace",
     "type": "enum",
     "options": [
      {
       "value": "exact",
       "label": "Compare exactly"
      },
      {
       "value": "changes",
       "label": "Ignore whitespace changes"
      },
      {
       "value": "all",
       "label": "Ignore all whitespace"
      }
     ],
     "multi": false,
     "required": false,
     "default": "exact",
     "advanced": true,
     "primary": false
    },
    {
     "name": "context",
     "label": "Unified diff context lines",
     "type": "integer",
     "min": 0,
     "max": 1000,
     "required": false,
     "default": 3,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/x-diff"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "diff",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.escape",
   "name": "Escape / Unescape",
   "description": "Escape or unescape text for JSON, JavaScript, HTML, XML, URLs, CSV, shell, regex, C, Java, Python and SQL string literals",
   "category": "text",
   "keywords": [
    "escape",
    "unescape",
    "quote",
    "string literal",
    "backslash",
    "html entities",
    "sql injection",
    "shell quote"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "json",
       "label": "JSON string"
      },
      {
       "value": "javascript",
       "label": "JavaScript string"
      },
      {
       "value": "html",
       "label": "HTML"
      },
      {
       "value": "xml",
       "label": "XML"
      },
      {
       "value": "url",
       "label": "URL (percent-encoding)"
      },
      {
       "value": "csv",
       "label": "CSV field"
      },
      {
       "value": "shell",
       "label": "Shell (POSIX single quotes)"
      },
      {
       "value": "regex",
       "label": "Regular expression"
      },
      {
       "value": "c",
       "label": "C/C++ string"
      },
      {
       "value": "java",
       "label": "Java string"
      },
      {
       "value": "python",
       "label": "Python string"
      },
      {
       "value": "sql",
       "label": "SQL string literal"
      }
     ],
     "multi": false,
     "required": false,
     "default": "json",
     "advanced": false,
     "primary": false
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "escape",
       "label": "Escape"
      },
      {
       "value": "unescape",
       "label": "Unescape"
      }
     ],
     "multi": false,
     "required": false,
     "default": "escape",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.encoding",
   "name": "Convert Text Encoding",
   "description": "Detect and convert the character encoding of a file or text (UTF-8, UTF-16, Windows-1252, Latin-1, Shift_JIS, GBK, Big5 ...)",
   "category": "text",
   "keywords": [
    "charset",
    "encoding",
    "utf-8",
    "utf8",
    "latin1",
    "ansi",
    "mojibake",
    "iconv",
    "bom"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste text",
     "description": "Pasted text is already Unicode; it is encoded into the target encoding",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "from",
     "label": "Source encoding",
     "description": "Encoding of the uploaded file (pasted text is already Unicode)",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "utf-8",
       "label": "UTF-8"
      },
      {
       "value": "utf-16le",
       "label": "UTF-16 LE (with BOM)"
      },
      {
       "value": "utf-16be",
       "label": "UTF-16 BE (with BOM)"
      },
      {
       "value": "windows-1252",
       "label": "Windows-1252 (Western)"
      },
      {
       "value": "iso-8859-1",
       "label": "ISO-8859-1 / Latin-1 (treated as Windows-1252, per WHATWG)"
      },
      {
       "value": "iso-8859-2",
       "label": "ISO-8859-2 (Central European)"
      },
      {
       "value": "iso-8859-5",
       "label": "ISO-8859-5 (Cyrillic)"
      },
      {
       "value": "iso-8859-7",
       "label": "ISO-8859-7 (Greek)"
      },
      {
       "value": "iso-8859-15",
       "label": "ISO-8859-15 (Latin-9)"
      },
      {
       "value": "windows-1250",
       "label": "Windows-1250 (Central European)"
      },
      {
       "value": "windows-1251",
       "label": "Windows-1251 (Cyrillic)"
      },
      {
       "value": "windows-1253",
       "label": "Windows-1253 (Greek)"
      },
      {
       "value": "windows-1254",
       "label": "Windows-1254 (Turkish)"
      },
      {
       "value": "windows-1255",
       "label": "Windows-1255 (Hebrew)"
      },
      {
       "value": "windows-1256",
       "label": "Windows-1256 (Arabic)"
      },
      {
       "value": "windows-1257",
       "label": "Windows-1257 (Baltic)"
      },
      {
       "value": "windows-1258",
       "label": "Windows-1258 (Vietnamese)"
      },
      {
       "value": "koi8-r",
       "label": "KOI8-R"
      },
      {
       "value": "koi8-u",
       "label": "KOI8-U"
      },
      {
       "value": "ibm866",
       "label": "IBM866 (DOS Cyrillic)"
      },
      {
       "value": "macintosh",
       "label": "Mac Roman"
      },
      {
       "value": "shift_jis",
       "label": "Shift_JIS"
      },
      {
       "value": "euc-jp",
       "label": "EUC-JP"
      },
      {
       "value": "iso-2022-jp",
       "label": "ISO-2022-JP"
      },
      {
       "value": "gbk",
       "label": "GBK"
      },
      {
       "value": "gb18030",
       "label": "GB18030"
      },
      {
       "value": "big5",
       "label": "Big5"
      },
      {
       "value": "euc-kr",
       "label": "EUC-KR"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "to",
     "label": "Target encoding",
     "type": "enum",
     "options": [
      {
       "value": "utf-8",
       "label": "UTF-8"
      },
      {
       "value": "utf-8-bom",
       "label": "UTF-8 with BOM"
      },
      {
       "value": "utf-16le",
       "label": "UTF-16 LE (with BOM)"
      },
      {
       "value": "utf-16be",
       "label": "UTF-16 BE (with BOM)"
      },
      {
       "value": "windows-1252",
       "label": "Windows-1252 (Western)"
      },
      {
       "value": "iso-8859-1",
       "label": "ISO-8859-1 / Latin-1 (treated as Windows-1252, per WHATWG)"
      },
      {
       "value": "iso-8859-2",
       "label": "ISO-8859-2 (Central European)"
      },
      {
       "value": "iso-8859-5",
       "label": "ISO-8859-5 (Cyrillic)"
      },
      {
       "value": "iso-8859-7",
       "label": "ISO-8859-7 (Greek)"
      },
      {
       "value": "iso-8859-15",
       "label": "ISO-8859-15 (Latin-9)"
      },
      {
       "value": "windows-1250",
       "label": "Windows-1250 (Central European)"
      },
      {
       "value": "windows-1251",
       "label": "Windows-1251 (Cyrillic)"
      },
      {
       "value": "windows-1253",
       "label": "Windows-1253 (Greek)"
      },
      {
       "value": "windows-1254",
       "label": "Windows-1254 (Turkish)"
      },
      {
       "value": "windows-1255",
       "label": "Windows-1255 (Hebrew)"
      },
      {
       "value": "windows-1256",
       "label": "Windows-1256 (Arabic)"
      },
      {
       "value": "windows-1257",
       "label": "Windows-1257 (Baltic)"
      },
      {
       "value": "windows-1258",
       "label": "Windows-1258 (Vietnamese)"
      },
      {
       "value": "koi8-r",
       "label": "KOI8-R"
      },
      {
       "value": "koi8-u",
       "label": "KOI8-U"
      },
      {
       "value": "ibm866",
       "label": "IBM866 (DOS Cyrillic)"
      },
      {
       "value": "macintosh",
       "label": "Mac Roman"
      },
      {
       "value": "shift_jis",
       "label": "Shift_JIS"
      },
      {
       "value": "euc-jp",
       "label": "EUC-JP"
      },
      {
       "value": "iso-2022-jp",
       "label": "ISO-2022-JP"
      },
      {
       "value": "gbk",
       "label": "GBK"
      },
      {
       "value": "gb18030",
       "label": "GB18030"
      },
      {
       "value": "big5",
       "label": "Big5"
      },
      {
       "value": "euc-kr",
       "label": "EUC-KR"
      }
     ],
     "multi": false,
     "required": false,
     "default": "utf-8",
     "advanced": false,
     "primary": false
    },
    {
     "name": "unmappable",
     "label": "Characters missing in target",
     "type": "enum",
     "options": [
      {
       "value": "question",
       "label": "Replace with ?"
      },
      {
       "value": "html",
       "label": "HTML numeric entity (&#233;)"
      },
      {
       "value": "error",
       "label": "Fail"
      }
     ],
     "multi": false,
     "required": false,
     "default": "question",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.markdown_preview",
   "name": "Markdown Preview",
   "description": "Render Markdown (GitHub-flavored: tables, task lists, strikethrough, footnotes) as safe, sanitized HTML",
   "category": "text",
   "keywords": [
    "markdown",
    "md",
    "preview",
    "render",
    "gfm",
    "readme"
   ],
   "params": [
    {
     "name": "text",
     "label": "Markdown",
     "type": "text",
     "multiline": true,
     "syntax": "markdown",
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/html"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.markdown_to_html",
   "name": "Markdown to HTML",
   "description": "Convert Markdown (GitHub-flavored) to HTML, optionally as a complete standalone HTML document",
   "category": "text",
   "keywords": [
    "markdown",
    "html",
    "convert",
    "md to html",
    "gfm"
   ],
   "params": [
    {
     "name": "text",
     "label": "Markdown",
     "type": "text",
     "multiline": true,
     "syntax": "markdown",
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or upload a .md file",
     "type": "file",
     "accept": [
      ".md",
      ".markdown",
      ".txt",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sanitize",
     "label": "Sanitize HTML (strip scripts and unsafe markup)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "full_document",
     "label": "Wrap in a complete HTML document",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "title",
     "label": "Document title",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "Document",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "full_document",
      "values": [
       true
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/html"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.html_to_text",
   "name": "HTML to Plain Text",
   "description": "Convert HTML into readable plain text, keeping lists, tables and link targets",
   "category": "text",
   "keywords": [
    "html",
    "strip tags",
    "plain text",
    "remove html"
   ],
   "params": [
    {
     "name": "text",
     "label": "HTML",
     "type": "text",
     "multiline": true,
     "syntax": "html",
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or upload an HTML file",
     "type": "file",
     "accept": [
      ".html",
      ".htm",
      ".xhtml",
      "text/html"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Line width",
     "type": "integer",
     "min": 10,
     "max": 10000,
     "required": false,
     "default": 80,
     "advanced": false,
     "primary": false
    },
    {
     "name": "decorate",
     "label": "Mark links, emphasis and headings",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.html_to_markdown",
   "name": "HTML to Markdown",
   "description": "Convert HTML into clean Markdown",
   "category": "text",
   "keywords": [
    "html",
    "markdown",
    "convert",
    "html to md"
   ],
   "params": [
    {
     "name": "text",
     "label": "HTML",
     "type": "text",
     "multiline": true,
     "syntax": "html",
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or upload an HTML file",
     "type": "file",
     "accept": [
      ".html",
      ".htm",
      ".xhtml",
      "text/html"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/markdown"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.cleanup",
   "name": "Clean Up Text",
   "description": "Straighten smart quotes, remove invisible characters, normalize Unicode, strip accents, fix mojibake and tidy whitespace",
   "category": "text",
   "keywords": [
    "smart quotes",
    "zero width",
    "invisible",
    "unicode normalize",
    "nfc",
    "nfkc",
    "diacritics",
    "accents",
    "mojibake",
    "sanitize",
    "nbsp"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "operations",
     "label": "Operations",
     "type": "enum",
     "options": [
      {
       "value": "quotes",
       "label": "Smart quotes → straight quotes"
      },
      {
       "value": "dashes",
       "label": "Em/en dashes → hyphen"
      },
      {
       "value": "ellipsis",
       "label": "… → ..."
      },
      {
       "value": "invisible",
       "label": "Remove zero-width & invisible characters"
      },
      {
       "value": "nbsp",
       "label": "Non-breaking/odd spaces → normal space"
      },
      {
       "value": "control",
       "label": "Remove control characters"
      },
      {
       "value": "diacritics",
       "label": "Strip accents/diacritics (é → e)"
      },
      {
       "value": "whitespace",
       "label": "Collapse repeated spaces & trim lines"
      },
      {
       "value": "mojibake",
       "label": "Fix mojibake (Ã© → é)"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "quotes",
      "invisible",
      "nbsp",
      "control"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "normalize",
     "label": "Normalize",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "None"
      },
      {
       "value": "nfc",
       "label": "NFC"
      },
      {
       "value": "nfd",
       "label": "NFD"
      },
      {
       "value": "nfkc",
       "label": "NFKC (compatibility)"
      },
      {
       "value": "nfkd",
       "label": "NFKD"
      }
     ],
     "multi": false,
     "required": false,
     "default": "nfc",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.slugify",
   "name": "Slugify",
   "description": "Turn text into URL-friendly slugs (each line separately): Crème Brûlée! → creme-brulee",
   "category": "text",
   "keywords": [
    "slug",
    "url",
    "permalink",
    "seo",
    "filename",
    "clean url"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "-",
     "advanced": false,
     "primary": false
    },
    {
     "name": "lowercase",
     "label": "Lowercase",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_length",
     "label": "Max length (0 = unlimited)",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.reverse",
   "name": "Reverse Text",
   "description": "Reverse the characters, the word order or the line order of text",
   "category": "text",
   "keywords": [
    "reverse",
    "backwards",
    "mirror",
    "flip"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "chars",
       "label": "Characters"
      },
      {
       "value": "words",
       "label": "Word order (per line)"
      },
      {
       "value": "lines",
       "label": "Line order"
      },
      {
       "value": "each_word",
       "label": "Letters of each word"
      }
     ],
     "multi": false,
     "required": false,
     "default": "chars",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.lorem",
   "name": "Lorem Ipsum Generator",
   "description": "Generate lorem ipsum placeholder text as words, sentences or paragraphs",
   "category": "text",
   "keywords": [
    "lorem ipsum",
    "placeholder",
    "dummy text",
    "filler",
    "generator"
   ],
   "params": [
    {
     "name": "unit",
     "label": "Unit",
     "type": "enum",
     "options": [
      {
       "value": "paragraphs",
       "label": "Paragraphs"
      },
      {
       "value": "sentences",
       "label": "Sentences"
      },
      {
       "value": "words",
       "label": "Words"
      }
     ],
     "multi": false,
     "required": false,
     "default": "paragraphs",
     "advanced": false,
     "primary": false
    },
    {
     "name": "count",
     "label": "How many",
     "type": "integer",
     "min": 1,
     "max": 1000,
     "required": false,
     "default": 3,
     "advanced": false,
     "primary": false
    },
    {
     "name": "start_with_lorem",
     "label": "Start with \"Lorem ipsum dolor sit amet\"",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "html",
     "label": "Wrap paragraphs in <p> tags",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.wrap",
   "name": "Wrap Text",
   "description": "Hard-wrap text at a given line width, or unwrap paragraphs into single lines",
   "category": "text",
   "keywords": [
    "wrap",
    "word wrap",
    "line width",
    "columns",
    "reflow",
    "unwrap",
    "fold"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "wrap",
       "label": "Wrap"
      },
      {
       "value": "unwrap",
       "label": "Unwrap paragraphs"
      }
     ],
     "multi": false,
     "required": false,
     "default": "wrap",
     "advanced": false,
     "primary": false
    },
    {
     "name": "width",
     "label": "Width (characters)",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 80,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "wrap"
      ]
     }
    },
    {
     "name": "break_words",
     "label": "Break words longer than the width",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "wrap"
      ]
     }
    },
    {
     "name": "indent",
     "label": "Indent wrapped lines with",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.column_extract",
   "name": "Extract Columns",
   "description": "Split each line by a delimiter and keep selected columns (like cut / awk '{print $2}')",
   "category": "text",
   "keywords": [
    "cut",
    "awk",
    "columns",
    "fields",
    "split",
    "delimiter"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "description": "Any string, or 'tab' / 'whitespace'",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "whitespace",
     "advanced": false,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Columns",
     "description": "e.g. 1,3-4 or -1 for the last column",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "1",
     "advanced": false,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "description": "Any string, or 'tab' / 'space'",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "tab",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.number_lines",
   "name": "Number Lines",
   "description": "Add line numbers to each line of text",
   "category": "text",
   "keywords": [
    "line numbers",
    "nl",
    "enumerate",
    "numbering"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "start",
     "label": "Start at",
     "type": "integer",
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "step",
     "label": "Step",
     "type": "integer",
     "min": 1,
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": ". ",
     "advanced": false,
     "primary": false
    },
    {
     "name": "pad",
     "label": "Pad numbers to equal width",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_empty",
     "label": "Don't number empty lines",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.prefix_suffix",
   "name": "Add Prefix / Suffix",
   "description": "Add text to the start and/or end of every line (e.g. quotes, commas, bullet points)",
   "category": "text",
   "keywords": [
    "prefix",
    "suffix",
    "prepend",
    "append",
    "wrap lines",
    "quote lines",
    "bullet"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "prefix",
     "label": "Prefix",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false
    },
    {
     "name": "suffix",
     "label": "Suffix",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false
    },
    {
     "name": "skip_empty",
     "label": "Skip empty lines",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.filter_lines",
   "name": "Filter Lines",
   "description": "Keep (or remove) lines that contain a word, start/end with text or match a regular expression (like grep)",
   "category": "text",
   "keywords": [
    "grep",
    "filter",
    "lines containing",
    "remove lines",
    "keep lines",
    "search"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "pattern",
     "label": "Pattern",
     "type": "text",
     "multiline": false,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "match",
     "label": "Match",
     "type": "enum",
     "options": [
      {
       "value": "contains",
       "label": "Contains"
      },
      {
       "value": "starts",
       "label": "Starts with"
      },
      {
       "value": "ends",
       "label": "Ends with"
      },
      {
       "value": "exact",
       "label": "Equals"
      },
      {
       "value": "regex",
       "label": "Regular expression"
      }
     ],
     "multi": false,
     "required": false,
     "default": "contains",
     "advanced": false,
     "primary": false
    },
    {
     "name": "invert",
     "label": "Remove matching lines instead",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "case_insensitive",
     "label": "Ignore case",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.unicode_inspect",
   "name": "Unicode Inspector",
   "description": "Show every character's code point, official Unicode name, category and UTF-8/UTF-16 encoding — find hidden or look-alike characters",
   "category": "text",
   "keywords": [
    "unicode",
    "code point",
    "character",
    "emoji",
    "utf-8 bytes",
    "hidden characters",
    "homoglyph",
    "char info"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "limit",
     "label": "Max characters",
     "type": "integer",
     "min": 1,
     "max": 20000,
     "required": false,
     "default": 2000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.word_frequency",
   "name": "Word Frequency",
   "description": "Count how often each word appears and list the most frequent ones",
   "category": "text",
   "keywords": [
    "word frequency",
    "keyword density",
    "top words",
    "concordance",
    "count words"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or upload a text file",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "top",
     "label": "Show top N (0 = all)",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 50,
     "advanced": false,
     "primary": false
    },
    {
     "name": "min_length",
     "label": "Minimum word length",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "ignore_stopwords",
     "label": "Ignore common English words",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "text.extract",
   "name": "Extract Text from Document",
   "description": "Extract plain text from TXT, Markdown, HTML, JSON, CSV, DOCX, ODT, PPTX, ODP, XLSX/XLS/ODS, EPUB, RTF and PDF (PDF needs Poppler)",
   "category": "text",
   "keywords": [
    "extract text",
    "docx to text",
    "word to text",
    "epub",
    "rtf",
    "pptx",
    "xlsx",
    "odt",
    "pdf to text",
    "plain text"
   ],
   "params": [
    {
     "name": "file",
     "label": "Document",
     "type": "file",
     "accept": [
      "text/*",
      ".txt",
      ".md",
      ".html",
      ".htm",
      ".xhtml",
      ".json",
      ".csv",
      ".tsv",
      ".xml",
      ".docx",
      ".odt",
      ".pptx",
      ".odp",
      ".xlsx",
      ".xlsm",
      ".xls",
      ".xlsb",
      ".ods",
      ".epub",
      ".rtf",
      ".pdf"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "width",
     "label": "Line width for HTML-based formats",
     "type": "integer",
     "min": 20,
     "max": 10000,
     "required": false,
     "default": 100,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.qr_generate",
   "name": "QR Code Generator",
   "description": "Generate QR codes from text or URLs as PNG and SVG with size, error correction, margin and colors",
   "category": "dev",
   "keywords": [
    "qr",
    "qr code",
    "generate",
    "barcode",
    "url",
    "wifi",
    "2d code"
   ],
   "params": [
    {
     "name": "text",
     "label": "Content",
     "type": "text",
     "multiline": true,
     "max_len": 4296,
     "placeholder": "https://example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "size",
     "label": "Size",
     "description": "Image size in pixels",
     "type": "integer",
     "min": 64,
     "max": 4096,
     "required": false,
     "default": 512,
     "advanced": false,
     "primary": false
    },
    {
     "name": "error_correction",
     "label": "Error correction",
     "type": "enum",
     "options": [
      {
       "value": "L",
       "label": "Low (7%)"
      },
      {
       "value": "M",
       "label": "Medium (15%)"
      },
      {
       "value": "Q",
       "label": "Quartile (25%)"
      },
      {
       "value": "H",
       "label": "High (30%)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "M",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin",
     "description": "Quiet zone in modules (4 recommended)",
     "type": "integer",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 4,
     "advanced": false,
     "primary": false
    },
    {
     "name": "foreground",
     "label": "Foreground",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "both",
       "label": "PNG + SVG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "svg",
       "label": "SVG"
      }
     ],
     "multi": false,
     "required": false,
     "default": "both",
     "advanced": true,
     "primary": false
    },
    {
     "name": "file_name",
     "label": "File name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "qr-code",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "qr",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.qr_read",
   "name": "QR Code Reader",
   "description": "Decode one or more QR codes from an image or screenshot",
   "category": "dev",
   "keywords": [
    "qr",
    "scan",
    "read",
    "decode",
    "qr code reader",
    "scanner"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.barcode_generate",
   "name": "Barcode Generator",
   "description": "Generate barcodes (Code 128, EAN-13, EAN-8, UPC-A/E, Code 39/93, ITF, Codabar, Data Matrix, PDF417, Aztec) as PNG and SVG",
   "category": "dev",
   "keywords": [
    "barcode",
    "ean",
    "upc",
    "code128",
    "code39",
    "datamatrix",
    "pdf417",
    "aztec",
    "generate",
    "isbn"
   ],
   "params": [
    {
     "name": "text",
     "label": "Content",
     "type": "text",
     "multiline": false,
     "placeholder": "5901234123457",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "code128",
       "label": "Code 128"
      },
      {
       "value": "ean13",
       "label": "EAN-13"
      },
      {
       "value": "ean8",
       "label": "EAN-8"
      },
      {
       "value": "upca",
       "label": "UPC-A"
      },
      {
       "value": "upce",
       "label": "UPC-E"
      },
      {
       "value": "code39",
       "label": "Code 39"
      },
      {
       "value": "code93",
       "label": "Code 93"
      },
      {
       "value": "itf",
       "label": "ITF (Interleaved 2 of 5)"
      },
      {
       "value": "codabar",
       "label": "Codabar"
      },
      {
       "value": "datamatrix",
       "label": "Data Matrix"
      },
      {
       "value": "pdf417",
       "label": "PDF417"
      },
      {
       "value": "aztec",
       "label": "Aztec"
      },
      {
       "value": "qr",
       "label": "QR Code"
      }
     ],
     "multi": false,
     "required": false,
     "default": "code128",
     "advanced": false,
     "primary": false
    },
    {
     "name": "module_width",
     "label": "Bar / module size (px)",
     "type": "integer",
     "min": 1,
     "max": 50,
     "required": false,
     "default": 3,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Bar height (px, 1D)",
     "type": "integer",
     "min": 10,
     "max": 2000,
     "required": false,
     "default": 120,
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Quiet zone (modules)",
     "type": "integer",
     "min": 0,
     "max": 50,
     "required": false,
     "default": 10,
     "advanced": false,
     "primary": false
    },
    {
     "name": "show_text",
     "label": "Show text",
     "description": "Print the content under 1D barcodes",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "foreground",
     "label": "Foreground",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": true,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.barcode_read",
   "name": "Barcode Reader",
   "description": "Read 1D and 2D barcodes (EAN, UPC, Code 128/39/93, ITF, Codabar, QR, Data Matrix, PDF417, Aztec) from an image",
   "category": "dev",
   "keywords": [
    "barcode",
    "scan",
    "read",
    "decode",
    "ean",
    "upc",
    "datamatrix",
    "pdf417",
    "scanner"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.json",
   "name": "JSON Formatter & Validator",
   "description": "Format (pretty-print), minify, validate and sort the keys of JSON, with precise error line and column",
   "category": "dev",
   "keywords": [
    "json",
    "pretty print",
    "beautify",
    "minify",
    "validate",
    "lint",
    "sort keys",
    "formatter"
   ],
   "params": [
    {
     "name": "text",
     "label": "JSON",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "format",
       "label": "Format"
      },
      {
       "value": "minify",
       "label": "Minify"
      },
      {
       "value": "validate",
       "label": "Validate only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "format",
     "advanced": false,
     "primary": false
    },
    {
     "name": "indent",
     "label": "Indent",
     "type": "enum",
     "options": [
      {
       "value": "2",
       "label": "2 spaces"
      },
      {
       "value": "4",
       "label": "4 spaces"
      },
      {
       "value": "tab",
       "label": "Tab"
      }
     ],
     "multi": false,
     "required": false,
     "default": "2",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "format"
      ]
     }
    },
    {
     "name": "sort_keys",
     "label": "Sort object keys",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "ascii",
     "label": "Escape non-ASCII characters",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/json"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.yaml",
   "name": "YAML Formatter & Validator",
   "description": "Validate and re-format YAML (multi-document aware), with error line and column",
   "category": "dev",
   "keywords": [
    "yaml",
    "yml",
    "validate",
    "lint",
    "format",
    "pretty print",
    "kubernetes",
    "docker compose"
   ],
   "params": [
    {
     "name": "text",
     "label": "YAML",
     "type": "text",
     "multiline": true,
     "syntax": "yaml",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "format",
       "label": "Format"
      },
      {
       "value": "validate",
       "label": "Validate only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "format",
     "advanced": false,
     "primary": false
    },
    {
     "name": "sort_keys",
     "label": "Sort mapping keys",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/yaml"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.toml",
   "name": "TOML Formatter & Validator",
   "description": "Validate and re-format TOML with error line and column",
   "category": "dev",
   "keywords": [
    "toml",
    "cargo.toml",
    "pyproject",
    "config",
    "validate",
    "format",
    "lint"
   ],
   "params": [
    {
     "name": "text",
     "label": "TOML",
     "type": "text",
     "multiline": true,
     "syntax": "toml",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "format",
       "label": "Format"
      },
      {
       "value": "validate",
       "label": "Validate only"
      }
     ],
     "multi": false,
     "required": false,
     "default": "format",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/toml"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.xml",
   "name": "XML Formatter & Validator",
   "description": "Pretty-print, minify or check XML for well-formedness (no external entities are ever loaded)",
   "category": "dev",
   "keywords": [
    "xml",
    "pretty print",
    "beautify",
    "minify",
    "validate",
    "well-formed",
    "svg",
    "rss"
   ],
   "params": [
    {
     "name": "text",
     "label": "XML",
     "type": "text",
     "multiline": true,
     "syntax": "xml",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "format",
       "label": "Format"
      },
      {
       "value": "minify",
       "label": "Minify"
      },
      {
       "value": "validate",
       "label": "Check well-formedness"
      }
     ],
     "multi": false,
     "required": false,
     "default": "format",
     "advanced": false,
     "primary": false
    },
    {
     "name": "indent",
     "label": "Indent",
     "type": "enum",
     "options": [
      {
       "value": "2",
       "label": "2 spaces"
      },
      {
       "value": "4",
       "label": "4 spaces"
      },
      {
       "value": "tab",
       "label": "Tab"
      }
     ],
     "multi": false,
     "required": false,
     "default": "2",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "format"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/xml"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.sql_format",
   "name": "SQL Formatter",
   "description": "Format SQL queries with consistent indentation and keyword case (dialect-agnostic)",
   "category": "dev",
   "keywords": [
    "sql",
    "format",
    "beautify",
    "pretty print",
    "query",
    "postgres",
    "mysql",
    "sqlite"
   ],
   "params": [
    {
     "name": "text",
     "label": "SQL",
     "type": "text",
     "multiline": true,
     "syntax": "sql",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "keyword_case",
     "label": "Keyword case",
     "type": "enum",
     "options": [
      {
       "value": "upper",
       "label": "UPPERCASE"
      },
      {
       "value": "lower",
       "label": "lowercase"
      },
      {
       "value": "preserve",
       "label": "Preserve"
      }
     ],
     "multi": false,
     "required": false,
     "default": "upper",
     "advanced": false,
     "primary": false
    },
    {
     "name": "indent",
     "label": "Indent",
     "type": "enum",
     "options": [
      {
       "value": "2",
       "label": "2 spaces"
      },
      {
       "value": "4",
       "label": "4 spaces"
      },
      {
       "value": "tab",
       "label": "Tab"
      }
     ],
     "multi": false,
     "required": false,
     "default": "2",
     "advanced": false,
     "primary": false
    },
    {
     "name": "lines_between_queries",
     "label": "Lines between queries",
     "type": "integer",
     "min": 0,
     "max": 5,
     "required": false,
     "default": 1,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/sql"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.convert",
   "name": "Convert Data Format",
   "description": "Convert structured data between JSON, YAML, TOML, XML, CSV/TSV, NDJSON and URL query strings",
   "category": "dev",
   "keywords": [
    "json to yaml",
    "yaml to json",
    "toml",
    "xml to json",
    "json to csv",
    "csv to json",
    "convert",
    "query string"
   ],
   "params": [
    {
     "name": "text",
     "label": "Input",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "from",
     "label": "From",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      },
      {
       "value": "xml",
       "label": "XML"
      },
      {
       "value": "csv",
       "label": "CSV"
      },
      {
       "value": "tsv",
       "label": "TSV"
      },
      {
       "value": "ndjson",
       "label": "NDJSON / JSON Lines"
      },
      {
       "value": "query",
       "label": "URL query string"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "to",
     "label": "To",
     "type": "enum",
     "options": [
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "json_min",
       "label": "JSON (minified)"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      },
      {
       "value": "xml",
       "label": "XML"
      },
      {
       "value": "csv",
       "label": "CSV"
      },
      {
       "value": "tsv",
       "label": "TSV"
      },
      {
       "value": "ndjson",
       "label": "NDJSON / JSON Lines"
      },
      {
       "value": "query",
       "label": "URL query string"
      }
     ],
     "multi": false,
     "required": false,
     "default": "yaml",
     "advanced": false,
     "primary": false
    },
    {
     "name": "root",
     "label": "XML root element name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "root",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "to",
      "values": [
       "xml"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.base64",
   "name": "Base64 Encode / Decode",
   "description": "Encode text or files to Base64 (standard or URL-safe, with or without padding, data URI) and decode Base64 back to text or a file",
   "category": "dev",
   "keywords": [
    "base64",
    "encode",
    "decode",
    "data uri",
    "base64url",
    "atob",
    "btoa"
   ],
   "params": [
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "encode",
       "label": "Encode"
      },
      {
       "value": "decode",
       "label": "Decode"
      }
     ],
     "multi": false,
     "required": false,
     "default": "encode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "text",
     "label": "Text / Base64",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or a file to encode",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "url_safe",
     "label": "URL-safe alphabet (- and _)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "no_padding",
     "label": "Omit = padding",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "data_uri",
     "label": "Output as data: URI",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "wrap",
     "label": "Wrap lines at (0 = no wrapping, 76 = MIME)",
     "type": "integer",
     "min": 0,
     "max": 1000,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "output",
     "label": "Decoded output",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Text if possible, else file"
      },
      {
       "value": "text",
       "label": "Text"
      },
      {
       "value": "file",
       "label": "File"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "decode"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.url_encode",
   "name": "URL Encode / Decode",
   "description": "Percent-encode or decode text for URLs — a single component (encodeURIComponent) or a full URL (encodeURI)",
   "category": "dev",
   "keywords": [
    "url encode",
    "url decode",
    "percent encoding",
    "urlencode",
    "encodeURIComponent",
    "escape url"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "encode",
       "label": "Encode"
      },
      {
       "value": "decode",
       "label": "Decode"
      }
     ],
     "multi": false,
     "required": false,
     "default": "encode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "scope",
     "label": "Scope",
     "type": "enum",
     "options": [
      {
       "value": "component",
       "label": "Component (encode everything reserved)"
      },
      {
       "value": "full",
       "label": "Full URL (keep :/?#&=)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "component",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "plus_spaces",
     "label": "Use + for spaces (form encoding)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.html_entities",
   "name": "HTML Entities Encode / Decode",
   "description": "Escape special characters as HTML entities (optionally all non-ASCII as numeric references) or decode all named and numeric entities",
   "category": "dev",
   "keywords": [
    "html entities",
    "escape html",
    "unescape html",
    "&amp;",
    "nbsp",
    "numeric character reference"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "encode",
       "label": "Encode"
      },
      {
       "value": "decode",
       "label": "Decode"
      }
     ],
     "multi": false,
     "required": false,
     "default": "encode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "non_ascii",
     "label": "Also encode non-ASCII characters (&#xE9;)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.hex",
   "name": "Hex Encode / Decode",
   "description": "Convert text or files to hexadecimal (with separators), decode hex back to text or bytes, or show a classic hex dump",
   "category": "dev",
   "keywords": [
    "hex",
    "hexadecimal",
    "hexdump",
    "xxd",
    "bytes",
    "encode",
    "decode"
   ],
   "params": [
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "encode",
       "label": "Text → hex"
      },
      {
       "value": "decode",
       "label": "Hex → text"
      },
      {
       "value": "dump",
       "label": "Hex dump"
      }
     ],
     "multi": false,
     "required": false,
     "default": "encode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "text",
     "label": "Text / hex",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or a file",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode",
       "dump"
      ]
     }
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "enum",
     "options": [
      {
       "value": "none",
       "label": "None"
      },
      {
       "value": "space",
       "label": "Space"
      },
      {
       "value": "colon",
       "label": "Colon"
      },
      {
       "value": "comma",
       "label": "Comma + 0x"
      },
      {
       "value": "escape",
       "label": "\\x escapes"
      }
     ],
     "multi": false,
     "required": false,
     "default": "space",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "uppercase",
     "label": "Uppercase",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    },
    {
     "name": "output",
     "label": "Decoded output",
     "type": "enum",
     "options": [
      {
       "value": "text",
       "label": "Text"
      },
      {
       "value": "file",
       "label": "Binary file"
      }
     ],
     "multi": false,
     "required": false,
     "default": "text",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "decode"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.number_base",
   "name": "Number Base Converter",
   "description": "Convert integers of any size between binary, octal, decimal, hexadecimal, base36 or any base 2–36, with two's complement views",
   "category": "dev",
   "keywords": [
    "binary",
    "hex",
    "octal",
    "decimal",
    "base converter",
    "radix",
    "base36",
    "two's complement",
    "bin to dec",
    "hex to dec"
   ],
   "params": [
    {
     "name": "value",
     "label": "Number",
     "type": "text",
     "multiline": false,
     "placeholder": "0xff, 0b1010, 255",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "from",
     "label": "Input base (0 = auto from prefix)",
     "type": "integer",
     "min": 0,
     "max": 36,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "to",
     "label": "Extra output base",
     "type": "integer",
     "min": 2,
     "max": 36,
     "required": false,
     "default": 36,
     "advanced": true,
     "primary": false
    },
    {
     "name": "bits",
     "label": "Two's complement width",
     "type": "enum",
     "options": [
      {
       "value": "8",
       "label": "8-bit"
      },
      {
       "value": "16",
       "label": "16-bit"
      },
      {
       "value": "32",
       "label": "32-bit"
      },
      {
       "value": "64",
       "label": "64-bit"
      },
      {
       "value": "128",
       "label": "128-bit"
      }
     ],
     "multi": false,
     "required": false,
     "default": "32",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.binary_text",
   "name": "Text ↔ Binary",
   "description": "Convert text to its UTF-8 bytes written in binary, octal, decimal or hex — and back",
   "category": "dev",
   "keywords": [
    "binary",
    "text to binary",
    "binary to text",
    "ascii",
    "bytes",
    "01010",
    "octal",
    "decimal bytes"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text / numbers",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "encode",
       "label": "Text → numbers"
      },
      {
       "value": "decode",
       "label": "Numbers → text"
      }
     ],
     "multi": false,
     "required": false,
     "default": "encode",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "bin",
       "label": "Binary"
      },
      {
       "value": "oct",
       "label": "Octal"
      },
      {
       "value": "dec",
       "label": "Decimal"
      },
      {
       "value": "hex",
       "label": "Hex"
      }
     ],
     "multi": false,
     "required": false,
     "default": "bin",
     "advanced": false,
     "primary": false
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": " ",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "encode"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.hash",
   "name": "Hash Generator",
   "description": "Compute MD5, SHA-1, SHA-2, SHA-3, Keccak, BLAKE2, BLAKE3 and CRC-32 digests of text or a file, optionally comparing with an expected hash",
   "category": "dev",
   "keywords": [
    "hash",
    "md5",
    "sha1",
    "sha256",
    "sha512",
    "sha3",
    "blake3",
    "crc32",
    "checksum",
    "digest"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "Or a file",
     "type": "file",
     "accept": [],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "algorithms",
     "label": "Algorithms",
     "type": "enum",
     "options": [
      {
       "value": "md5",
       "label": "MD5"
      },
      {
       "value": "sha1",
       "label": "SHA-1"
      },
      {
       "value": "sha224",
       "label": "SHA-224"
      },
      {
       "value": "sha256",
       "label": "SHA-256"
      },
      {
       "value": "sha384",
       "label": "SHA-384"
      },
      {
       "value": "sha512",
       "label": "SHA-512"
      },
      {
       "value": "sha512_256",
       "label": "SHA-512/256"
      },
      {
       "value": "sha3_224",
       "label": "SHA3-224"
      },
      {
       "value": "sha3_256",
       "label": "SHA3-256"
      },
      {
       "value": "sha3_384",
       "label": "SHA3-384"
      },
      {
       "value": "sha3_512",
       "label": "SHA3-512"
      },
      {
       "value": "keccak256",
       "label": "Keccak-256 (Ethereum)"
      },
      {
       "value": "blake2b",
       "label": "BLAKE2b-512"
      },
      {
       "value": "blake2s",
       "label": "BLAKE2s-256"
      },
      {
       "value": "blake3",
       "label": "BLAKE3"
      },
      {
       "value": "crc32",
       "label": "CRC-32"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "md5",
      "sha1",
      "sha256",
      "sha512"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "encoding",
     "label": "Encoding",
     "type": "enum",
     "options": [
      {
       "value": "hex",
       "label": "hex"
      },
      {
       "value": "HEX",
       "label": "HEX (uppercase)"
      },
      {
       "value": "base64",
       "label": "Base64"
      }
     ],
     "multi": false,
     "required": false,
     "default": "hex",
     "advanced": false,
     "primary": false
    },
    {
     "name": "compare",
     "label": "Compare with expected hash",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.hmac",
   "name": "HMAC Generator & Verifier",
   "description": "Compute or verify an HMAC (SHA-1, SHA-256, SHA-384, SHA-512, MD5) of a message with a secret key — e.g. webhook signatures",
   "category": "dev",
   "keywords": [
    "hmac",
    "signature",
    "webhook",
    "sha256",
    "mac",
    "verify",
    "sign"
   ],
   "params": [
    {
     "name": "text",
     "label": "Message",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "key",
     "label": "Secret key",
     "type": "secret",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "key_format",
     "label": "Key format",
     "type": "enum",
     "options": [
      {
       "value": "text",
       "label": "Text (UTF-8)"
      },
      {
       "value": "hex",
       "label": "Hex"
      },
      {
       "value": "base64",
       "label": "Base64"
      }
     ],
     "multi": false,
     "required": false,
     "default": "text",
     "advanced": true,
     "primary": false
    },
    {
     "name": "algorithm",
     "label": "Algorithm",
     "type": "enum",
     "options": [
      {
       "value": "sha256",
       "label": "HMAC-SHA256"
      },
      {
       "value": "sha1",
       "label": "HMAC-SHA1"
      },
      {
       "value": "sha384",
       "label": "HMAC-SHA384"
      },
      {
       "value": "sha512",
       "label": "HMAC-SHA512"
      },
      {
       "value": "md5",
       "label": "HMAC-MD5"
      }
     ],
     "multi": false,
     "required": false,
     "default": "sha256",
     "advanced": false,
     "primary": false
    },
    {
     "name": "encoding",
     "label": "Encoding",
     "type": "enum",
     "options": [
      {
       "value": "hex",
       "label": "hex"
      },
      {
       "value": "base64",
       "label": "Base64"
      }
     ],
     "multi": false,
     "required": false,
     "default": "hex",
     "advanced": false,
     "primary": false
    },
    {
     "name": "expected",
     "label": "Verify against signature (optional)",
     "type": "text",
     "multiline": false,
     "placeholder": "sha256=… or hex/base64",
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.random",
   "name": "Password & Random Generator",
   "description": "Generate cryptographically secure passwords (with entropy estimate), passphrases (EFF wordlist), hex/Base64 tokens and random integers",
   "category": "dev",
   "keywords": [
    "password generator",
    "passphrase",
    "diceware",
    "random",
    "token",
    "secret",
    "api key",
    "random number",
    "entropy"
   ],
   "params": [
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "password",
       "label": "Password"
      },
      {
       "value": "passphrase",
       "label": "Passphrase"
      },
      {
       "value": "hex",
       "label": "Hex token"
      },
      {
       "value": "base64",
       "label": "Base64url token"
      },
      {
       "value": "integer",
       "label": "Integers"
      }
     ],
     "multi": false,
     "required": false,
     "default": "password",
     "advanced": false,
     "primary": false
    },
    {
     "name": "count",
     "label": "How many",
     "type": "integer",
     "min": 1,
     "max": 1000,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "length",
     "label": "Length (characters / bytes)",
     "type": "integer",
     "min": 1,
     "max": 4096,
     "required": false,
     "default": 20,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "password",
       "hex",
       "base64"
      ]
     }
    },
    {
     "name": "charset",
     "label": "Characters",
     "type": "enum",
     "options": [
      {
       "value": "lower",
       "label": "a–z"
      },
      {
       "value": "upper",
       "label": "A–Z"
      },
      {
       "value": "digits",
       "label": "0–9"
      },
      {
       "value": "symbols",
       "label": "Symbols !@#…"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "lower",
      "upper",
      "digits",
      "symbols"
     ],
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "password"
      ]
     }
    },
    {
     "name": "exclude_ambiguous",
     "label": "Exclude look-alikes (Il1O0o)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "password"
      ]
     }
    },
    {
     "name": "symbols",
     "label": "Symbol set",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "!@#$%^&*()-_=+[]{};:,.?/",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "password"
      ]
     }
    },
    {
     "name": "words",
     "label": "Words",
     "type": "integer",
     "min": 1,
     "max": 64,
     "required": false,
     "default": 6,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "passphrase"
      ]
     }
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "-",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "passphrase"
      ]
     }
    },
    {
     "name": "capitalize",
     "label": "Capitalize words",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "passphrase"
      ]
     }
    },
    {
     "name": "add_number",
     "label": "Append a digit",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "passphrase"
      ]
     }
    },
    {
     "name": "min",
     "label": "Minimum",
     "type": "integer",
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "integer"
      ]
     }
    },
    {
     "name": "max",
     "label": "Maximum",
     "type": "integer",
     "required": false,
     "default": 100,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "integer"
      ]
     }
    },
    {
     "name": "unique",
     "label": "No repeats",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "integer"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.uuid",
   "name": "UUID Generator & Decoder",
   "description": "Generate UUIDs (v4 random, v7 time-ordered, v1, v6, v3/v5 name-based, nil, max) in bulk, or decode a UUID to see its version, variant and embedded timestamp",
   "category": "dev",
   "keywords": [
    "uuid",
    "guid",
    "uuid v4",
    "uuid v7",
    "uuidv5",
    "generate",
    "decode uuid",
    "ulid"
   ],
   "params": [
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "generate",
       "label": "Generate"
      },
      {
       "value": "inspect",
       "label": "Inspect / decode"
      }
     ],
     "multi": false,
     "required": false,
     "default": "generate",
     "advanced": false,
     "primary": false
    },
    {
     "name": "version",
     "label": "Version",
     "type": "enum",
     "options": [
      {
       "value": "v4",
       "label": "v4 (random)"
      },
      {
       "value": "v7",
       "label": "v7 (time-ordered)"
      },
      {
       "value": "v1",
       "label": "v1 (time + random node)"
      },
      {
       "value": "v6",
       "label": "v6 (reordered time)"
      },
      {
       "value": "v5",
       "label": "v5 (SHA-1 name)"
      },
      {
       "value": "v3",
       "label": "v3 (MD5 name)"
      },
      {
       "value": "nil",
       "label": "Nil"
      },
      {
       "value": "max",
       "label": "Max"
      }
     ],
     "multi": false,
     "required": false,
     "default": "v4",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "generate"
      ]
     }
    },
    {
     "name": "count",
     "label": "How many",
     "type": "integer",
     "min": 1,
     "max": 10000,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "generate"
      ]
     }
    },
    {
     "name": "namespace",
     "label": "Namespace (dns, url, oid, x500 or a UUID)",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "dns",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "version",
      "values": [
       "v5",
       "v3"
      ]
     }
    },
    {
     "name": "name",
     "label": "Name",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "version",
      "values": [
       "v5",
       "v3"
      ]
     }
    },
    {
     "name": "uppercase",
     "label": "Uppercase",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "generate"
      ]
     }
    },
    {
     "name": "no_hyphens",
     "label": "Without hyphens",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "generate"
      ]
     }
    },
    {
     "name": "braces",
     "label": "Wrap in {braces}",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "generate"
      ]
     }
    },
    {
     "name": "uuid",
     "label": "UUID to inspect",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": true,
     "show_if": {
      "param": "mode",
      "values": [
       "inspect"
      ]
     }
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.jwt",
   "name": "JWT Decoder & Verifier",
   "description": "Decode a JSON Web Token's header and claims with readable exp/iat/nbf times. The signature is only verified if you supply a secret (HS*) or a PEM public key (RS*/PS*/ES*/EdDSA)",
   "category": "dev",
   "keywords": [
    "jwt",
    "json web token",
    "decode jwt",
    "bearer token",
    "oauth",
    "verify signature",
    "claims",
    "jws"
   ],
   "params": [
    {
     "name": "token",
     "label": "Token",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "secret",
     "label": "HMAC secret (HS256/384/512)",
     "type": "secret",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "secret_base64",
     "label": "Secret is Base64-encoded",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "public_key",
     "label": "Public key (PEM) for RS/PS/ES/EdDSA",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.timestamp",
   "name": "Unix Timestamp Converter",
   "description": "Convert Unix timestamps (seconds, ms, µs, ns — auto-detected) to ISO 8601 / RFC 2822 dates in UTC and any time zone, and dates back to timestamps",
   "category": "dev",
   "keywords": [
    "unix time",
    "epoch",
    "timestamp",
    "posix time",
    "iso 8601",
    "date to timestamp",
    "milliseconds",
    "now"
   ],
   "params": [
    {
     "name": "value",
     "label": "Timestamp or date",
     "type": "text",
     "multiline": false,
     "placeholder": "1700000000 or 2024-05-01 12:00",
     "required": false,
     "default": "now",
     "advanced": false,
     "primary": true
    },
    {
     "name": "unit",
     "label": "Unit",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "s",
       "label": "Seconds"
      },
      {
       "value": "ms",
       "label": "Milliseconds"
      },
      {
       "value": "us",
       "label": "Microseconds"
      },
      {
       "value": "ns",
       "label": "Nanoseconds"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": false,
     "primary": false
    },
    {
     "name": "timezone",
     "label": "Time zone (for display and for dates without offset)",
     "type": "text",
     "multiline": false,
     "placeholder": "Europe/Berlin",
     "required": false,
     "default": "UTC",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.datetime",
   "name": "Date Calculator & Formatter",
   "description": "Parse dates in many formats, format them with strftime patterns, add or subtract durations, or compute the difference between two dates",
   "category": "dev",
   "keywords": [
    "date",
    "time",
    "strftime",
    "format date",
    "add days",
    "date difference",
    "days between",
    "date calculator",
    "duration"
   ],
   "params": [
    {
     "name": "operation",
     "label": "Operation",
     "type": "enum",
     "options": [
      {
       "value": "format",
       "label": "Parse & format"
      },
      {
       "value": "add",
       "label": "Add / subtract duration"
      },
      {
       "value": "diff",
       "label": "Difference between dates"
      }
     ],
     "multi": false,
     "required": false,
     "default": "format",
     "advanced": false,
     "primary": false
    },
    {
     "name": "date",
     "label": "Date",
     "type": "text",
     "multiline": false,
     "placeholder": "2024-02-29 14:30, 1700000000, March 3, 2024",
     "required": false,
     "default": "now",
     "advanced": false,
     "primary": true
    },
    {
     "name": "format",
     "label": "Output format (strftime)",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "%Y-%m-%d %H:%M:%S %Z",
     "advanced": true,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "format",
       "add"
      ]
     }
    },
    {
     "name": "duration",
     "label": "Duration",
     "type": "text",
     "multiline": false,
     "placeholder": "1y 2mo 3d 4h, -90m, P1DT12H",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "add"
      ]
     }
    },
    {
     "name": "date2",
     "label": "Second date",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "now",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "diff"
      ]
     }
    },
    {
     "name": "timezone",
     "label": "Time zone",
     "type": "text",
     "multiline": false,
     "placeholder": "Europe/Berlin",
     "required": false,
     "default": "UTC",
     "advanced": false,
     "primary": false
    },
    {
     "name": "day_first",
     "label": "Ambiguous dates are day-first (03/04 = 3 April)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.timezone",
   "name": "Time Zone Converter",
   "description": "Convert a date and time between IANA time zones (DST-aware), or search the list of time zones with their current offsets",
   "category": "dev",
   "keywords": [
    "time zone",
    "timezone",
    "convert time",
    "utc",
    "gmt",
    "dst",
    "world clock",
    "iana",
    "meeting planner"
   ],
   "params": [
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "convert",
       "label": "Convert"
      },
      {
       "value": "list",
       "label": "List time zones"
      }
     ],
     "multi": false,
     "required": false,
     "default": "convert",
     "advanced": false,
     "primary": false
    },
    {
     "name": "date",
     "label": "Date & time",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "now",
     "advanced": false,
     "primary": true,
     "show_if": {
      "param": "mode",
      "values": [
       "convert"
      ]
     }
    },
    {
     "name": "from",
     "label": "From zone",
     "type": "text",
     "multiline": false,
     "placeholder": "Europe/Berlin",
     "required": false,
     "default": "UTC",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "convert"
      ]
     }
    },
    {
     "name": "to",
     "label": "To zones (comma-separated)",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "America/New_York, Europe/London, Asia/Tokyo",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "convert"
      ]
     }
    },
    {
     "name": "search",
     "label": "Filter",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "list"
      ]
     }
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.cron",
   "name": "Cron Expression Explainer",
   "description": "Explain a cron expression in plain English and list its next run times in any time zone (5 or 6 fields, @daily-style aliases, L/W/# extensions)",
   "category": "dev",
   "keywords": [
    "cron",
    "crontab",
    "schedule",
    "next run",
    "cron expression",
    "explain cron",
    "job scheduler"
   ],
   "params": [
    {
     "name": "expression",
     "label": "Cron expression",
     "type": "text",
     "multiline": false,
     "placeholder": "*/15 9-17 * * MON-FRI",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "count",
     "label": "Next runs",
     "type": "integer",
     "min": 1,
     "max": 100,
     "required": false,
     "default": 10,
     "advanced": false,
     "primary": false
    },
    {
     "name": "timezone",
     "label": "Time zone",
     "type": "text",
     "multiline": false,
     "placeholder": "Europe/Berlin",
     "required": false,
     "default": "UTC",
     "advanced": false,
     "primary": false
    },
    {
     "name": "start",
     "label": "Start from",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "now",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.regex",
   "name": "Regex Tester",
   "description": "Test a regular expression against text: highlights every match with numbered and named capture groups, previews a replacement and explains syntax errors",
   "category": "dev",
   "keywords": [
    "regex",
    "regexp",
    "regular expression",
    "tester",
    "match",
    "capture groups",
    "lookahead",
    "pcre"
   ],
   "params": [
    {
     "name": "pattern",
     "label": "Pattern",
     "type": "text",
     "multiline": false,
     "placeholder": "(?P<year>\\d{4})-(\\d{2})",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Test text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "flags",
     "label": "Flags",
     "type": "enum",
     "options": [
      {
       "value": "i",
       "label": "i – ignore case"
      },
      {
       "value": "m",
       "label": "m – ^/$ match at line breaks"
      },
      {
       "value": "s",
       "label": "s – . matches newline"
      },
      {
       "value": "x",
       "label": "x – verbose (ignore whitespace, # comments)"
      }
     ],
     "multi": true,
     "required": false,
     "default": [],
     "advanced": false,
     "primary": false
    },
    {
     "name": "engine",
     "label": "Engine",
     "description": "The extended engine supports (?=…), (?<=…), \\1 backreferences and atomic groups, with a backtracking limit",
     "type": "enum",
     "options": [
      {
       "value": "standard",
       "label": "Standard (fast, linear time)"
      },
      {
       "value": "fancy",
       "label": "Extended (lookaround, backreferences)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "standard",
     "advanced": false,
     "primary": false
    },
    {
     "name": "replacement",
     "label": "Replacement preview (optional)",
     "type": "text",
     "multiline": false,
     "placeholder": "$year/${2}",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_matches",
     "label": "Max matches",
     "type": "integer",
     "min": 1,
     "max": 100000,
     "required": false,
     "default": 1000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "regex",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.jsonpath",
   "name": "JSONPath Query",
   "description": "Query JSON (or YAML/TOML) with standard RFC 9535 JSONPath expressions, e.g. $.store.book[?@.price < 10].title",
   "category": "dev",
   "keywords": [
    "jsonpath",
    "json query",
    "rfc 9535",
    "filter json",
    "extract",
    "select"
   ],
   "params": [
    {
     "name": "query",
     "label": "JSONPath",
     "type": "text",
     "multiline": false,
     "placeholder": "$..author",
     "required": true,
     "default": "$",
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "JSON",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "file",
     "label": "Or upload a file",
     "type": "file",
     "accept": [
      ".json",
      ".yaml",
      ".yml",
      ".toml",
      "application/json"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      }
     ],
     "multi": false,
     "required": false,
     "default": "json",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/json"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.jq",
   "name": "jq Filter",
   "description": "Transform JSON with jq filters (powered by jaq, a jq clone in Rust): select, map, group_by, reduce and more",
   "category": "dev",
   "keywords": [
    "jq",
    "jaq",
    "json transform",
    "filter",
    "query json",
    "map",
    "select"
   ],
   "params": [
    {
     "name": "filter",
     "label": "Filter",
     "type": "text",
     "multiline": false,
     "placeholder": ".items[] | select(.price > 10) | .name",
     "required": true,
     "default": ".",
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "JSON input",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "file",
     "label": "Or upload a file",
     "type": "file",
     "accept": [
      ".json",
      ".yaml",
      ".yml",
      ".toml",
      "application/json"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      }
     ],
     "multi": false,
     "required": false,
     "default": "json",
     "advanced": true,
     "primary": false
    },
    {
     "name": "compact",
     "label": "Compact output (one result per line)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "raw",
     "label": "Raw strings (-r)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_results",
     "label": "Max results",
     "type": "integer",
     "min": 1,
     "max": 1000000,
     "required": false,
     "default": 10000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/json"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.json_schema_validate",
   "name": "JSON Schema Validator",
   "description": "Validate JSON (or YAML/TOML) against a JSON Schema (drafts 4, 6, 7, 2019-09, 2020-12) and list every error with its path. Remote $refs are not fetched",
   "category": "dev",
   "keywords": [
    "json schema",
    "validate",
    "schema",
    "openapi",
    "draft 2020-12",
    "contract"
   ],
   "params": [
    {
     "name": "schema",
     "label": "JSON Schema",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "text",
     "label": "JSON to validate",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "file",
     "label": "Or upload a file",
     "type": "file",
     "accept": [
      ".json",
      ".yaml",
      ".yml",
      ".toml",
      "application/json"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      }
     ],
     "multi": false,
     "required": false,
     "default": "json",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.diff_json",
   "name": "JSON Diff",
   "description": "Compare two JSON (or YAML/TOML) documents structurally and list added, removed and changed values by JSON Pointer path — key order and formatting are ignored",
   "category": "dev",
   "keywords": [
    "json diff",
    "compare json",
    "structural diff",
    "yaml diff",
    "json pointer",
    "changes"
   ],
   "params": [
    {
     "name": "original",
     "label": "Original",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "changed",
     "label": "Changed",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Input format",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "toml",
       "label": "TOML"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "ignore_array_order",
     "label": "Ignore array order",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.color",
   "name": "Color Converter",
   "description": "Convert any CSS color (hex, rgb(), hsl(), hwb(), lab(), lch(), oklch(), named) to HEX, RGB, HSL, HSV, HWB, CMYK, Lab, LCH, OKLab and OKLCH, with WCAG contrast and nearest named color",
   "category": "dev",
   "keywords": [
    "color",
    "colour",
    "hex to rgb",
    "rgb to hex",
    "hsl",
    "cmyk",
    "oklch",
    "lab",
    "css color",
    "contrast",
    "color picker",
    "design",
    "palette"
   ],
   "params": [
    {
     "name": "color",
     "label": "Color",
     "type": "text",
     "multiline": false,
     "placeholder": "#3366ff, rgb(51 102 255), tomato, oklch(0.6 0.2 260)",
     "required": true,
     "default": "#3366ff",
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "color",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.http_request",
   "name": "HTTP Message Parser",
   "description": "Parse a raw HTTP request or response: method, URL, query parameters, headers, cookies and a pretty-printed body; generate an equivalent curl command",
   "category": "dev",
   "keywords": [
    "http",
    "request",
    "response",
    "headers",
    "curl",
    "cookies",
    "raw http",
    "parse request"
   ],
   "params": [
    {
     "name": "text",
     "label": "Raw HTTP message",
     "type": "text",
     "multiline": true,
     "placeholder": "GET /path?q=1 HTTP/1.1\nHost: example.com\n\n",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "scheme",
     "label": "Scheme for the curl command",
     "type": "enum",
     "options": [
      {
       "value": "https",
       "label": "https"
      },
      {
       "value": "http",
       "label": "http"
      }
     ],
     "multi": false,
     "required": false,
     "default": "https",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.user_agent",
   "name": "User-Agent Parser",
   "description": "Identify the browser, version, operating system, device type and bots/crawlers from User-Agent strings (one per line)",
   "category": "dev",
   "keywords": [
    "user agent",
    "ua",
    "browser detection",
    "bot",
    "crawler",
    "useragent parser",
    "device"
   ],
   "params": [
    {
     "name": "text",
     "label": "User-Agent string(s)",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "dev.string_inspect",
   "name": "String Inspector",
   "description": "Inspect a string: length in characters, graphemes, UTF-16 units and bytes, character classes, hidden/invisible characters, line endings and whitespace issues",
   "category": "dev",
   "keywords": [
    "string length",
    "byte length",
    "utf-16 length",
    "inspect",
    "invisible characters",
    "whitespace",
    "debug string"
   ],
   "params": [
    {
     "name": "text",
     "label": "Text",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.csv_view",
   "name": "CSV Viewer",
   "description": "Preview a CSV/TSV file or pasted text as a table with automatic delimiter, header and column type detection",
   "category": "data",
   "keywords": [
    "csv",
    "tsv",
    "viewer",
    "table",
    "open csv",
    "preview",
    "spreadsheet"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "offset",
     "label": "Start at row",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "limit",
     "label": "Rows to show",
     "type": "integer",
     "min": 1,
     "max": 500,
     "required": false,
     "default": 100,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.csv_filter_sort",
   "name": "Filter & Sort CSV",
   "description": "Filter rows by column conditions (equals, contains, regex, >, <), sort by one or more columns and choose/reorder columns",
   "category": "data",
   "keywords": [
    "csv",
    "filter",
    "sort",
    "where",
    "query",
    "select columns",
    "order by"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "filter_column",
     "label": "Filter column",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "filter_op",
     "label": "Condition",
     "type": "enum",
     "options": [
      {
       "value": "equals",
       "label": "equals"
      },
      {
       "value": "not_equals",
       "label": "does not equal"
      },
      {
       "value": "contains",
       "label": "contains"
      },
      {
       "value": "not_contains",
       "label": "does not contain"
      },
      {
       "value": "starts_with",
       "label": "starts with"
      },
      {
       "value": "ends_with",
       "label": "ends with"
      },
      {
       "value": "regex",
       "label": "matches regex"
      },
      {
       "value": "gt",
       "label": ">"
      },
      {
       "value": "gte",
       "label": "≥"
      },
      {
       "value": "lt",
       "label": "<"
      },
      {
       "value": "lte",
       "label": "≤"
      },
      {
       "value": "empty",
       "label": "is empty"
      },
      {
       "value": "not_empty",
       "label": "is not empty"
      }
     ],
     "multi": false,
     "required": false,
     "default": "contains",
     "advanced": false,
     "primary": false
    },
    {
     "name": "filter_value",
     "label": "Value",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false
    },
    {
     "name": "filters",
     "label": "More filters (all must match)",
     "description": "JSON list like [{\"column\": \"age\", \"op\": \"gte\", \"value\": 18}]",
     "type": "json",
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "case_insensitive",
     "label": "Ignore case when comparing",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sort",
     "label": "Sort by",
     "description": "Comma-separated columns, each optionally followed by asc/desc",
     "type": "text",
     "multiline": false,
     "placeholder": "price desc, name",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Output columns (blank = all)",
     "type": "text",
     "multiline": false,
     "placeholder": "name, price",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "comma",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.csv_to_json",
   "name": "CSV to JSON",
   "description": "Convert CSV/TSV into a JSON array of objects, an array of arrays or NDJSON, with optional type inference",
   "category": "data",
   "keywords": [
    "csv to json",
    "tsv to json",
    "convert",
    "ndjson",
    "json lines"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "shape",
     "label": "Shape",
     "type": "enum",
     "options": [
      {
       "value": "objects",
       "label": "Array of objects"
      },
      {
       "value": "arrays",
       "label": "Array of arrays"
      },
      {
       "value": "ndjson",
       "label": "NDJSON (one object per line)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "objects",
     "advanced": false,
     "primary": false
    },
    {
     "name": "infer_types",
     "label": "Detect numbers, booleans and nulls",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "pretty",
     "label": "Pretty print",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/json"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.json_to_csv",
   "name": "JSON to CSV",
   "description": "Convert a JSON array (or NDJSON) into CSV, flattening nested objects into dotted column names",
   "category": "data",
   "keywords": [
    "json to csv",
    "flatten",
    "convert",
    "export",
    "ndjson",
    "excel"
   ],
   "params": [
    {
     "name": "file",
     "label": "JSON file",
     "type": "file",
     "accept": [
      ".json",
      ".ndjson",
      ".jsonl",
      "application/json"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste JSON",
     "type": "text",
     "multiline": true,
     "syntax": "json",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "separator",
     "label": "Nested key separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": ".",
     "advanced": false,
     "primary": false
    },
    {
     "name": "arrays",
     "label": "Arrays",
     "type": "enum",
     "options": [
      {
       "value": "index",
       "label": "Separate columns (tags.0, tags.1)"
      },
      {
       "value": "join",
       "label": "Join values with ;"
      },
      {
       "value": "json",
       "label": "Keep as JSON text"
      }
     ],
     "multi": false,
     "required": false,
     "default": "index",
     "advanced": false,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "comma",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.spreadsheet",
   "name": "Spreadsheet Viewer & Export",
   "description": "Open Excel (xlsx, xls, xlsb) and OpenDocument (ods) spreadsheets: list sheets, preview a sheet and export it as CSV or JSON",
   "category": "data",
   "keywords": [
    "excel",
    "xlsx",
    "xls",
    "ods",
    "spreadsheet",
    "sheet",
    "xlsx to csv",
    "excel to json"
   ],
   "params": [
    {
     "name": "file",
     "label": "Spreadsheet",
     "type": "file",
     "accept": [
      ".xlsx",
      ".xlsm",
      ".xls",
      ".xlsb",
      ".ods"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "sheet",
     "label": "Sheet name (blank = first)",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "action",
     "label": "Action",
     "type": "enum",
     "options": [
      {
       "value": "preview",
       "label": "Preview"
      },
      {
       "value": "csv",
       "label": "Export as CSV"
      },
      {
       "value": "json",
       "label": "Export as JSON"
      },
      {
       "value": "all_csv",
       "label": "Export every sheet as CSV"
      }
     ],
     "multi": false,
     "required": false,
     "default": "preview",
     "advanced": false,
     "primary": false
    },
    {
     "name": "header",
     "label": "First row is a header",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "offset",
     "label": "Start at row",
     "type": "integer",
     "min": 0,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "action",
      "values": [
       "preview"
      ]
     }
    },
    {
     "name": "limit",
     "label": "Rows to show",
     "type": "integer",
     "min": 1,
     "max": 500,
     "required": false,
     "default": 100,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "action",
      "values": [
       "preview"
      ]
     }
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 300,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.delimiter",
   "name": "Change CSV Delimiter",
   "description": "Convert between comma, tab, semicolon and pipe separated values and change the quoting style",
   "category": "data",
   "keywords": [
    "csv",
    "tsv",
    "delimiter",
    "separator",
    "semicolon",
    "tab",
    "quote",
    "csv to tsv",
    "tsv to csv"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "tab",
     "advanced": false,
     "primary": false
    },
    {
     "name": "quote",
     "label": "Quoting",
     "type": "enum",
     "options": [
      {
       "value": "necessary",
       "label": "Only when needed"
      },
      {
       "value": "always",
       "label": "Always"
      },
      {
       "value": "non_numeric",
       "label": "Non-numeric fields"
      },
      {
       "value": "never",
       "label": "Never"
      }
     ],
     "multi": false,
     "required": false,
     "default": "necessary",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.columns",
   "name": "Transform Columns",
   "description": "Rename, drop, reorder, split, merge, change case, trim or find-and-replace in CSV columns, or add a row index",
   "category": "data",
   "keywords": [
    "csv",
    "columns",
    "rename",
    "drop",
    "reorder",
    "split column",
    "merge columns",
    "transform"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "operation",
     "label": "Operation",
     "type": "enum",
     "options": [
      {
       "value": "rename",
       "label": "Rename"
      },
      {
       "value": "drop",
       "label": "Drop columns"
      },
      {
       "value": "select",
       "label": "Keep / reorder columns"
      },
      {
       "value": "split",
       "label": "Split a column"
      },
      {
       "value": "merge",
       "label": "Merge columns"
      },
      {
       "value": "upper",
       "label": "UPPERCASE values"
      },
      {
       "value": "lower",
       "label": "lowercase values"
      },
      {
       "value": "title",
       "label": "Title Case values"
      },
      {
       "value": "trim",
       "label": "Trim values"
      },
      {
       "value": "replace",
       "label": "Find & replace in values"
      },
      {
       "value": "index",
       "label": "Add row number column"
      }
     ],
     "multi": false,
     "required": false,
     "default": "rename",
     "advanced": false,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Column(s)",
     "description": "Comma-separated column names or 1-based numbers",
     "type": "text",
     "multiline": false,
     "placeholder": "name, email",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "mapping",
     "label": "Renames",
     "type": "text",
     "multiline": false,
     "placeholder": "old=new, other=Other",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "rename"
      ]
     }
    },
    {
     "name": "separator",
     "label": "Separator",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": " ",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "split",
       "merge"
      ]
     }
    },
    {
     "name": "new_names",
     "label": "New column name(s)",
     "type": "text",
     "multiline": false,
     "placeholder": "first, last",
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "split",
       "merge",
       "index"
      ]
     }
    },
    {
     "name": "find",
     "label": "Find",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "replace"
      ]
     }
    },
    {
     "name": "replace",
     "label": "Replace with",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "replace"
      ]
     }
    },
    {
     "name": "regex",
     "label": "Find is a regular expression",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "replace"
      ]
     }
    },
    {
     "name": "keep_original",
     "label": "Keep the original column(s)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "operation",
      "values": [
       "split",
       "merge"
      ]
     }
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "comma",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.validate",
   "name": "Validate CSV / JSON Data",
   "description": "Check CSV rows against rules (required columns, types, unique, regex, ranges, allowed values) or JSON against a JSON Schema; lists every error",
   "category": "data",
   "keywords": [
    "validate",
    "csv",
    "data quality",
    "rules",
    "schema",
    "check",
    "lint",
    "json schema"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "required_columns",
     "label": "Required columns",
     "type": "text",
     "multiline": false,
     "placeholder": "id, email",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "rules",
     "label": "Column rules",
     "description": "JSON like {\"id\": {\"type\": \"integer\", \"required\": true, \"unique\": true}, \"email\": {\"type\": \"email\"}, \"age\": {\"min\": 0, \"max\": 130}, \"status\": {\"values\": [\"open\", \"closed\"]}}. Types: integer, number, boolean, date, email, url, uuid, string",
     "type": "json",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "schema",
     "label": "JSON Schema (for JSON input)",
     "type": "json",
     "required": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.duplicates",
   "name": "Find Duplicate Rows",
   "description": "Find or remove duplicate rows in CSV data, comparing all columns or only selected ones",
   "category": "data",
   "keywords": [
    "duplicates",
    "dedupe",
    "unique rows",
    "csv",
    "distinct",
    "remove duplicates"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "columns",
     "label": "Compare columns (blank = all)",
     "type": "text",
     "multiline": false,
     "placeholder": "email",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "ignore_case",
     "label": "Ignore case",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "trim",
     "label": "Ignore surrounding whitespace",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "keep",
     "label": "Keep",
     "type": "enum",
     "options": [
      {
       "value": "first",
       "label": "Keep first occurrence"
      },
      {
       "value": "last",
       "label": "Keep last occurrence"
      }
     ],
     "multi": false,
     "required": false,
     "default": "first",
     "advanced": false,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "comma",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.stats",
   "name": "Column Statistics",
   "description": "Summarize each column: count, empty values, distinct values, min/max/mean/median/standard deviation for numbers and top values for text",
   "category": "data",
   "keywords": [
    "statistics",
    "summary",
    "describe",
    "profile",
    "csv",
    "mean",
    "median",
    "column stats"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "top",
     "label": "Top values per column",
     "type": "integer",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 3,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.clean",
   "name": "Clean CSV Data",
   "description": "Tidy CSV data: trim cells, normalize whitespace, blank out placeholder values, standardize dates to ISO 8601, remove empty rows and columns",
   "category": "data",
   "keywords": [
    "clean",
    "tidy",
    "csv",
    "normalize",
    "trim",
    "dates",
    "iso 8601",
    "empty rows",
    "data cleaning"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "operations",
     "label": "Operations",
     "type": "enum",
     "options": [
      {
       "value": "trim",
       "label": "Trim cells"
      },
      {
       "value": "whitespace",
       "label": "Collapse inner whitespace & line breaks"
      },
      {
       "value": "nulls",
       "label": "Blank out NULL / N/A / - / none"
      },
      {
       "value": "dates",
       "label": "Standardize dates to YYYY-MM-DD"
      },
      {
       "value": "empty_rows",
       "label": "Remove empty rows"
      },
      {
       "value": "empty_columns",
       "label": "Remove empty columns"
      },
      {
       "value": "headers",
       "label": "Clean header names (snake_case)"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "trim",
      "nulls",
      "empty_rows",
      "empty_columns"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "day_first",
     "label": "Ambiguous dates are day-first (31/12/2024)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "output_delimiter",
     "label": "Output delimiter",
     "type": "enum",
     "options": [
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "comma",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "data.convert",
   "name": "Convert Table Data",
   "description": "Convert tabular data between CSV, TSV, JSON, NDJSON, YAML, Excel XLSX, Markdown tables, HTML tables and SQL INSERT statements",
   "category": "data",
   "keywords": [
    "convert",
    "csv to excel",
    "csv to xlsx",
    "xlsx to csv",
    "markdown table",
    "html table",
    "sql insert",
    "csv to json"
   ],
   "params": [
    {
     "name": "file",
     "label": "File",
     "type": "file",
     "accept": [
      ".csv",
      ".tsv",
      ".txt",
      ".json",
      ".ndjson",
      ".jsonl",
      ".xlsx",
      ".xls",
      ".xlsb",
      ".ods",
      "text/*"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "text",
     "label": "Or paste CSV",
     "type": "text",
     "multiline": true,
     "syntax": "csv",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "delimiter",
     "label": "Delimiter",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "comma",
       "label": "Comma ,"
      },
      {
       "value": "tab",
       "label": "Tab"
      },
      {
       "value": "semicolon",
       "label": "Semicolon ;"
      },
      {
       "value": "pipe",
       "label": "Pipe |"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "header",
     "label": "Header",
     "type": "enum",
     "options": [
      {
       "value": "auto",
       "label": "Auto-detect"
      },
      {
       "value": "yes",
       "label": "First row is a header"
      },
      {
       "value": "no",
       "label": "No header"
      }
     ],
     "multi": false,
     "required": false,
     "default": "auto",
     "advanced": true,
     "primary": false
    },
    {
     "name": "to",
     "label": "To",
     "type": "enum",
     "options": [
      {
       "value": "xlsx",
       "label": "Excel (.xlsx)"
      },
      {
       "value": "csv",
       "label": "CSV"
      },
      {
       "value": "tsv",
       "label": "TSV"
      },
      {
       "value": "json",
       "label": "JSON"
      },
      {
       "value": "ndjson",
       "label": "NDJSON"
      },
      {
       "value": "yaml",
       "label": "YAML"
      },
      {
       "value": "markdown",
       "label": "Markdown table"
      },
      {
       "value": "html",
       "label": "HTML table"
      },
      {
       "value": "sql",
       "label": "SQL INSERT statements"
      }
     ],
     "multi": false,
     "required": false,
     "default": "xlsx",
     "advanced": false,
     "primary": false
    },
    {
     "name": "infer_types",
     "label": "Detect numbers and booleans",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "table_name",
     "label": "SQL table name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "data",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "to",
      "values": [
       "sql"
      ]
     }
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.url_parse",
   "name": "URL Parser",
   "description": "Break a URL into scheme, host, port, path, query parameters and fragment, with IDN/punycode forms",
   "category": "network",
   "keywords": [
    "url",
    "uri",
    "query string",
    "punycode",
    "idn",
    "decode",
    "parse"
   ],
   "params": [
    {
     "name": "url",
     "label": "URL",
     "type": "text",
     "multiline": false,
     "placeholder": "https://user@example.com:8080/a/b?x=1&y=%C3%A9#top",
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.url_normalize",
   "name": "URL Normalizer",
   "description": "Canonicalize URLs: lowercase scheme/host, drop default ports, resolve dot segments, sort query, strip tracking parameters",
   "category": "network",
   "keywords": [
    "url",
    "canonical",
    "clean",
    "utm",
    "tracking",
    "fbclid",
    "gclid",
    "normalize"
   ],
   "params": [
    {
     "name": "urls",
     "label": "URL(s)",
     "description": "One URL per line",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "remove_tracking",
     "label": "Remove tracking parameters (utm_*, fbclid, gclid…)",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sort_query",
     "label": "Sort query parameters",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_fragment",
     "label": "Remove #fragment",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove_www",
     "label": "Remove leading www.",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "strip_trailing_slash",
     "label": "Strip trailing slash from path",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "remove_empty_params",
     "label": "Remove parameters with empty values",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.query_params",
   "name": "Query Parameter Editor",
   "description": "Set, replace or remove URL query parameters and rebuild the URL",
   "category": "network",
   "keywords": [
    "url",
    "query",
    "parameters",
    "querystring",
    "edit",
    "builder"
   ],
   "params": [
    {
     "name": "url",
     "label": "URL",
     "type": "text",
     "multiline": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "set",
     "label": "Set parameters",
     "description": "JSON object ({\"q\": \"x\", \"tag\": [\"a\",\"b\"], \"drop\": null}) or one key=value per line; replaces existing values",
     "type": "text",
     "multiline": true,
     "placeholder": "page=2\nsort=desc",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "remove",
     "label": "Remove parameters",
     "description": "Comma-separated keys; supports a trailing * wildcard (utm_*)",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "clear",
     "label": "Remove all existing parameters first",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.ip_info",
   "name": "IP Address Info",
   "description": "Classify an IPv4/IPv6 address (private, loopback, CGNAT, global…) and show its binary, hex, integer and reverse-DNS forms",
   "category": "network",
   "keywords": [
    "ip",
    "ipv4",
    "ipv6",
    "address",
    "private",
    "binary",
    "integer",
    "ptr",
    "arpa"
   ],
   "params": [
    {
     "name": "ip",
     "label": "IP address",
     "description": "IPv4, IPv6 or an integer",
     "type": "text",
     "multiline": false,
     "placeholder": "192.168.1.10",
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.cidr",
   "name": "CIDR Calculator",
   "description": "Subnet calculator for IPv4/IPv6: network, broadcast, netmask, host range; contains-check, split into subnets, aggregate CIDR lists",
   "category": "network",
   "keywords": [
    "cidr",
    "subnet",
    "netmask",
    "calculator",
    "ipv4",
    "ipv6",
    "supernet",
    "aggregate",
    "summarize",
    "wildcard"
   ],
   "params": [
    {
     "name": "cidr",
     "label": "CIDR block(s)",
     "description": "One per line, e.g. 10.0.0.0/22, 2001:db8::/48 or 192.168.1.0 255.255.255.0",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "action",
     "label": "Action",
     "type": "enum",
     "options": [
      {
       "value": "info",
       "label": "Subnet details"
      },
      {
       "value": "contains",
       "label": "Does it contain an address?"
      },
      {
       "value": "split",
       "label": "Split into subnets"
      },
      {
       "value": "summarize",
       "label": "Summarize / aggregate list"
      }
     ],
     "multi": false,
     "required": false,
     "default": "info",
     "advanced": false,
     "primary": false
    },
    {
     "name": "address",
     "label": "Address or CIDR to test",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "action",
      "values": [
       "contains"
      ]
     }
    },
    {
     "name": "new_prefix",
     "label": "New prefix length",
     "type": "integer",
     "min": 0,
     "max": 128,
     "required": false,
     "default": 26,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "action",
      "values": [
       "split"
      ]
     }
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.subnet_plan",
   "name": "Subnet Planner (VLSM)",
   "description": "Allocate variable-length subnets from a parent block for a list of required host counts",
   "category": "network",
   "keywords": [
    "vlsm",
    "subnet",
    "planner",
    "allocation",
    "cidr",
    "ip plan",
    "addressing"
   ],
   "params": [
    {
     "name": "parent",
     "label": "Parent block",
     "type": "text",
     "multiline": false,
     "placeholder": "10.0.0.0/22",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "requirements",
     "label": "Required subnets",
     "description": "One per line as 'name: hosts' (or JSON [{\"name\":..,\"hosts\":..}])",
     "type": "text",
     "multiline": true,
     "placeholder": "Office: 200\nLab: 50\nVoIP: 25\nLink: 2",
     "required": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.cert_decode",
   "name": "Certificate Decoder",
   "description": "Decode PEM/DER X.509 certificates, chains and CSRs: subject, issuer, SANs, validity, key, fingerprints, extensions",
   "category": "network",
   "keywords": [
    "x509",
    "ssl",
    "tls",
    "certificate",
    "pem",
    "der",
    "csr",
    "decode",
    "san",
    "fingerprint",
    "chain"
   ],
   "params": [
    {
     "name": "pem",
     "label": "PEM text",
     "description": "Paste one or more -----BEGIN CERTIFICATE----- / CERTIFICATE REQUEST blocks",
     "type": "text",
     "multiline": true,
     "required": false,
     "advanced": false,
     "primary": true
    },
    {
     "name": "file",
     "label": "…or certificate file",
     "type": "file",
     "accept": [
      ".pem",
      ".crt",
      ".cer",
      ".der",
      ".csr",
      ".req",
      ".p7b"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.key_inspect",
   "name": "Key Inspector",
   "description": "Identify public/private keys (PEM, PKCS#1/#8, SEC1, OpenSSH, SSH public keys): type, size, curve and SHA-256 fingerprints — private key material is never echoed",
   "category": "network",
   "keywords": [
    "key",
    "public key",
    "private key",
    "rsa",
    "ecdsa",
    "ed25519",
    "ssh",
    "fingerprint",
    "pem",
    "pkcs8",
    "spki"
   ],
   "params": [
    {
     "name": "key",
     "label": "Key text",
     "description": "PEM block(s) or SSH public key line(s). Processed locally; not stored or echoed.",
     "type": "secret",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "file",
     "label": "…or key file",
     "type": "file",
     "accept": [
      ".pem",
      ".key",
      ".pub",
      ".der",
      ".crt",
      ".txt"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.dns_lookup",
   "name": "DNS Lookup",
   "description": "Query DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, CAA, SRV, PTR, HTTPS…) with TTLs via the system or a public resolver (optionally DNS-over-HTTPS)",
   "category": "network",
   "keywords": [
    "dns",
    "dig",
    "nslookup",
    "mx",
    "txt",
    "spf",
    "dmarc",
    "ns",
    "soa",
    "caa",
    "records",
    "resolver",
    "doh"
   ],
   "params": [
    {
     "name": "name",
     "label": "Domain name or IP",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "types",
     "label": "Record types",
     "type": "enum",
     "options": [
      {
       "value": "A",
       "label": "A"
      },
      {
       "value": "AAAA",
       "label": "AAAA"
      },
      {
       "value": "CNAME",
       "label": "CNAME"
      },
      {
       "value": "MX",
       "label": "MX"
      },
      {
       "value": "TXT",
       "label": "TXT"
      },
      {
       "value": "NS",
       "label": "NS"
      },
      {
       "value": "SOA",
       "label": "SOA"
      },
      {
       "value": "CAA",
       "label": "CAA"
      },
      {
       "value": "SRV",
       "label": "SRV"
      },
      {
       "value": "PTR",
       "label": "PTR"
      },
      {
       "value": "HTTPS",
       "label": "HTTPS"
      },
      {
       "value": "DS",
       "label": "DS"
      },
      {
       "value": "DNSKEY",
       "label": "DNSKEY"
      },
      {
       "value": "TLSA",
       "label": "TLSA"
      },
      {
       "value": "NAPTR",
       "label": "NAPTR"
      }
     ],
     "multi": true,
     "required": false,
     "default": [
      "A",
      "AAAA",
      "CNAME",
      "MX",
      "TXT",
      "NS",
      "SOA",
      "CAA"
     ],
     "advanced": false,
     "primary": false
    },
    {
     "name": "resolver",
     "label": "Resolver",
     "type": "enum",
     "options": [
      {
       "value": "system",
       "label": "System resolver"
      },
      {
       "value": "cloudflare",
       "label": "Cloudflare 1.1.1.1"
      },
      {
       "value": "google",
       "label": "Google 8.8.8.8"
      },
      {
       "value": "quad9",
       "label": "Quad9 9.9.9.9"
      },
      {
       "value": "cloudflare-doh",
       "label": "Cloudflare (DNS-over-HTTPS)"
      },
      {
       "value": "google-doh",
       "label": "Google (DNS-over-HTTPS)"
      },
      {
       "value": "quad9-doh",
       "label": "Quad9 (DNS-over-HTTPS)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "system",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.reverse_dns",
   "name": "Reverse DNS",
   "description": "Look up PTR host names for IP addresses and check forward-confirmation (FCrDNS)",
   "category": "network",
   "keywords": [
    "reverse dns",
    "ptr",
    "rdns",
    "hostname",
    "fcrdns",
    "ip to hostname"
   ],
   "params": [
    {
     "name": "ips",
     "label": "IP addresses",
     "description": "One per line (max 50)",
     "type": "text",
     "multiline": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "resolver",
     "label": "Resolver",
     "type": "enum",
     "options": [
      {
       "value": "system",
       "label": "System resolver"
      },
      {
       "value": "cloudflare",
       "label": "Cloudflare 1.1.1.1"
      },
      {
       "value": "google",
       "label": "Google 8.8.8.8"
      },
      {
       "value": "quad9",
       "label": "Quad9 9.9.9.9"
      },
      {
       "value": "cloudflare-doh",
       "label": "Cloudflare (DNS-over-HTTPS)"
      },
      {
       "value": "google-doh",
       "label": "Google (DNS-over-HTTPS)"
      },
      {
       "value": "quad9-doh",
       "label": "Quad9 (DNS-over-HTTPS)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "system",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 90,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.tls_inspect",
   "name": "TLS / SSL Inspector",
   "description": "Connect to a TLS server and show protocol, cipher, ALPN, the certificate chain (SANs, validity, key, fingerprints) and whether it is publicly trusted",
   "category": "network",
   "keywords": [
    "tls",
    "ssl",
    "https",
    "certificate",
    "chain",
    "expiry",
    "cipher",
    "alpn",
    "handshake",
    "openssl s_client"
   ],
   "params": [
    {
     "name": "host",
     "label": "Host",
     "description": "host, host:port or https:// URL",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "port",
     "label": "Port",
     "type": "integer",
     "min": 1,
     "max": 65535,
     "required": false,
     "default": 443,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sni",
     "label": "SNI server name override",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "timeout_secs",
     "label": "Timeout (s)",
     "type": "integer",
     "min": 1,
     "max": 30,
     "required": false,
     "default": 10,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.http_headers",
   "name": "HTTP Headers & Security Check",
   "description": "Fetch a URL and show status, every redirect hop, response headers and a security-header analysis (HSTS, CSP, frame options, cookies…) with recommendations",
   "category": "network",
   "keywords": [
    "http",
    "headers",
    "redirect",
    "hsts",
    "csp",
    "security headers",
    "cookies",
    "curl -I",
    "status code"
   ],
   "params": [
    {
     "name": "url",
     "label": "URL",
     "type": "text",
     "multiline": false,
     "placeholder": "https://example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "method",
     "label": "Method",
     "type": "enum",
     "options": [
      {
       "value": "GET",
       "label": "GET"
      },
      {
       "value": "HEAD",
       "label": "HEAD"
      }
     ],
     "multi": false,
     "required": false,
     "default": "GET",
     "advanced": false,
     "primary": false
    },
    {
     "name": "max_redirects",
     "label": "Max redirects to follow",
     "type": "integer",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 10,
     "advanced": false,
     "primary": false
    },
    {
     "name": "timeout_secs",
     "label": "Timeout per request (s)",
     "type": "integer",
     "min": 1,
     "max": 30,
     "required": false,
     "default": 10,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.favicon",
   "name": "Favicon Fetcher",
   "description": "Find and download a website's favicons: <link rel=icon>, apple-touch-icon, web manifest icons and /favicon.ico",
   "category": "network",
   "keywords": [
    "favicon",
    "icon",
    "apple-touch-icon",
    "manifest",
    "logo",
    "website icon"
   ],
   "params": [
    {
     "name": "url",
     "label": "Website URL",
     "type": "text",
     "multiline": false,
     "placeholder": "https://example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "download",
     "label": "Download icon files",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.connectivity",
   "name": "Connectivity Check",
   "description": "Test TCP reachability (host:port) and HTTP(S) availability with latency over several attempts — no ICMP needed",
   "category": "network",
   "keywords": [
    "ping",
    "reachability",
    "tcp",
    "latency",
    "uptime",
    "connect",
    "port",
    "http check"
   ],
   "params": [
    {
     "name": "targets",
     "label": "Targets",
     "description": "One per line: host:port or http(s):// URL (max 20)",
     "type": "text",
     "multiline": true,
     "placeholder": "example.com:443\nhttps://example.org",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "attempts",
     "label": "Attempts per target",
     "type": "integer",
     "min": 1,
     "max": 10,
     "required": false,
     "default": 3,
     "advanced": false,
     "primary": false
    },
    {
     "name": "timeout_ms",
     "label": "Timeout per attempt (ms)",
     "type": "integer",
     "min": 100,
     "max": 15000,
     "required": false,
     "default": 3000,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 300,
   "reports_progress": true,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.port_check",
   "name": "Port Checker",
   "description": "Check which TCP ports are open on a host (common services or up to 50 listed ports) with short timeouts and bounded concurrency",
   "category": "network",
   "keywords": [
    "port",
    "open port",
    "tcp",
    "firewall",
    "port check",
    "service",
    "listening"
   ],
   "params": [
    {
     "name": "host",
     "label": "Host",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "preset",
     "label": "Preset",
     "type": "enum",
     "options": [
      {
       "value": "common",
       "label": "Common service ports (25)"
      },
      {
       "value": "custom",
       "label": "Custom list"
      }
     ],
     "multi": false,
     "required": false,
     "default": "common",
     "advanced": false,
     "primary": false
    },
    {
     "name": "ports",
     "label": "Ports",
     "description": "e.g. 22,80,443,8000-8010 (max 50)",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "preset",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "timeout_ms",
     "label": "Timeout per port (ms)",
     "description": "Windows retries refused connections for about 2 s, so shorter timeouts there report closed ports as filtered",
     "type": "integer",
     "min": 100,
     "max": 5000,
     "required": false,
     "default": 1500,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.rdap",
   "name": "RDAP Lookup",
   "description": "Registration data for domains, IP networks and ASNs via RDAP (the modern WHOIS), routed through the IANA bootstrap registry",
   "category": "network",
   "keywords": [
    "rdap",
    "whois",
    "registrar",
    "domain expiry",
    "registration",
    "asn",
    "ip owner",
    "network owner"
   ],
   "params": [
    {
     "name": "query",
     "label": "Domain, IP, CIDR or ASN",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com, 8.8.8.8, AS13335",
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "application/json"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.whois",
   "name": "WHOIS Lookup",
   "description": "Classic WHOIS over TCP port 43, following referrals from whois.iana.org to the registry and registrar servers",
   "category": "network",
   "keywords": [
    "whois",
    "domain",
    "registrar",
    "expiry",
    "owner",
    "ip whois",
    "asn"
   ],
   "params": [
    {
     "name": "query",
     "label": "Domain, IP or ASN",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "server",
     "label": "WHOIS server (skip IANA referral)",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": true,
     "primary": false
    },
    {
     "name": "follow_referrals",
     "label": "Follow registrar referrals",
     "type": "boolean",
     "required": false,
     "default": true,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "text",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "network.domain_inspect",
   "name": "Domain Inspector",
   "description": "All-in-one domain report: DNS records (incl. SPF/DMARC), RDAP registration (registrar, dates, status), TLS certificate and HTTP redirect chain",
   "category": "network",
   "keywords": [
    "domain",
    "report",
    "dns",
    "whois",
    "rdap",
    "ssl",
    "certificate",
    "expiry",
    "registrar",
    "spf",
    "dmarc",
    "website check"
   ],
   "params": [
    {
     "name": "domain",
     "label": "Domain",
     "type": "text",
     "multiline": false,
     "placeholder": "example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "resolver",
     "label": "Resolver",
     "type": "enum",
     "options": [
      {
       "value": "system",
       "label": "System resolver"
      },
      {
       "value": "cloudflare",
       "label": "Cloudflare 1.1.1.1"
      },
      {
       "value": "google",
       "label": "Google 8.8.8.8"
      },
      {
       "value": "quad9",
       "label": "Quad9 9.9.9.9"
      },
      {
       "value": "cloudflare-doh",
       "label": "Cloudflare (DNS-over-HTTPS)"
      },
      {
       "value": "google-doh",
       "label": "Google (DNS-over-HTTPS)"
      },
      {
       "value": "quad9-doh",
       "label": "Quad9 (DNS-over-HTTPS)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "system",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "network"
   ],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "network",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.palette",
   "name": "Color Palette Generator",
   "description": "Generate harmonious color palettes from a base color: complementary, analogous, triadic, tetradic, monochromatic, shades, tints and a 50–950 scale",
   "category": "design",
   "keywords": [
    "palette",
    "color scheme",
    "complementary",
    "analogous",
    "triadic",
    "monochromatic",
    "shades",
    "tints",
    "harmony"
   ],
   "params": [
    {
     "name": "color",
     "label": "Base color",
     "type": "color",
     "required": true,
     "default": "#3366ff",
     "advanced": false,
     "primary": true
    },
    {
     "name": "scheme",
     "label": "Scheme",
     "type": "enum",
     "options": [
      {
       "value": "complementary",
       "label": "Complementary"
      },
      {
       "value": "split_complementary",
       "label": "Split complementary"
      },
      {
       "value": "analogous",
       "label": "Analogous"
      },
      {
       "value": "triadic",
       "label": "Triadic"
      },
      {
       "value": "tetradic",
       "label": "Tetradic (rectangle)"
      },
      {
       "value": "square",
       "label": "Square"
      },
      {
       "value": "monochromatic",
       "label": "Monochromatic"
      },
      {
       "value": "shades",
       "label": "Shades (darker)"
      },
      {
       "value": "tints",
       "label": "Tints (lighter)"
      },
      {
       "value": "tones",
       "label": "Tones (grayer)"
      },
      {
       "value": "scale",
       "label": "50–950 scale"
      }
     ],
     "multi": false,
     "required": false,
     "default": "complementary",
     "advanced": false,
     "primary": false
    },
    {
     "name": "count",
     "label": "Count",
     "description": "Number of colors for monochromatic/shades/tints/tones",
     "type": "integer",
     "min": 2,
     "max": 20,
     "required": false,
     "default": 5,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "color",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.palette_extract",
   "name": "Extract Palette from Image",
   "description": "Extract a color palette from an image, with percentages, CSS variables and a swatch image",
   "category": "design",
   "keywords": [
    "palette",
    "extract colors",
    "color picker",
    "image colors",
    "swatches",
    "theme from image"
   ],
   "params": [
    {
     "name": "input",
     "label": "Image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "count",
     "label": "Count",
     "type": "integer",
     "min": 2,
     "max": 16,
     "required": false,
     "default": 6,
     "advanced": false,
     "primary": false
    },
    {
     "name": "sort",
     "label": "Sort",
     "type": "enum",
     "options": [
      {
       "value": "share",
       "label": "By share of image"
      },
      {
       "value": "lightness",
       "label": "By lightness"
      },
      {
       "value": "hue",
       "label": "By hue"
      }
     ],
     "multi": false,
     "required": false,
     "default": "share",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "color",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.contrast",
   "name": "Contrast Checker",
   "description": "Check WCAG 2.x contrast between text and background colors (AA/AAA, normal and large text) and get passing suggestions",
   "category": "design",
   "keywords": [
    "contrast",
    "wcag",
    "accessibility",
    "a11y",
    "aa",
    "aaa",
    "color contrast",
    "readability"
   ],
   "params": [
    {
     "name": "foreground",
     "label": "Text color",
     "type": "color",
     "required": true,
     "default": "#777777",
     "advanced": false,
     "primary": true
    },
    {
     "name": "background",
     "label": "Background color",
     "type": "color",
     "required": true,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "color",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.gradient",
   "name": "Gradient Generator",
   "description": "Create CSS linear, radial or conic gradients from color stops and render them as PNG",
   "category": "design",
   "keywords": [
    "gradient",
    "css gradient",
    "linear-gradient",
    "radial",
    "background",
    "wallpaper"
   ],
   "params": [
    {
     "name": "stops",
     "label": "Color stops",
     "type": "text",
     "multiline": true,
     "placeholder": "#ff7e5f, #feb47b 60%, #86a8e7",
     "required": true,
     "default": "#ff7e5f, #feb47b",
     "advanced": false,
     "primary": true
    },
    {
     "name": "kind",
     "label": "Kind",
     "type": "enum",
     "options": [
      {
       "value": "linear",
       "label": "Linear"
      },
      {
       "value": "radial",
       "label": "Radial"
      },
      {
       "value": "conic",
       "label": "Conic"
      }
     ],
     "multi": false,
     "required": false,
     "default": "linear",
     "advanced": false,
     "primary": false
    },
    {
     "name": "angle",
     "label": "Angle (°)",
     "type": "number",
     "min": -360,
     "max": 360,
     "required": false,
     "default": 90,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "kind",
      "values": [
       "linear",
       "conic"
      ]
     }
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 1,
     "max": 8000,
     "required": false,
     "default": 1200,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 1,
     "max": 8000,
     "required": false,
     "default": 630,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files",
    "text_mime": "text/plain"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.aspect_ratio",
   "name": "Aspect Ratio Calculator",
   "description": "Calculate the aspect ratio of a size, or the missing width/height for a given ratio",
   "category": "design",
   "keywords": [
    "aspect ratio",
    "ratio",
    "16:9",
    "resolution",
    "dimensions",
    "calculator",
    "scale"
   ],
   "params": [
    {
     "name": "width",
     "label": "Width",
     "description": "Original width",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "height",
     "label": "Height",
     "description": "Original height",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "ratio",
     "label": "Ratio",
     "description": "Use this ratio instead of width × height",
     "type": "text",
     "multiline": false,
     "placeholder": "16:9",
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "target_width",
     "label": "Target width",
     "description": "New width → compute height",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "target_height",
     "label": "Target height",
     "description": "New height → compute width",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "live",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.canvas_resize",
   "name": "Resize Canvas / Pad",
   "description": "Extend or trim the canvas around images to an exact size, an aspect ratio or by padding, with a color or transparent fill",
   "category": "design",
   "keywords": [
    "canvas",
    "pad",
    "padding",
    "border",
    "extend",
    "letterbox",
    "square",
    "instagram",
    "frame"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "mode",
     "label": "Mode",
     "type": "enum",
     "options": [
      {
       "value": "aspect",
       "label": "To aspect ratio"
      },
      {
       "value": "size",
       "label": "To exact size"
      },
      {
       "value": "padding",
       "label": "Add padding"
      }
     ],
     "multi": false,
     "required": false,
     "default": "aspect",
     "advanced": false,
     "primary": false
    },
    {
     "name": "aspect",
     "label": "Aspect ratio",
     "type": "text",
     "multiline": false,
     "placeholder": "1:1",
     "required": false,
     "default": "1:1",
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "aspect"
      ]
     }
    },
    {
     "name": "width",
     "label": "Width",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "size"
      ]
     }
    },
    {
     "name": "height",
     "label": "Height",
     "type": "integer",
     "min": 1,
     "required": false,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "size"
      ]
     }
    },
    {
     "name": "padding",
     "label": "Padding",
     "description": "Pixels on every side",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 50,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "mode",
      "values": [
       "padding"
      ]
     }
    },
    {
     "name": "anchor",
     "label": "Anchor",
     "description": "Where the original sits on the new canvas",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "top-left",
       "label": "Top left"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "left",
       "label": "Left"
      },
      {
       "value": "right",
       "label": "Right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "bottom-right",
       "label": "Bottom right"
      }
     ],
     "multi": false,
     "required": false,
     "default": "center",
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "description": "Fill color (#00000000 = transparent)",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "same",
       "label": "Same as input"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "same",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.compose",
   "name": "Overlay Images",
   "description": "Place one image on top of another with position, scale, opacity and blend mode (multiply, screen, overlay...)",
   "category": "design",
   "keywords": [
    "overlay",
    "compose",
    "composite",
    "layer",
    "blend",
    "superimpose",
    "place logo"
   ],
   "params": [
    {
     "name": "input",
     "label": "Base image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "overlay",
     "label": "Overlay image",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": true,
     "advanced": false,
     "primary": false
    },
    {
     "name": "position",
     "label": "Position",
     "type": "enum",
     "options": [
      {
       "value": "center",
       "label": "Center"
      },
      {
       "value": "top-left",
       "label": "Top left"
      },
      {
       "value": "top",
       "label": "Top"
      },
      {
       "value": "top-right",
       "label": "Top right"
      },
      {
       "value": "left",
       "label": "Left"
      },
      {
       "value": "right",
       "label": "Right"
      },
      {
       "value": "bottom-left",
       "label": "Bottom left"
      },
      {
       "value": "bottom",
       "label": "Bottom"
      },
      {
       "value": "bottom-right",
       "label": "Bottom right"
      },
      {
       "value": "custom",
       "label": "Custom x/y"
      }
     ],
     "multi": false,
     "required": false,
     "default": "center",
     "advanced": false,
     "primary": false
    },
    {
     "name": "x",
     "label": "X",
     "type": "integer",
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "position",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "y",
     "label": "Y",
     "type": "integer",
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false,
     "show_if": {
      "param": "position",
      "values": [
       "custom"
      ]
     }
    },
    {
     "name": "scale",
     "label": "Overlay width (% of base, 0 = original)",
     "type": "number",
     "min": 0,
     "max": 400,
     "required": false,
     "default": 0,
     "advanced": false,
     "primary": false
    },
    {
     "name": "opacity",
     "label": "Opacity",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "required": false,
     "default": 1,
     "advanced": false,
     "primary": false
    },
    {
     "name": "blend",
     "label": "Blend",
     "type": "enum",
     "options": [
      {
       "value": "normal",
       "label": "Normal"
      },
      {
       "value": "multiply",
       "label": "Multiply"
      },
      {
       "value": "screen",
       "label": "Screen"
      },
      {
       "value": "overlay",
       "label": "Overlay"
      },
      {
       "value": "darken",
       "label": "Darken"
      },
      {
       "value": "lighten",
       "label": "Lighten"
      },
      {
       "value": "difference",
       "label": "Difference"
      },
      {
       "value": "add",
       "label": "Add"
      }
     ],
     "multi": false,
     "required": false,
     "default": "normal",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin",
     "type": "integer",
     "min": 0,
     "max": 10000,
     "required": false,
     "default": 0,
     "advanced": true,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "jpg",
       "label": "JPEG"
      },
      {
       "value": "webp",
       "label": "WebP"
      }
     ],
     "multi": false,
     "required": false,
     "default": "png",
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.image_dimensions",
   "name": "Bulk Image Dimensions",
   "description": "List width, height, aspect ratio, megapixels, DPI and format of many images at once (reads headers only, fast)",
   "category": "design",
   "keywords": [
    "dimensions",
    "size",
    "resolution",
    "dpi",
    "batch",
    "list",
    "inventory",
    "audit"
   ],
   "params": [
    {
     "name": "input",
     "label": "Images",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": true,
     "required": true,
     "advanced": false,
     "primary": true
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": true,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "design.qr_style",
   "name": "Styled QR Code",
   "description": "Design branded QR codes: colors, rounded or dot modules, styled eyes and a center logo (uses high error correction)",
   "category": "design",
   "keywords": [
    "qr",
    "qr code",
    "logo",
    "branded",
    "custom",
    "styled",
    "dots",
    "rounded"
   ],
   "params": [
    {
     "name": "text",
     "label": "Content",
     "type": "text",
     "multiline": true,
     "max_len": 4296,
     "placeholder": "https://example.com",
     "required": true,
     "advanced": false,
     "primary": true
    },
    {
     "name": "size",
     "label": "Size",
     "description": "Image size in pixels",
     "type": "integer",
     "min": 64,
     "max": 4096,
     "required": false,
     "default": 512,
     "advanced": false,
     "primary": false
    },
    {
     "name": "error_correction",
     "label": "Error correction",
     "type": "enum",
     "options": [
      {
       "value": "L",
       "label": "Low (7%)"
      },
      {
       "value": "M",
       "label": "Medium (15%)"
      },
      {
       "value": "Q",
       "label": "Quartile (25%)"
      },
      {
       "value": "H",
       "label": "High (30%)"
      }
     ],
     "multi": false,
     "required": false,
     "default": "M",
     "advanced": false,
     "primary": false
    },
    {
     "name": "margin",
     "label": "Margin",
     "description": "Quiet zone in modules (4 recommended)",
     "type": "integer",
     "min": 0,
     "max": 20,
     "required": false,
     "default": 4,
     "advanced": false,
     "primary": false
    },
    {
     "name": "foreground",
     "label": "Foreground",
     "type": "color",
     "required": false,
     "default": "#000000",
     "advanced": false,
     "primary": false
    },
    {
     "name": "background",
     "label": "Background",
     "type": "color",
     "required": false,
     "default": "#ffffff",
     "advanced": false,
     "primary": false
    },
    {
     "name": "module_style",
     "label": "Module style",
     "type": "enum",
     "options": [
      {
       "value": "square",
       "label": "Square"
      },
      {
       "value": "rounded",
       "label": "Rounded"
      },
      {
       "value": "dots",
       "label": "Dots"
      }
     ],
     "multi": false,
     "required": false,
     "default": "rounded",
     "advanced": false,
     "primary": false
    },
    {
     "name": "eye_style",
     "label": "Eye style",
     "type": "enum",
     "options": [
      {
       "value": "square",
       "label": "Square"
      },
      {
       "value": "rounded",
       "label": "Rounded"
      },
      {
       "value": "dots",
       "label": "Rounded with dot"
      }
     ],
     "multi": false,
     "required": false,
     "default": "rounded",
     "advanced": false,
     "primary": false
    },
    {
     "name": "logo",
     "label": "Logo (optional)",
     "type": "file",
     "accept": [
      "image/*",
      ".png",
      ".jpg",
      ".jpeg",
      ".webp",
      ".gif",
      ".bmp",
      ".tif",
      ".tiff",
      ".ico",
      ".tga",
      ".qoi",
      ".ppm",
      ".pgm",
      ".pbm",
      ".pnm",
      ".pam",
      ".avif",
      ".svg",
      ".svgz",
      ".jfif",
      ".apng",
      ".heic",
      ".heif",
      ".psd",
      ".jxl",
      ".jp2",
      ".pcx",
      ".xcf",
      ".dds",
      ".exr",
      ".hdr",
      ".dng",
      ".cr2",
      ".nef",
      ".arw",
      ".orf",
      ".rw2"
     ],
     "multiple": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "logo_size",
     "label": "Logo size (% of width)",
     "type": "number",
     "min": 5,
     "max": 30,
     "required": false,
     "default": 20,
     "advanced": false,
     "primary": false
    },
    {
     "name": "format",
     "label": "Format",
     "type": "enum",
     "options": [
      {
       "value": "both",
       "label": "PNG + SVG"
      },
      {
       "value": "png",
       "label": "PNG"
      },
      {
       "value": "svg",
       "label": "SVG"
      }
     ],
     "multi": false,
     "required": false,
     "default": "both",
     "advanced": true,
     "primary": false
    },
    {
     "name": "file_name",
     "label": "File name",
     "type": "text",
     "multiline": false,
     "required": false,
     "default": "qr-code",
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "files"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [],
   "timeout_secs": 120,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "qr",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.overview",
   "name": "System Overview",
   "description": "One-glance dashboard: OS, host, kernel, uptime, CPU usage, memory, swap, load average and disks",
   "category": "system",
   "keywords": [
    "system",
    "overview",
    "dashboard",
    "cpu",
    "memory",
    "ram",
    "uptime",
    "disk",
    "host"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.cpu",
   "name": "CPU Info",
   "description": "CPU brand, vendor, physical/logical cores, per-core usage (sampled ~300 ms), frequencies and instruction-set features",
   "category": "system",
   "keywords": [
    "cpu",
    "processor",
    "cores",
    "threads",
    "usage",
    "frequency",
    "avx",
    "neon"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.memory",
   "name": "Memory Usage",
   "description": "RAM and swap: total, used, available, free and container (cgroup) limits",
   "category": "system",
   "keywords": [
    "memory",
    "ram",
    "swap",
    "usage",
    "free",
    "cgroup"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.disks",
   "name": "Disks & Storage",
   "description": "Mounted disks with file system, SSD/HDD kind, capacity, free space and usage",
   "category": "system",
   "keywords": [
    "disk",
    "storage",
    "drive",
    "free space",
    "ssd",
    "hdd",
    "mount",
    "partition",
    "df"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.hardware",
   "name": "Hardware Info",
   "description": "Computer model, vendor, motherboard, BIOS/firmware, CPU, memory and GPUs (serial numbers are omitted for privacy)",
   "category": "system",
   "keywords": [
    "hardware",
    "model",
    "motherboard",
    "bios",
    "vendor",
    "gpu",
    "specs",
    "manufacturer"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.os",
   "name": "Operating System",
   "description": "OS name, version, kernel, distribution, hostname, architecture, locale and time zone",
   "category": "system",
   "keywords": [
    "os",
    "operating system",
    "version",
    "kernel",
    "distro",
    "locale",
    "timezone",
    "hostname"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.network_interfaces",
   "name": "Network Interfaces",
   "description": "Network adapters with MAC address, IP addresses, MTU, state and traffic counters",
   "category": "system",
   "keywords": [
    "network",
    "interface",
    "adapter",
    "mac",
    "ip address",
    "ifconfig",
    "ipconfig",
    "traffic"
   ],
   "params": [
    {
     "name": "include_loopback",
     "label": "Include loopback",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": false,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.processes",
   "name": "Top Processes",
   "description": "Top running processes by CPU or memory with PID, user, status and start time (command lines only on request)",
   "category": "system",
   "keywords": [
    "process",
    "task manager",
    "top",
    "htop",
    "cpu hog",
    "memory usage",
    "running programs",
    "pid"
   ],
   "params": [
    {
     "name": "sort_by",
     "label": "Sort by",
     "type": "enum",
     "options": [
      {
       "value": "cpu",
       "label": "CPU usage"
      },
      {
       "value": "memory",
       "label": "Memory"
      },
      {
       "value": "name",
       "label": "Name"
      },
      {
       "value": "pid",
       "label": "PID"
      },
      {
       "value": "start",
       "label": "Newest first"
      }
     ],
     "multi": false,
     "required": false,
     "default": "cpu",
     "advanced": false,
     "primary": false
    },
    {
     "name": "limit",
     "label": "Number of processes",
     "type": "integer",
     "min": 1,
     "max": 500,
     "required": false,
     "default": 25,
     "advanced": false,
     "primary": false
    },
    {
     "name": "filter",
     "label": "Name contains",
     "type": "text",
     "multiline": false,
     "required": false,
     "advanced": false,
     "primary": false
    },
    {
     "name": "include_command",
     "label": "Include full command lines (may contain secrets)",
     "type": "boolean",
     "required": false,
     "default": false,
     "advanced": true,
     "primary": false
    }
   ],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "process_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.uptime",
   "name": "Uptime",
   "description": "How long the system has been running, boot time and load average",
   "category": "system",
   "keywords": [
    "uptime",
    "boot time",
    "load average",
    "running since"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.temperatures",
   "name": "Temperature Sensors",
   "description": "Hardware temperature sensors (CPU, GPU, drives…) with current, max and critical values",
   "category": "system",
   "keywords": [
    "temperature",
    "sensors",
    "thermal",
    "cpu temp",
    "overheating",
    "fan"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.diagnostics",
   "name": "Environment Diagnostics",
   "description": "Check Dogubako's environment: external programs and versions, temp space, models folder, CPU features and GPU availability",
   "category": "system",
   "keywords": [
    "diagnostics",
    "dependencies",
    "ffmpeg",
    "doctor",
    "environment",
    "gpu",
    "avx2",
    "troubleshoot"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 60,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "destructive": false,
   "source": "builtin"
  },
  {
   "id": "system.battery",
   "name": "Battery Health",
   "description": "Battery charge, state, health (full vs design capacity), cycle count, energy, power draw, voltage, temperature and time remaining",
   "category": "system",
   "keywords": [
    "battery",
    "health",
    "cycles",
    "charge",
    "capacity",
    "wear",
    "laptop",
    "power"
   ],
   "params": [],
   "output": {
    "kind": "data"
   },
   "platforms": [
    "linux",
    "macos",
    "windows"
   ],
   "requires": [],
   "permissions": [
    "system_info"
   ],
   "timeout_secs": 30,
   "reports_progress": false,
   "execution": "native",
   "version": "1.0.0",
   "ui": "system",
   "destructive": false,
   "source": "builtin"
  }
 ]
}
