{
  "name": "Aaron Chartier — client-side tools",
  "description": "Free client-side developer tools. All computation happens in the visitor's browser; no input is transmitted.",
  "url": "https://aaronchartier.com/tools",
  "contract": {
    "pageApi": "after hydration, window.__tools[slug] exposes run(input) and describe()",
    "prefill": "URL #fragment parameters pre-fill tool inputs where documented (e.g. /tools/base64#input=hello); the fragment is never sent to the server. A ?query form also works for back-compat but is part of the request and may be logged",
    "output": "results render into the element with id 'tool-output'"
  },
  "tools": [
    {
      "slug": "base64",
      "title": "base64 encoder / decoder",
      "description": "Unicode-safe Base64 encode and decode, with URL-safe variant.",
      "category": "encode",
      "status": "live",
      "url": "https://aaronchartier.com/tools/base64",
      "manifest": "https://aaronchartier.com/tools/base64.json",
      "keywords": [
        "base64",
        "encode",
        "decode",
        "btoa",
        "atob"
      ]
    },
    {
      "slug": "url",
      "title": "url encoder / decoder",
      "description": "Percent-encode and decode URLs and query components.",
      "category": "encode",
      "status": "live",
      "url": "https://aaronchartier.com/tools/url",
      "manifest": "https://aaronchartier.com/tools/url.json",
      "keywords": [
        "url",
        "percent",
        "encode",
        "decode",
        "query string"
      ]
    },
    {
      "slug": "jwt",
      "title": "jwt encoder / decoder",
      "description": "Decode a JWT's header, payload and time claims — or encode and HMAC-sign a new token. All in the browser.",
      "category": "encode",
      "status": "live",
      "url": "https://aaronchartier.com/tools/jwt",
      "manifest": "https://aaronchartier.com/tools/jwt.json",
      "keywords": [
        "jwt",
        "json web token",
        "decode",
        "encode",
        "sign",
        "hmac",
        "claims",
        "exp"
      ]
    },
    {
      "slug": "hash",
      "title": "hash digest",
      "description": "SHA-1 / SHA-256 / SHA-384 / SHA-512 of text or files, via WebCrypto.",
      "category": "encode",
      "status": "live",
      "url": "https://aaronchartier.com/tools/hash",
      "manifest": "https://aaronchartier.com/tools/hash.json",
      "keywords": [
        "hash",
        "sha256",
        "sha512",
        "checksum",
        "digest"
      ]
    },
    {
      "slug": "radix",
      "title": "number base converter",
      "description": "Binary, octal, decimal, hex — arbitrary precision via BigInt.",
      "category": "convert",
      "status": "live",
      "url": "https://aaronchartier.com/tools/radix",
      "manifest": "https://aaronchartier.com/tools/radix.json",
      "keywords": [
        "binary",
        "hex",
        "octal",
        "decimal",
        "base",
        "radix"
      ]
    },
    {
      "slug": "timestamp",
      "title": "unix timestamp converter",
      "description": "Epoch seconds/millis ⇄ human dates, timezone-aware, with relative time.",
      "category": "time",
      "status": "live",
      "url": "https://aaronchartier.com/tools/timestamp",
      "manifest": "https://aaronchartier.com/tools/timestamp.json",
      "keywords": [
        "unix",
        "epoch",
        "timestamp",
        "date",
        "timezone"
      ]
    },
    {
      "slug": "cron",
      "title": "cron explainer",
      "description": "Cron expression → plain-English schedule + the next run times.",
      "category": "time",
      "status": "live",
      "url": "https://aaronchartier.com/tools/cron",
      "manifest": "https://aaronchartier.com/tools/cron.json",
      "keywords": [
        "cron",
        "crontab",
        "schedule",
        "expression"
      ]
    },
    {
      "slug": "uuid",
      "title": "uuid generator",
      "description": "UUID v4 and v7, single or bulk, copy-ready.",
      "category": "generate",
      "status": "live",
      "url": "https://aaronchartier.com/tools/uuid",
      "manifest": "https://aaronchartier.com/tools/uuid.json",
      "keywords": [
        "uuid",
        "guid",
        "v4",
        "v7",
        "generator"
      ]
    },
    {
      "slug": "json",
      "title": "json formatter & validator",
      "description": "Pretty-print, minify, validate — with precise error positions.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/json",
      "manifest": "https://aaronchartier.com/tools/json.json",
      "keywords": [
        "json",
        "format",
        "validate",
        "minify",
        "pretty print"
      ]
    },
    {
      "slug": "case",
      "title": "case converter",
      "description": "camelCase, snake_case, kebab-case, Title Case, CONSTANT_CASE and more.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/case",
      "manifest": "https://aaronchartier.com/tools/case.json",
      "keywords": [
        "case",
        "camel",
        "snake",
        "kebab",
        "convert"
      ]
    },
    {
      "slug": "diff",
      "title": "text diff",
      "description": "Line and word diff of two texts, computed locally.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/diff",
      "manifest": "https://aaronchartier.com/tools/diff.json",
      "keywords": [
        "diff",
        "compare",
        "text",
        "patch"
      ]
    },
    {
      "slug": "regex",
      "title": "regex tester",
      "description": "Live match highlighting, capture groups, and a common-pattern library.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/regex",
      "manifest": "https://aaronchartier.com/tools/regex.json",
      "keywords": [
        "regex",
        "regexp",
        "match",
        "test",
        "pattern"
      ]
    },
    {
      "slug": "markdown",
      "title": "markdown editor",
      "description": "Split-pane markdown editor — live preview, right-to-left aware, copy as HTML, Markdown, or rich text.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/markdown",
      "manifest": "https://aaronchartier.com/tools/markdown.json",
      "keywords": [
        "markdown",
        "preview",
        "editor",
        "md",
        "rtl",
        "hebrew",
        "arabic",
        "rich text",
        "html"
      ]
    },
    {
      "slug": "count",
      "title": "word & character counter",
      "description": "Words, characters, lines, reading time, and word frequency.",
      "category": "text",
      "status": "live",
      "url": "https://aaronchartier.com/tools/count",
      "manifest": "https://aaronchartier.com/tools/count.json",
      "keywords": [
        "word count",
        "character count",
        "reading time"
      ]
    },
    {
      "slug": "plot",
      "title": "graphing calculator",
      "description": "Plot functions on an interactive canvas — pan, zoom, multiple expressions, shareable links.",
      "category": "math",
      "status": "live",
      "url": "https://aaronchartier.com/tools/plot",
      "manifest": "https://aaronchartier.com/tools/plot.json",
      "keywords": [
        "graph",
        "plot",
        "function",
        "calculator",
        "math"
      ]
    }
  ]
}