{
  "name": "SimonOS Tool Manifest",
  "version": "2026-04-24",
  "tools": [
    {
      "id": "timestamp-converter",
      "version": "2026-04-24",
      "name": "Timestamp Converter",
      "description": "Convert Unix timestamps, ISO strings, and readable dates without guessing which format you are looking at.",
      "href": "/tools/timestamp-converter",
      "category": "Time & Date",
      "tags": [
        "Unix",
        "ISO 8601",
        "Dates"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Parse Unix seconds, Unix milliseconds, ISO strings, or readable date strings into common timestamp formats.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "value"
        ],
        "properties": {
          "value": {
            "type": "string",
            "description": "Timestamp or date string to parse.",
            "examples": [
              "1776853800",
              "2026-04-22T10:30:00.000Z"
            ]
          },
          "locale": {
            "type": "string",
            "description": "Optional BCP 47 locale for human-readable outputs.",
            "examples": [
              "en-US"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "kind",
          "kindLabel",
          "iso",
          "unixSeconds",
          "unixMilliseconds",
          "outputs"
        ],
        "properties": {
          "kind": {
            "type": "string"
          },
          "kindLabel": {
            "type": "string"
          },
          "iso": {
            "type": "string"
          },
          "unixSeconds": {
            "type": "integer"
          },
          "unixMilliseconds": {
            "type": "integer"
          },
          "outputs": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Unix seconds",
          "input": {
            "value": "1776853800",
            "locale": "en-US"
          }
        }
      ]
    },
    {
      "id": "timezone-converter",
      "version": "2026-04-24",
      "name": "Timezone Converter",
      "description": "Translate one meeting time across cities and named time zones with quick previews for the places you care about.",
      "href": "/tools/timezone-converter",
      "category": "Time & Date",
      "tags": [
        "UTC",
        "Scheduling",
        "World Clock"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Convert a local date and time from one IANA timezone to another and return common comparison previews.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "dateTime",
          "sourceTimeZone",
          "targetTimeZone"
        ],
        "properties": {
          "dateTime": {
            "type": "string",
            "description": "Local datetime in YYYY-MM-DDTHH:mm format.",
            "examples": [
              "2026-04-23T14:05"
            ]
          },
          "sourceTimeZone": {
            "type": "string",
            "description": "Source IANA timezone.",
            "examples": [
              "Europe/Vienna"
            ]
          },
          "targetTimeZone": {
            "type": "string",
            "description": "Target IANA timezone.",
            "examples": [
              "America/Los_Angeles"
            ]
          },
          "locale": {
            "type": "string",
            "description": "Optional BCP 47 locale for formatted outputs.",
            "examples": [
              "en-US"
            ]
          },
          "previewTimeZones": {
            "type": "array",
            "description": "Optional explicit list of IANA timezone previews.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "source",
          "target",
          "utc",
          "previews"
        ],
        "properties": {
          "source": {
            "type": "object"
          },
          "target": {
            "type": "object"
          },
          "utc": {
            "type": "object"
          },
          "previews": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Vienna to Los Angeles",
          "input": {
            "dateTime": "2026-04-23T14:05",
            "sourceTimeZone": "Europe/Vienna",
            "targetTimeZone": "America/Los_Angeles",
            "locale": "en-US"
          }
        }
      ]
    },
    {
      "id": "length-converter",
      "version": "2026-04-24",
      "name": "Length Converter",
      "description": "Switch between metric and imperial length units instantly, with quick swaps and practical equivalents.",
      "href": "/tools/length-converter",
      "category": "Converters",
      "tags": [
        "Metric",
        "Imperial",
        "Units"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Convert a numeric length between supported metric, imperial, and nautical units.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "value",
          "fromUnitId",
          "toUnitId"
        ],
        "properties": {
          "value": {
            "type": "number",
            "description": "The numeric length value to convert.",
            "examples": [
              1
            ]
          },
          "fromUnitId": {
            "type": "string",
            "enum": [
              "mm",
              "cm",
              "m",
              "km",
              "in",
              "ft",
              "yd",
              "mi",
              "nmi"
            ],
            "description": "Source unit id."
          },
          "toUnitId": {
            "type": "string",
            "enum": [
              "mm",
              "cm",
              "m",
              "km",
              "in",
              "ft",
              "yd",
              "mi",
              "nmi"
            ],
            "description": "Target unit id."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "value",
          "formattedValue",
          "fromUnit",
          "toUnit",
          "equivalents"
        ],
        "properties": {
          "value": {
            "type": "number"
          },
          "formattedValue": {
            "type": "string"
          },
          "fromUnit": {
            "type": "object"
          },
          "toUnit": {
            "type": "object"
          },
          "equivalents": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Meters to feet",
          "input": {
            "value": 1,
            "fromUnitId": "m",
            "toUnitId": "ft"
          }
        }
      ]
    },
    {
      "id": "base64-converter",
      "version": "2026-04-24",
      "name": "Base64 Converter",
      "description": "Encode and decode UTF-8 text as Base64 for payloads, tokens, and debugging.",
      "href": "/tools/base64-converter",
      "category": "Converters",
      "tags": [
        "Base64",
        "Encode",
        "Decode"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Encode plain UTF-8 text to Base64 or decode UTF-8 Base64 text.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input",
          "mode"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Plain text or Base64 text to convert.",
            "examples": [
              "SimonOS"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "encode",
              "decode"
            ],
            "description": "Conversion direction."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "mode",
          "input",
          "output",
          "inputLength",
          "outputLength"
        ],
        "properties": {
          "mode": {
            "type": "string"
          },
          "input": {
            "type": "string"
          },
          "output": {
            "type": "string"
          },
          "inputLength": {
            "type": "integer"
          },
          "outputLength": {
            "type": "integer"
          }
        }
      },
      "examples": [
        {
          "name": "Encode text",
          "input": {
            "input": "SimonOS",
            "mode": "encode"
          }
        }
      ]
    },
    {
      "id": "url-encoder-decoder",
      "version": "2026-04-24",
      "name": "URL Encoder / Decoder",
      "description": "Encode and decode percent-escaped URL text for query strings, route parameters, links, and copied payload fragments.",
      "href": "/tools/url-encoder-decoder",
      "category": "Converters",
      "tags": [
        "URL",
        "Encode",
        "Decode"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Encode plain text for URL components or decode percent-escaped URL text back into readable UTF-8.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input",
          "mode"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "URL text, query value, or percent-escaped text to convert.",
            "examples": [
              "hello world?x=1"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "encode",
              "decode"
            ],
            "description": "Conversion direction."
          },
          "plusAsSpace": {
            "type": "boolean",
            "default": false,
            "description": "When decoding, treat plus signs as spaces for form-style query values."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "mode",
          "input",
          "output",
          "inputLength",
          "outputLength",
          "changed"
        ],
        "properties": {
          "mode": {
            "type": "string"
          },
          "input": {
            "type": "string"
          },
          "output": {
            "type": "string"
          },
          "inputLength": {
            "type": "integer"
          },
          "outputLength": {
            "type": "integer"
          },
          "changed": {
            "type": "boolean"
          }
        }
      },
      "examples": [
        {
          "name": "Encode query value",
          "input": {
            "input": "hello world?x=1",
            "mode": "encode"
          }
        }
      ]
    },
    {
      "id": "text-case-converter",
      "version": "2026-04-24",
      "name": "Text Case Converter",
      "description": "Flip text between sentence case, title case, uppercase, lowercase, slugs, and developer-friendly identifiers.",
      "href": "/tools/text-case-converter",
      "category": "Text & Code",
      "tags": [
        "Case",
        "Slugs",
        "Formatting"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Generate common prose, URL, and code identifier case variants from text.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Text to transform.",
            "examples": [
              "SimonOS makes small tools feel fast"
            ]
          },
          "transformId": {
            "type": "string",
            "enum": [
              "sentence",
              "title",
              "uppercase",
              "lowercase",
              "slug",
              "camel",
              "pascal",
              "snake",
              "constant"
            ],
            "description": "Optional single transform to highlight in selectedOutput."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "outputs"
        ],
        "properties": {
          "outputs": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "selectedOutput": {
            "type": "object"
          }
        }
      },
      "examples": [
        {
          "name": "Slug output",
          "input": {
            "text": "SimonOS makes small tools feel fast",
            "transformId": "slug"
          }
        }
      ]
    },
    {
      "id": "json-formatter",
      "version": "2026-04-24",
      "name": "JSON Formatter",
      "description": "Format, validate, minify, and sort JSON payloads for APIs, configs, and logs.",
      "href": "/tools/json-formatter",
      "category": "Text & Code",
      "tags": [
        "JSON",
        "Format",
        "Validate"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Validate JSON and return formatted, minified, and optionally key-sorted output.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "json"
        ],
        "properties": {
          "json": {
            "type": "string",
            "description": "JSON string to validate and format.",
            "examples": [
              "{\"name\":\"SimonOS\",\"tools\":2}"
            ]
          },
          "indent": {
            "type": "integer",
            "minimum": 0,
            "maximum": 8,
            "default": 2,
            "description": "Number of spaces to use in formatted output."
          },
          "sortKeys": {
            "type": "boolean",
            "default": false,
            "description": "Whether to sort object keys recursively."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "formatted",
          "minified",
          "typeLabel",
          "stats"
        ],
        "properties": {
          "formatted": {
            "type": "string"
          },
          "minified": {
            "type": "string"
          },
          "typeLabel": {
            "type": "string"
          },
          "stats": {
            "type": "object"
          }
        }
      },
      "examples": [
        {
          "name": "Format API payload",
          "input": {
            "json": "{\"name\":\"SimonOS\",\"tools\":2}",
            "indent": 2,
            "sortKeys": true
          }
        }
      ]
    },
    {
      "id": "jwt-decoder",
      "version": "2026-04-24",
      "name": "JWT Decoder",
      "description": "Decode JSON Web Token headers and payloads locally so you can inspect claims without verifying or uploading the token.",
      "href": "/tools/jwt-decoder",
      "category": "Text & Code",
      "tags": [
        "JWT",
        "Tokens",
        "Claims"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Decode a JWT header and payload into formatted JSON and summarize common registered claims. Signatures are not verified.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "description": "JWT string to decode, optionally prefixed with Bearer.",
            "examples": [
              "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzaW1vbi1vcyIsInN1YiI6InRvb2wtZGVtbyIsImF1ZCI6WyJicm93c2VyLXRvb2xzIl0sImV4cCI6MTg5MzQ1NjAwMCwiaWF0IjoxNzc2ODU0ODAwfQ.demo-signature"
            ]
          },
          "now": {
            "type": "string",
            "description": "Optional ISO date used for expiration and not-before status checks.",
            "examples": [
              "2026-04-23T12:00:00.000Z"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "header",
          "payload",
          "signaturePresent",
          "warnings"
        ],
        "properties": {
          "header": {
            "type": "object"
          },
          "payload": {
            "type": "object"
          },
          "signaturePresent": {
            "type": "boolean"
          },
          "algorithm": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "issuer": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "audience": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expiresAt": {
            "type": "object"
          },
          "issuedAt": {
            "type": "object"
          },
          "notBefore": {
            "type": "object"
          },
          "isExpired": {
            "type": "boolean"
          },
          "isNotYetValid": {
            "type": "boolean"
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Decode demo token",
          "input": {
            "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzaW1vbi1vcyIsInN1YiI6InRvb2wtZGVtbyIsImF1ZCI6WyJicm93c2VyLXRvb2xzIl0sImV4cCI6MTg5MzQ1NjAwMCwiaWF0IjoxNzc2ODU0ODAwfQ.demo-signature",
            "now": "2026-04-23T12:00:00.000Z"
          }
        }
      ]
    },
    {
      "id": "hash-generator",
      "version": "2026-04-24",
      "name": "Hash Generator",
      "description": "Generate SHA-1, SHA-256, SHA-384, and SHA-512 hashes from local text with hex and Base64 output.",
      "href": "/tools/hash-generator",
      "category": "Text & Code",
      "tags": [
        "SHA",
        "Hash",
        "Digest"
      ],
      "executionEnvironment": "browser-only",
      "agentDescription": "Generate SHA digests from text in the browser using Web Crypto. The JSON API currently exposes schema metadata only.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Text to hash in browser memory.",
            "examples": [
              "SimonOS"
            ]
          },
          "algorithms": {
            "type": "array",
            "default": [
              "SHA-256"
            ],
            "description": "One or more Web Crypto SHA algorithms to run.",
            "items": {
              "type": "string",
              "enum": [
                "SHA-1",
                "SHA-256",
                "SHA-384",
                "SHA-512"
              ]
            }
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "hashes",
          "note"
        ],
        "properties": {
          "hashes": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Hash text with SHA-256",
          "input": {
            "input": "SimonOS",
            "algorithms": [
              "SHA-256"
            ]
          }
        }
      ]
    },
    {
      "id": "regex-tester",
      "version": "2026-04-24",
      "name": "Regex Tester",
      "description": "Test JavaScript regular expressions against local text and inspect matches, indexes, capture groups, and flags.",
      "href": "/tools/regex-tester",
      "category": "Text & Code",
      "tags": [
        "Regex",
        "Pattern",
        "Match"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Run a JavaScript regular expression against text and return match indexes, captures, named groups, and truncation status.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "pattern",
          "text"
        ],
        "properties": {
          "pattern": {
            "type": "string",
            "description": "JavaScript regular expression pattern without wrapping slashes.",
            "examples": [
              "tool\\w+"
            ]
          },
          "flags": {
            "type": "string",
            "default": "gi",
            "description": "Optional JavaScript regex flags such as g, i, m, s, u, v, or y.",
            "examples": [
              "gi"
            ]
          },
          "text": {
            "type": "string",
            "description": "Text to test against.",
            "examples": [
              "Toolbox has toolmaker tools."
            ]
          },
          "maxMatches": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000,
            "default": 100,
            "description": "Maximum matches to return before truncating output."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "pattern",
          "flags",
          "isMatch",
          "matchCount",
          "matches",
          "truncated"
        ],
        "properties": {
          "pattern": {
            "type": "string"
          },
          "flags": {
            "type": "string"
          },
          "isMatch": {
            "type": "boolean"
          },
          "matchCount": {
            "type": "integer"
          },
          "matches": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "truncated": {
            "type": "boolean"
          }
        }
      },
      "examples": [
        {
          "name": "Find tool words",
          "input": {
            "pattern": "tool\\w+",
            "flags": "gi",
            "text": "Toolbox has toolmaker tools."
          }
        }
      ]
    },
    {
      "id": "color-converter",
      "version": "2026-04-24",
      "name": "Color Converter",
      "description": "Convert HEX, RGB, and HSL color values with a live swatch, copyable CSS output, and contrast guidance.",
      "href": "/tools/color-converter",
      "category": "Converters",
      "tags": [
        "HEX",
        "RGB",
        "HSL"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Parse a HEX, RGB, or HSL CSS color value and return normalized HEX, RGB, HSL, luminance, and contrast text guidance.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "CSS color value in HEX, rgb(), rgba(), hsl(), or hsla() format.",
            "examples": [
              "#70E35A",
              "rgb(112, 227, 90)",
              "hsl(111, 70%, 62%)"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "input",
          "rgb",
          "hsl",
          "hex",
          "rgbString",
          "hslString",
          "luminance",
          "contrastText"
        ],
        "properties": {
          "input": {
            "type": "string"
          },
          "rgb": {
            "type": "object"
          },
          "hsl": {
            "type": "object"
          },
          "hex": {
            "type": "string"
          },
          "rgbString": {
            "type": "string"
          },
          "hslString": {
            "type": "string"
          },
          "luminance": {
            "type": "number"
          },
          "contrastText": {
            "type": "string",
            "enum": [
              "black",
              "white"
            ]
          }
        }
      },
      "examples": [
        {
          "name": "Convert Simon green",
          "input": {
            "input": "#70E35A"
          }
        }
      ]
    },
    {
      "id": "word-counter",
      "version": "2026-04-24",
      "name": "Word Counter",
      "description": "Count words, characters, sentences, paragraphs, lines, unique words, and estimated reading time.",
      "href": "/tools/word-counter",
      "category": "Text & Code",
      "tags": [
        "Words",
        "Characters",
        "Reading Time"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Count text words, characters, unique words, sentences, paragraphs, lines, and estimated reading time.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Text to measure.",
            "examples": [
              "SimonOS ships small browser tools fast."
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "characters",
          "charactersNoSpaces",
          "words",
          "uniqueWords",
          "sentences",
          "paragraphs",
          "lines",
          "readingTimeMinutes"
        ],
        "properties": {
          "characters": {
            "type": "integer"
          },
          "charactersNoSpaces": {
            "type": "integer"
          },
          "words": {
            "type": "integer"
          },
          "uniqueWords": {
            "type": "integer"
          },
          "sentences": {
            "type": "integer"
          },
          "paragraphs": {
            "type": "integer"
          },
          "lines": {
            "type": "integer"
          },
          "readingTimeMinutes": {
            "type": "integer"
          },
          "longestWord": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Count short copy",
          "input": {
            "text": "SimonOS ships small browser tools fast."
          }
        }
      ]
    },
    {
      "id": "lorem-ipsum-generator",
      "version": "2026-04-24",
      "name": "Lorem Ipsum Generator",
      "description": "Generate predictable placeholder paragraphs with adjustable sentence and word counts.",
      "href": "/tools/lorem-ipsum-generator",
      "category": "Text & Code",
      "tags": [
        "Lorem Ipsum",
        "Placeholder",
        "Copy"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Generate deterministic lorem ipsum placeholder paragraphs with adjustable counts.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "paragraphs": {
            "type": "integer",
            "minimum": 1,
            "maximum": 12,
            "default": 3,
            "description": "Number of paragraphs to generate."
          },
          "sentencesPerParagraph": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 4,
            "description": "Sentences in each paragraph."
          },
          "wordsPerSentence": {
            "type": "integer",
            "minimum": 4,
            "maximum": 24,
            "default": 10,
            "description": "Words in each sentence."
          },
          "startWithLorem": {
            "type": "boolean",
            "default": true,
            "description": "Whether output starts with lorem ipsum."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "text",
          "paragraphs",
          "sentences",
          "words"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "paragraphs": {
            "type": "integer"
          },
          "sentences": {
            "type": "integer"
          },
          "words": {
            "type": "integer"
          }
        }
      },
      "examples": [
        {
          "name": "Two small paragraphs",
          "input": {
            "paragraphs": 2,
            "sentencesPerParagraph": 2,
            "wordsPerSentence": 6
          }
        }
      ]
    },
    {
      "id": "password-generator",
      "version": "2026-04-24",
      "name": "Password Generator",
      "description": "Create strong local passwords with configurable length, character sets, and entropy estimates.",
      "href": "/tools/password-generator",
      "category": "Text & Code",
      "tags": [
        "Password",
        "Random",
        "Security"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Generate a random or seeded password with selected character sets and entropy metadata.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "length": {
            "type": "integer",
            "minimum": 4,
            "maximum": 128,
            "default": 16,
            "description": "Password length."
          },
          "uppercase": {
            "type": "boolean",
            "default": true
          },
          "lowercase": {
            "type": "boolean",
            "default": true
          },
          "numbers": {
            "type": "boolean",
            "default": true
          },
          "symbols": {
            "type": "boolean",
            "default": true
          },
          "excludeSimilar": {
            "type": "boolean",
            "default": false,
            "description": "Exclude 0, O, o, 1, l, and I."
          },
          "seed": {
            "type": "string",
            "description": "Optional deterministic seed for repeatable output.",
            "examples": [
              "simonos"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "password",
          "length",
          "charsetSize",
          "entropyBits",
          "selectedSets"
        ],
        "properties": {
          "password": {
            "type": "string"
          },
          "length": {
            "type": "integer"
          },
          "charsetSize": {
            "type": "integer"
          },
          "entropyBits": {
            "type": "number"
          },
          "selectedSets": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Seeded password",
          "input": {
            "length": 16,
            "symbols": false,
            "seed": "simonos"
          }
        }
      ]
    },
    {
      "id": "number-base-converter",
      "version": "2026-04-24",
      "name": "Number Base Converter",
      "description": "Convert integers between binary, octal, decimal, hexadecimal, and other bases up to base 36.",
      "href": "/tools/number-base-converter",
      "category": "Converters",
      "tags": [
        "Binary",
        "Hex",
        "Decimal"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Convert an integer between bases 2 through 36.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "value",
          "fromBase",
          "toBase"
        ],
        "properties": {
          "value": {
            "type": "string",
            "description": "Integer string to convert.",
            "examples": [
              "0xFF"
            ]
          },
          "fromBase": {
            "type": "integer",
            "minimum": 2,
            "maximum": 36,
            "description": "Source base."
          },
          "toBase": {
            "type": "integer",
            "minimum": 2,
            "maximum": 36,
            "description": "Target base."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "input",
          "fromBase",
          "toBase",
          "decimal",
          "output",
          "prefixedOutput"
        ],
        "properties": {
          "input": {
            "type": "string"
          },
          "fromBase": {
            "type": "integer"
          },
          "toBase": {
            "type": "integer"
          },
          "decimal": {
            "type": "string"
          },
          "output": {
            "type": "string"
          },
          "prefixedOutput": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Hex to binary",
          "input": {
            "value": "0xFF",
            "fromBase": 16,
            "toBase": 2
          }
        }
      ]
    },
    {
      "id": "url-parser",
      "version": "2026-04-24",
      "name": "URL Parser",
      "description": "Break absolute or relative URLs into protocol, host, path, query parameters, and fragments.",
      "href": "/tools/url-parser",
      "category": "Text & Code",
      "tags": [
        "URL",
        "Query",
        "Parser"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Parse an absolute or relative URL into protocol, origin, host, path, query parameters, and fragment.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "URL or relative path to parse.",
            "examples": [
              "https://simon-os.com/tools?search=pdf#launchpad"
            ]
          },
          "baseUrl": {
            "type": "string",
            "description": "Base URL used when parsing relative paths.",
            "examples": [
              "https://simon-os.com"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "input",
          "href",
          "origin",
          "protocol",
          "passwordPresent",
          "hostname",
          "pathname",
          "isAbsolute",
          "queryParams"
        ],
        "properties": {
          "input": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          },
          "protocol": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "passwordPresent": {
            "type": "boolean"
          },
          "hostname": {
            "type": "string"
          },
          "port": {
            "type": "string"
          },
          "pathname": {
            "type": "string"
          },
          "search": {
            "type": "string"
          },
          "hash": {
            "type": "string"
          },
          "isAbsolute": {
            "type": "boolean"
          },
          "queryParams": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "examples": [
        {
          "name": "Parse tool URL",
          "input": {
            "input": "https://simon-os.com/tools?search=pdf#launchpad"
          }
        }
      ]
    },
    {
      "id": "html-entity-converter",
      "version": "2026-04-24",
      "name": "HTML Entity Converter",
      "description": "Encode HTML-sensitive characters or decode common named and numeric HTML entities locally.",
      "href": "/tools/html-entity-converter",
      "category": "Converters",
      "tags": [
        "HTML",
        "Entities",
        "Escape"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Encode HTML-sensitive characters or decode common HTML entities.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input",
          "mode"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "HTML text or entity text to convert.",
            "examples": [
              "<button>Tools & files</button>"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "encode",
              "decode"
            ],
            "description": "Conversion direction."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "mode",
          "input",
          "output",
          "inputLength",
          "outputLength",
          "changed"
        ],
        "properties": {
          "mode": {
            "type": "string"
          },
          "input": {
            "type": "string"
          },
          "output": {
            "type": "string"
          },
          "inputLength": {
            "type": "integer"
          },
          "outputLength": {
            "type": "integer"
          },
          "changed": {
            "type": "boolean"
          }
        }
      },
      "examples": [
        {
          "name": "Encode HTML snippet",
          "input": {
            "input": "<button>Tools & files</button>",
            "mode": "encode"
          }
        }
      ]
    },
    {
      "id": "csv-json-converter",
      "version": "2026-04-24",
      "name": "CSV to JSON Converter",
      "description": "Convert CSV text into formatted JSON rows with quoted-field support and custom delimiters.",
      "href": "/tools/csv-json-converter",
      "category": "Converters",
      "tags": [
        "CSV",
        "JSON",
        "Data"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Convert CSV text into formatted JSON rows with optional headers.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "csv"
        ],
        "properties": {
          "csv": {
            "type": "string",
            "description": "CSV text to parse.",
            "examples": [
              "name,tool\nSimon,CSV\nAda,JSON"
            ]
          },
          "delimiter": {
            "type": "string",
            "default": ",",
            "description": "Single-character delimiter."
          },
          "hasHeader": {
            "type": "boolean",
            "default": true,
            "description": "Whether the first row contains headers."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "headers",
          "rows",
          "rowCount",
          "columnCount",
          "json"
        ],
        "properties": {
          "headers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "rowCount": {
            "type": "integer"
          },
          "columnCount": {
            "type": "integer"
          },
          "json": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "CSV with headers",
          "input": {
            "csv": "name,tool\nSimon,CSV\nAda,JSON"
          }
        }
      ]
    },
    {
      "id": "date-difference-calculator",
      "version": "2026-04-24",
      "name": "Date Difference Calculator",
      "description": "Calculate days, hours, and calendar parts between two YYYY-MM-DD dates with optional inclusive counting.",
      "href": "/tools/date-difference-calculator",
      "category": "Time & Date",
      "tags": [
        "Dates",
        "Days",
        "Calendar"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Calculate total days, hours, and calendar parts between two YYYY-MM-DD dates.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "startDate",
          "endDate"
        ],
        "properties": {
          "startDate": {
            "type": "string",
            "description": "Start date in YYYY-MM-DD format.",
            "examples": [
              "2026-04-23"
            ]
          },
          "endDate": {
            "type": "string",
            "description": "End date in YYYY-MM-DD format.",
            "examples": [
              "2026-05-01"
            ]
          },
          "includeEndDate": {
            "type": "boolean",
            "default": false,
            "description": "Whether to include the end date in the day count."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "startDate",
          "endDate",
          "direction",
          "totalDays",
          "absoluteDays",
          "totalHours",
          "years",
          "months",
          "days"
        ],
        "properties": {
          "startDate": {
            "type": "string"
          },
          "endDate": {
            "type": "string"
          },
          "direction": {
            "type": "string"
          },
          "totalDays": {
            "type": "integer"
          },
          "absoluteDays": {
            "type": "integer"
          },
          "totalHours": {
            "type": "integer"
          },
          "years": {
            "type": "integer"
          },
          "months": {
            "type": "integer"
          },
          "days": {
            "type": "integer"
          }
        }
      },
      "examples": [
        {
          "name": "Launch countdown",
          "input": {
            "startDate": "2026-04-23",
            "endDate": "2026-05-01"
          }
        }
      ]
    },
    {
      "id": "list-sorter",
      "version": "2026-04-24",
      "name": "List Sorter",
      "description": "Sort pasted lines alphabetically or numerically, remove duplicates, and copy the cleaned list.",
      "href": "/tools/list-sorter",
      "category": "Text & Code",
      "tags": [
        "Sort",
        "Deduplicate",
        "Lines"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Sort pasted lines with optional duplicate removal and numeric sorting.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "One item per line.",
            "examples": [
              "beta\nAlpha\nalpha"
            ]
          },
          "order": {
            "type": "string",
            "enum": [
              "asc",
              "desc"
            ],
            "default": "asc"
          },
          "trimLines": {
            "type": "boolean",
            "default": true
          },
          "removeDuplicates": {
            "type": "boolean",
            "default": false
          },
          "caseSensitive": {
            "type": "boolean",
            "default": false
          },
          "numeric": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "output",
          "lines",
          "inputCount",
          "outputCount",
          "duplicateCount"
        ],
        "properties": {
          "output": {
            "type": "string"
          },
          "lines": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "inputCount": {
            "type": "integer"
          },
          "outputCount": {
            "type": "integer"
          },
          "duplicateCount": {
            "type": "integer"
          }
        }
      },
      "examples": [
        {
          "name": "Sort and dedupe",
          "input": {
            "text": "beta\nAlpha\nalpha",
            "removeDuplicates": true
          }
        }
      ]
    },
    {
      "id": "text-diff-checker",
      "version": "2026-04-24",
      "name": "Text Diff Checker",
      "description": "Compare two blocks of text with a local line diff and copy a unified-style change summary.",
      "href": "/tools/text-diff-checker",
      "category": "Text & Code",
      "tags": [
        "Diff",
        "Compare",
        "Text"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Compare two text blocks line by line and return additions, removals, unchanged lines, and a unified summary.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "original",
          "modified"
        ],
        "properties": {
          "original": {
            "type": "string",
            "description": "Original text block.",
            "examples": [
              "one\ntwo"
            ]
          },
          "modified": {
            "type": "string",
            "description": "Modified text block.",
            "examples": [
              "one\nthree"
            ]
          },
          "ignoreWhitespace": {
            "type": "boolean",
            "default": false
          },
          "ignoreCase": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "lines",
          "added",
          "removed",
          "unchanged",
          "changed",
          "unified"
        ],
        "properties": {
          "lines": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "added": {
            "type": "integer"
          },
          "removed": {
            "type": "integer"
          },
          "unchanged": {
            "type": "integer"
          },
          "changed": {
            "type": "boolean"
          },
          "unified": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Compare two snippets",
          "input": {
            "original": "one\ntwo",
            "modified": "one\nthree"
          }
        }
      ]
    },
    {
      "id": "uuid-generator",
      "version": "2026-04-24",
      "name": "UUID Generator",
      "description": "Generate one or many random UUID v4 identifiers for fixtures and records.",
      "href": "/tools/uuid-generator",
      "category": "Text & Code",
      "tags": [
        "UUID",
        "Random",
        "IDs"
      ],
      "executionEnvironment": "universal",
      "agentDescription": "Generate one or more random UUID v4 identifiers.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 1,
            "description": "Number of UUIDs to generate."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "uuids",
          "count"
        ],
        "properties": {
          "uuids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "count": {
            "type": "integer"
          }
        }
      },
      "examples": [
        {
          "name": "Generate three IDs",
          "input": {
            "count": 3
          }
        }
      ]
    },
    {
      "id": "image-resizer",
      "version": "2026-04-24",
      "name": "Image Resizer",
      "description": "Resize PNG, JPEG, and WebP images locally in the browser with aspect-ratio locking and quick export formats.",
      "href": "/tools/image-resizer",
      "category": "Image",
      "tags": [
        "Resize",
        "PNG",
        "JPEG",
        "WebP"
      ],
      "executionEnvironment": "browser-file",
      "agentDescription": "Validate browser image resize settings and describe the output file metadata. Binary resizing runs in the browser UI until an API worker is added.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "originalFileName",
          "originalMimeType",
          "originalWidth",
          "originalHeight"
        ],
        "properties": {
          "originalFileName": {
            "type": "string",
            "description": "Original image file name.",
            "examples": [
              "photo.jpg"
            ]
          },
          "originalMimeType": {
            "type": "string",
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ],
            "description": "Original image MIME type."
          },
          "originalWidth": {
            "type": "integer",
            "minimum": 1,
            "description": "Original image width in pixels."
          },
          "originalHeight": {
            "type": "integer",
            "minimum": 1,
            "description": "Original image height in pixels."
          },
          "width": {
            "type": "integer",
            "minimum": 1,
            "description": "Requested output width in pixels."
          },
          "height": {
            "type": "integer",
            "minimum": 1,
            "description": "Requested output height in pixels."
          },
          "lockAspectRatio": {
            "type": "boolean",
            "default": true,
            "description": "Whether to derive the other dimension from the original aspect ratio."
          },
          "changedDimension": {
            "type": "string",
            "enum": [
              "width",
              "height"
            ],
            "description": "Dimension the user changed when lockAspectRatio is true."
          },
          "outputFormat": {
            "type": "string",
            "enum": [
              "original",
              "image/png",
              "image/jpeg",
              "image/webp"
            ],
            "default": "original",
            "description": "Requested output MIME type or original."
          },
          "quality": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 1,
            "default": 0.86,
            "description": "JPEG/WebP export quality."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "original",
          "output",
          "note"
        ],
        "properties": {
          "original": {
            "type": "object"
          },
          "output": {
            "type": "object"
          },
          "estimatedSourceSize": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Resize width and keep aspect ratio",
          "input": {
            "originalFileName": "photo.jpg",
            "originalMimeType": "image/jpeg",
            "originalWidth": 1920,
            "originalHeight": 1080,
            "width": 960,
            "lockAspectRatio": true,
            "changedDimension": "width",
            "outputFormat": "image/webp",
            "quality": 0.82
          }
        }
      ]
    },
    {
      "id": "pdf-merger",
      "version": "2026-04-24",
      "name": "PDF Merger",
      "description": "Combine multiple PDF files locally in the browser with explicit ordering.",
      "href": "/tools/pdf-merger",
      "category": "PDF Tools",
      "tags": [
        "PDF",
        "Merge",
        "Files"
      ],
      "executionEnvironment": "browser-file",
      "agentDescription": "Validate PDF merge order and output file metadata. Binary PDF merging runs locally in the browser UI.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "files"
        ],
        "properties": {
          "files": {
            "type": "array",
            "description": "PDF files in the desired merge order.",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "fileName"
              ],
              "properties": {
                "fileName": {
                  "type": "string",
                  "description": "PDF file name.",
                  "examples": [
                    "agenda.pdf"
                  ]
                },
                "size": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Optional source file size in bytes."
                },
                "pageCount": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Optional source page count."
                }
              }
            }
          },
          "outputFileName": {
            "type": "string",
            "description": "Optional merged PDF file name.",
            "examples": [
              "meeting-pack.pdf"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "fileCount",
          "outputFileName",
          "files",
          "note"
        ],
        "properties": {
          "fileCount": {
            "type": "integer"
          },
          "totalPages": {
            "type": "integer"
          },
          "estimatedSourceSize": {
            "type": "string"
          },
          "outputFileName": {
            "type": "string"
          },
          "files": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Merge meeting PDFs",
          "input": {
            "files": [
              {
                "fileName": "agenda.pdf",
                "pageCount": 2,
                "size": 120000
              },
              {
                "fileName": "notes.pdf",
                "pageCount": 4,
                "size": 240000
              }
            ],
            "outputFileName": "meeting-pack.pdf"
          }
        }
      ]
    },
    {
      "id": "pdf-compressor",
      "version": "2026-04-24",
      "name": "PDF Compressor",
      "description": "Optimize a PDF locally by rebuilding page data and reporting the actual byte savings.",
      "href": "/tools/pdf-compressor",
      "category": "PDF Tools",
      "tags": [
        "PDF",
        "Compress",
        "Optimize"
      ],
      "executionEnvironment": "browser-file",
      "agentDescription": "Validate PDF compression source metadata. Binary PDF optimization runs locally in the browser UI and reports actual byte savings.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "fileName"
        ],
        "properties": {
          "fileName": {
            "type": "string",
            "description": "Source PDF file name.",
            "examples": [
              "report.pdf"
            ]
          },
          "size": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional source file size in bytes."
          },
          "pageCount": {
            "type": "integer",
            "minimum": 1,
            "description": "Optional source page count."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "source",
          "outputFileName",
          "note"
        ],
        "properties": {
          "source": {
            "type": "object"
          },
          "outputFileName": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Compress report",
          "input": {
            "fileName": "report.pdf",
            "size": 1500000,
            "pageCount": 8
          }
        }
      ]
    },
    {
      "id": "markdown-to-pdf",
      "version": "2026-04-24",
      "name": "Markdown to PDF",
      "description": "Turn markdown notes into a local, printable PDF with headings, lists, quotes, and code blocks.",
      "href": "/tools/markdown-to-pdf",
      "category": "Document Tools",
      "tags": [
        "Markdown",
        "PDF",
        "Export"
      ],
      "executionEnvironment": "browser-file",
      "agentDescription": "Validate markdown PDF export settings and return preview metadata. Binary PDF generation runs locally in the browser UI.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "markdown"
        ],
        "properties": {
          "markdown": {
            "type": "string",
            "description": "Markdown content to render into a printable PDF.",
            "examples": [
              "# Launch Notes\n\n- Ship PDF tools"
            ]
          },
          "outputFileName": {
            "type": "string",
            "description": "Optional PDF output file name.",
            "examples": [
              "launch-notes.pdf"
            ]
          },
          "pageSize": {
            "type": "string",
            "enum": [
              "a4",
              "letter"
            ],
            "default": "a4",
            "description": "PDF page size."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "outputFileName",
          "pageSize",
          "stats",
          "previewHtml",
          "note"
        ],
        "properties": {
          "outputFileName": {
            "type": "string"
          },
          "pageSize": {
            "type": "string"
          },
          "stats": {
            "type": "object"
          },
          "previewHtml": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Launch notes PDF",
          "input": {
            "markdown": "# Launch Notes\n\n- Ship PDF tools",
            "outputFileName": "launch-notes",
            "pageSize": "a4"
          }
        }
      ]
    },
    {
      "id": "document-ocr",
      "version": "2026-04-24",
      "name": "Document OCR",
      "description": "Extract selectable text from PNG, JPEG, and WebP scans or screenshots in the browser.",
      "href": "/tools/document-ocr",
      "category": "Document Tools",
      "tags": [
        "OCR",
        "Images",
        "Text"
      ],
      "executionEnvironment": "browser-file",
      "agentDescription": "Validate image OCR source metadata. Text extraction runs locally in the browser UI with an OCR worker.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "fileName",
          "mimeType"
        ],
        "properties": {
          "fileName": {
            "type": "string",
            "description": "Source image file name.",
            "examples": [
              "scan.png"
            ]
          },
          "mimeType": {
            "type": "string",
            "enum": [
              "image/png",
              "image/jpeg",
              "image/webp"
            ],
            "description": "Source image MIME type."
          },
          "size": {
            "type": "integer",
            "minimum": 0,
            "description": "Optional source file size in bytes."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "source",
          "outputFileName",
          "note"
        ],
        "properties": {
          "source": {
            "type": "object"
          },
          "outputFileName": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "examples": [
        {
          "name": "Image OCR source",
          "input": {
            "fileName": "scan.png",
            "mimeType": "image/png",
            "size": 512000
          }
        }
      ]
    }
  ]
}