[
 {
  "id": "merge",
  "name": "Merge PDF",
  "blurb": "Combine selected PDFs into one file.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=merge",
  "formats": "PDF",
  "limits": "200 inputs; 160 MB batch; no page limit",
  "keywords": [
   "join",
   "combine",
   "merge pdf",
   "add pdfs together"
  ]
 },
 {
  "id": "split",
  "name": "Split PDF",
  "blurb": "Save each page or chosen page groups as separate PDFs.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=split",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": [
   "separate",
   "cut pdf",
   "split pdf"
  ]
 },
 {
  "id": "extract",
  "name": "Extract pages",
  "blurb": "Keep only chosen pages in a new PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=extract",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": []
 },
 {
  "id": "delete",
  "name": "Delete pages",
  "blurb": "Remove chosen pages without changing the source.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=delete",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": [
   "remove pages"
  ]
 },
 {
  "id": "pdf-delete-blank",
  "name": "Delete blank pages",
  "blurb": "Find the pages with no text and almost no ink, review the list, and remove just those pages.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-delete-blank",
  "formats": "PDF → PDF",
  "limits": "300 pages; 150 MB",
  "keywords": [
   "delete blank pages",
   "remove blank pages from pdf",
   "blank page remover",
   "remove empty pages pdf"
  ]
 },
 {
  "id": "pdf-organize",
  "name": "Organize PDF",
  "blurb": "One page grid: reorder, rotate, delete, duplicate, insert blank pages or another PDF, then save.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-organize",
  "formats": "PDF",
  "limits": "1000 pages; 160 MB",
  "keywords": [
   "organize pdf",
   "organise pdf",
   "rearrange pages",
   "sort pages",
   "insert pages",
   "add pages to pdf",
   "page grid",
   "move pages"
  ]
 },
 {
  "id": "reorder",
  "name": "Reorder pages",
  "blurb": "Set a new order for every page.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=reorder",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": [
   "rearrange",
   "move pages",
   "sort pages"
  ]
 },
 {
  "id": "rotate",
  "name": "Rotate pages",
  "blurb": "Turn selected pages by 90° or 180°.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=rotate",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": [
   "turn",
   "rotate pdf"
  ]
 },
 {
  "id": "pdf-flip",
  "name": "Flip PDF",
  "blurb": "Mirror every page left to right, or flip it top to bottom — for iron-on transfers and mirrored signs.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-flip",
  "formats": "PDF → PDF",
  "limits": "No page limit",
  "keywords": [
   "mirror",
   "flip pdf",
   "mirror pdf",
   "iron-on transfer"
  ]
 },
 {
  "id": "duplicate",
  "name": "Duplicate pages",
  "blurb": "Copy selected pages within a PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=duplicate",
  "formats": "PDF",
  "limits": "No page limit",
  "keywords": []
 },
 {
  "id": "images-pdf",
  "name": "Turn images into PDF",
  "blurb": "Arrange images across PDF pages.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=images-pdf",
  "formats": "JPG, PNG, WebP, HEIC, GIF, BMP, AVIF",
  "limits": "Up to 200 images; 1-12 per page",
  "keywords": [
   "jpg to pdf",
   "jpeg to pdf",
   "png to pdf",
   "webp to pdf",
   "image to pdf",
   "photo to pdf",
   "picture to pdf",
   "convert",
   "pictures",
   "heic to pdf",
   "iphone photo to pdf",
   "gif to pdf",
   "bmp to pdf",
   "avif to pdf"
  ]
 },
 {
  "id": "pdf-images",
  "route": "/images/?tool=pdf-images",
  "category": "Images",
  "name": "PDF to images",
  "blurb": "Export PDF pages to PNG or JPG, up to 600 dpi, as one ZIP.",
  "formats": "PDF, PNG, JPG",
  "limits": "80 MB input; no page limit; 32 MP per page",
  "status": "working",
  "keywords": [
   "pdf to jpg",
   "pdf to png",
   "pdf to image",
   "convert",
   "export pages"
  ]
 },
 {
  "id": "image-convert",
  "route": "/images/?tool=image-convert",
  "category": "Images",
  "name": "Image converter",
  "blurb": "Convert to JPG, PNG, WebP, AVIF or JPEG XL; resize, crop, rotate and flip.",
  "formats": "JPG, PNG, WebP, AVIF, JXL, HEIC, GIF, BMP",
  "limits": "80 MB input; 32 MP",
  "status": "working",
  "keywords": [
   "png to jpg",
   "jpg to png",
   "webp to jpg",
   "convert",
   "format",
   "jpeg",
   "avif",
   "jpg to avif",
   "png to avif",
   "avif to jpg",
   "avif to png",
   "jxl",
   "jpeg xl",
   "jpg to jxl",
   "png to jxl",
   "jxl to jpg",
   "jxl to png"
  ]
 },
 {
  "id": "tiff-convert",
  "name": "TIFF to JPG / PNG / WebP",
  "category": "Images",
  "route": "/images/?tool=tiff-convert",
  "blurb": "Turn TIFF pages into ordinary JPG, PNG or WebP files — multi-page TIFFs become one file per page, plus a ZIP.",
  "formats": "TIFF to JPG, PNG, WebP",
  "limits": "60 pages; 80 MP total",
  "keywords": [
   "tiff to jpg",
   "tiff to png",
   "tif to jpg",
   "convert tiff",
   "tiff converter",
   "multi-page tiff",
   "tiff viewer"
  ],
  "status": "working"
 },
 {
  "id": "image-info",
  "route": "/images/?tool=image-info",
  "category": "Images",
  "name": "Image information",
  "blurb": "View browser-decoded dimensions and file details.",
  "formats": "JPG, PNG, WebP, AVIF",
  "limits": "80 MB input; 32 MP",
  "status": "working",
  "keywords": []
 },
 {
  "id": "image-exif",
  "route": "/images/?tool=image-exif",
  "category": "Images",
  "name": "Image metadata viewer",
  "blurb": "See EXIF, GPS (with a map link), IPTC and XMP without changing the file.",
  "formats": "JPG, PNG, WebP, HEIC, AVIF, TIFF",
  "limits": "80 MB input; read-only",
  "status": "working",
  "keywords": [
   "exif",
   "metadata",
   "exif viewer",
   "photo metadata",
   "gps location",
   "where was this photo taken",
   "iptc",
   "xmp",
   "heic metadata",
   "camera info"
  ]
 },
 {
  "id": "image-compress",
  "route": "/images/?tool=image-compress",
  "category": "Images",
  "name": "Image size reducer",
  "blurb": "Reduce JPEG, WebP or PNG size with a preview. Quick 20/50/100 KB limits and WhatsApp or passport sizes.",
  "formats": "JPG, PNG, WebP to JPG, WebP, PNG",
  "limits": "80 MB input; 32 MP; target is not guaranteed",
  "status": "working",
  "keywords": [
   "compress",
   "compress image",
   "compress photo",
   "reduce image size",
   "shrink",
   "smaller",
   "jpg compress",
   "resize",
   "kb",
   "10kb",
   "20kb",
   "30kb",
   "50kb",
   "100kb",
   "200kb",
   "500kb",
   "reduce photo size in kb",
   "target size",
   "png compress",
   "compress png",
   "tinypng",
   "reduce png size",
   "passport photo size",
   "whatsapp dp"
  ]
 },
 {
  "id": "qr-generate",
  "route": "/qr/?tool=qr-generate",
  "category": "QR",
  "name": "Create QR code",
  "blurb": "Make a QR for a link, text, Wi-Fi, WhatsApp chat, SMS, email, phone call or map location.",
  "formats": "PNG, SVG, JPG",
  "limits": "128-2048 px; verify before printing",
  "status": "working",
  "keywords": [
   "qr code",
   "make qr",
   "qr maker",
   "link to qr",
   "whatsapp qr",
   "sms qr",
   "email qr",
   "phone qr",
   "call qr",
   "location qr",
   "map qr",
   "google maps qr",
   "geo qr",
   "wa.me"
  ]
 },
 {
  "id": "qr-scan",
  "route": "/qr/?tool=qr-scan",
  "category": "QR",
  "name": "Scan QR",
  "blurb": "Scan an image or pasted screenshot, or try your camera. Text stays inert.",
  "formats": "JPG, PNG, WebP",
  "limits": "80 MB input; 32 MP",
  "status": "working",
  "keywords": [
   "qr scanner",
   "qr reader",
   "scanner",
   "reader",
   "read qr code"
  ]
 },
 {
  "id": "qr-design",
  "route": "/qr/?tool=qr-design",
  "category": "QR",
  "name": "Design QR",
  "blurb": "Make a high-contrast colored SVG.",
  "formats": "SVG",
  "limits": "128-2048 px; 4-module quiet zone",
  "status": "working",
  "keywords": []
 },
 {
  "id": "reader",
  "name": "Reader (PDF, Word, EPUB, text)",
  "blurb": "Read PDF, Word, EPUB, text, Markdown or HTML like a book: swipe, zoom, page turn. No app needed.",
  "category": "Reader",
  "status": "working",
  "route": "/reader/?tool=reader",
  "formats": "PDF, DOCX, EPUB, TXT, MD, HTML",
  "limits": "200 MB; EPUB without DRM",
  "keywords": [
   "read",
   "reader",
   "book",
   "ebook",
   "epub",
   "epub reader",
   "pdf reader",
   "pdf viewer",
   "open pdf",
   "view pdf",
   "docx viewer",
   "word viewer",
   "open word file",
   "txt reader",
   "markdown viewer",
   "read book",
   "flip book",
   "page turn"
  ]
 },
 {
  "id": "pdf-details",
  "name": "PDF details",
  "blurb": "Inspect page count, size and available document metadata.",
  "category": "PDF",
  "formats": "PDF",
  "limits": "80 MB; no page limit",
  "status": "working",
  "route": "/pdf/?tool=pdf-details",
  "keywords": []
 },
 {
  "id": "amount-words",
  "name": "Amount in words",
  "blurb": "Exact SAR, INR and USD wording, including minor units.",
  "category": "Text",
  "formats": "Typed amount",
  "limits": "Up to 15 whole-number digits; two decimals",
  "status": "working",
  "route": "/text/?tool=amount-words",
  "keywords": []
 },
 {
  "id": "text-tidy",
  "name": "Clean up text lines",
  "blurb": "Trim spaces, fix case, sort and remove duplicate lines.",
  "category": "Text",
  "formats": "Text",
  "limits": "1 million characters",
  "status": "working",
  "route": "/text/?tool=text-tidy",
  "keywords": [
   "text tidy desk",
   "remove duplicates",
   "trim",
   "sort lines",
   "clean"
  ]
 },
 {
  "id": "base64",
  "name": "Base64 encode / decode",
  "category": "Text",
  "route": "/text/?tool=base64",
  "blurb": "Encode text to Base64 or decode it back. UTF-8 safe.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "base64 text codec",
   "base64"
  ]
 },
 {
  "id": "url-codec",
  "name": "URL encode / decode",
  "category": "Web",
  "route": "/web/?tool=url-codec",
  "blurb": "Make text safe for a URL, or turn %20-style codes back into text.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "html-codec",
  "name": "HTML encode / decode",
  "category": "Web",
  "route": "/web/?tool=html-codec",
  "blurb": "Turn <, > and & into HTML entities, or decode them back.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "json-desk",
  "name": "JSON formatter & validator",
  "category": "Web",
  "route": "/web/?tool=json-desk",
  "blurb": "Check JSON for errors, pretty-print it, or squeeze it onto one line.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "json desk",
   "format json",
   "validate json",
   "pretty print",
   "beautify",
   "minify json"
  ]
 },
 {
  "id": "json-xml",
  "name": "JSON to XML",
  "category": "Web",
  "route": "/web/?tool=json-xml",
  "blurb": "Convert JSON data into XML elements.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "code-format",
  "name": "Code formatter",
  "category": "Web",
  "route": "/web/?tool=code-format",
  "blurb": "Tidy messy JavaScript, CSS or HTML indentation.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "text-codec",
  "name": "Text to Unicode / binary",
  "category": "Text",
  "route": "/text/?tool=text-codec",
  "blurb": "See the Unicode numbers or UTF-8 binary behind text, and back.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "text / code points / binary",
   "code points",
   "binary",
   "unicode",
   "ascii"
  ]
 },
 {
  "id": "repeat-text",
  "name": "Repeat text",
  "category": "Text",
  "route": "/text/?tool=repeat-text",
  "blurb": "Repeat a word or line many times.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "ipv4",
  "name": "IPv4 to binary",
  "category": "Web",
  "route": "/web/?tool=ipv4",
  "blurb": "Show an IPv4 address in binary, octet by octet.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "hash",
  "name": "Hash generator (SHA-256, MD5)",
  "category": "Security",
  "route": "/security/?tool=hash",
  "blurb": "Get the SHA-256, SHA-512, SHA-1 or MD5 hash of text.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "text hash desk",
   "sha256",
   "sha-256",
   "md5",
   "sha1",
   "checksum"
  ]
 },
 {
  "id": "password-generator",
  "name": "Password generator",
  "category": "Security",
  "route": "/security/?tool=password-generator",
  "blurb": "Make strong random passwords with the characters you choose.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "random password",
   "strong password"
  ]
 },
 {
  "id": "random-list",
  "name": "Shuffle / sample list",
  "category": "Text",
  "route": "/text/?tool=random-list",
  "blurb": "Shuffle lines into random order or pick random samples.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "reading-view",
  "name": "Bold-start reading view",
  "category": "Text",
  "route": "/text/?tool=reading-view",
  "blurb": "Bold the start of each word to make long text easier to skim.",
  "formats": "Text",
  "limits": "1 million input characters; tool-specific limits",
  "status": "working",
  "keywords": [
   "emphasized reading view",
   "bionic reading",
   "skim"
  ]
 },
 {
  "id": "image-effects",
  "name": "Invert, B&W or slice image",
  "category": "Images",
  "route": "/images/?tool=image-effects",
  "blurb": "Invert colours, make black and white, or slice an image into tiles.",
  "formats": "JPG, PNG, WebP",
  "limits": "Tool-specific input limits",
  "status": "working",
  "keywords": [
   "image effects / slicer",
   "image effects",
   "slicer",
   "grayscale",
   "black and white",
   "invert",
   "split image",
   "slice",
   "tiles",
   "grid"
  ]
 },
 {
  "id": "color-splash",
  "name": "Colour splash",
  "category": "Images",
  "route": "/images/?tool=color-splash",
  "blurb": "Keep one colour in a photo and turn the rest black and white.",
  "formats": "JPG, PNG, WebP",
  "limits": "40 MP",
  "keywords": [
   "color splash",
   "colour splash",
   "selective color",
   "selective colour",
   "keep one color",
   "black and white with color"
  ],
  "status": "working"
 },
 {
  "id": "image-base64",
  "name": "Image / Base64",
  "category": "Images",
  "route": "/images/?tool=image-base64",
  "blurb": "Turn an image into a Base64 data URL, or a data URL back into an image.",
  "formats": "JPG, PNG, WebP",
  "limits": "Tool-specific input limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "text-image",
  "name": "Text to image",
  "category": "Images",
  "route": "/images/?tool=text-image",
  "blurb": "Render text as a PNG image with your font size and colours.",
  "formats": "JPG, PNG, WebP",
  "limits": "Tool-specific input limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "aes-text",
  "name": "AES text encryption",
  "category": "Security",
  "route": "/security/?tool=aes-text",
  "blurb": "Encrypt or decrypt text with a password (AES-GCM).",
  "formats": "Text",
  "limits": "Tool-specific input limits",
  "status": "working",
  "keywords": []
 },
 {
  "id": "pdf-protect",
  "name": "Protect PDF",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-protect",
  "blurb": "Add an open password to a PDF.",
  "formats": "PDF",
  "limits": "50 MB input; editing can invalidate signatures",
  "status": "working",
  "keywords": [
   "password",
   "lock",
   "encrypt",
   "secure"
  ]
 },
 {
  "id": "pdf-unlock",
  "name": "Unlock PDF with password",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-unlock",
  "blurb": "Remove a PDF password you know.",
  "formats": "PDF",
  "limits": "50 MB input; editing can invalidate signatures",
  "status": "working",
  "keywords": [
   "remove password",
   "decrypt",
   "unlock"
  ]
 },
 {
  "id": "svg-png",
  "name": "SVG to PNG",
  "category": "Images",
  "route": "/images/?tool=svg-png",
  "blurb": "Local conversion with a reviewed output.",
  "formats": "SVG",
  "limits": "1 MB SVG / 16 MP output",
  "status": "working",
  "keywords": []
 },
 {
  "id": "css-minify",
  "name": "CSS minifier",
  "category": "Web",
  "route": "/web/?tool=css-minify",
  "blurb": "Local conversion with a reviewed output.",
  "formats": "CSS",
  "limits": "1 million input characters",
  "status": "working",
  "keywords": []
 },
 {
  "id": "webcam-test",
  "name": "Webcam test",
  "category": "Web",
  "route": "/web/?tool=webcam-test",
  "blurb": "Check a local camera preview with no recording or upload.",
  "formats": "Camera",
  "limits": "Browser permission required",
  "status": "working",
  "keywords": []
 },
 {
  "id": "js-minify",
  "name": "JavaScript minifier",
  "category": "Web",
  "route": "/web/?tool=js-minify",
  "blurb": "Parser-based whitespace and comment reduction. Code is never run.",
  "formats": "JavaScript",
  "limits": "1 million input characters",
  "status": "working",
  "keywords": []
 },
 {
  "id": "vector-trace",
  "name": "Image to vector SVG",
  "category": "Images",
  "route": "/images/?tool=vector-trace",
  "blurb": "Local conversion with an honest preview and explicit limits.",
  "formats": "JPG, PNG, WebP",
  "limits": "512 px trace; eight colors",
  "status": "working",
  "keywords": []
 },
 {
  "id": "mhtml-print",
  "name": "Saved web page (MHTML) to PDF",
  "category": "PDF",
  "route": "/pdf/?tool=mhtml-print",
  "blurb": "Turn a saved web page (.mhtml) into a PDF.",
  "formats": "MHTML, MHT",
  "limits": "10 MB; browser Save as PDF",
  "status": "working",
  "keywords": [
   "mhtml / mht print to pdf",
   "mhtml",
   "mht",
   "web page to pdf"
  ]
 },
 {
  "id": "animated-gif",
  "name": "Animated GIF resize",
  "category": "Images",
  "route": "/images/?tool=animated-gif",
  "blurb": "Browser-local conversion with explicit limits and a preview.",
  "formats": "GIF",
  "limits": "10 MB; 120 frames; white background",
  "status": "working",
  "keywords": []
 },
 {
  "id": "gif-frames",
  "name": "GIF frame extractor",
  "category": "Images",
  "route": "/images/?tool=gif-frames",
  "blurb": "Pull every frame out of an animated GIF as its own PNG, exactly as it appears in the animation.",
  "formats": "GIF to PNG, ZIP",
  "limits": "120 frames; 4 MP per frame",
  "keywords": [
   "gif frames",
   "extract gif frames",
   "gif to png frames",
   "split gif",
   "gif frame extractor"
  ],
  "status": "working"
 },
 {
  "id": "gif-sprite-sheet",
  "name": "Sprite sheet maker",
  "category": "Images",
  "route": "/images/?tool=gif-sprite-sheet",
  "blurb": "Pack images or a GIF's frames into one sprite sheet PNG, with the JSON map and CSS to play it.",
  "formats": "JPG, PNG, WebP, GIF to PNG",
  "limits": "120 frames",
  "keywords": [
   "sprite sheet",
   "spritesheet",
   "texture atlas",
   "gif to sprite sheet",
   "sprite maker"
  ],
  "status": "working"
 },
 {
  "id": "regex",
  "name": "Regex tester",
  "category": "Web",
  "route": "/web/?tool=regex",
  "blurb": "Test a regular expression and see every match highlighted.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "regular expression",
   "match",
   "pattern"
  ]
 },
 {
  "id": "cron",
  "name": "Cron expression builder",
  "category": "Web",
  "route": "/web/?tool=cron",
  "blurb": "Build a cron schedule and read it in plain words.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "schedule",
   "crontab"
  ]
 },
 {
  "id": "timestamp",
  "name": "Timestamp and timezone converter",
  "category": "Web",
  "route": "/web/?tool=timestamp",
  "blurb": "Convert Unix timestamps to dates and between time zones.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "time",
   "date",
   "zone",
   "UTC",
   "Unix",
   "unix time",
   "epoch",
   "timezone"
  ]
 },
 {
  "id": "jwt-decode",
  "name": "JWT decoder",
  "category": "Security",
  "route": "/security/?tool=jwt-decode",
  "blurb": "Read the header and claims inside a JWT, without sending it anywhere.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "data-convert",
  "name": "CSV / YAML / JSON converter",
  "category": "Web",
  "route": "/web/?tool=data-convert",
  "blurb": "Convert between CSV, YAML and JSON.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "CSV",
   "YAML",
   "JSON",
   "spreadsheet"
  ]
 },
 {
  "id": "excel-convert",
  "name": "Excel / CSV / JSON converter",
  "blurb": "Convert a spreadsheet (XLSX, XLS, ODS) to CSV or JSON, or a CSV file to an Excel workbook — pick a sheet and preview it first.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=excel-convert",
  "formats": "XLSX, XLS, XLSM, ODS, CSV, TSV to CSV, JSON or XLSX",
  "limits": "30 MB; 20,000 rows per sheet",
  "keywords": [
   "excel to csv",
   "xlsx to csv",
   "xls to csv",
   "ods to csv",
   "excel to json",
   "xlsx to json",
   "csv to excel",
   "csv to xlsx",
   "csv to json",
   "spreadsheet converter",
   "sheet to csv",
   "convert spreadsheet"
  ]
 },
 {
  "id": "json-diff",
  "name": "JSON difference",
  "category": "Web",
  "route": "/web/?tool=json-diff",
  "blurb": "Compare two JSON documents and list what changed.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "markdown",
  "name": "Markdown preview",
  "category": "Web",
  "route": "/web/?tool=markdown",
  "blurb": "Write Markdown and see the formatted preview.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "color-desk",
  "name": "Color picker and converter",
  "category": "Web",
  "route": "/web/?tool=color-desk",
  "blurb": "Pick a colour and convert between HEX, RGB and HSL.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "contrast",
  "name": "Color contrast checker",
  "category": "Web",
  "route": "/web/?tool=contrast",
  "blurb": "Check if text and background colours meet WCAG contrast.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "unit-convert",
  "name": "Unit converter",
  "category": "Calculators",
  "route": "/calculators/?tool=unit-convert",
  "blurb": "Convert length, weight, volume, area, speed, data and temperature.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "length",
   "mass",
   "temperature",
   "volume",
   "weight",
   "distance",
   "units",
   "km to miles",
   "kg to lb",
   "celsius",
   "cm to inch",
   "inch to cm",
   "kg to lbs",
   "lbs to kg",
   "miles to km",
   "feet to metre",
   "celsius to fahrenheit",
   "cm",
   "inch",
   "kg",
   "lbs",
   "pounds",
   "miles",
   "km",
   "feet",
   "metre",
   "meter",
   "fahrenheit",
   "litre",
   "gallon",
   "acre",
   "mb to gb"
  ]
 },
 {
  "id": "percentage",
  "name": "Percentage calculator",
  "category": "Calculators",
  "route": "/calculators/?tool=percentage",
  "blurb": "Work out percentages, increases and decreases.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "percent",
   "percentage calculator",
   "discount"
  ]
 },
 {
  "id": "loan",
  "name": "Loan / EMI estimate",
  "category": "Calculators",
  "route": "/calculators/?tool=loan",
  "blurb": "Estimate the monthly EMI and total interest on a loan.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "EMI",
   "mortgage",
   "interest",
   "emi",
   "emi calculator",
   "home loan",
   "car loan"
  ]
 },
 {
  "id": "date-difference",
  "name": "Date difference",
  "category": "Calculators",
  "route": "/calculators/?tool=date-difference",
  "blurb": "Count the days, weeks and months between two dates.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "days between dates",
   "date calculator",
   "days calculator"
  ]
 },
 {
  "id": "tip",
  "name": "Tip and bill split",
  "category": "Calculators",
  "route": "/calculators/?tool=tip",
  "blurb": "Add a tip and split the bill between people.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "upi-qr",
  "name": "UPI payment QR",
  "category": "QR",
  "route": "/qr/?tool=upi-qr",
  "blurb": "Make a UPI payment QR with payee, amount and note.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "bulk-qr",
  "name": "Bulk QR to ZIP",
  "category": "QR",
  "route": "/qr/?tool=bulk-qr",
  "blurb": "Make many QR codes from a list and download them as a ZIP.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "passphrase",
  "name": "Passphrase generator",
  "category": "Security",
  "route": "/security/?tool=passphrase",
  "blurb": "Make an easy-to-type passphrase from random words.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "diceware",
   "password",
   "words"
  ]
 },
 {
  "id": "strength",
  "name": "Password strength estimate",
  "category": "Security",
  "route": "/security/?tool=strength",
  "blurb": "Estimate how hard a password is to guess.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "identifiers",
  "name": "UUID / ULID generator",
  "category": "Security",
  "route": "/security/?tool=identifiers",
  "blurb": "Generate random UUID v4 or ULID identifiers.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "uuid",
   "ulid",
   "unique"
  ]
 },
 {
  "id": "favicon",
  "name": "Favicon generator",
  "category": "Images",
  "route": "/images/?tool=favicon",
  "blurb": "Make favicons in every size from one image, plus an ICO file.",
  "formats": "Raster images",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "icon",
   "website",
   "ico",
   "website icon"
  ]
 },
 {
  "id": "strip-exif",
  "name": "Strip image metadata",
  "category": "Images",
  "route": "/images/?tool=strip-exif",
  "blurb": "Remove EXIF and container metadata by exporting a fresh PNG.",
  "formats": "Raster images",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "privacy",
   "GPS",
   "location",
   "metadata",
   "remove metadata",
   "exif remove"
  ]
 },
 {
  "id": "image-watermark",
  "name": "Image watermark (text or logo)",
  "category": "Images",
  "route": "/images/?tool=image-watermark",
  "blurb": "Add text or a logo watermark with opacity, size and position, or tile it across the image.",
  "formats": "JPG, PNG, WebP, AVIF",
  "limits": "20 MB; 32 MP",
  "status": "working",
  "keywords": [
   "logo watermark",
   "watermark photo",
   "tiled watermark",
   "copyright",
   "stamp image"
  ]
 },
 {
  "id": "palette",
  "name": "Palette from image",
  "category": "Images",
  "route": "/images/?tool=palette",
  "blurb": "Pull the dominant colours out of an image as a palette.",
  "formats": "Raster images",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "image-compare",
  "name": "Image compare slider",
  "category": "Images",
  "route": "/images/?tool=image-compare",
  "blurb": "Compare two images with a drag slider.",
  "formats": "Raster images",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": []
 },
 {
  "id": "barcode",
  "name": "Barcode generator",
  "category": "QR",
  "route": "/qr/?tool=barcode",
  "blurb": "Make Code 128, EAN-13 or UPC-A barcodes from text.",
  "formats": "Text",
  "limits": "Tool-specific bounds",
  "status": "working",
  "keywords": [
   "ean",
   "code128"
  ]
 },
 {
  "id": "pdf-number",
  "name": "PDF page numbers",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-number",
  "blurb": "Add page numbers to every page.",
  "formats": "PDF",
  "limits": "40 MB; no page limit; upright pages",
  "status": "working",
  "keywords": []
 },
 {
  "id": "pdf-watermark",
  "name": "PDF watermark (text or logo)",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-watermark",
  "blurb": "Stamp text such as DRAFT, or a logo, once or tiled across pages.",
  "formats": "PDF",
  "limits": "40 MB; no page limit; upright pages",
  "status": "working",
  "keywords": [
   "watermark",
   "logo watermark",
   "image watermark",
   "stamp logo on pdf",
   "tiled watermark",
   "add watermark to pdf"
  ]
 },
 {
  "id": "pdf-overlay",
  "name": "Overlay PDF / letterhead",
  "blurb": "Stamp a letterhead or overlay PDF onto every page of another PDF — over the content or underneath it.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-overlay",
  "formats": "PDF → PDF",
  "limits": "150 MB",
  "keywords": [
   "overlay pdf",
   "letterhead",
   "add letterhead to pdf",
   "stamp pdf",
   "underlay pdf"
  ]
 },
 {
  "id": "pdf-headers",
  "name": "Header, footer & Bates",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-headers",
  "blurb": "Add headers, footers and Bates numbers to every page.",
  "formats": "PDF",
  "limits": "40 MB; no page limit",
  "status": "working",
  "keywords": [
   "header footer",
   "bates numbering",
   "bates stamp",
   "add header to pdf",
   "page header",
   "legal numbering"
  ]
 },
 {
  "id": "pdf-annotate",
  "name": "PDF sign / annotate",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-annotate",
  "blurb": "Add a signature, text, an image or marks to a PDF.",
  "formats": "PDF",
  "limits": "40 MB; no page limit; upright pages",
  "status": "working",
  "keywords": [
   "sign",
   "signature",
   "annotation",
   "add link to pdf",
   "add hyperlink to pdf",
   "clickable link in pdf",
   "link annotation",
   "esign",
   "write on pdf",
   "add image to pdf",
   "insert picture in pdf",
   "stamp pdf"
  ]
 },
 {
  "id": "archive-zip",
  "route": "/archives/?tool=archive-zip",
  "category": "Archives",
  "name": "ZIP archive",
  "blurb": "Pack files into a ZIP or unpack one, all on this device.",
  "formats": "ZIP (deflate)",
  "limits": "2,000 files / 400 MB; no encrypted archives",
  "status": "working",
  "keywords": [
   "zip",
   "unzip",
   "compress files",
   "extract zip"
  ]
 },
 {
  "id": "word-count",
  "route": "/text/?tool=word-count",
  "category": "Text",
  "name": "Word and character count",
  "blurb": "Live word, character, sentence and reading-time counts.",
  "formats": "Plain text",
  "limits": "1 million characters",
  "status": "working",
  "keywords": [
   "count words",
   "characters",
   "letters"
  ]
 },
 {
  "id": "text-diff",
  "route": "/text/?tool=text-diff",
  "category": "Text",
  "name": "Compare two texts",
  "blurb": "Line or word differences between two pasted texts.",
  "formats": "Plain text",
  "limits": "500k characters per side",
  "status": "working",
  "keywords": [
   "compare",
   "difference",
   "diff"
  ]
 },
 {
  "id": "gst-vat",
  "route": "/calculators/?tool=gst-vat",
  "category": "Calculators",
  "name": "GST / VAT calculator",
  "blurb": "Add or remove tax, with CGST/SGST or IGST split.",
  "formats": "Numbers",
  "limits": "Rates 0-100%; estimate only",
  "status": "working",
  "keywords": [
   "tax",
   "gst",
   "vat"
  ]
 },
 {
  "id": "gst-invoice",
  "route": "/calculators/?tool=gst-invoice",
  "category": "Calculators",
  "name": "GST invoice generator",
  "blurb": "Make an Indian GST tax invoice: GSTINs checked, CGST/SGST or IGST by place of supply, amount in words, PDF and e-invoice QR.",
  "formats": "PDF, JSON",
  "limits": "On this device; QR is the e-invoice payload, the IRN is added on the portal",
  "status": "working",
  "keywords": [
   "gst invoice",
   "tax invoice",
   "invoice generator india",
   "einvoice",
   "cgst sgst igst",
   "gst bill"
  ]
 },
 {
  "id": "gst-filing-prep",
  "route": "/calculators/?tool=gst-filing-prep",
  "category": "Calculators",
  "name": "GST filing prep (GSTR-1)",
  "blurb": "Turn a set of sales invoices (CSV or JSON) into GSTR-1 section tables — B2B, B2C, exports, nil-rated — with the rows that would mis-file flagged.",
  "formats": "CSV, JSON, PDF",
  "limits": "Files up to 20 MB; prepares the numbers, filing is on the GST portal",
  "status": "working",
  "keywords": [
   "gstr-1",
   "gst filing",
   "gst return summary",
   "b2b b2c summary",
   "gstr1"
  ]
 },
 {
  "id": "pos-billing",
  "route": "/calculators/?tool=pos-billing",
  "category": "Calculators",
  "name": "POS billing",
  "blurb": "Fast counter billing for a small shop: tap items, see the GST split live, print a receipt, and keep the day's sales and tax.",
  "formats": "PDF, JSON",
  "limits": "Intra-state bills (CGST + SGST); day book lasts for the tab session",
  "status": "working",
  "keywords": [
   "pos",
   "billing",
   "point of sale",
   "shop bill",
   "retail invoice",
   "receipt"
  ]
 },
 {
  "id": "barcode-scan",
  "route": "/qr/?tool=barcode-scan",
  "category": "QR",
  "name": "Scan a barcode",
  "blurb": "Read EAN, UPC, Code 128 and more with your camera or from an image.",
  "formats": "EAN-13/8, UPC, Code 128/39, ITF, Codabar, Data Matrix, Aztec, PDF417, QR",
  "limits": "Camera permission; no product lookup",
  "status": "working",
  "keywords": [
   "barcode scanner",
   "barcode reader",
   "scanner",
   "reader"
  ]
 },
 {
  "id": "image-ocr",
  "route": "/images/?tool=image-ocr",
  "category": "Images",
  "name": "Image to text (OCR)",
  "blurb": "Read printed text from a photo in English, Tamil, Hindi or Arabic.",
  "formats": "PNG, JPEG, WebP, BMP",
  "limits": "32 MP; language data 2-15 MB per language on first use",
  "status": "working",
  "keywords": [
   "ocr",
   "image to text",
   "text from image",
   "scan text",
   "read text"
  ]
 },
 {
  "id": "heic-convert",
  "route": "/images/?tool=heic-convert",
  "category": "Images",
  "name": "HEIC / HEIF converter",
  "blurb": "Turn iPhone photos into JPEG, PNG or WebP on this device.",
  "formats": "HEIC, HEIF to JPEG/PNG/WebP",
  "limits": "20 photos at a time",
  "status": "working",
  "keywords": [
   "heic to jpg",
   "iphone photo",
   "convert"
  ]
 },
 {
  "id": "math-eval",
  "route": "/calculators/?tool=math-eval",
  "category": "Calculators",
  "name": "Math expression evaluator",
  "blurb": "Full expressions with functions, powers and constants.",
  "formats": "Expressions like (3+4)*sqrt(2)",
  "limits": "Double precision; no units or symbols",
  "status": "working",
  "keywords": []
 },
 {
  "id": "wifi-qr",
  "route": "/qr/?tool=wifi-qr",
  "category": "QR",
  "name": "Wi-Fi QR code",
  "blurb": "A QR that joins guests to your Wi-Fi network.",
  "formats": "WIFI payload to PNG QR",
  "limits": "SSID up to 32 bytes",
  "status": "working",
  "keywords": []
 },
 {
  "id": "hmac-rsa",
  "route": "/security/?tool=hmac-rsa",
  "category": "Security",
  "name": "HMAC & RSA keys",
  "blurb": "Compute HMACs and generate RSA key pairs, sign and verify.",
  "formats": "Text/hex keys, PEM, base64",
  "limits": "Keys are not stored; browser crypto only",
  "status": "working",
  "keywords": [
   "hmac + rsa",
   "hmac",
   "rsa",
   "signing"
  ]
 },
 {
  "id": "iban-check",
  "route": "/security/?tool=iban-check",
  "category": "Security",
  "name": "IBAN checker",
  "blurb": "Validate IBANs against the SWIFT registry (release 103).",
  "formats": "89 official + 22 draft national formats",
  "limits": "Format check only, not account existence",
  "status": "working",
  "keywords": []
 },
 {
  "id": "safelink-decoder",
  "route": "/security/?tool=safelink-decoder",
  "category": "Security",
  "name": "Unwrap tracking links",
  "blurb": "Unwrap redirect links and strip tracking parameters without contacting them.",
  "formats": "Google, Outlook SafeLinks, Facebook, LinkedIn, YouTube redirects",
  "limits": "Shorteners (t.co, bit.ly) cannot be resolved offline",
  "status": "working",
  "keywords": [
   "safe-link decoder",
   "safelinks",
   "redirect",
   "tracking"
  ]
 },
 {
  "id": "totp-codes",
  "route": "/security/?tool=totp-codes",
  "category": "Security",
  "name": "Authenticator codes (TOTP)",
  "blurb": "Generate time-based one-time codes from a setup key.",
  "formats": "Base32 secret or otpauth:// URI; SHA-1/256/512",
  "limits": "Nothing saved; tab must stay open",
  "status": "working",
  "keywords": [
   "2fa",
   "otp",
   "google authenticator"
  ]
 },
 {
  "id": "phone-number",
  "route": "/text/?tool=phone-number",
  "category": "Text",
  "name": "Phone number check",
  "blurb": "Validate and format phone numbers for any country.",
  "formats": "International and national formats",
  "limits": "Format check only, not line status",
  "status": "working",
  "keywords": []
 },
 {
  "id": "text-kit",
  "route": "/text/?tool=text-kit",
  "category": "Text",
  "name": "Change case & make slugs",
  "blurb": "Case changes, slugs, and list cleanup in one box.",
  "formats": "Plain text",
  "limits": "1 million characters",
  "status": "working",
  "keywords": [
   "text kit",
   "uppercase",
   "lowercase",
   "title case",
   "slug",
   "case converter"
  ]
 },
 {
  "id": "base-chmod",
  "route": "/web/?tool=base-chmod",
  "category": "Web",
  "name": "Number bases + chmod",
  "blurb": "Convert decimal/hex/octal/binary and file permissions.",
  "formats": "Bases 2/8/10/16; rwx and octal",
  "limits": "Integers only",
  "status": "working",
  "keywords": []
 },
 {
  "id": "http-mime-reference",
  "route": "/web/?tool=http-mime-reference",
  "category": "Web",
  "name": "HTTP status, headers, MIME",
  "blurb": "Searchable offline reference for status codes, headers and file types.",
  "formats": "60 status codes, 27 headers, 71 MIME types",
  "limits": "Reference data, no network checks",
  "status": "working",
  "keywords": []
 },
 {
  "id": "ipv4-subnet",
  "route": "/web/?tool=ipv4-subnet",
  "category": "Web",
  "name": "IPv4 subnet calculator",
  "blurb": "Network, broadcast, hosts and masks from a CIDR.",
  "formats": "CIDR or address + mask",
  "limits": "IPv4 only",
  "status": "working",
  "keywords": []
 },
 {
  "id": "sql-format",
  "route": "/web/?tool=sql-format",
  "category": "Web",
  "name": "SQL formatter",
  "blurb": "Pretty-print SQL for 17 dialects on this device.",
  "formats": "SQL",
  "limits": "500k characters; formatting, not validation",
  "status": "working",
  "keywords": []
 },
 {
  "id": "media-editor",
  "route": "/media/?tool=media-editor",
  "category": "Media",
  "name": "Audio / video multi-range cut",
  "blurb": "Mark ranges on the waveform and save each part (or one merge) as WAV.",
  "formats": "MP3, WAV, M4A, OGG, MP4 (audio track) to WAV",
  "limits": "500 MB; WAV output only",
  "status": "working",
  "keywords": [
   "trim audio",
   "cut video",
   "trim video",
   "cut mp3"
  ]
 },
 {
  "id": "subtitle-convert",
  "route": "/media/?tool=subtitle-convert",
  "category": "Media",
  "name": "Subtitle converter",
  "blurb": "SRT to WebVTT and back, with timing shift.",
  "formats": "SRT, WebVTT",
  "limits": "5 MB files",
  "status": "working",
  "keywords": []
 },
 {
  "id": "audio-polish",
  "route": "/media/?tool=audio-polish",
  "category": "Media",
  "name": "Normalise & fade audio",
  "blurb": "Normalise, change volume, add fades, convert to mono.",
  "formats": "Audio/video in, WAV out",
  "limits": "300 MB per file; WAV only",
  "status": "working",
  "keywords": [
   "audio polish",
   "normalize",
   "volume",
   "fade"
  ]
 },
 {
  "id": "media-join",
  "route": "/media/?tool=media-join",
  "category": "Media",
  "name": "Join audio + change speed",
  "blurb": "Join audio files into one and speed it up or slow it down.",
  "formats": "Audio in, WAV out",
  "limits": "300 MB per file; shared sample rate",
  "status": "working",
  "keywords": []
 },
 {
  "id": "clean-voice",
  "route": "/media/?tool=clean-voice",
  "category": "Media",
  "name": "Clean voice recording",
  "blurb": "Cut long silences and reduce steady background noise in speech.",
  "formats": "Audio in, WAV out",
  "limits": "300 MB; basic gate, not studio denoise",
  "status": "working",
  "keywords": []
 },
 {
  "id": "gif-kit",
  "route": "/media/?tool=gif-kit",
  "category": "Media",
  "name": "GIF maker & frame extractor",
  "blurb": "Make an animated GIF from images or pull every frame out of a GIF as PNGs.",
  "formats": "Images ↔ GIF / PNG zip",
  "limits": "24 images or 120 frames; 4 MP",
  "status": "working",
  "keywords": [
   "gif",
   "animation",
   "frames",
   "gif kit",
   "make gif",
   "gif maker"
  ]
 },
 {
  "id": "contact-sheet",
  "route": "/media/?tool=contact-sheet",
  "category": "Media",
  "name": "Contact sheet",
  "blurb": "Tile many images into one printable sheet with file names.",
  "formats": "Images → PNG/JPEG sheet",
  "limits": "30 images; sheet under 4000 px wide",
  "status": "working",
  "keywords": [
   "grid",
   "thumbnails",
   "print"
  ]
 },
 {
  "id": "pdf-fill",
  "route": "/pdf/?tool=pdf-fill",
  "category": "PDF",
  "name": "Fill PDF form",
  "blurb": "Fill interactive PDF form fields and save an editable copy.",
  "formats": "PDF with AcroForm",
  "limits": "Fields read locally",
  "status": "working",
  "keywords": [
   "form",
   "fill",
   "acroform"
  ]
 },
 {
  "id": "pdf-flatten",
  "route": "/pdf/?tool=pdf-flatten",
  "category": "PDF",
  "name": "Flatten PDF",
  "blurb": "Bake form fields, comments and drawings into the page so nothing stays editable, and remove scripts.",
  "formats": "PDF with forms or comments",
  "limits": "One-way; keep the original",
  "status": "working",
  "keywords": [
   "flatten",
   "flatten annotations",
   "flatten comments",
   "form",
   "lock",
   "lock pdf content",
   "make pdf non editable",
   "remove javascript pdf"
  ]
 },
 {
  "id": "pdf-nup",
  "route": "/pdf/?tool=pdf-nup",
  "category": "PDF",
  "name": "Pages per sheet (N-up)",
  "blurb": "Pack 2, 4, 6, 9 or 16 pages onto each sheet for printing.",
  "formats": "PDF → PDF",
  "limits": "200 pages; vector quality kept",
  "status": "working",
  "keywords": [
   "nup",
   "booklet",
   "print",
   "multiple",
   "n-up pages per sheet",
   "n-up"
  ]
 },
 {
  "id": "pdf-metadata",
  "route": "/pdf/?tool=pdf-metadata",
  "category": "PDF",
  "name": "PDF metadata",
  "blurb": "View and edit title, author, subject, keywords and creator.",
  "formats": "PDF → PDF",
  "limits": "Metadata only, content untouched",
  "status": "working",
  "keywords": [
   "properties",
   "title",
   "author"
  ]
 },
 {
  "id": "pdf-attachments",
  "name": "PDF attachments",
  "blurb": "See the files embedded inside a PDF and download any of them — or attach your own files to a PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-attachments",
  "formats": "PDF → PDF, ZIP",
  "limits": "150 MB",
  "keywords": [
   "pdf attachments",
   "extract attachments from pdf",
   "embed file in pdf",
   "attach file to pdf",
   "pdf embedded files"
  ]
 },
 {
  "id": "pdf-repair",
  "route": "/pdf/?tool=pdf-repair",
  "category": "PDF",
  "name": "Repair PDF",
  "blurb": "Rebuild a damaged PDF's structure with QPDF WebAssembly.",
  "formats": "PDF → PDF",
  "limits": "50 MB; lost content stays lost",
  "status": "working",
  "keywords": [
   "fix",
   "corrupt",
   "damaged",
   "broken"
  ]
 },
 {
  "id": "pdf-invert",
  "route": "/pdf/?tool=pdf-invert",
  "category": "PDF",
  "name": "Invert PDF colors",
  "blurb": "Recolour a PDF: inverted, dark mode, grayscale or sepia, with the text kept selectable.",
  "formats": "PDF",
  "limits": "Text stays selectable; 150 MB",
  "status": "working",
  "keywords": [
   "black and white pdf",
   "dark",
   "dark mode pdf",
   "grayscale pdf",
   "invert",
   "mode",
   "negative",
   "night mode pdf",
   "sepia pdf"
  ]
 },
 {
  "id": "pdf-grayscale",
  "name": "Grayscale PDF",
  "blurb": "Convert a PDF to true grayscale — the colour is rewritten to gray in the file itself, and the text stays selectable.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-grayscale",
  "formats": "PDF → PDF",
  "limits": "Text stays selectable; 150 MB",
  "keywords": [
   "grayscale pdf",
   "convert pdf to grayscale",
   "black and white pdf",
   "grey scale pdf",
   "remove color from pdf"
  ]
 },
 {
  "id": "pdf-redact",
  "route": "/pdf/?tool=pdf-redact",
  "category": "PDF",
  "name": "Redact PDF",
  "blurb": "Black out parts of pages permanently; pages are re-created as images.",
  "formats": "PDF → raster PDF",
  "limits": "20 pages; permanent burn-in",
  "status": "working",
  "keywords": [
   "redact",
   "black",
   "out",
   "censor",
   "hide",
   "hide text",
   "black out"
  ]
 },
 {
  "id": "pdf-compare",
  "route": "/pdf/?tool=pdf-compare",
  "category": "PDF",
  "name": "Compare PDFs visually",
  "blurb": "Render two PDFs page by page, highlight pixel differences and read them side by side.",
  "formats": "2 PDFs → diff view",
  "limits": "40 pages; visual only",
  "status": "working",
  "keywords": [
   "compare",
   "diff",
   "version",
   "changes"
  ]
 },
 {
  "id": "scan-pdf",
  "route": "/pdf/?tool=scan-pdf",
  "category": "PDF",
  "name": "Make PDF look scanned",
  "blurb": "Make a clean PDF look like a grayscale scan.",
  "formats": "PDF → raster PDF",
  "limits": "No page limit; text not selectable",
  "status": "working",
  "keywords": [
   "scan",
   "photocopy",
   "effect",
   "grayscale",
   "scan effect"
  ]
 },
 {
  "id": "file-checksum",
  "route": "/archives/?tool=file-checksum",
  "category": "Archives",
  "name": "File checksum (SHA-256)",
  "blurb": "Hash files to verify downloads or prove a file did not change.",
  "formats": "Any file",
  "limits": "20 files, 500 MB each",
  "status": "working",
  "keywords": [
   "sha256",
   "hash",
   "verify",
   "checksum",
   "integrity"
  ]
 },
 {
  "id": "duplicate-finder",
  "route": "/archives/?tool=duplicate-finder",
  "category": "Archives",
  "name": "Find duplicate files",
  "blurb": "Find exact duplicate files by size, then content hash.",
  "formats": "Any files",
  "limits": "200 files; report only, never deletes",
  "status": "working",
  "keywords": [
   "duplicates",
   "same",
   "copies",
   "reclaim",
   "space",
   "duplicate finder"
  ]
 },
 {
  "id": "batch-rename",
  "route": "/archives/?tool=batch-rename",
  "category": "Archives",
  "name": "Batch rename",
  "blurb": "Rename many files with find/replace, prefixes and numbering; download a zip.",
  "formats": "Any files → ZIP",
  "limits": "200 files; originals untouched",
  "status": "working",
  "keywords": [
   "rename",
   "bulk",
   "files",
   "numbering"
  ]
 },
 {
  "id": "make-it-fit",
  "route": "/archives/?tool=make-it-fit",
  "category": "Archives",
  "name": "Compress to a target size",
  "blurb": "Compress an image or PDF to fit a size limit, e.g. under 2 MB for email.",
  "formats": "Image/PDF in, same kind out",
  "limits": "Images 40 MP; PDFs 20 pages",
  "status": "working",
  "keywords": [
   "compress",
   "target",
   "size",
   "email",
   "limit",
   "shrink",
   "make it fit a size",
   "compress pdf",
   "reduce pdf size",
   "pdf compressor",
   "shrink pdf",
   "smaller",
   "compress image",
   "under 1mb",
   "under 2mb"
  ]
 },
 {
  "id": "camera-scan-pdf",
  "route": "/pdf/?tool=camera-scan-pdf",
  "category": "PDF",
  "name": "Camera scan to PDF",
  "blurb": "Photograph pages (or add photos): the edges are found and each page is straightened, then saved as one PDF.",
  "formats": "Camera → PDF",
  "limits": "No page limit; photos stay on this device",
  "status": "working",
  "keywords": [
   "auto crop",
   "camera",
   "deskew",
   "document",
   "document scanner",
   "photo",
   "photo scan",
   "scan",
   "scan document",
   "scan to pdf",
   "straighten scan"
  ]
 },
 {
  "id": "pdf-count",
  "name": "PDF page counter",
  "blurb": "Count the pages in a PDF on this device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-count",
  "formats": "PDF",
  "limits": "80 MB",
  "keywords": []
 },
 {
  "id": "pdf-size",
  "name": "PDF size checker",
  "blurb": "File size, page count, page dimensions and PDF version, checked locally.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-size",
  "formats": "PDF",
  "limits": "80 MB",
  "keywords": []
 },
 {
  "id": "pdf-size-analyzer",
  "name": "PDF size analyzer",
  "blurb": "Why is this PDF so big? A byte-by-byte breakdown: images, fonts, content, attachments and structure, with what would shrink it.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-size-analyzer",
  "formats": "PDF",
  "limits": "150 MB",
  "keywords": [
   "why is my pdf so big",
   "pdf size breakdown",
   "analyze pdf size",
   "pdf file size"
  ]
 },
 {
  "id": "pdf-text",
  "name": "PDF to text",
  "blurb": "Extract selectable text from a PDF, page by page, on this device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-text",
  "formats": "PDF",
  "limits": "80 MB",
  "keywords": [
   "pdf to text",
   "extract text",
   "copy text"
  ]
 },
 {
  "id": "pdf-to-markdown",
  "name": "PDF to Markdown",
  "blurb": "Turn a PDF's text layer into Markdown — headings by type size, lists and paragraphs in reading order.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-to-markdown",
  "formats": "PDF → MD",
  "limits": "300 pages; 80 MB",
  "keywords": [
   "pdf to markdown",
   "pdf to md",
   "convert pdf to markdown"
  ]
 },
 {
  "id": "pdf-extract-images",
  "name": "Extract images from PDF",
  "blurb": "Pull the pictures stored inside a PDF out at their original resolution — photos and graphics themselves, not page screenshots.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-extract-images",
  "formats": "PDF → PNG, JPG",
  "limits": "150 MB",
  "keywords": [
   "extract images from pdf",
   "pdf image extractor",
   "get pictures out of pdf",
   "save images from pdf"
  ]
 },
 {
  "id": "pdf-crop",
  "name": "Crop PDF pages",
  "blurb": "Trim equal margins off every page of a PDF on this device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-crop",
  "formats": "PDF",
  "limits": "80 MB",
  "keywords": [
   "crop",
   "trim margins"
  ]
 },
 {
  "id": "image-redact-areas",
  "name": "Blur or pixelate areas",
  "blurb": "Hide faces, plates or text in an image copy.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-redact-areas",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB; 32 MP",
  "keywords": [
   "blur",
   "pixelate",
   "hide face"
  ]
 },
 {
  "id": "face-blur",
  "name": "Face blur",
  "category": "Images",
  "route": "/images/?tool=face-blur",
  "blurb": "Detect faces in a photo and blur or pixelate them — then check and adjust every box before you share it.",
  "formats": "JPG, PNG, WebP",
  "limits": "32 MP; 0.23 MB one-time model download",
  "keywords": [
   "blur faces",
   "face blur",
   "pixelate faces",
   "hide faces",
   "censor face",
   "face detection blur",
   "anonymize photo"
  ],
  "status": "working"
 },
 {
  "id": "image-adjust",
  "name": "Adjust image",
  "blurb": "Exposure, brightness, contrast, warmth, vignette and one-tap filters (sepia, vintage, B&W) with a live preview.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-adjust",
  "formats": "JPG, PNG, WebP, AVIF",
  "limits": "20 MB; 32 MP",
  "keywords": [
   "photo editor",
   "filters",
   "sepia",
   "black and white",
   "vintage",
   "exposure",
   "warmth",
   "vignette",
   "brightness",
   "contrast"
  ]
 },
 {
  "id": "meme-generator",
  "name": "Meme generator",
  "blurb": "Top and bottom caption image from your own picture.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=meme-generator",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB; 32 MP",
  "keywords": []
 },
 {
  "id": "image-ascii",
  "name": "Image to ASCII art",
  "blurb": "Turn an image into monospace text art.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-ascii",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB; 32 MP; no character cap",
  "keywords": []
 },
 {
  "id": "image-collage",
  "name": "Image collage",
  "blurb": "Combine 2-12 images into one grid.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-collage",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB each; 32 MP output",
  "keywords": []
 },
 {
  "id": "image-merge",
  "name": "Merge images",
  "blurb": "Stitch images side by side or top to bottom.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-merge",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB each; 32 MP output",
  "keywords": []
 },
 {
  "id": "image-transparent",
  "name": "Make color transparent",
  "blurb": "Remove one color from an image copy.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-transparent",
  "formats": "JPG, PNG, WebP",
  "limits": "20 MB; 32 MP",
  "keywords": [
   "remove background colour",
   "transparent png"
  ]
 },
 {
  "id": "dpi-checker",
  "name": "DPI checker",
  "blurb": "Read the stored print resolution (DPI) of a JPG or PNG.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=dpi-checker",
  "formats": "JPG, PNG",
  "limits": "20 MB",
  "keywords": []
 },
 {
  "id": "image-set-dpi",
  "name": "Set image DPI",
  "category": "Images",
  "route": "/images/?tool=image-set-dpi",
  "blurb": "Change the DPI tag inside a JPG, PNG or WebP. Changes the DPI tag only — adds no detail.",
  "formats": "JPG, PNG, WebP",
  "limits": "Tag only; pixels unchanged",
  "keywords": [
   "set dpi",
   "change dpi",
   "300 dpi",
   "image resolution tag",
   "dpi converter",
   "set image resolution"
  ],
  "status": "working"
 },
 {
  "id": "compress-pdf",
  "category": "PDF",
  "name": "Compress PDF",
  "blurb": "Make a PDF smaller, on your device. Best for scanned PDFs.",
  "formats": "PDF",
  "limits": "150 MB; 300 pages",
  "keywords": [
   "compress pdf",
   "reduce pdf size",
   "shrink pdf",
   "smaller pdf",
   "pdf size reducer",
   "optimize pdf",
   "pdf compress"
  ],
  "status": "working",
  "route": "/pdf/?tool=compress-pdf"
 },
 {
  "id": "pdf-linearize",
  "name": "Linearize PDF",
  "blurb": "Rewrite a PDF for fast web viewing, so the first page can open before the whole file has downloaded.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-linearize",
  "formats": "PDF → PDF",
  "limits": "150 MB",
  "keywords": [
   "linearize pdf",
   "fast web view",
   "linearized pdf",
   "optimize pdf for web"
  ]
 },
 {
  "id": "pdf-ocr",
  "category": "PDF",
  "name": "Make scanned PDF searchable",
  "blurb": "Add a hidden text layer so you can search and copy text in a scan.",
  "formats": "PDF",
  "limits": "60 pages; 120 MB",
  "keywords": [
   "ocr pdf",
   "searchable pdf",
   "scan to text",
   "pdf ocr",
   "copy text from scan"
  ],
  "status": "working",
  "route": "/pdf/?tool=pdf-ocr"
 },
 {
  "id": "pdf-interleave",
  "category": "PDF",
  "name": "Mix pages from two PDFs",
  "blurb": "Combine front and back scans into one PDF, page by page.",
  "formats": "PDF",
  "limits": "2 PDFs",
  "keywords": [
   "interleave",
   "alternate pages",
   "double sided scan",
   "front and back",
   "collate pdf"
  ],
  "status": "working",
  "route": "/pdf/?tool=pdf-interleave"
 },
 {
  "id": "batch-resize",
  "category": "Images",
  "name": "Batch resize images",
  "blurb": "Resize many photos at once by width, height, percent or a WhatsApp / passport preset. Download as ZIP.",
  "formats": "JPG, PNG, WebP",
  "limits": "300 images; 40 MP each",
  "keywords": [
   "resize",
   "resize image",
   "bulk resize",
   "change image size",
   "resize photos",
   "pixels",
   "whatsapp dp size",
   "whatsapp status size",
   "passport size photo",
   "passport photo size"
  ],
  "status": "working",
  "route": "/images/?tool=batch-resize"
 },
 {
  "id": "social-crop",
  "category": "Images",
  "name": "Crop for social media",
  "blurb": "Crop or fit a photo to Instagram, YouTube, WhatsApp or passport size.",
  "formats": "JPG, PNG",
  "limits": "40 MP",
  "keywords": [
   "instagram size",
   "youtube thumbnail",
   "story size",
   "passport photo",
   "crop photo",
   "dp",
   "profile picture",
   "whatsapp status size",
   "whatsapp dp",
   "2x2 photo"
  ],
  "status": "working",
  "route": "/images/?tool=social-crop"
 },
 {
  "id": "image-rotate",
  "category": "Images",
  "name": "Rotate or flip images",
  "blurb": "Turn images 90°, 180° or 270°, or mirror them. Many at once.",
  "formats": "JPG, PNG, WebP",
  "limits": "300 images",
  "keywords": [
   "rotate image",
   "flip image",
   "mirror photo",
   "turn photo",
   "sideways photo"
  ],
  "status": "working",
  "route": "/images/?tool=image-rotate"
 },
 {
  "id": "qr-logo",
  "category": "QR",
  "name": "QR code with logo",
  "blurb": "Put your logo and colours on a QR code that still scans.",
  "formats": "PNG",
  "limits": "512–2048 px",
  "keywords": [
   "qr logo",
   "branded qr",
   "custom qr",
   "qr with image",
   "colour qr"
  ],
  "status": "working",
  "route": "/qr/?tool=qr-logo"
 },
 {
  "id": "event-qr",
  "category": "QR",
  "name": "Event QR code",
  "blurb": "A QR that adds an event to the phone’s calendar. Also gives an .ics file.",
  "formats": "PNG, ICS",
  "limits": "One event",
  "keywords": [
   "calendar qr",
   "event qr",
   "meeting qr",
   "ics",
   "invite qr"
  ],
  "status": "working",
  "route": "/qr/?tool=event-qr"
 },
 {
  "id": "qr-styled",
  "name": "Styled QR code",
  "category": "QR",
  "route": "/qr/?tool=qr-styled",
  "blurb": "QR codes with dot shapes, colours, a logo and a \"Scan me\" frame. PNG and SVG.",
  "formats": "PNG, SVG",
  "limits": "Up to 1,000 characters",
  "keywords": [
   "custom qr",
   "qr design",
   "styled qr",
   "qr code generator",
   "qr with logo",
   "qr frame",
   "scan me",
   "qr colors",
   "qr png",
   "qr svg",
   "fancy qr"
  ],
  "status": "working"
 },
 {
  "id": "vcard-qr",
  "name": "Contact QR code (vCard)",
  "blurb": "A QR that saves a contact: name, phones, email, company, website, address. PNG, SVG and .vcf.",
  "category": "QR",
  "status": "working",
  "route": "/qr/?tool=vcard-qr",
  "formats": "PNG, SVG, VCF",
  "limits": "vCard 3.0 or MeCard; keep it short for small prints",
  "keywords": [
   "vcard",
   "vcard qr",
   "contact qr",
   "business card qr",
   "mecard",
   "vcf",
   "save contact",
   "digital business card",
   "contact card"
  ]
 },
 {
  "id": "find-replace",
  "category": "Text",
  "name": "Find and replace",
  "blurb": "Replace words across a whole text. Quick fixes for line breaks and spaces.",
  "formats": "Text",
  "limits": "5 million characters",
  "keywords": [
   "find replace",
   "replace text",
   "remove line breaks",
   "regex replace",
   "search and replace"
  ],
  "status": "working",
  "route": "/text/?tool=find-replace"
 },
 {
  "id": "text-speech",
  "category": "Text",
  "name": "Text to speech",
  "blurb": "Listen to any text read aloud with your device’s voices.",
  "formats": "Text",
  "limits": "Device voices",
  "keywords": [
   "read aloud",
   "tts",
   "speak text",
   "voice",
   "listen"
  ],
  "status": "working",
  "route": "/text/?tool=text-speech"
 },
 {
  "id": "lorem-ipsum",
  "category": "Text",
  "name": "Lorem ipsum generator",
  "blurb": "Placeholder text in paragraphs, sentences or words.",
  "formats": "Text",
  "limits": "500 units",
  "keywords": [
   "dummy text",
   "placeholder text",
   "lorem",
   "filler text"
  ],
  "status": "working",
  "route": "/text/?tool=lorem-ipsum"
 },
 {
  "id": "signature-maker",
  "name": "Signature maker",
  "category": "PDF",
  "route": "/pdf/?tool=signature-maker",
  "blurb": "Draw or type a signature, or clean up a photo of one. Save a transparent PNG.",
  "formats": "PNG (transparent)",
  "limits": "Photos up to 40 MP",
  "keywords": [
   "signature",
   "sign",
   "e-signature",
   "esign",
   "draw signature",
   "handwritten signature",
   "transparent signature",
   "signature png",
   "autograph",
   "digital signature image"
  ],
  "status": "working"
 },
 {
  "id": "word-pdf",
  "name": "Word to PDF",
  "category": "PDF",
  "route": "/pdf/?tool=word-pdf",
  "blurb": "Turn a Word document (.docx) into a PDF on this device.",
  "formats": "DOCX to PDF",
  "limits": "50 MB; .doc not supported",
  "keywords": [
   "word to pdf",
   "docx to pdf",
   "doc to pdf",
   "convert word",
   "word pdf",
   "document to pdf"
  ],
  "status": "working"
 },
 {
  "id": "excel-pdf",
  "name": "Excel / CSV to PDF",
  "category": "PDF",
  "route": "/pdf/?tool=excel-pdf",
  "blurb": "Turn a spreadsheet (XLSX, XLS, ODS or CSV) into a PDF table that fits the page.",
  "formats": "XLSX, XLS, ODS, CSV to PDF",
  "limits": "30 MB; 20,000 rows per sheet",
  "keywords": [
   "excel to pdf",
   "xlsx to pdf",
   "csv to pdf",
   "spreadsheet to pdf",
   "sheet to pdf",
   "xls to pdf",
   "table to pdf"
  ],
  "status": "working"
 },
 {
  "id": "pdf-word",
  "name": "PDF to Word",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-word",
  "blurb": "Turn a text PDF into an editable Word document (.docx).",
  "formats": "PDF to DOCX",
  "limits": "100 MB; 300 pages; best on text PDFs",
  "keywords": [
   "pdf to word",
   "pdf to docx",
   "pdf to doc",
   "convert pdf to word",
   "editable pdf",
   "pdf editor word"
  ],
  "status": "working"
 },
 {
  "id": "pdf-excel",
  "name": "PDF to Excel",
  "category": "PDF",
  "route": "/pdf/?tool=pdf-excel",
  "blurb": "Turn the tables in a PDF into a real Excel spreadsheet (.xlsx), with numbers and dates stored as values.",
  "formats": "PDF to XLSX",
  "limits": "100 MB; 300 pages; best on text PDFs",
  "keywords": [
   "pdf to excel",
   "pdf to xlsx",
   "pdf to spreadsheet",
   "convert pdf to excel",
   "extract table from pdf",
   "pdf table to excel"
  ],
  "status": "working"
 },
 {
  "id": "pdf-csv",
  "name": "PDF to CSV",
  "blurb": "Turn the tables in a PDF into CSV files, one per sheet, on this device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-csv",
  "formats": "PDF to CSV",
  "limits": "100 MB; 300 pages; best on text PDFs",
  "keywords": [
   "pdf to csv",
   "pdf table to csv",
   "pdf to spreadsheet csv",
   "convert pdf to csv",
   "extract table csv"
  ]
 },
 {
  "id": "image-crop",
  "name": "Crop image",
  "category": "Images",
  "route": "/images/?tool=image-crop",
  "blurb": "Crop freely or to a shape (1:1, 16:9…), straighten any angle, then rotate or flip.",
  "formats": "JPG, PNG, WebP, GIF, BMP, AVIF, HEIC",
  "limits": "50 MP",
  "keywords": [
   "crop",
   "crop image",
   "crop photo",
   "cut image",
   "trim image",
   "aspect ratio",
   "square crop",
   "rotate",
   "flip",
   "straighten",
   "straighten photo",
   "rotate any angle",
   "tilt",
   "level horizon",
   "whatsapp dp",
   "whatsapp status",
   "passport size"
  ],
  "status": "working"
 },
 {
  "id": "smart-crop",
  "name": "Smart crop",
  "category": "Images",
  "route": "/images/?tool=smart-crop",
  "blurb": "Crop to 16:9, 1:1 and other shapes around the interesting part of the photo, not just the centre.",
  "formats": "JPG, PNG, WebP",
  "limits": "50 MP",
  "keywords": [
   "smart crop",
   "content aware crop",
   "focal point",
   "crop photo",
   "crop image",
   "aspect ratio",
   "thumbnail crop",
   "subject crop",
   "auto crop"
  ],
  "status": "working"
 },
 {
  "id": "remove-bg",
  "name": "Remove background",
  "category": "Images",
  "route": "/images/?tool=remove-bg",
  "blurb": "Cut out the subject of a photo and get a transparent PNG. Runs on this device.",
  "formats": "JPG, PNG, WebP, HEIC to PNG",
  "limits": "40 MP; 44 MB one-time model download",
  "keywords": [
   "remove background",
   "background remover",
   "remove bg",
   "bg remover",
   "transparent background",
   "cut out",
   "erase background",
   "white background",
   "background eraser"
  ],
  "status": "working"
 },
 {
  "id": "background-blur",
  "name": "Background blur",
  "category": "Images",
  "route": "/images/?tool=background-blur",
  "blurb": "Keep the subject sharp and blur everything behind it — the portrait-mode look, on this device.",
  "formats": "JPG, PNG, WebP",
  "limits": "40 MP; 44 MB one-time model download",
  "keywords": [
   "background blur",
   "blur background",
   "portrait mode",
   "bokeh",
   "depth effect",
   "blur photo background"
  ],
  "status": "working"
 },
 {
  "id": "passport-photo",
  "name": "Passport photo maker",
  "category": "Images",
  "route": "/images/?tool=passport-photo",
  "blurb": "Make passport and visa photos (India, Saudi, US, UK…) and a printable sheet.",
  "formats": "JPG to JPG / PDF sheet",
  "limits": "40 MP",
  "keywords": [
   "passport photo",
   "passport size photo",
   "visa photo",
   "id photo",
   "photo 35x45",
   "2x2 photo",
   "4x6 photo",
   "print sheet",
   "passport picture"
  ],
  "status": "working"
 },
 {
  "id": "unzip",
  "name": "Unzip files",
  "category": "Archives",
  "route": "/archives/?tool=unzip",
  "blurb": "Open a ZIP, preview what is inside and save one file or all of them.",
  "formats": "ZIP",
  "limits": "1 GB / 20,000 files; no password ZIPs",
  "keywords": [
   "unzip",
   "extract zip",
   "open zip",
   "zip extractor",
   "unpack",
   "zip viewer",
   "decompress",
   "zip file opener",
   "rar",
   "7z",
   "zip opener"
  ],
  "status": "working"
 },
 {
  "id": "age-calc",
  "name": "Age calculator",
  "category": "Calculators",
  "route": "/calculators/?tool=age-calc",
  "blurb": "Exact age in years, months and days, plus the next birthday.",
  "formats": "Dates",
  "limits": "Calendar dates",
  "keywords": [
   "age",
   "age calculator",
   "date of birth",
   "dob",
   "birthday",
   "how old",
   "years months days",
   "next birthday"
  ],
  "status": "working"
 },
 {
  "id": "sip-calc",
  "name": "SIP, FD & compound interest",
  "category": "Calculators",
  "route": "/calculators/?tool=sip-calc",
  "blurb": "See how a monthly SIP, a lump sum or a fixed deposit grows, with a chart.",
  "formats": "INR, SAR, AED, USD, EUR, GBP",
  "limits": "Up to 50 years",
  "keywords": [
   "sip",
   "sip calculator",
   "mutual fund",
   "fd",
   "fixed deposit",
   "compound interest",
   "lumpsum",
   "lump sum",
   "investment",
   "returns",
   "step up sip",
   "maturity",
   "interest calculator"
  ],
  "status": "working"
 },
 {
  "id": "currency-convert",
  "name": "Currency converter",
  "category": "Calculators",
  "route": "/calculators/?tool=currency-convert",
  "blurb": "Convert between 59 world currencies — dollars to riyals, euros to rupees and every cross rate — with rates saved in the tool.",
  "formats": "59 currencies (USD, SAR, AED, KWD, EUR, GBP, INR, PKR, JPY and more)",
  "limits": "Rates as of 28 Oct 2026; for guidance only",
  "keywords": [
   "currency converter",
   "currency",
   "convert currency",
   "exchange rate",
   "exchange rates",
   "usd to sar",
   "dollar to riyal",
   "sar to inr",
   "riyal to rupee",
   "eur to inr",
   "money converter",
   "forex",
   "fx",
   "aed to inr",
   "kwd to inr"
  ],
  "status": "working"
 },
 {
  "id": "fancy-text",
  "name": "Fancy text fonts",
  "category": "Text",
  "route": "/text/?tool=fancy-text",
  "blurb": "Bold, italic, script and 20+ Unicode styles for Instagram and WhatsApp. One tap to copy.",
  "formats": "Text (Unicode)",
  "limits": "2,000 characters",
  "keywords": [
   "fancy text",
   "fancy fonts",
   "font generator",
   "instagram fonts",
   "bold text",
   "italic text",
   "cursive",
   "stylish text",
   "unicode text",
   "whatsapp fonts",
   "cool text",
   "upside down text"
  ],
  "status": "working"
 },
 {
  "id": "screen-recorder",
  "name": "Screen recorder",
  "category": "Media",
  "route": "/media/?tool=screen-recorder",
  "blurb": "Record your screen, a window or a tab, with sound and microphone.",
  "formats": "MP4 or WebM",
  "limits": "Computer browsers only",
  "keywords": [
   "screen recorder",
   "record screen",
   "screen capture",
   "screencast",
   "record tab",
   "video recording",
   "record desktop"
  ],
  "status": "working"
 },
 {
  "id": "video-mp3",
  "name": "Video to MP3",
  "category": "Media",
  "route": "/media/?tool=video-mp3",
  "blurb": "Take the sound out of a video or convert audio to MP3, M4A or WAV.",
  "formats": "MP4, MOV, MKV, WebM, AVI, audio to MP3/M4A/WAV",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "video to mp3",
   "mp4 to mp3",
   "extract audio",
   "audio converter",
   "convert to mp3",
   "mp3 converter",
   "video to audio",
   "wav to mp3",
   "m4a to mp3"
  ],
  "status": "working"
 },
 {
  "id": "audio-cut",
  "name": "Audio cutter & joiner",
  "category": "Media",
  "route": "/media/?tool=audio-cut",
  "blurb": "Cut one or more parts of any song, voice note or video sound, then join them into one file or save each part. MP3 or WAV.",
  "formats": "MP3, WAV, M4A, OGG, FLAC, MP4, MOV, WebM to MP3/WAV",
  "limits": "Up to 60 min; long files use a 32 MB one-time engine",
  "keywords": [
   "audio cutter",
   "cut audio",
   "trim audio",
   "audio trimmer",
   "cut mp3",
   "mp3 cutter",
   "trim mp3",
   "ringtone maker",
   "make ringtone",
   "sample cutter",
   "cut song",
   "song cutter",
   "clip audio",
   "audio splitter",
   "fade in fade out",
   "cut voice note",
   "wav cutter",
   "audio joiner",
   "merge audio",
   "combine mp3",
   "audio merger",
   "join clips",
   "join audio",
   "merge mp3",
   "mp3 joiner",
   "combine audio",
   "audio combiner"
  ],
  "status": "working"
 },
 {
  "id": "audio-convert",
  "name": "Audio converter",
  "category": "Media",
  "route": "/media/?tool=audio-convert",
  "blurb": "Convert songs, voice notes and podcasts between MP3, WAV, OGG, Opus, FLAC and M4A — or save a video's sound in any of them.",
  "formats": "MP3, WAV, OGG, Opus, FLAC, M4A, AAC, WebM and video sound to MP3/WAV/OGG/Opus/FLAC/M4A",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "audio converter",
   "convert audio",
   "change audio format",
   "audio format converter",
   "mp3 converter",
   "wav to mp3",
   "mp3 to wav",
   "flac to mp3",
   "mp3 to flac",
   "ogg to mp3",
   "mp3 to ogg",
   "opus to mp3",
   "m4a to mp3",
   "mp3 to opus",
   "wav converter",
   "flac converter",
   "convert to flac",
   "convert to opus"
  ],
  "status": "working"
 },
 {
  "id": "video-convert",
  "name": "Video converter",
  "category": "Media",
  "route": "/media/?tool=video-convert",
  "blurb": "Convert a video between MP4, WebM, MOV and MKV, and choose the resolution — all on this device.",
  "formats": "MP4, MOV, MKV, WebM, AVI to MP4/WebM/MOV/MKV",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "video converter",
   "convert video",
   "change video format",
   "video format converter",
   "mp4 converter",
   "webm to mp4",
   "mp4 to webm",
   "mov to mp4",
   "mp4 to mov",
   "mkv to mp4",
   "avi to mp4",
   "convert to webm",
   "convert video format"
  ],
  "status": "working"
 },
 {
  "id": "video-trim",
  "name": "Video trimmer",
  "category": "Media",
  "route": "/media/?tool=video-trim",
  "blurb": "Cut the start and end off a video and keep the part you want — fast, keeping the format, or frame-exact as MP4.",
  "formats": "MP4, MOV, MKV, WebM, AVI to same format (fast) or MP4 (accurate)",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "trim video",
   "video trimmer",
   "cut video",
   "video cutter",
   "shorten video",
   "trim mp4",
   "cut mp4",
   "remove start of video",
   "video editor",
   "clip video"
  ],
  "status": "working"
 },
 {
  "id": "video-gif",
  "name": "Video to GIF / WebP",
  "category": "Media",
  "route": "/media/?tool=video-gif",
  "blurb": "Make an animated GIF or WebP from any part of a video — choose the start, length, width and smoothness.",
  "formats": "MP4, MOV, MKV, WebM, AVI to GIF or animated WebP",
  "limits": "30 seconds per animation; 500 MB input; 32 MB one-time download",
  "keywords": [
   "video to gif",
   "mp4 to gif",
   "gif maker",
   "make a gif",
   "gif from video",
   "video to webp",
   "animated webp",
   "mp4 to webp",
   "gif converter",
   "turn video into gif"
  ],
  "status": "working"
 },
 {
  "id": "video-compress",
  "name": "Video compressor",
  "category": "Media",
  "route": "/media/?tool=video-compress",
  "blurb": "Make videos smaller for WhatsApp or email. See the size before and after.",
  "formats": "MP4, MOV, MKV, WebM, AVI to MP4",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "compress video",
   "video compressor",
   "reduce video size",
   "shrink video",
   "smaller video",
   "video size",
   "whatsapp video",
   "mp4 compressor",
   "webm to mp4",
   "mov to mp4"
  ],
  "status": "working"
 },
 {
  "id": "css-gradient",
  "name": "CSS gradient generator",
  "blurb": "Build linear or radial gradients with live preview and copy the CSS.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=css-gradient",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "gradient",
   "background",
   "linear-gradient",
   "css colors"
  ]
 },
 {
  "id": "box-shadow",
  "name": "CSS box shadow generator",
  "blurb": "Set offset, blur, spread and colour; preview and copy the CSS.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=box-shadow",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "shadow",
   "drop shadow",
   "css shadow"
  ]
 },
 {
  "id": "border-radius",
  "name": "CSS border radius generator",
  "blurb": "Round each corner separately and copy the CSS.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=border-radius",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "rounded corners",
   "radius",
   "css"
  ]
 },
 {
  "id": "cubic-bezier",
  "name": "CSS easing curve editor",
  "blurb": "Shape a cubic-bezier timing curve, watch it animate, copy the CSS.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=cubic-bezier",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "easing",
   "animation",
   "transition",
   "bezier"
  ]
 },
 {
  "id": "color-shades",
  "name": "Color shades and tints",
  "blurb": "Make lighter tints and darker shades of any colour as a palette.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=color-shades",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "tints",
   "shades",
   "palette",
   "color scale",
   "lighter darker"
  ]
 },
 {
  "id": "color-mixer",
  "name": "Color mixer",
  "blurb": "Blend two colours in even steps and copy any mix.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=color-mixer",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "blend colors",
   "mix",
   "gradient steps"
  ]
 },
 {
  "id": "stopwatch",
  "name": "Stopwatch with laps",
  "blurb": "Start, pause and record lap times to the hundredth of a second.",
  "category": "Everyday",
  "status": "working",
  "route": "/everyday/?tool=stopwatch",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "timer",
   "lap",
   "chronometer"
  ]
 },
 {
  "id": "countdown",
  "name": "Countdown and focus timer",
  "blurb": "Count down any time with an alarm, or run 25/5 focus sessions.",
  "category": "Everyday",
  "status": "working",
  "route": "/everyday/?tool=countdown",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "timer",
   "pomodoro",
   "alarm",
   "focus",
   "countdown to date"
  ]
 },
 {
  "id": "world-clock",
  "name": "World clock and meeting planner",
  "blurb": "See the time in several cities and find hours that suit everyone.",
  "category": "Everyday",
  "status": "working",
  "route": "/everyday/?tool=world-clock",
  "formats": "Text and numbers",
  "limits": "12 clocks",
  "keywords": [
   "time zones",
   "meeting planner",
   "city time",
   "timezone"
  ]
 },
 {
  "id": "random-picker",
  "name": "Random number, dice and coin",
  "blurb": "Fair random numbers, dice rolls and coin flips from your device.",
  "category": "Everyday",
  "status": "working",
  "route": "/everyday/?tool=random-picker",
  "formats": "Text and numbers",
  "limits": "1,000 picks",
  "keywords": [
   "dice",
   "coin flip",
   "random number",
   "name picker",
   "lottery",
   "raffle"
  ]
 },
 {
  "id": "bmi-calc",
  "name": "BMI and calorie calculator",
  "blurb": "Body mass index, healthy weight range and daily calorie estimate.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=bmi-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "bmi",
   "calories",
   "bmr",
   "tdee",
   "weight",
   "health"
  ]
 },
 {
  "id": "discount-calc",
  "name": "Discount calculator",
  "blurb": "Sale price and savings after one or two discounts, plus tax.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=discount-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "sale",
   "percent off",
   "offer price"
  ]
 },
 {
  "id": "margin-calc",
  "name": "Profit margin and markup",
  "blurb": "Find selling price, profit, margin and markup from cost.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=margin-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "profit",
   "markup",
   "margin",
   "selling price"
  ]
 },
 {
  "id": "time-calc",
  "name": "Time duration calculator",
  "blurb": "Add or subtract hours, minutes and seconds, or time between two clock times.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=time-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "hours",
   "minutes",
   "add time",
   "timesheet",
   "shift"
  ]
 },
 {
  "id": "date-add",
  "name": "Add days to a date",
  "blurb": "Add or subtract days, weeks, months or working days from a date.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=date-add",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "add days",
   "working days",
   "business days",
   "due date",
   "deadline"
  ]
 },
 {
  "id": "stats-calc",
  "name": "Statistics calculator",
  "blurb": "Mean, median, mode, range, standard deviation and quartiles of a list.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=stats-calc",
  "formats": "Text and numbers",
  "limits": "100,000 numbers",
  "keywords": [
   "mean",
   "median",
   "mode",
   "standard deviation",
   "average",
   "quartile"
  ]
 },
 {
  "id": "fraction-calc",
  "name": "Fraction calculator",
  "blurb": "Add, subtract, multiply and divide fractions and mixed numbers.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=fraction-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "fractions",
   "mixed numbers",
   "simplify"
  ]
 },
 {
  "id": "roman-numerals",
  "name": "Roman numeral converter",
  "blurb": "Convert numbers to Roman numerals and back (1 to 3,999).",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=roman-numerals",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "roman",
   "numerals",
   "mmxxvi"
  ]
 },
 {
  "id": "cagr-calc",
  "name": "CAGR and ROI calculator",
  "blurb": "Yearly growth rate and total return between a start and end value.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=cagr-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "cagr",
   "roi",
   "returns",
   "growth rate",
   "investment"
  ]
 },
 {
  "id": "inflation-calc",
  "name": "Inflation calculator",
  "blurb": "What an amount will cost in future, or is worth today, at a set inflation rate.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=inflation-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "inflation",
   "future value",
   "purchasing power"
  ]
 },
 {
  "id": "fuel-cost",
  "name": "Trip fuel cost",
  "blurb": "Fuel needed and cost for a trip, split between people.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=fuel-cost",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "petrol",
   "diesel",
   "mileage",
   "trip cost",
   "gas"
  ]
 },
 {
  "id": "morse-code",
  "name": "Morse code translator",
  "blurb": "Convert text to Morse code and back, and play it as sound.",
  "category": "Text",
  "status": "working",
  "route": "/text/?tool=morse-code",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "morse",
   "sos",
   "dots and dashes"
  ]
 },
 {
  "id": "nato-alphabet",
  "name": "NATO phonetic spelling",
  "blurb": "Spell text out as Alfa, Bravo, Charlie for clear phone calls.",
  "category": "Text",
  "status": "working",
  "route": "/text/?tool=nato-alphabet",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "phonetic",
   "alfa bravo",
   "spelling alphabet",
   "nato"
  ]
 },
 {
  "id": "extract-text",
  "name": "Extract emails, links and numbers",
  "blurb": "Pull every email, web link, phone number or number out of text.",
  "category": "Text",
  "status": "working",
  "route": "/text/?tool=extract-text",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "extract emails",
   "find links",
   "phone numbers",
   "scrape"
  ]
 },
 {
  "id": "meta-tags",
  "name": "Meta tag and Open Graph generator",
  "blurb": "Write page title, description and social tags with a search preview.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=meta-tags",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "seo",
   "open graph",
   "og tags",
   "twitter card",
   "meta description"
  ]
 },
 {
  "id": "robots-txt",
  "name": "robots.txt generator",
  "blurb": "Make a robots.txt with allow and block rules and a sitemap line.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=robots-txt",
  "formats": "robots.txt",
  "limits": "Runs on this device",
  "keywords": [
   "robots",
   "seo",
   "crawler",
   "sitemap",
   "ai bots"
  ]
 },
 {
  "id": "utm-builder",
  "name": "UTM link builder",
  "blurb": "Add campaign tracking tags to a link in the standard UTM format.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=utm-builder",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "utm",
   "campaign",
   "tracking link",
   "analytics"
  ]
 },
 {
  "id": "url-parser",
  "name": "URL parser and query editor",
  "blurb": "Split a link into its parts, edit query values and rebuild it.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=url-parser",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "url",
   "query string",
   "parameters",
   "link parts"
  ]
 },
 {
  "id": "xml-format",
  "name": "XML formatter and validator",
  "blurb": "Indent, minify and check XML; shows the line of any error.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=xml-format",
  "formats": "XML",
  "limits": "5 MB",
  "keywords": [
   "xml",
   "pretty print",
   "validate",
   "minify xml"
  ]
 },
 {
  "id": "json-ts",
  "name": "JSON to TypeScript",
  "blurb": "Turn JSON into TypeScript interfaces.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=json-ts",
  "formats": "JSON",
  "limits": "5 MB",
  "keywords": [
   "typescript",
   "interface",
   "types",
   "json"
  ]
 },
 {
  "id": "markdown-table",
  "name": "Markdown table generator",
  "blurb": "Turn CSV or spreadsheet cells into a neat Markdown table.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=markdown-table",
  "formats": "CSV, TSV",
  "limits": "Runs on this device",
  "keywords": [
   "markdown",
   "table",
   "csv to markdown"
  ]
 },
 {
  "id": "html-markdown",
  "name": "HTML to Markdown",
  "blurb": "Convert HTML into clean Markdown.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=html-markdown",
  "formats": "HTML",
  "limits": "2 MB",
  "keywords": [
   "html",
   "markdown",
   "convert",
   "turndown"
  ]
 },
 {
  "id": "keycode",
  "name": "Keyboard key code tester",
  "blurb": "Press any key to see its key, code and modifier values.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=keycode",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "keyboard",
   "keycode",
   "key event",
   "javascript"
  ]
 },
 {
  "id": "xml-convert",
  "name": "XML converter",
  "category": "Web",
  "route": "/web/?tool=xml-convert",
  "blurb": "Convert XML to JSON or CSV, and CSV or JSON back to XML — both directions.",
  "formats": "XML, JSON, CSV",
  "limits": "200,000 characters",
  "status": "working",
  "keywords": [
   "xml to json",
   "xml to csv",
   "csv to xml",
   "json to xml",
   "convert xml",
   "xml converter",
   "xml parser"
  ]
 },
 {
  "id": "font-convert",
  "name": "Font converter",
  "category": "Web",
  "route": "/web/?tool=font-convert",
  "blurb": "Convert TTF and OTF fonts to WOFF for the web, and WOFF fonts back to TTF or OTF.",
  "formats": "TTF, OTF, WOFF",
  "limits": "30 MB; WOFF2 not supported",
  "status": "working",
  "keywords": [
   "font converter",
   "ttf to woff",
   "otf to woff",
   "woff to ttf",
   "woff to otf",
   "convert font",
   "web font"
  ]
 },
 {
  "id": "chart-maker",
  "name": "Chart maker",
  "category": "Web",
  "route": "/web/?tool=chart-maker",
  "blurb": "Paste a table and get a bar, line, pie or doughnut chart to download as PNG or SVG.",
  "formats": "CSV in; PNG, SVG out",
  "limits": "100 rows; 8 series",
  "status": "working",
  "keywords": [
   "chart maker",
   "make a chart",
   "bar chart",
   "line chart",
   "pie chart",
   "doughnut chart",
   "csv to chart",
   "graph maker"
  ]
 },
 {
  "id": "bcrypt",
  "name": "bcrypt hash and verify",
  "blurb": "Hash a password with bcrypt or check a password against a hash.",
  "category": "Security",
  "status": "working",
  "route": "/security/?tool=bcrypt",
  "formats": "Text",
  "limits": "Runs on this device",
  "keywords": [
   "bcrypt",
   "password hash",
   "verify hash"
  ]
 },
 {
  "id": "image-color-picker",
  "name": "Pick colour from image",
  "blurb": "Tap any point of a photo to get its HEX, RGB and HSL colour.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-color-picker",
  "formats": "JPG, PNG, WebP, GIF",
  "limits": "50 MP",
  "keywords": [
   "eyedropper",
   "color picker",
   "hex from image",
   "pick color"
  ]
 },
 {
  "id": "image-border",
  "name": "Add border and round corners",
  "blurb": "Add a coloured border or padding and round the corners of an image.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-border",
  "formats": "JPG, PNG, WebP",
  "limits": "50 MP",
  "keywords": [
   "border",
   "frame",
   "rounded corners",
   "padding"
  ]
 },
 {
  "id": "screenshot-beautifier",
  "name": "Screenshot beautifier",
  "blurb": "Put a screenshot on a gradient or colour backdrop with padding, rounded corners and a soft shadow, ready to share.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=screenshot-beautifier",
  "formats": "PNG, JPG",
  "limits": "50 MP",
  "keywords": [
   "screenshot beautifier",
   "beautify screenshot",
   "screenshot background",
   "screenshot frame",
   "social screenshot",
   "screenshot mockup",
   "gradient background",
   "share screenshot"
  ]
 },
 {
  "id": "placeholder-image",
  "name": "Placeholder image generator",
  "blurb": "Make a sized placeholder image as PNG or SVG with your text.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=placeholder-image",
  "formats": "PNG, SVG",
  "limits": "8000 × 8000 px",
  "keywords": [
   "placeholder",
   "dummy image",
   "mockup"
  ]
 },
 {
  "id": "svg-optimize",
  "name": "SVG optimizer",
  "blurb": "Shrink SVG files by removing editor data and extra precision.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=svg-optimize",
  "formats": "SVG",
  "limits": "20 files, 10 MB each",
  "keywords": [
   "svg",
   "minify svg",
   "svgo",
   "compress svg"
  ]
 },
 {
  "id": "voice-recorder",
  "name": "Voice recorder",
  "blurb": "Record from your microphone with a live level meter and save the audio.",
  "category": "Media",
  "status": "working",
  "route": "/media/?tool=voice-recorder",
  "formats": "WebM / M4A",
  "limits": "Runs on this device",
  "keywords": [
   "record",
   "microphone",
   "audio recorder",
   "voice memo",
   "mic test"
  ]
 },
 {
  "id": "tone-generator",
  "name": "Tone generator",
  "blurb": "Play a pure tone at any frequency and wave shape.",
  "category": "Media",
  "status": "working",
  "route": "/media/?tool=tone-generator",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "frequency",
   "hz",
   "sine wave",
   "tuning",
   "hearing test"
  ]
 },
 {
  "id": "metronome",
  "name": "Metronome",
  "blurb": "Steady beat at any tempo with accents and tap tempo.",
  "category": "Media",
  "status": "working",
  "route": "/media/?tool=metronome",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "bpm",
   "tempo",
   "beat",
   "music"
  ]
 },
 {
  "id": "video-merge",
  "name": "Video merger",
  "category": "Media",
  "route": "/media/?tool=video-merge",
  "blurb": "Join two or more videos into one — a fast join when the clips match, or re-encode any mix to fit.",
  "formats": "MP4, MOV, MKV, WebM, AVI to MP4, WebM or MKV",
  "limits": "10 clips; 1 GB total; 32 MB one-time download",
  "keywords": [
   "merge videos",
   "join videos",
   "combine videos",
   "video joiner",
   "merge mp4",
   "join mp4 files",
   "concatenate videos",
   "stitch videos",
   "merge clips",
   "video combiner"
  ],
  "status": "working"
 },
 {
  "id": "video-audio",
  "name": "Mute or replace video audio",
  "category": "Media",
  "route": "/media/?tool=video-audio",
  "blurb": "Take the sound off a video, or give it a new soundtrack — the picture is copied untouched.",
  "formats": "MP4, MOV, MKV, WebM, AVI + MP3, WAV, OGG, FLAC, M4A",
  "limits": "500 MB video; 200 MB audio; 32 MB one-time download",
  "keywords": [
   "mute video",
   "remove audio from video",
   "replace audio in video",
   "add music to video",
   "video soundtrack",
   "mute mp4",
   "silence video",
   "change video audio",
   "add audio to video",
   "video audio replace"
  ],
  "status": "working"
 },
 {
  "id": "video-speed",
  "name": "Video speed & loop",
  "category": "Media",
  "route": "/media/?tool=video-speed",
  "blurb": "Speed a video up or slow it down — sound keeps its pitch — and loop it in one file.",
  "formats": "MP4, MOV, MKV, WebM, AVI to MP4",
  "limits": "0.25×–4×; up to 10 plays; 500 MB; 32 MB one-time download",
  "keywords": [
   "change video speed",
   "speed up video",
   "slow down video",
   "slow motion",
   "fast motion",
   "loop video",
   "repeat video",
   "video speed",
   "2x video",
   "timelapse maker"
  ],
  "status": "working"
 },
 {
  "id": "audio-fx",
  "name": "Audio pitch, EQ & reverse",
  "category": "Media",
  "route": "/media/?tool=audio-fx",
  "blurb": "Change the pitch of a voice or song, boost the bass or treble, or play audio backwards.",
  "formats": "MP3, WAV, OGG, Opus, FLAC, M4A in and out",
  "limits": "500 MB; 32 MB one-time download",
  "keywords": [
   "change pitch",
   "pitch shifter",
   "lower voice pitch",
   "higher pitch",
   "audio equalizer",
   "bass boost",
   "reverse audio",
   "backwards audio",
   "chipmunk voice",
   "deepen voice"
  ],
  "status": "working"
 },
 {
  "id": "webcam-record",
  "name": "Webcam recorder",
  "category": "Media",
  "route": "/media/?tool=webcam-record",
  "blurb": "Record video from your webcam with sound — for greetings, practice takes and quick messages.",
  "formats": "Camera to MP4 or WebM",
  "limits": "Needs a camera and permission; nothing is uploaded",
  "keywords": [
   "webcam recorder",
   "record webcam",
   "camera recorder",
   "record video of myself",
   "webcam video",
   "record from camera",
   "video greeting",
   "online camera recorder",
   "record webcam video",
   "cam recorder"
  ],
  "status": "working"
 },
 {
  "id": "file-type",
  "name": "File type and hex viewer",
  "blurb": "Identify a file from its first bytes and view it as hex.",
  "category": "Archives",
  "status": "working",
  "route": "/archives/?tool=file-type",
  "formats": "Any file",
  "limits": "Runs on this device",
  "keywords": [
   "magic bytes",
   "file type",
   "hex",
   "mime",
   "what file is this"
  ]
 },
 {
  "id": "file-split",
  "name": "Split and join files",
  "blurb": "Cut a large file into parts of a set size and join parts back.",
  "category": "Archives",
  "status": "working",
  "route": "/archives/?tool=file-split",
  "formats": "Any file",
  "limits": "Up to about 2 GB; 999 parts",
  "keywords": [
   "split file",
   "join files",
   "chunks",
   "001"
  ]
 },
 {
  "id": "archive-extract",
  "name": "Archive extractor (TAR & GZ)",
  "blurb": "Open TAR, TAR.GZ, TGZ and GZ archives, save files out, or pack files into a new .tar.gz.",
  "category": "Archives",
  "status": "working",
  "route": "/archives/?tool=archive-extract",
  "formats": "TAR, TAR.GZ, TGZ, GZ",
  "limits": "1 GB in; 20,000 files; 7z/RAR not yet",
  "keywords": [
   "tar",
   "tar.gz",
   "tgz",
   "untar",
   "extract tar",
   "open tar.gz",
   "gzip",
   "gunzip",
   "tarball",
   "make tar.gz",
   "create tar.gz",
   "archive extractor"
  ]
 },
 {
  "id": "pdf-resize",
  "name": "Resize PDF pages",
  "blurb": "Fit every page onto A4, Letter or another paper size.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-resize",
  "formats": "PDF",
  "limits": "200 MB",
  "keywords": [
   "a4",
   "letter",
   "page size",
   "scale pdf",
   "resize pdf"
  ]
 },
 {
  "id": "pdf-edit-text",
  "name": "Edit PDF text",
  "blurb": "Tap any line of text in a PDF to change it, or add new text anywhere.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-edit-text",
  "formats": "PDF",
  "limits": "100 pages; 100 MB",
  "keywords": [
   "edit pdf",
   "change text in pdf",
   "pdf editor",
   "fix typo pdf",
   "edit resume pdf",
   "replace text",
   "modify pdf text",
   "pdf text editor"
  ]
 },
 {
  "id": "pdf-find-replace",
  "name": "Find & replace in PDF",
  "blurb": "Find a word or phrase in a PDF's text and replace it everywhere — the old text is removed from the file, not painted over.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-find-replace",
  "formats": "PDF → PDF",
  "limits": "100 pages; 100 MB",
  "keywords": [
   "find and replace pdf",
   "replace text in pdf",
   "edit words in pdf",
   "search and replace pdf"
  ]
 },
 {
  "id": "create-pdf",
  "name": "Create PDF",
  "blurb": "Write a document with headings, lists, tables and pictures, then save it as a PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=create-pdf",
  "formats": "Rich text to PDF",
  "limits": "Runs on this device",
  "keywords": [
   "make pdf",
   "new pdf",
   "write pdf",
   "pdf maker",
   "text to pdf",
   "document to pdf",
   "rich text pdf",
   "create document"
  ]
 },
 {
  "id": "txt-pdf",
  "name": "TXT to PDF",
  "blurb": "Turn a plain text file (.txt) or pasted text into a clean PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=txt-pdf",
  "formats": "TXT to PDF",
  "limits": "Text up to 5 MB; Latin text only",
  "keywords": [
   "txt to pdf",
   "text to pdf",
   "plain text to pdf",
   "txt file to pdf",
   "convert txt to pdf"
  ]
 },
 {
  "id": "markdown-pdf",
  "name": "Markdown to PDF",
  "blurb": "Turn Markdown (.md) into a neat PDF with headings, lists, tables and code.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=markdown-pdf",
  "formats": "MD, TXT to PDF",
  "limits": "5 MB of text",
  "keywords": [
   "md to pdf",
   "markdown pdf",
   "readme to pdf",
   "convert markdown",
   "md file to pdf",
   "github markdown pdf"
  ]
 },
 {
  "id": "html-pdf",
  "name": "HTML to PDF",
  "blurb": "Turn an HTML file or pasted HTML code into a PDF with its own styles.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=html-pdf",
  "formats": "HTML, HTM to PDF",
  "limits": "10 MB; scripts never run",
  "keywords": [
   "html to pdf",
   "web page to pdf",
   "code to pdf",
   "convert html",
   "htm to pdf",
   "html file pdf",
   "invoice html pdf"
  ]
 },
 {
  "id": "pptx-pdf",
  "name": "PowerPoint to PDF",
  "blurb": "Turn a PowerPoint presentation (.pptx) into a PDF, one page per slide.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pptx-pdf",
  "formats": "PPTX to PDF",
  "limits": "300 slides; 100 MB",
  "keywords": [
   "ppt to pdf",
   "pptx to pdf",
   "powerpoint pdf",
   "slides to pdf",
   "presentation to pdf",
   "convert powerpoint"
  ]
 },
 {
  "id": "pdf-pptx",
  "name": "PDF to PowerPoint",
  "blurb": "Turn each PDF page into a PowerPoint slide with text you can edit.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-pptx",
  "formats": "PDF to PPTX",
  "limits": "300 pages; 150 MB",
  "keywords": [
   "pdf to ppt",
   "pdf to pptx",
   "pdf to powerpoint",
   "pdf to slides",
   "convert pdf to presentation"
  ]
 },
 {
  "id": "pdf-html",
  "name": "PDF to HTML",
  "blurb": "Turn a PDF into a web page with real, selectable and searchable text.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-html",
  "formats": "PDF to HTML",
  "limits": "200 pages; 150 MB",
  "keywords": [
   "pdf to html",
   "pdf to web page",
   "publish pdf",
   "pdf to website",
   "convert pdf html"
  ]
 },
 {
  "id": "pdf-epub",
  "name": "PDF to EPUB",
  "blurb": "Turn a PDF into an EPUB e-book for Kindle, Kobo, Apple Books or any e-reader.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-epub",
  "formats": "PDF to EPUB",
  "limits": "500 pages; 150 MB",
  "keywords": [
   "pdf to epub",
   "pdf to ebook",
   "pdf to kindle",
   "ebook converter",
   "pdf to kobo",
   "epub maker"
  ]
 },
 {
  "id": "ebook-pdf",
  "name": "eBook to PDF",
  "blurb": "Turn an EPUB, MOBI, AZW3 or FB2 e-book into a PDF with its chapters and pictures.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=ebook-pdf",
  "formats": "EPUB, MOBI, AZW, AZW3, FB2 to PDF",
  "limits": "100 MB; DRM-free books only",
  "keywords": [
   "epub to pdf",
   "mobi to pdf",
   "azw3 to pdf",
   "ebook to pdf",
   "kindle to pdf",
   "fb2 to pdf",
   "convert ebook"
  ]
 },
 {
  "id": "pdf-audio",
  "name": "PDF to audio (read aloud)",
  "blurb": "Listen to a PDF read aloud by your device’s voices, with the text highlighted.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-audio",
  "formats": "PDF to TXT",
  "limits": "1,000 pages; uses device voices",
  "keywords": [
   "pdf to audio",
   "read pdf aloud",
   "pdf reader voice",
   "pdf text to speech",
   "listen to pdf",
   "pdf to speech",
   "audiobook pdf"
  ]
 },
 {
  "id": "pdf-summarize",
  "name": "Summarize PDF",
  "blurb": "Get the key points of a PDF and find the passages that answer your questions.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-summarize",
  "formats": "PDF to TXT",
  "limits": "1,000 pages; no AI model download",
  "keywords": [
   "summarize pdf",
   "pdf summary",
   "pdf summarizer",
   "key points",
   "tldr pdf",
   "ask pdf",
   "chat with pdf",
   "search pdf",
   "question pdf"
  ]
 },
 {
  "id": "pdf-privacy",
  "name": "PDF privacy check",
  "blurb": "Find hidden names, dates, photo GPS, comments, scripts and old versions, and remove them.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-privacy",
  "formats": "PDF",
  "limits": "150 MB",
  "keywords": [
   "pdf metadata remover",
   "remove author pdf",
   "pdf privacy",
   "gps in pdf",
   "hidden data pdf",
   "clean pdf",
   "sanitize pdf",
   "scrub pdf",
   "exif pdf"
  ]
 },
 {
  "id": "pdf-redact-check",
  "name": "Redaction checker",
  "blurb": "Audit a redacted PDF before sharing: live text under black boxes, unapplied redaction marks and earlier versions still inside.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-redact-check",
  "formats": "PDF",
  "limits": "150 MB",
  "keywords": [
   "check redaction",
   "is my pdf really redacted",
   "redaction verifier",
   "hidden text under black box"
  ]
 },
 {
  "id": "pdf-fingerprint",
  "name": "Fingerprint PDF",
  "blurb": "Give each person an invisibly marked copy so a leak can be traced to its source.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-fingerprint",
  "formats": "PDF",
  "limits": "100 copies; 100 MB",
  "keywords": [
   "pdf watermark invisible",
   "leak tracking",
   "trace pdf leak",
   "pdf tracking code",
   "marked copies",
   "forensic watermark",
   "document fingerprint"
  ]
 },
 {
  "id": "pdf-workflow",
  "name": "PDF Workflow runner",
  "blurb": "Run a preset of PDF steps in one click: Email Ready, Confidential or Archive, in order, on this device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-workflow",
  "formats": "PDF → PDF",
  "limits": "Runs on this device",
  "keywords": [
   "workflow",
   "preset",
   "batch",
   "email ready",
   "confidential",
   "archive",
   "compress",
   "watermark",
   "flatten",
   "protect"
  ]
 },
 {
  "id": "pdf-booklet",
  "name": "Create booklet",
  "blurb": "Reorder a PDF’s pages onto double-sided sheets that fold into a booklet — print, fold the stack in half and staple the fold.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-booklet",
  "formats": "PDF → PDF",
  "limits": "150 MB",
  "keywords": [
   "booklet",
   "imposition",
   "saddle stitch",
   "fold and staple",
   "print booklet"
  ]
 },
 {
  "id": "pdf-mail-merge",
  "name": "PDF mail merge",
  "blurb": "Fill a form PDF once for every row of a spreadsheet — certificates, tickets or invoices for a whole list, delivered as one ZIP.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-mail-merge",
  "formats": "PDF, CSV, XLSX → ZIP",
  "limits": "Up to 500 rows",
  "keywords": [
   "mail merge",
   "fill form from excel",
   "certificates from spreadsheet",
   "bulk fill pdf",
   "merge spreadsheet into pdf"
  ]
 },
 {
  "id": "pdf-auto-rotate",
  "name": "Auto-rotate PDF pages",
  "blurb": "Find pages whose text runs sideways or upside down and turn them upright, page by page.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-auto-rotate",
  "formats": "PDF → PDF",
  "limits": "150 MB",
  "keywords": [
   "auto rotate pdf",
   "fix sideways pages",
   "upside down pdf",
   "rotate pages automatically",
   "orientation"
  ]
 },
 {
  "id": "pdf-bookmarks",
  "name": "Edit PDF bookmarks",
  "blurb": "See, add, rename, reorder and delete a PDF’s bookmarks — or build them from its headings.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-bookmarks",
  "formats": "PDF → PDF",
  "limits": "150 MB",
  "keywords": [
   "bookmarks",
   "outline editor",
   "table of contents",
   "add bookmarks to pdf",
   "edit outline"
  ]
 },
 {
  "id": "eml-to-pdf",
  "name": "Email to PDF",
  "blurb": "Turn a saved email (.eml) into a PDF with its headers, its message and a list of its attachments.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=eml-to-pdf",
  "formats": "EML → PDF",
  "limits": "25 MB",
  "keywords": [
   "eml to pdf",
   "email to pdf",
   "convert email",
   "save email as pdf",
   "outlook email"
  ]
 },
 {
  "id": "cbz-to-pdf",
  "name": "CBZ to PDF",
  "blurb": "Turn a comic book archive (.cbz) into a PDF, one picture per page, in reading order.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=cbz-to-pdf",
  "formats": "CBZ, ZIP → PDF",
  "limits": "150 MB",
  "keywords": [
   "cbz to pdf",
   "comic book pdf",
   "cbz converter",
   "manga to pdf",
   "comic archive"
  ]
 },
 {
  "id": "salary-calc",
  "name": "Salary converter",
  "blurb": "Convert pay between hourly, daily, weekly, monthly and yearly.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=salary-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "hourly",
   "annual",
   "wage",
   "pay",
   "salary"
  ]
 },
 {
  "id": "pace-calc",
  "name": "Running pace calculator",
  "blurb": "Pace, finish time or distance for a run, walk or ride.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=pace-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "running",
   "pace",
   "marathon",
   "5k",
   "speed"
  ]
 },
 {
  "id": "elec-cost",
  "name": "Electricity cost calculator",
  "blurb": "Running cost and energy use of an appliance per day, month and year.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=elec-cost",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "electricity",
   "power bill",
   "kwh",
   "appliance",
   "energy"
  ]
 },
 {
  "id": "hijri-date",
  "name": "Hijri ↔ Gregorian date converter",
  "blurb": "Convert dates between the Hijri (Umm al-Qura) and Gregorian calendars, both ways. Shows today in both.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=hijri-date",
  "formats": "Text and numbers",
  "limits": "1300–1600 AH (1882–2174); runs on this device",
  "keywords": [
   "hijri",
   "hijri date",
   "islamic date",
   "umm al-qura",
   "umm al qura",
   "hijri to gregorian",
   "gregorian to hijri",
   "arabic calendar",
   "islamic calendar",
   "saudi calendar",
   "ramadan date",
   "التاريخ الهجري",
   "هجري",
   "ميلادي",
   "تحويل التاريخ",
   "ام القرى"
  ]
 },
 {
  "id": "zakat-calc",
  "name": "Zakat calculator",
  "blurb": "Zakat on cash, gold, silver, shares and money owed to you, minus debts, with the nisab check.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=zakat-calc",
  "formats": "Text and numbers",
  "limits": "Enter today's gold or silver price; runs on this device",
  "keywords": [
   "zakat",
   "zakah",
   "zakaat",
   "nisab",
   "gold zakat",
   "2.5%",
   "islamic",
   "charity",
   "sadaqah",
   "زكاة",
   "الزكاة",
   "حساب الزكاة",
   "نصاب"
  ]
 },
 {
  "id": "eos-gratuity",
  "name": "End-of-service award (Saudi Arabia)",
  "blurb": "Saudi end-of-service gratuity under Labor Law Articles 84–87, with resignation rules and a breakdown.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=eos-gratuity",
  "formats": "Text and numbers",
  "limits": "Estimate, not legal advice; runs on this device",
  "keywords": [
   "end of service",
   "eos",
   "eosb",
   "gratuity",
   "saudi gratuity",
   "ksa",
   "labour law",
   "labor law",
   "article 84",
   "resignation",
   "final settlement",
   "مكافأة نهاية الخدمة",
   "نهاية الخدمة",
   "مستحقات",
   "استقالة"
  ]
 },
 {
  "id": "gpa-calc",
  "name": "GPA calculator",
  "blurb": "Weighted grade point average from your courses, grades and credits.",
  "category": "Calculators",
  "status": "working",
  "route": "/calculators/?tool=gpa-calc",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "gpa",
   "cgpa",
   "grades",
   "credits",
   "grade point average",
   "student"
  ]
 },
 {
  "id": "spin-wheel",
  "name": "Spin the wheel",
  "blurb": "Put names on a wheel, spin it and let it pick a winner.",
  "category": "Everyday",
  "status": "working",
  "route": "/everyday/?tool=spin-wheel",
  "formats": "Text and numbers",
  "limits": "Runs on this device",
  "keywords": [
   "wheel",
   "spinner",
   "pick",
   "raffle",
   "names",
   "random winner",
   "lucky draw"
  ]
 },
 {
  "id": "audio-studio",
  "name": "Audio studio — karaoke, stems & vocal remover",
  "blurb": "Cut the part you want, then make karaoke (instant or AI), split drums/bass/other/vocals, save the acapella too, or clean up noise.",
  "category": "Media",
  "status": "working",
  "route": "/media/?tool=audio-studio",
  "formats": "MP3, WAV, M4A, OGG, FLAC and video sound in; WAV out",
  "limits": "Instant jobs need stereo; AI jobs up to 10 min per part; stem mixer needs a strong desktop",
  "keywords": [
   "karaoke",
   "vocal remover",
   "remove vocals",
   "acapella",
   "vocals only",
   "instrumental maker",
   "stem",
   "stem splitter",
   "drums remover",
   "denoise",
   "remove noise",
   "audio studio",
   "karaoke maker",
   "bass rescue",
   "ai karaoke"
  ]
 },
 {
  "id": "text-handwriting",
  "name": "Text to handwriting",
  "blurb": "Type or paste text and get it back as handwritten pages — PNG pictures and a PDF.",
  "category": "Text",
  "status": "working",
  "route": "/text/?tool=text-handwriting",
  "formats": "Text to PNG, PDF",
  "limits": "About 60 pages; Latin text in three handwriting fonts",
  "keywords": [
   "text to handwriting",
   "handwriting converter",
   "handwritten notes",
   "write my assignment",
   "text to handwritten",
   "handwriting generator",
   "handwritten pages"
  ]
 },
 {
  "id": "pdf-handwriting",
  "name": "PDF to handwriting",
  "blurb": "Read a PDF's text and write it out again as handwritten pages — PNG pictures and a PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-handwriting",
  "formats": "PDF to PNG, PDF",
  "limits": "200 source pages; text layer only, no pictures",
  "keywords": [
   "pdf to handwriting",
   "pdf to handwritten",
   "handwritten pdf",
   "convert pdf to handwriting",
   "assignment from pdf"
  ]
 },
 {
  "id": "thumbmark-maker",
  "name": "Thumbmark maker",
  "blurb": "Make a fingerprint-style thumb mark for forms: grown from a name, drawn, or cleaned up from a photo. Decorative — not a real fingerprint.",
  "category": "Design",
  "status": "working",
  "route": "/design/?tool=thumbmark-maker",
  "formats": "PNG (transparent)",
  "limits": "A decorative mark, never a biometric",
  "keywords": [
   "thumbmark",
   "thumb impression",
   "fingerprint maker",
   "thumb print png",
   "fingerprint png",
   "angootha",
   "thumb impression png",
   "fingerprint style mark"
  ]
 },
 {
  "id": "pdf-to-tiff",
  "name": "PDF to TIFF",
  "blurb": "Render a PDF's pages into one multi-page TIFF file, at 150, 200 or 300 dpi, colour or grayscale.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-to-tiff",
  "formats": "PDF to TIFF",
  "limits": "50 pages; rendered pictures, text not selectable",
  "keywords": [
   "pdf to tiff",
   "pdf to tif",
   "convert pdf to tiff",
   "multi-page tiff",
   "pdf to tiff 300 dpi",
   "tiff converter"
  ]
 },
 {
  "id": "resume-builder",
  "name": "Resume builder",
  "blurb": "Fill in your details and get a clean resume PDF — three restrained templates, single-column ATS-friendly layout.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=resume-builder",
  "formats": "PDF, TXT",
  "limits": "Runs on this device; nothing is kept",
  "keywords": [
   "resume builder",
   "cv maker",
   "make resume",
   "resume pdf",
   "curriculum vitae",
   "ats resume",
   "bio data maker"
  ]
 },
 {
  "id": "pdf-form-creator",
  "name": "PDF form creator",
  "blurb": "Turn any PDF into a fillable form: drag a box on the page for each text field, checkbox, radio group or dropdown, then save a real AcroForm PDF.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-form-creator",
  "formats": "PDF → PDF",
  "limits": "Fields placed by hand; 150 MB",
  "keywords": [
   "create fillable form",
   "form creator",
   "make pdf fillable",
   "add form fields",
   "acroform maker"
  ]
 },
 {
  "id": "pdf-form-data",
  "name": "Extract form data",
  "blurb": "Read every field of a filled PDF form into a table — name, type and value — and save it as JSON or CSV.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-form-data",
  "formats": "PDF → JSON, CSV",
  "limits": "AcroForm fields only",
  "keywords": [
   "extract form data",
   "pdf form to json",
   "pdf form to csv",
   "read form fields",
   "form responses"
  ]
 },
 {
  "id": "pdf-split-barcode",
  "name": "Split PDF by barcode",
  "blurb": "Start a new file at every page carrying a barcode or QR separator sheet; each file is named by the code it starts with.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-split-barcode",
  "formats": "PDF → PDF",
  "limits": "Codes read from page pictures; 200 pages",
  "keywords": [
   "split by barcode",
   "split by qr",
   "separator sheets",
   "batch scan split",
   "barcode split"
  ]
 },
 {
  "id": "pdf-barcode-read",
  "name": "Read barcodes in PDF",
  "blurb": "Find every barcode and QR code printed on the pages of a PDF: which page, which kind, and what it says, ready to copy or save as CSV.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-barcode-read",
  "formats": "PDF",
  "limits": "Codes read from page pictures; 200 pages",
  "keywords": [
   "read barcode from pdf",
   "scan qr in pdf",
   "find barcodes",
   "barcode reader pdf",
   "extract qr codes"
  ]
 },
 {
  "id": "pdf-barcode-stamp",
  "name": "Stamp barcode on PDF",
  "blurb": "Print a QR code or Code 128 barcode carrying your text onto the pages of a PDF — invoices, shipping labels and asset tags.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-barcode-stamp",
  "formats": "PDF → PDF",
  "limits": "QR or Code 128; 150 MB",
  "keywords": [
   "add barcode to pdf",
   "stamp qr code",
   "barcode on invoice",
   "label pdf",
   "asset tag"
  ]
 },
 {
  "id": "pdf-redact-terms",
  "name": "Redact by term",
  "blurb": "Remove words or phrases from a PDF for good — every occurrence is deleted from the file itself and blacked out.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-redact-terms",
  "formats": "PDF → PDF",
  "limits": "100 pages; 100 MB",
  "keywords": [
   "redact word",
   "remove word from pdf",
   "redact by term",
   "find and redact",
   "black out text",
   "remove name from pdf"
  ]
 },
 {
  "id": "pdf-compare-text",
  "name": "Compare PDF text",
  "blurb": "Compare the words of two PDFs page by page — lines added, lines removed, and a report to download.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-compare-text",
  "formats": "PDF + PDF → TXT",
  "limits": "Text layer only; 200 pages",
  "keywords": [
   "compare pdf text",
   "diff pdf",
   "pdf text difference",
   "compare two pdfs",
   "document diff"
  ]
 },
 {
  "id": "pdf-deskew",
  "name": "Deskew PDF",
  "blurb": "Straighten PDF pages scanned a degree or two crooked — the tilt is measured, then the page is rotated level.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-deskew",
  "formats": "PDF → PDF",
  "limits": "Tilts up to 5°; 100 pages",
  "keywords": [
   "deskew pdf",
   "straighten pdf",
   "fix crooked scan",
   "skewed pdf",
   "tilted pages"
  ]
 },
 {
  "id": "image-auto-crop",
  "name": "Auto-crop image",
  "category": "Images",
  "route": "/images/?tool=image-auto-crop",
  "blurb": "Trim the plain border off images automatically — the border colour is read from each picture’s own corners.",
  "formats": "JPG, PNG, WebP",
  "limits": "Batch; 40 MP per image",
  "keywords": [
   "auto crop image",
   "trim borders",
   "remove white border",
   "crop margins",
   "trim image"
  ],
  "status": "working"
 },
 {
  "id": "pdf-extract-tables",
  "name": "Extract tables",
  "blurb": "Find only the tables in a PDF and export each one to its own Excel sheet or CSV, with a preview first.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-extract-tables",
  "formats": "PDF → XLSX / CSV",
  "limits": "100 MB; 300 pages; text PDFs",
  "keywords": [
   "extract tables from pdf",
   "pdf table extractor",
   "pdf tables to excel",
   "pdf table to csv",
   "tabula",
   "only tables"
  ]
 },
 {
  "id": "pdf-pdfa",
  "name": "PDF to PDF/A",
  "blurb": "Convert a PDF to PDF/A (1b, 2b or 3b) for long-term archiving — fonts embedded, sRGB colour profile added, checked afterwards.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-pdfa",
  "formats": "PDF → PDF/A",
  "limits": "100 MB; not a certification — check with veraPDF",
  "keywords": [
   "pdf to pdf/a",
   "pdfa",
   "pdf/a-2b",
   "pdf/a-1b",
   "archive pdf",
   "long-term archiving",
   "iso 19005",
   "convert to pdfa"
  ]
 },
 {
  "id": "pdf-sign-cert",
  "name": "Sign PDF with a certificate",
  "blurb": "Apply a real digital signature with your .p12/.pfx certificate, or check who signed a PDF and whether it changed since.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-sign-cert",
  "formats": "PDF + .p12/.pfx → signed PDF",
  "limits": "100 MB; RSA or ECDSA certificate; no timestamp server",
  "keywords": [
   "digital signature",
   "sign pdf with certificate",
   "pfx",
   "p12",
   "pades",
   "verify pdf signature",
   "certificate signature",
   "validate signed pdf"
  ]
 },
 {
  "id": "image-circle-crop",
  "name": "Circle crop",
  "blurb": "Crop a photo into a circle for a profile picture — zoom, move, and save with a transparent or coloured background.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-circle-crop",
  "formats": "JPG, PNG, WebP, HEIC → PNG",
  "limits": "50 MP",
  "keywords": [
   "circle crop",
   "round profile picture",
   "crop image in circle",
   "circular image",
   "round photo",
   "dp maker"
  ]
 },
 {
  "id": "image-print-size",
  "name": "Resize for print",
  "blurb": "Resize a photo to an exact print size in cm, mm or inches at the DPI you need — the DPI is saved in the file.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-print-size",
  "formats": "JPG, PNG, WebP, HEIC → JPG, PNG",
  "limits": "50 MP",
  "keywords": [
   "resize image in cm",
   "resize photo in inches",
   "print size image",
   "3.5 x 4.5 cm photo",
   "image size for print 300 dpi",
   "resize to mm"
  ]
 },
 {
  "id": "long-image-pdf",
  "name": "Long screenshot to PDF",
  "blurb": "Cut a long screenshot or tall picture into paper-sized PDF pages, without slicing lines of text in half.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=long-image-pdf",
  "formats": "JPG, PNG, WebP, HEIC → PDF",
  "limits": "80 MB; 200 MP",
  "keywords": [
   "long screenshot to pdf",
   "scrolling screenshot pdf",
   "tall image to pdf pages",
   "split long image into pages",
   "chat screenshot to pdf"
  ]
 },
 {
  "id": "pdf-long-image",
  "name": "PDF to long image",
  "blurb": "Turn the pages of a PDF into one long picture — easy to send in a chat or scroll on a phone.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-long-image",
  "formats": "PDF → JPG, PNG",
  "limits": "300 pages; 150 MB",
  "keywords": [
   "pdf to long image",
   "pdf to one image",
   "pdf pages to single jpg",
   "stitch pdf pages",
   "pdf to long screenshot"
  ]
 },
 {
  "id": "pdf-margins",
  "name": "Add margins to PDF",
  "blurb": "Add white space around PDF pages — for binding, hole punching or notes — or keep the paper size and shrink the content.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-margins",
  "formats": "PDF → PDF",
  "limits": "Lossless when pages grow; 150 MB",
  "keywords": [
   "add margin to pdf",
   "pdf margins",
   "binding margin",
   "gutter pdf",
   "add white space pdf",
   "pdf padding"
  ]
 },
 {
  "id": "pdf-poster",
  "name": "PDF poster (tile print)",
  "blurb": "Print one PDF page as a big poster across several A4 or Letter sheets, with glue overlap and cut marks.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-poster",
  "formats": "PDF → PDF",
  "limits": "Up to 10 × 10 sheets; 150 MB",
  "keywords": [
   "pdf poster",
   "tile print pdf",
   "print poster on a4",
   "split page across pages",
   "enlarge pdf print",
   "poster printing"
  ]
 },
 {
  "id": "image-blend",
  "name": "Blend two images",
  "blurb": "Lay one photo over another with screen, multiply, overlay, soft-light or lighten blending — the classic double exposure, with an opacity slider.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-blend",
  "formats": "JPG, PNG, WebP",
  "limits": "40 MP per image",
  "keywords": [
   "double exposure",
   "blend images",
   "photo blend",
   "overlay two photos",
   "screen blend",
   "multiply blend"
  ]
 },
 {
  "id": "pixel-art",
  "name": "Pixel art converter",
  "blurb": "Turn a photo into pixel art: shrink it to a small grid, optionally squeeze its colours into a small palette, and export it big and blocky.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=pixel-art",
  "formats": "JPG, PNG, WebP to PNG",
  "limits": "40 MP",
  "keywords": [
   "pixel art maker",
   "pixelate image",
   "photo to pixel art",
   "8-bit converter",
   "pixelize photo"
  ]
 },
 {
  "id": "psd-convert",
  "name": "PSD to PNG / JPG / PDF",
  "blurb": "Open a Photoshop PSD and save its flattened picture as a PNG, JPG or PDF — the layers merged exactly as they were saved.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=psd-convert",
  "formats": "PSD to PNG, JPG, PDF",
  "limits": "One file; 40 MP",
  "keywords": [
   "psd to png",
   "psd to jpg",
   "psd to pdf",
   "open psd",
   "photoshop file converter",
   "flattened psd"
  ]
 },
 {
  "id": "djvu-to-pdf",
  "name": "DjVu to PDF",
  "blurb": "Convert DjVu e-books and scans — the old-library format — into an ordinary PDF, decoded on your device.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=djvu-to-pdf",
  "formats": "DjVu → PDF",
  "limits": "200 pages; 150 MB",
  "keywords": [
   "djvu to pdf",
   "convert djvu",
   "djvu converter",
   "djvu file to pdf",
   "open djvu file"
  ]
 },
 {
  "id": "pdf-auto-crop",
  "name": "Auto-crop PDF",
  "blurb": "Trim the blank margins off every page automatically — the content is found and each page is fitted to it, text still text.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-auto-crop",
  "formats": "PDF → PDF",
  "limits": "100 pages; 150 MB",
  "keywords": [
   "auto crop pdf",
   "trim pdf margins automatically",
   "remove white margins pdf",
   "crop pdf to content",
   "pdf margin remover",
   "fit pdf page to content"
  ]
 },
 {
  "id": "pdf-long-page",
  "name": "PDF to one long page",
  "blurb": "Stack all the pages of a PDF into one long page — top to bottom, still real text and drawings, not a picture.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-long-page",
  "formats": "PDF → PDF",
  "limits": "Total height ≤ 14,400 pt; 150 MB",
  "keywords": [
   "pdf to one long page",
   "stitch pdf pages into one page",
   "combine pdf pages vertically",
   "long page pdf",
   "continuous scroll pdf",
   "merge pdf pages into single page"
  ]
 },
 {
  "id": "pdf-measure",
  "name": "Measure PDF",
  "blurb": "Measure distances and areas on plans and drawings: calibrate the scale once, then click to measure, with a CSV export.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-measure",
  "formats": "PDF → CSV",
  "limits": "150 MB",
  "keywords": [
   "measure pdf",
   "pdf distance measurement",
   "measure area in pdf",
   "pdf scale calibration",
   "measure blueprint pdf",
   "floor plan measurement"
  ]
 },
 {
  "id": "pdf-rename-content",
  "name": "Rename PDFs by content",
  "blurb": "Name a batch of PDFs after their own titles or first-page headings — preview every name, then download them renamed.",
  "category": "PDF",
  "status": "working",
  "route": "/pdf/?tool=pdf-rename-content",
  "formats": "PDF → PDF",
  "limits": "50 files; 150 MB each",
  "keywords": [
   "rename pdf by content",
   "batch rename pdf by title",
   "rename pdf files automatically",
   "pdf rename from heading",
   "bulk rename pdf"
  ]
 },
 {
  "id": "crypto-qr",
  "name": "Crypto payment QR",
  "blurb": "Make a payment QR for a Bitcoin, Litecoin or Ethereum address, with an optional amount and label.",
  "category": "QR",
  "status": "working",
  "route": "/qr/?tool=crypto-qr",
  "formats": "PNG, SVG",
  "limits": "One address; check it before you share it",
  "keywords": [
   "bitcoin qr",
   "btc payment qr",
   "litecoin qr",
   "ethereum qr",
   "crypto payment",
   "wallet address qr",
   "bip21",
   "receive crypto"
  ]
 },
 {
  "id": "html-image",
  "name": "HTML to image",
  "blurb": "Turn an HTML file or pasted HTML code into a PNG picture with its own styles.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=html-image",
  "formats": "HTML, HTM to PNG",
  "limits": "2 MB; scripts never run",
  "keywords": [
   "html to image",
   "html to png",
   "web page to image",
   "code to image",
   "render html",
   "html screenshot",
   "htm to png",
   "invoice html image"
  ]
 },
 {
  "id": "image-upscale",
  "name": "Upscale image",
  "blurb": "Make a photo 2x, 3x or 4x bigger with smooth resampling, on this device.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-upscale",
  "formats": "JPG, PNG, WebP, AVIF → JPG, PNG or WebP",
  "limits": "50 MP in; 100 MP out",
  "keywords": [
   "upscale image",
   "enlarge photo",
   "increase resolution",
   "make image bigger",
   "2x 4x upscale",
   "resize up",
   "photo enlarger",
   "bigger image no upload"
  ]
 },
 {
  "id": "image-workflow",
  "name": "Image Workflow runner",
  "blurb": "Run a preset of image steps in one click: Web ready, Small grey WebP or Turn, frame, keep as PNG, in order, on this device.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=image-workflow",
  "formats": "JPG, PNG, WebP, AVIF → JPG, PNG or WebP",
  "limits": "Runs on this device",
  "keywords": [
   "image workflow",
   "preset",
   "batch image steps",
   "web ready",
   "resize and compress",
   "rotate border save",
   "pipeline",
   "chain image tools"
  ]
 },
 {
  "id": "app-icon",
  "name": "App icon set maker",
  "blurb": "Make Apple, Android, Play Store and web app icon sets from one artwork.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=app-icon",
  "formats": "PNG/JPG to PNG zip",
  "limits": "50 MP",
  "keywords": [
   "app icon",
   "app icon generator",
   "ios icon",
   "android icon",
   "adaptive icon",
   "appiconset",
   "play store icon",
   "pwa icon",
   "monochrome icon",
   "icon set"
  ]
 },
 {
  "id": "blurhash",
  "name": "BlurHash generator",
  "blurb": "Make a BlurHash placeholder string from a picture, or decode a hash to an image.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=blurhash",
  "formats": "Image to hash / hash to PNG",
  "limits": "50 MP",
  "keywords": [
   "blurhash",
   "blurhash generator",
   "blurhash decode",
   "image placeholder",
   "blur placeholder",
   "thumbhash alternative"
  ]
 },
 {
  "id": "exam-photo",
  "name": "Exam photo & signature prep",
  "blurb": "Crop and compress photo, signature and thumb scans to exam portal rules (IBPS, GATE, UPSC, NEET).",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=exam-photo",
  "formats": "Images to exact-size JPG",
  "limits": "40 MP",
  "keywords": [
   "exam photo resize",
   "ibps photo resize",
   "gate photo resize",
   "upsc photo signature",
   "neet photo resize",
   "signature resize kb",
   "photo 200x230",
   "thumb impression resize",
   "photo signature join",
   "exam form photo"
  ]
 },
 {
  "id": "og-image",
  "name": "Social card (OG image) maker",
  "blurb": "Design a 1200×630 link-preview card and copy the Open Graph meta tags.",
  "category": "Web",
  "status": "working",
  "route": "/web/?tool=og-image",
  "formats": "Text to PNG / JPG card",
  "limits": "20 MP logo",
  "keywords": [
   "og image",
   "open graph image",
   "social card",
   "link preview image",
   "twitter card image",
   "og:image generator",
   "1200x630"
  ]
 },
 {
  "id": "text-on-photo",
  "name": "Text on photo",
  "blurb": "Add captions anywhere on a photo - top, bottom or any free position.",
  "category": "Images",
  "status": "working",
  "route": "/images/?tool=text-on-photo",
  "formats": "JPG/PNG to JPG",
  "limits": "40 MP",
  "keywords": [
   "text on photo",
   "add text to image",
   "photo caption",
   "write on picture",
   "caption maker",
   "label photo"
  ]
 }
]
