{
  "schemaVersion": 1,
  "description": "YorpHives tools and products. Browser tools run locally; no hosted execution API is currently provided.",
  "items": [
    {
      "name": "Word & Character Counter",
      "description": "Count words, characters, sentences, paragraphs, and estimated reading time.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/word-counter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: word-counter",
          "object of named form inputs"
        ],
        "toolId": "word-counter",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          }
        ]
      }
    },
    {
      "name": "Text Case Converter",
      "description": "Convert text to uppercase, lowercase, title case, or sentence case.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/case-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: case-converter",
          "object of named form inputs"
        ],
        "toolId": "case-converter",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "mode",
            "type": "select",
            "options": [
              "upper",
              "lower",
              "title",
              "sentence"
            ],
            "default": "upper"
          }
        ]
      }
    },
    {
      "name": "URL Slug Generator",
      "description": "Turn a title into a clean, readable URL slug.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/slug-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: slug-generator",
          "object of named form inputs"
        ],
        "toolId": "slug-generator",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "A useful title for your page"
          }
        ]
      }
    },
    {
      "name": "Duplicate Line Remover",
      "description": "Remove repeated lines while keeping their original order.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/duplicate-line-remover/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: duplicate-line-remover",
          "object of named form inputs"
        ],
        "toolId": "duplicate-line-remover",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "One item per line"
          },
          {
            "name": "ignorecase",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": false
          }
        ]
      }
    },
    {
      "name": "Line Sorter",
      "description": "Sort lines alphabetically or in natural numeric order.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/line-sorter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: line-sorter",
          "object of named form inputs"
        ],
        "toolId": "line-sorter",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "One item per line"
          },
          {
            "name": "order",
            "type": "select",
            "options": [
              "asc",
              "desc"
            ],
            "default": "asc"
          }
        ]
      }
    },
    {
      "name": "Whitespace Cleaner",
      "description": "Clean spaces and blank lines with simple, configurable options.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/whitespace-cleaner/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: whitespace-cleaner",
          "object of named form inputs"
        ],
        "toolId": "whitespace-cleaner",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "trim",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          },
          {
            "name": "collapse",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          },
          {
            "name": "empty",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": false
          }
        ]
      }
    },
    {
      "name": "Text Find & Replace",
      "description": "Find and replace an exact piece of text without uploading it.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/text-find-replace/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: text-find-replace",
          "object of named form inputs"
        ],
        "toolId": "text-find-replace",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "find",
            "type": "text",
            "default": "",
            "placeholder": "Text to find"
          },
          {
            "name": "replace",
            "type": "text",
            "default": "",
            "placeholder": "Replacement text"
          }
        ]
      }
    },
    {
      "name": "Text Difference Checker",
      "description": "Compare two versions of text line by line.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-14",
      "url": "tools/text-diff/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: text-diff",
          "object of named form inputs"
        ],
        "toolId": "text-diff",
        "inputs": [
          {
            "name": "original",
            "type": "textarea",
            "placeholder": "Paste the original text"
          },
          {
            "name": "revised",
            "type": "textarea",
            "placeholder": "Paste the revised text"
          }
        ]
      }
    },
    {
      "name": "Base64 Encoder & Decoder",
      "description": "Encode and decode UTF-8 text using Base64.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/base64-tool/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: base64-tool",
          "object of named form inputs"
        ],
        "toolId": "base64-tool",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "mode",
            "type": "select",
            "options": [
              "encode",
              "decode"
            ],
            "default": "encode"
          }
        ]
      }
    },
    {
      "name": "URL Encoder & Decoder",
      "description": "Encode or decode a URL component using percent encoding.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/url-encoder/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: url-encoder",
          "object of named form inputs"
        ],
        "toolId": "url-encoder",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "mode",
            "type": "select",
            "options": [
              "encode",
              "decode"
            ],
            "default": "encode"
          }
        ]
      }
    },
    {
      "name": "HTML Entity Encoder & Decoder",
      "description": "Encode special HTML characters or decode common entities and numeric references.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/html-entities/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: html-entities",
          "object of named form inputs"
        ],
        "toolId": "html-entities",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "mode",
            "type": "select",
            "options": [
              "encode",
              "decode"
            ],
            "default": "encode"
          }
        ]
      }
    },
    {
      "name": "JSON to CSV Converter",
      "description": "Convert an array of JSON objects into CSV for spreadsheets and data tools.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/json-to-csv/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: json-to-csv",
          "object of named form inputs"
        ],
        "toolId": "json-to-csv",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "[{\"name\":\"Mira\",\"score\":42},{\"name\":\"Kai\",\"score\":35}]"
          },
          {
            "name": "safe",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          }
        ]
      }
    },
    {
      "name": "CSV to JSON Converter",
      "description": "Convert CSV with a header row into an array of JSON objects.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/csv-to-json/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: csv-to-json",
          "object of named form inputs"
        ],
        "toolId": "csv-to-json",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "name,score\nMira,42\nKai,35"
          }
        ]
      }
    },
    {
      "name": "URL Parser",
      "description": "Inspect a URL’s host, path, query parameters, and fragment.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/url-parser/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: url-parser",
          "object of named form inputs"
        ],
        "toolId": "url-parser",
        "inputs": [
          {
            "name": "url",
            "type": "url",
            "default": "https://example.com/page?ref=news#section"
          }
        ]
      }
    },
    {
      "name": "UUID Generator",
      "description": "Generate version 4 UUIDs using your browser’s secure random generator.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/uuid-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: uuid-generator",
          "object of named form inputs"
        ],
        "toolId": "uuid-generator",
        "inputs": [
          {
            "name": "count",
            "type": "number",
            "default": "5",
            "min": "1",
            "max": "100",
            "step": "1"
          }
        ]
      }
    },
    {
      "name": "SHA Hash Generator",
      "description": "Create a SHA-256, SHA-384, or SHA-512 hash of UTF-8 text.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/hash-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: hash-generator",
          "object of named form inputs"
        ],
        "toolId": "hash-generator",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste or type text here"
          },
          {
            "name": "algorithm",
            "type": "select",
            "options": [
              "SHA-256",
              "SHA-384",
              "SHA-512"
            ],
            "default": "SHA-256"
          }
        ]
      }
    },
    {
      "name": "JWT Decoder",
      "description": "Read the header and payload of a JSON Web Token locally.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/jwt-decoder/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: jwt-decoder",
          "object of named form inputs"
        ],
        "toolId": "jwt-decoder",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "Paste a JWT with three dot-separated parts"
          }
        ]
      }
    },
    {
      "name": "Unix Timestamp Converter",
      "description": "Convert Unix timestamps to UTC dates or timezone-qualified ISO dates to timestamps.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-14",
      "url": "tools/unix-timestamp/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: unix-timestamp",
          "object of named form inputs"
        ],
        "toolId": "unix-timestamp",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "options": [
              "to-date",
              "to-timestamp"
            ],
            "default": "to-date"
          },
          {
            "name": "value",
            "type": "text",
            "default": "1704067200"
          },
          {
            "name": "unit",
            "type": "select",
            "options": [
              "seconds",
              "milliseconds"
            ],
            "default": "seconds"
          }
        ]
      }
    },
    {
      "name": "Percentage Calculator",
      "description": "Calculate a percentage of a value, a percentage share, or percentage change.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/percentage-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: percentage-calculator",
          "object of named form inputs"
        ],
        "toolId": "percentage-calculator",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "options": [
              "of",
              "what",
              "change"
            ],
            "default": "of"
          },
          {
            "name": "a",
            "type": "number",
            "default": "20",
            "step": "any"
          },
          {
            "name": "b",
            "type": "number",
            "default": "150",
            "step": "any"
          }
        ]
      }
    },
    {
      "name": "Discount Calculator",
      "description": "Calculate a sale price and savings from an original price and discount.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/discount-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: discount-calculator",
          "object of named form inputs"
        ],
        "toolId": "discount-calculator",
        "inputs": [
          {
            "name": "price",
            "type": "number",
            "default": "100",
            "min": "0",
            "step": "any"
          },
          {
            "name": "rate",
            "type": "number",
            "default": "20",
            "min": "0",
            "max": "100",
            "step": "any"
          }
        ]
      }
    },
    {
      "name": "Profit Margin Calculator",
      "description": "Calculate profit, margin, and markup from cost and selling price.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/profit-margin/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: profit-margin",
          "object of named form inputs"
        ],
        "toolId": "profit-margin",
        "inputs": [
          {
            "name": "cost",
            "type": "number",
            "default": "60",
            "min": "0",
            "step": "any"
          },
          {
            "name": "price",
            "type": "number",
            "default": "100",
            "min": "0.01",
            "step": "any"
          }
        ]
      }
    },
    {
      "name": "Tip & Bill Split Calculator",
      "description": "Calculate a tip and split a bill among a group.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/tip-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: tip-calculator",
          "object of named form inputs"
        ],
        "toolId": "tip-calculator",
        "inputs": [
          {
            "name": "bill",
            "type": "number",
            "default": "100",
            "min": "0",
            "step": "any"
          },
          {
            "name": "rate",
            "type": "number",
            "default": "15",
            "min": "0",
            "step": "any"
          },
          {
            "name": "people",
            "type": "number",
            "default": "2",
            "min": "1",
            "max": "1000",
            "step": "1"
          }
        ]
      }
    },
    {
      "name": "Sales Tax Calculator",
      "description": "Calculate tax and the total from an amount and a rate you provide.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/sales-tax-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: sales-tax-calculator",
          "object of named form inputs"
        ],
        "toolId": "sales-tax-calculator",
        "inputs": [
          {
            "name": "amount",
            "type": "number",
            "default": "100",
            "min": "0",
            "step": "any"
          },
          {
            "name": "rate",
            "type": "number",
            "default": "10",
            "min": "0",
            "step": "any"
          }
        ]
      }
    },
    {
      "name": "Unit Converter",
      "description": "Convert common length, weight, and temperature units.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/unit-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: unit-converter",
          "object of named form inputs"
        ],
        "toolId": "unit-converter",
        "inputs": [
          {
            "name": "value",
            "type": "number",
            "default": "1000",
            "step": "any"
          },
          {
            "name": "from",
            "type": "select",
            "options": [
              "mm",
              "cm",
              "m",
              "km",
              "in",
              "ft",
              "yd",
              "mi",
              "mg",
              "g",
              "kg",
              "oz",
              "lb",
              "c",
              "f",
              "k"
            ],
            "default": "m"
          },
          {
            "name": "to",
            "type": "select",
            "options": [
              "mm",
              "cm",
              "m",
              "km",
              "in",
              "ft",
              "yd",
              "mi",
              "mg",
              "g",
              "kg",
              "oz",
              "lb",
              "c",
              "f",
              "k"
            ],
            "default": "km"
          }
        ]
      }
    },
    {
      "name": "Time Duration Calculator",
      "description": "Find the time between two clock times, including an overnight end.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/time-duration/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: time-duration",
          "object of named form inputs"
        ],
        "toolId": "time-duration",
        "inputs": [
          {
            "name": "start",
            "type": "time",
            "default": "09:00"
          },
          {
            "name": "end",
            "type": "time",
            "default": "17:30"
          },
          {
            "name": "overnight",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": false
          }
        ]
      }
    },
    {
      "name": "Average & Median Calculator",
      "description": "Calculate the mean, median, sum, and range of a list of numbers.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-14",
      "url": "tools/average-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: average-calculator",
          "object of named form inputs"
        ],
        "toolId": "average-calculator",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "placeholder": "10, 20, 30, 40"
          }
        ]
      }
    },
    {
      "name": "Hex Color Converter",
      "description": "Convert a hex color into RGB and HSL values.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-14",
      "url": "tools/color-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: color-converter",
          "object of named form inputs"
        ],
        "toolId": "color-converter",
        "inputs": [
          {
            "name": "color",
            "type": "text",
            "default": "#37b69c"
          }
        ]
      }
    },
    {
      "name": "Color Contrast Checker",
      "description": "Check text and background colors against WCAG contrast thresholds.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-14",
      "url": "tools/contrast-checker/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: contrast-checker",
          "object of named form inputs"
        ],
        "toolId": "contrast-checker",
        "inputs": [
          {
            "name": "foreground",
            "type": "text",
            "default": "#123329"
          },
          {
            "name": "background",
            "type": "text",
            "default": "#ffffff"
          }
        ]
      }
    },
    {
      "name": "CSS Gradient Generator",
      "description": "Create a two-color CSS linear gradient and preview the result.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-14",
      "url": "tools/gradient-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: gradient-generator",
          "object of named form inputs"
        ],
        "toolId": "gradient-generator",
        "inputs": [
          {
            "name": "first",
            "type": "text",
            "default": "#38c4a5"
          },
          {
            "name": "second",
            "type": "text",
            "default": "#176cb0"
          },
          {
            "name": "angle",
            "type": "number",
            "default": "135",
            "min": "0",
            "max": "360",
            "step": "1"
          }
        ]
      }
    },
    {
      "name": "Aspect Ratio Calculator",
      "description": "Simplify image dimensions and calculate a proportional height.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-14",
      "url": "tools/aspect-ratio-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: aspect-ratio-calculator",
          "object of named form inputs"
        ],
        "toolId": "aspect-ratio-calculator",
        "inputs": [
          {
            "name": "width",
            "type": "number",
            "default": "1920",
            "min": "1",
            "step": "1"
          },
          {
            "name": "height",
            "type": "number",
            "default": "1080",
            "min": "1",
            "step": "1"
          },
          {
            "name": "target",
            "type": "number",
            "default": "800",
            "min": "1",
            "step": "any"
          }
        ]
      }
    },
    {
      "name": "Color Palette Generator",
      "description": "Generate five evenly spaced colors from a hex color.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-14",
      "url": "tools/color-palette/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: color-palette",
          "object of named form inputs"
        ],
        "toolId": "color-palette",
        "inputs": [
          {
            "name": "color",
            "type": "text",
            "default": "#37b69c"
          }
        ]
      }
    },
    {
      "name": "Password Generator",
      "description": "Generate a random password locally with your chosen character sets.",
      "type": "tool",
      "category": "Security",
      "date": "2026-11-14",
      "url": "tools/password-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/utility-core.mjs",
        "export": "runUtility",
        "arguments": [
          "tool id: password-generator",
          "object of named form inputs"
        ],
        "toolId": "password-generator",
        "inputs": [
          {
            "name": "length",
            "type": "number",
            "default": "20",
            "min": "8",
            "max": "128",
            "step": "1"
          },
          {
            "name": "lower",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          },
          {
            "name": "upper",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          },
          {
            "name": "numbers",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          },
          {
            "name": "symbols",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          }
        ]
      }
    },
    {
      "name": "JSON Formatter & Validator",
      "description": "Format, minify, and validate JSON while preserving the original numbers.",
      "type": "tool",
      "date": "2026-11-14",
      "url": "tools/json-formatter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/toolkit.mjs",
        "export": "formatJson",
        "arguments": [
          "jsonText",
          "indent (0, 2, or 4)"
        ]
      },
      "category": "Developer"
    },
    {
      "name": "Campaign URL Builder",
      "description": "Create clean UTM tracking links for campaigns, newsletters, and social posts.",
      "type": "tool",
      "date": "2026-11-14",
      "url": "tools/campaign-url-builder/",
      "execution": "browser-local",
      "module": {
        "url": "tools/toolkit.mjs",
        "export": "buildCampaignUrl",
        "arguments": [
          "baseUrl",
          "parameters object with source, medium, campaign, term, and content"
        ]
      },
      "category": "Marketing"
    },
    {
      "name": "Image Resizer & Compressor",
      "description": "Resize and compress images privately in your browser, with no upload.",
      "type": "tool",
      "date": "2026-11-14",
      "url": "tools/image-resizer/",
      "execution": "browser-local",
      "module": null,
      "category": "Creator"
    },
    {
      "name": "QR Code Generator",
      "description": "Create a downloadable QR code for a link or text without uploading your data.",
      "type": "tool",
      "category": "Creator",
      "date": "2026-11-15",
      "url": "tools/qr-code-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: qr-code-generator",
          "object of named form inputs"
        ],
        "toolId": "qr-code-generator",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "correction",
            "type": "select",
            "default": "M",
            "options": [
              "L",
              "M",
              "Q",
              "H"
            ]
          }
        ]
      }
    },
    {
      "name": "Markdown to HTML Converter",
      "description": "Convert Markdown into HTML locally using the open-source Marked parser.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/markdown-to-html/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: markdown-to-html",
          "object of named form inputs"
        ],
        "toolId": "markdown-to-html",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Regular Expression Tester",
      "description": "Find regular-expression matches and capture groups in text, privately in your browser.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/regex-tester/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: regex-tester",
          "object of named form inputs"
        ],
        "toolId": "regex-tester",
        "inputs": [
          {
            "name": "pattern",
            "type": "text",
            "default": "\\b\\w+\\b"
          },
          {
            "name": "flags",
            "type": "text",
            "default": "i"
          },
          {
            "name": "text",
            "type": "textarea",
            "default": "Cats and dogs"
          }
        ]
      }
    },
    {
      "name": "JSON Pointer Explorer",
      "description": "Select a value from a JSON document using an RFC 6901 JSON Pointer.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/json-pointer/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: json-pointer",
          "object of named form inputs"
        ],
        "toolId": "json-pointer",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "pointer",
            "type": "text",
            "default": "/user/name"
          }
        ]
      }
    },
    {
      "name": "JSON Merge Patch",
      "description": "Apply an RFC 7396 merge patch to a JSON document without sending your data away.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/json-merge-patch/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: json-merge-patch",
          "object of named form inputs"
        ],
        "toolId": "json-merge-patch",
        "inputs": [
          {
            "name": "target",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "patch",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "JSON Lines Converter",
      "description": "Convert JSON Lines to a JSON array or a JSON array to JSON Lines.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/json-lines-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: json-lines-converter",
          "object of named form inputs"
        ],
        "toolId": "json-lines-converter",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "default": "to-array",
            "options": [
              "to-array",
              "to-lines"
            ]
          },
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Number Base Converter",
      "description": "Convert whole numbers between binary, octal, decimal, and hexadecimal with arbitrary precision.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/number-base-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: number-base-converter",
          "object of named form inputs"
        ],
        "toolId": "number-base-converter",
        "inputs": [
          {
            "name": "value",
            "type": "text",
            "default": "255"
          },
          {
            "name": "from",
            "type": "select",
            "default": "10",
            "options": [
              "2",
              "8",
              "10",
              "16"
            ]
          },
          {
            "name": "to",
            "type": "select",
            "default": "16",
            "options": [
              "2",
              "8",
              "10",
              "16"
            ]
          }
        ]
      }
    },
    {
      "name": "Text to Hex Converter",
      "description": "Encode text as UTF-8 hexadecimal bytes or decode valid UTF-8 hex back to text.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/text-to-hex/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: text-to-hex",
          "object of named form inputs"
        ],
        "toolId": "text-to-hex",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "default": "encode",
            "options": [
              "encode",
              "decode"
            ]
          },
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "IPv4 Subnet Calculator",
      "description": "Calculate an IPv4 network, subnet mask, address range, and usable hosts from a CIDR prefix.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/ipv4-subnet-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: ipv4-subnet-calculator",
          "object of named form inputs"
        ],
        "toolId": "ipv4-subnet-calculator",
        "inputs": [
          {
            "name": "address",
            "type": "text",
            "default": "192.168.1.10"
          },
          {
            "name": "prefix",
            "type": "number",
            "default": "24",
            "min": 0,
            "max": 32
          }
        ]
      }
    },
    {
      "name": "Word Frequency Counter",
      "description": "Find the most frequently used words in a piece of text.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-15",
      "url": "tools/word-frequency-counter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: word-frequency-counter",
          "object of named form inputs"
        ],
        "toolId": "word-frequency-counter",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "limit",
            "type": "number",
            "default": "20",
            "min": 1,
            "max": 100
          }
        ]
      }
    },
    {
      "name": "Lorem Ipsum Generator",
      "description": "Generate placeholder paragraphs for mockups, prototypes, and layouts.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-15",
      "url": "tools/lorem-ipsum-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: lorem-ipsum-generator",
          "object of named form inputs"
        ],
        "toolId": "lorem-ipsum-generator",
        "inputs": [
          {
            "name": "count",
            "type": "number",
            "default": "3",
            "min": 1,
            "max": 20
          }
        ]
      }
    },
    {
      "name": "Reverse Text",
      "description": "Reverse text while preserving emoji and combined characters where supported.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-15",
      "url": "tools/reverse-text/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: reverse-text",
          "object of named form inputs"
        ],
        "toolId": "reverse-text",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Unicode Code Point Inspector",
      "description": "Inspect the Unicode code point for each character in a string.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/unicode-inspector/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: unicode-inspector",
          "object of named form inputs"
        ],
        "toolId": "unicode-inspector",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "List and Delimiter Converter",
      "description": "Join lines with a separator or split separated text into a list.",
      "type": "tool",
      "category": "Writing",
      "date": "2026-11-15",
      "url": "tools/list-to-delimited/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: list-to-delimited",
          "object of named form inputs"
        ],
        "toolId": "list-to-delimited",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "default": "join",
            "options": [
              "join",
              "split"
            ]
          },
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "delimiter",
            "type": "text",
            "default": ", "
          },
          {
            "name": "trim",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          }
        ]
      }
    },
    {
      "name": "CSV to Markdown Table",
      "description": "Turn CSV data into a Markdown table while preserving quoted commas and line breaks.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/csv-to-markdown/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: csv-to-markdown",
          "object of named form inputs"
        ],
        "toolId": "csv-to-markdown",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "URL Tracking Parameter Remover",
      "description": "Remove common tracking parameters from a link without visiting the destination.",
      "type": "tool",
      "category": "Marketing",
      "date": "2026-11-15",
      "url": "tools/url-tracking-remover/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: url-tracking-remover",
          "object of named form inputs"
        ],
        "toolId": "url-tracking-remover",
        "inputs": [
          {
            "name": "url",
            "type": "text",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "URL Query Parameter Builder",
      "description": "Add or replace URL query parameters safely without manually encoding them.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/query-string-builder/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: query-string-builder",
          "object of named form inputs"
        ],
        "toolId": "query-string-builder",
        "inputs": [
          {
            "name": "url",
            "type": "text",
            "default": ""
          },
          {
            "name": "params",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "mode",
            "type": "select",
            "default": "replace",
            "options": [
              "replace",
              "append"
            ]
          }
        ]
      }
    },
    {
      "name": "Email Link Generator",
      "description": "Create a mailto link with an optional subject and message.",
      "type": "tool",
      "category": "Marketing",
      "date": "2026-11-15",
      "url": "tools/mailto-link-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: mailto-link-generator",
          "object of named form inputs"
        ],
        "toolId": "mailto-link-generator",
        "inputs": [
          {
            "name": "email",
            "type": "text",
            "default": ""
          },
          {
            "name": "subject",
            "type": "text",
            "default": ""
          },
          {
            "name": "body",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "SEO and Open Graph Meta Tag Generator",
      "description": "Create basic page title, description, canonical, and Open Graph tags.",
      "type": "tool",
      "category": "Marketing",
      "date": "2026-11-15",
      "url": "tools/meta-tag-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: meta-tag-generator",
          "object of named form inputs"
        ],
        "toolId": "meta-tag-generator",
        "inputs": [
          {
            "name": "title",
            "type": "text",
            "default": ""
          },
          {
            "name": "description",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "url",
            "type": "text",
            "default": ""
          },
          {
            "name": "image",
            "type": "text",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Robots.txt Generator",
      "description": "Build a basic robots.txt file with optional disallowed paths and sitemap.",
      "type": "tool",
      "category": "Marketing",
      "date": "2026-11-15",
      "url": "tools/robots-txt-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: robots-txt-generator",
          "object of named form inputs"
        ],
        "toolId": "robots-txt-generator",
        "inputs": [
          {
            "name": "paths",
            "type": "textarea",
            "default": ""
          },
          {
            "name": "sitemap",
            "type": "text",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "XML Sitemap Generator",
      "description": "Create an XML sitemap from a list of page URLs on one website.",
      "type": "tool",
      "category": "Marketing",
      "date": "2026-11-15",
      "url": "tools/xml-sitemap-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: xml-sitemap-generator",
          "object of named form inputs"
        ],
        "toolId": "xml-sitemap-generator",
        "inputs": [
          {
            "name": "urls",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Business Days Calculator",
      "description": "Count weekdays between two dates, with an optional list of holidays.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/business-days-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: business-days-calculator",
          "object of named form inputs"
        ],
        "toolId": "business-days-calculator",
        "inputs": [
          {
            "name": "start",
            "type": "date"
          },
          {
            "name": "end",
            "type": "date"
          },
          {
            "name": "holidays",
            "type": "textarea",
            "default": ""
          }
        ]
      }
    },
    {
      "name": "Add or Subtract Days",
      "description": "Add or subtract calendar days from a date.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/date-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: date-calculator",
          "object of named form inputs"
        ],
        "toolId": "date-calculator",
        "inputs": [
          {
            "name": "date",
            "type": "date"
          },
          {
            "name": "days",
            "type": "number",
            "default": "30",
            "min": -36500,
            "max": 36500
          }
        ]
      }
    },
    {
      "name": "Compound Interest Calculator",
      "description": "Estimate the growth of savings with monthly compounding and contributions.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/compound-interest-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: compound-interest-calculator",
          "object of named form inputs"
        ],
        "toolId": "compound-interest-calculator",
        "inputs": [
          {
            "name": "principal",
            "type": "number",
            "default": "10000",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "monthly",
            "type": "number",
            "default": "100",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "rate",
            "type": "number",
            "default": "5",
            "min": 0,
            "max": 1000
          },
          {
            "name": "years",
            "type": "number",
            "default": "10",
            "min": 0,
            "max": 60
          }
        ]
      }
    },
    {
      "name": "Loan Payment Calculator",
      "description": "Estimate a fixed-rate monthly loan payment and total interest.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/loan-payment-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: loan-payment-calculator",
          "object of named form inputs"
        ],
        "toolId": "loan-payment-calculator",
        "inputs": [
          {
            "name": "principal",
            "type": "number",
            "default": "100000",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "rate",
            "type": "number",
            "default": "6",
            "min": 0,
            "max": 1000
          },
          {
            "name": "months",
            "type": "number",
            "default": "120",
            "min": 1,
            "max": 600
          }
        ]
      }
    },
    {
      "name": "Return on Investment Calculator",
      "description": "Calculate net gain and return on investment from a cost and total return value.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/roi-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: roi-calculator",
          "object of named form inputs"
        ],
        "toolId": "roi-calculator",
        "inputs": [
          {
            "name": "cost",
            "type": "number",
            "default": "1000",
            "min": 1e-8,
            "max": 1000000000000
          },
          {
            "name": "value",
            "type": "number",
            "default": "1200",
            "min": 0,
            "max": 1000000000000
          }
        ]
      }
    },
    {
      "name": "Break-even Calculator",
      "description": "Estimate the number of units needed to cover fixed costs.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/break-even-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: break-even-calculator",
          "object of named form inputs"
        ],
        "toolId": "break-even-calculator",
        "inputs": [
          {
            "name": "fixed",
            "type": "number",
            "default": "1000",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "price",
            "type": "number",
            "default": "25",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "variable",
            "type": "number",
            "default": "10",
            "min": 0,
            "max": 1000000000000
          }
        ]
      }
    },
    {
      "name": "Reverse Sales Tax Calculator",
      "description": "Find the pre-tax amount and tax included in a total price.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/reverse-sales-tax-calculator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: reverse-sales-tax-calculator",
          "object of named form inputs"
        ],
        "toolId": "reverse-sales-tax-calculator",
        "inputs": [
          {
            "name": "total",
            "type": "number",
            "default": "110",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "rate",
            "type": "number",
            "default": "10",
            "min": 0,
            "max": 1000
          }
        ]
      }
    },
    {
      "name": "Currency Converter with Manual Rate",
      "description": "Convert a currency amount using an exchange rate you provide.",
      "type": "tool",
      "category": "Calculators",
      "date": "2026-11-15",
      "url": "tools/manual-currency-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: manual-currency-converter",
          "object of named form inputs"
        ],
        "toolId": "manual-currency-converter",
        "inputs": [
          {
            "name": "amount",
            "type": "number",
            "default": "100",
            "min": 0,
            "max": 1000000000000
          },
          {
            "name": "rate",
            "type": "number",
            "default": "1.25",
            "min": 1e-12,
            "max": 1000000000000
          }
        ]
      }
    },
    {
      "name": "CSS Box Shadow Generator",
      "description": "Create CSS box-shadow code and preview the effect.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-15",
      "url": "tools/box-shadow-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: box-shadow-generator",
          "object of named form inputs"
        ],
        "toolId": "box-shadow-generator",
        "inputs": [
          {
            "name": "x",
            "type": "number",
            "default": "0",
            "min": -200,
            "max": 200
          },
          {
            "name": "y",
            "type": "number",
            "default": "12",
            "min": -200,
            "max": 200
          },
          {
            "name": "blur",
            "type": "number",
            "default": "28",
            "min": 0,
            "max": 200
          },
          {
            "name": "spread",
            "type": "number",
            "default": "0",
            "min": -200,
            "max": 200
          },
          {
            "name": "opacity",
            "type": "number",
            "default": "30",
            "min": 0,
            "max": 100
          },
          {
            "name": "color",
            "type": "text",
            "default": "#000000"
          }
        ]
      }
    },
    {
      "name": "PX to REM Converter",
      "description": "Convert CSS pixel and rem values using your chosen root font size.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-15",
      "url": "tools/px-to-rem-converter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: px-to-rem-converter",
          "object of named form inputs"
        ],
        "toolId": "px-to-rem-converter",
        "inputs": [
          {
            "name": "value",
            "type": "number",
            "default": "24",
            "min": -1000000000000,
            "max": 1000000000000
          },
          {
            "name": "root",
            "type": "number",
            "default": "16",
            "min": 1,
            "max": 200
          },
          {
            "name": "mode",
            "type": "select",
            "default": "to-rem",
            "options": [
              "to-rem",
              "to-px"
            ]
          }
        ]
      }
    },
    {
      "name": "CSS Grid Generator",
      "description": "Generate a responsive-friendly CSS grid declaration with equal columns.",
      "type": "tool",
      "category": "Design",
      "date": "2026-11-15",
      "url": "tools/css-grid-generator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: css-grid-generator",
          "object of named form inputs"
        ],
        "toolId": "css-grid-generator",
        "inputs": [
          {
            "name": "columns",
            "type": "number",
            "default": "3",
            "min": 1,
            "max": 12
          },
          {
            "name": "gap",
            "type": "number",
            "default": "16",
            "min": 0,
            "max": 200
          }
        ]
      }
    },
    {
      "name": "Merge PDF Files",
      "description": "Combine PDF documents into one file directly in your browser.",
      "type": "tool",
      "category": "PDF",
      "date": "2026-11-15",
      "url": "tools/pdf-merge/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: pdf-merge",
          "array of File objects",
          "object of options"
        ],
        "toolId": "pdf-merge",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": true,
            "accept": ".pdf,application/pdf"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Extract PDF Pages",
      "description": "Create a new PDF from the pages or ranges you choose.",
      "type": "tool",
      "category": "PDF",
      "date": "2026-11-15",
      "url": "tools/pdf-extract-pages/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: pdf-extract-pages",
          "array of File objects",
          "object of options"
        ],
        "toolId": "pdf-extract-pages",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".pdf,application/pdf"
          },
          {
            "name": "pages",
            "type": "text",
            "default": ""
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Remove PDF Pages",
      "description": "Remove selected pages and download the remaining PDF.",
      "type": "tool",
      "category": "PDF",
      "date": "2026-11-15",
      "url": "tools/pdf-remove-pages/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: pdf-remove-pages",
          "array of File objects",
          "object of options"
        ],
        "toolId": "pdf-remove-pages",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".pdf,application/pdf"
          },
          {
            "name": "pages",
            "type": "text",
            "default": ""
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Rotate PDF Pages",
      "description": "Rotate all or selected PDF pages by a right angle.",
      "type": "tool",
      "category": "PDF",
      "date": "2026-11-15",
      "url": "tools/pdf-rotate-pages/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: pdf-rotate-pages",
          "array of File objects",
          "object of options"
        ],
        "toolId": "pdf-rotate-pages",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".pdf,application/pdf"
          },
          {
            "name": "pages",
            "type": "text",
            "default": ""
          },
          {
            "name": "angle",
            "type": "select",
            "default": "90"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "PDF Page Counter",
      "description": "Count PDF pages and inspect their dimensions locally.",
      "type": "tool",
      "category": "PDF",
      "date": "2026-11-15",
      "url": "tools/pdf-page-counter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: pdf-page-counter",
          "array of File objects",
          "object of options"
        ],
        "toolId": "pdf-page-counter",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".pdf,application/pdf"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Images to PDF",
      "description": "Combine JPEG, PNG, or WebP images into a PDF, one image per page.",
      "type": "tool",
      "category": "Images",
      "date": "2026-11-15",
      "url": "tools/images-to-pdf/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: images-to-pdf",
          "array of File objects",
          "object of options"
        ],
        "toolId": "images-to-pdf",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": true,
            "accept": ".png,.jpg,.jpeg,.webp,image/png,image/jpeg,image/webp"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Image Cropper",
      "description": "Crop a JPEG, PNG, or WebP image using pixel coordinates.",
      "type": "tool",
      "category": "Images",
      "date": "2026-11-15",
      "url": "tools/image-cropper/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: image-cropper",
          "array of File objects",
          "object of options"
        ],
        "toolId": "image-cropper",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".png,.jpg,.jpeg,.webp,image/png,image/jpeg,image/webp"
          },
          {
            "name": "x",
            "type": "number",
            "default": 0
          },
          {
            "name": "y",
            "type": "number",
            "default": 0
          },
          {
            "name": "width",
            "type": "number",
            "default": 0
          },
          {
            "name": "height",
            "type": "number",
            "default": 0
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Rotate and Flip Image",
      "description": "Rotate an image by 90-degree increments or flip it horizontally.",
      "type": "tool",
      "category": "Images",
      "date": "2026-11-15",
      "url": "tools/image-rotate-flip/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: image-rotate-flip",
          "array of File objects",
          "object of options"
        ],
        "toolId": "image-rotate-flip",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".png,.jpg,.jpeg,.webp,image/png,image/jpeg,image/webp"
          },
          {
            "name": "angle",
            "type": "select",
            "default": "90"
          },
          {
            "name": "flip",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": false
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Add Text Watermark",
      "description": "Add a text watermark to an image without uploading it.",
      "type": "tool",
      "category": "Images",
      "date": "2026-11-15",
      "url": "tools/image-watermark/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: image-watermark",
          "array of File objects",
          "object of options"
        ],
        "toolId": "image-watermark",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".png,.jpg,.jpeg,.webp,image/png,image/jpeg,image/webp"
          },
          {
            "name": "watermark",
            "type": "text",
            "default": ""
          },
          {
            "name": "size",
            "type": "number",
            "default": 32
          },
          {
            "name": "opacity",
            "type": "number",
            "default": 70
          },
          {
            "name": "color",
            "type": "text",
            "default": "#ffffff"
          },
          {
            "name": "position",
            "type": "select",
            "default": "bottom-right"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "CSV File to Excel",
      "description": "Convert a UTF-8 CSV file into an Excel XLSX workbook.",
      "type": "tool",
      "category": "Spreadsheets",
      "date": "2026-11-15",
      "url": "tools/csv-file-to-xlsx/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: csv-file-to-xlsx",
          "array of File objects",
          "object of options"
        ],
        "toolId": "csv-file-to-xlsx",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".csv,text/csv"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Excel to CSV",
      "description": "Export a worksheet from an XLSX workbook as a CSV file.",
      "type": "tool",
      "category": "Spreadsheets",
      "date": "2026-11-15",
      "url": "tools/xlsx-file-to-csv/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: xlsx-file-to-csv",
          "array of File objects",
          "object of options"
        ],
        "toolId": "xlsx-file-to-csv",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
          },
          {
            "name": "sheet",
            "type": "number",
            "default": 1
          },
          {
            "name": "safe",
            "type": "checkbox",
            "checkedValue": "on",
            "defaultChecked": true
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Excel to JSON",
      "description": "Convert an XLSX worksheet into a JSON array using its first row as field names.",
      "type": "tool",
      "category": "Spreadsheets",
      "date": "2026-11-15",
      "url": "tools/xlsx-file-to-json/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: xlsx-file-to-json",
          "array of File objects",
          "object of options"
        ],
        "toolId": "xlsx-file-to-json",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
          },
          {
            "name": "sheet",
            "type": "number",
            "default": 1
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "Images to PowerPoint",
      "description": "Create a PowerPoint presentation with one image per slide.",
      "type": "tool",
      "category": "Presentations",
      "date": "2026-11-15",
      "url": "tools/images-to-powerpoint/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: images-to-powerpoint",
          "array of File objects",
          "object of options"
        ],
        "toolId": "images-to-powerpoint",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": true,
            "accept": ".png,.jpg,.jpeg,.webp,image/png,image/jpeg,image/webp"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "PowerPoint Text Extractor",
      "description": "Extract visible text from PPTX slide shapes into a text file.",
      "type": "tool",
      "category": "Presentations",
      "date": "2026-11-15",
      "url": "tools/powerpoint-text-extractor/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: powerpoint-text-extractor",
          "array of File objects",
          "object of options"
        ],
        "toolId": "powerpoint-text-extractor",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".pptx,application/vnd.openxmlformats-officedocument.presentationml.presentation"
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "File SHA-256 Checksum",
      "description": "Calculate the SHA-256 checksum of a file locally.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/file-sha256/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: file-sha256",
          "array of File objects",
          "object of options"
        ],
        "toolId": "file-sha256",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ""
          }
        ],
        "requirements": [
          "Browser File and Blob APIs; image and presentation tools also need Canvas."
        ]
      }
    },
    {
      "name": "File Format Inspector",
      "description": "Identify common file types from actual file signatures instead of filenames.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/file-format-inspector/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: file-format-inspector",
          "array of File objects",
          "object of options"
        ],
        "toolId": "file-format-inspector",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ""
          }
        ],
        "requirements": [
          "Modern browser with File and Blob APIs; JSZip bundled locally for archive creation."
        ]
      }
    },
    {
      "name": "Batch File Renamer",
      "description": "Give multiple files consistent numbered names and download one ZIP.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/batch-file-renamer/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: batch-file-renamer",
          "array of File objects",
          "object of options"
        ],
        "toolId": "batch-file-renamer",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": true,
            "accept": ""
          },
          {
            "name": "prefix",
            "type": "text",
            "default": "yorphives"
          }
        ],
        "requirements": [
          "Modern browser with File and Blob APIs; JSZip bundled locally for archive creation."
        ]
      }
    },
    {
      "name": "ZIP File Creator",
      "description": "Create a downloadable ZIP of local files with no uploads.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/zip-file-creator/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: zip-file-creator",
          "array of File objects",
          "object of options"
        ],
        "toolId": "zip-file-creator",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": true,
            "accept": ""
          }
        ],
        "requirements": [
          "Modern browser with File and Blob APIs; JSZip bundled locally for archive creation."
        ]
      }
    },
    {
      "name": "ZIP Contents Viewer",
      "description": "View ZIP filenames and uncompressed sizes without extracting anything.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/zip-contents-viewer/",
      "execution": "browser-local",
      "module": {
        "url": "tools/file-core.mjs",
        "export": "processFileTool",
        "arguments": [
          "tool id: zip-contents-viewer",
          "array of File objects",
          "object of options"
        ],
        "toolId": "zip-contents-viewer",
        "inputs": [
          {
            "name": "files",
            "type": "file",
            "multiple": false,
            "accept": ".zip,application/zip"
          }
        ],
        "requirements": [
          "Modern browser with File and Blob APIs; JSZip bundled locally for archive creation."
        ]
      }
    },
    {
      "name": "Open-Source Conversion Command Builder",
      "description": "Make copyable commands for free desktop conversion tools.",
      "type": "tool",
      "category": "Files",
      "date": "2026-11-15",
      "url": "tools/conversion-command-builder/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: conversion-command-builder",
          "object of named form inputs"
        ],
        "toolId": "conversion-command-builder",
        "inputs": [
          {
            "name": "mode",
            "type": "select",
            "default": "docx-pdf",
            "options": [
              "docx-pdf",
              "xlsx-csv",
              "mp4-webm",
              "wav-mp3",
              "png-webp",
              "pdf-png"
            ]
          }
        ]
      }
    },
    {
      "name": "JSON Key Sorter",
      "description": "Sort nested JSON object keys while preserving array order.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/json-key-sorter/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: json-key-sorter",
          "object of named form inputs"
        ],
        "toolId": "json-key-sorter",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": "{\"z\":1,\"a\":2}"
          }
        ]
      }
    },
    {
      "name": "CSV Column Extractor",
      "description": "Select a CSV column by header, preserving quoted fields and newlines.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/csv-column-extractor/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: csv-column-extractor",
          "object of named form inputs"
        ],
        "toolId": "csv-column-extractor",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": "Name,Score\nAva,20\nKai,18"
          },
          {
            "name": "header",
            "type": "text",
            "default": "Score"
          }
        ]
      }
    },
    {
      "name": "CSV to HTML Table",
      "description": "Generate properly escaped HTML table markup from a CSV.",
      "type": "tool",
      "category": "Developer",
      "date": "2026-11-15",
      "url": "tools/csv-to-html-table/",
      "execution": "browser-local",
      "module": {
        "url": "tools/everyday-core.mjs",
        "export": "runEverydayTool",
        "arguments": [
          "tool id: csv-to-html-table",
          "object of named form inputs"
        ],
        "toolId": "csv-to-html-table",
        "inputs": [
          {
            "name": "text",
            "type": "textarea",
            "default": "Name,Role\nAva,Designer"
          }
        ]
      }
    }
  ]
}
