# Bench — Full Reference > Fast, private utilities for text, JSON, images and video, audio, files, hashing, time, color, math and the web. Every tool runs in your browser — no uploads, no accounts, no tracking of what you paste. ## Text & Encoding Base64, URL and HTML encoding, case conversion, full-width / half-width, address checksums, and 40+ other text transforms — instant and reversible. ### Text Transformer URL: https://bench.bozmoz.com/text/transform A unified text transformer: Base64, URL and HTML encoding, hex, binary, case conversion, full-width/half-width, slugify, Morse, ROT13 and more. Runs entirely in your browser. How it works: Pick a transform, paste your text, and the result updates instantly. Every transform is a pure function that runs locally in your browser — your text is never uploaded. The selected transform and input are stored in the URL, so any result is one copy-paste away from being reproduced. Q: Is my text uploaded anywhere? A: No. Every transform runs locally in your browser using JavaScript. Nothing is sent to a server. Q: Can I share a result? A: Yes. The transform and input are encoded in the page URL, so copying the address bar (or the Share button) reproduces your exact result. Q: Which transforms are supported? A: Over 45, including Base64, URL, HTML entities, hex, binary, Unicode escapes, all common case styles, full-width/half-width, line operations, Ethereum EIP-55 checksums, Keccak-256, Morse and ROT13. ### Base64 Encode & Decode URL: https://bench.bozmoz.com/text/base64 Encode text to Base64 or decode Base64 back to text, including URL-safe Base64URL. UTF-8 aware and fully client-side — paste, convert, copy. How it works: Base64 represents binary data using 64 ASCII characters, commonly used to embed data in URLs, JSON, data URIs and email. This tool is UTF-8 aware, so emoji and non-Latin scripts encode and decode correctly. Base64URL swaps + and / for - and _ and drops padding so the result is safe inside URLs. Q: What is the difference between Base64 and Base64URL? A: Base64URL is a URL- and filename-safe variant: it replaces '+' with '-', '/' with '_', and omits '=' padding, so it can be used in query strings and paths without escaping. Q: Does it handle Unicode? A: Yes. Text is encoded as UTF-8 before Base64, so emoji and non-Latin characters round-trip correctly. Q: Is it safe to paste sensitive data? A: Encoding happens entirely in your browser; nothing is uploaded. That said, Base64 is encoding, not encryption — it is not a way to keep data secret. ### URL Encode & Decode URL: https://bench.bozmoz.com/text/url-encode Encode text for query strings and URLs (percent-encoding) or decode an encoded URL back to readable text. Handles UTF-8 and runs locally. How it works: URLs may only contain a limited set of characters, so spaces, punctuation and non-ASCII text must be percent-encoded (for example a space becomes %20). This tool uses the same rules as the browser's encodeURIComponent/decodeURIComponent and is UTF-8 aware. Q: What does %20 mean? A: %20 is the percent-encoded form of a space character. Percent-encoding represents reserved or non-ASCII characters as a % followed by their hexadecimal byte value. Q: Why didn’t my slashes get encoded? A: This tool encodes a value as a single URL component, so reserved characters like / and ? are escaped. Use it for query-string values rather than whole URLs. ### HTML Entity Encode & Decode URL: https://bench.bozmoz.com/text/html-entities Encode characters like <, >, & and quotes into HTML entities, or decode named and numeric entities back to text. Prevent broken markup and XSS. How it works: Certain characters have special meaning in HTML. Encoding &, <, >, " and ' as entities (like & and <) lets you display them literally and helps prevent cross-site scripting when injecting user content. Decoding converts named and numeric entities back to characters. Q: Which characters get encoded? A: The five HTML-significant characters: & < > " and '. Decoding also understands numeric entities such as © and 😀. Q: Does this prevent XSS by itself? A: Entity-encoding untrusted text before inserting it into HTML is an important defense, but full XSS protection depends on context (attributes, scripts, URLs). Use a framework's escaping where possible. ### Gzip / Deflate Compressor URL: https://bench.bozmoz.com/text/gzip Compress text to gzip, zlib (deflate) or raw deflate and get Base64 output — or paste Base64/hex of compressed data and decompress it. Runs on the browser's native compression engine, nothing is uploaded. How it works: In Compress mode, your text is UTF-8 encoded and compressed with the browser's native CompressionStream — choose gzip (RFC 1952, the .gz / Content-Encoding: gzip format), deflate (RFC 1950, the zlib wrapper) or deflate-raw (RFC 1951, a bare stream) — and the result is shown as Base64 with exact before/after byte counts and the compression ratio. In Decompress mode, paste Base64 (standard or URL-safe) or a hex string of compressed data: the container is auto-detected from its magic bytes (1f 8b for gzip, 78 xx for zlib) with raw deflate as the fallback, and the decompressed text appears instantly — or, if the payload isn't UTF-8 text, you can download the raw bytes. Everything runs locally; gzip output can also be saved as a .gz file. Q: Is my data uploaded anywhere? A: No. Compression and decompression use the browser's built-in CompressionStream / DecompressionStream APIs and run entirely on your device. Q: What's the difference between gzip, deflate and deflate-raw? A: All three use the same DEFLATE algorithm. gzip (RFC 1952) adds a header and CRC and is used for .gz files and HTTP Content-Encoding: gzip; deflate (RFC 1950) is the lighter zlib wrapper with an Adler-32 checksum; deflate-raw (RFC 1951) is the bare stream with no header at all. Q: How does decompression know which format I pasted? A: It sniffs the magic bytes — 1f 8b means gzip and 0x78 with a valid check byte means zlib — then falls back to trying raw deflate. The detected format is shown with the result. Q: Can I decompress a hex string instead of Base64? A: Yes. Input that looks like hex (only 0-9 a-f, even length) is parsed as hex; anything else is treated as Base64, including URL-safe Base64. Q: Why is the Base64 output longer than the compressed size? A: Base64 encodes 3 bytes into 4 characters, adding about 33% on top of the compressed byte count. The stats line shows the true compressed size in bytes; use Save to download the raw .gz bytes. Q: Is Brotli or Zstandard supported? A: Not yet — browsers don't expose Brotli or zstd through CompressionStream. This tool supports what the platform provides natively: gzip, deflate (zlib) and deflate-raw. ### Case Converter URL: https://bench.bozmoz.com/text/case-converter Convert text between camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Title Case, sentence case and other styles. Great for variable and slug naming. How it works: The converter intelligently splits your input into words — handling existing camelCase, snake_case, kebab-case and spaces — then re-joins them in the style you pick. This makes it easy to rename variables, build URL slugs or normalize headings. Q: How does it detect word boundaries? A: It splits on spaces, underscores, hyphens and dots, and also on camelCase boundaries (a lowercase letter followed by an uppercase one), so 'getHTTPResponse' becomes the words get, HTTP, Response. Q: What is CONSTANT_CASE? A: Uppercase words joined by underscores (also called SCREAMING_SNAKE_CASE), commonly used for constants and environment variables. ### ASCII Table & Character Codes URL: https://bench.bozmoz.com/text/ascii-generator A full ASCII table reference and a character-code converter: turn text into decimal, hex, octal, binary or HTML-entity codes and back. Many representations, one tool. How it works: Three modes: a searchable ASCII table (0–127 or 0–255) showing each character's decimal, hex, octal, binary, HTML entity and control-code name; an Encode mode that converts text to per-character codes in your chosen format and separator; and a Decode mode that turns codes back into text. Useful for debugging encodings, building escape sequences and learning the ASCII set. Q: What representations does it show? A: For every character: decimal, hexadecimal, octal, 8-bit binary, HTML numeric entity, and (for control characters) the standard name like NUL, TAB, LF or DEL. Q: Can it convert text to ASCII codes and back? A: Yes. Encode mode turns text into codes (decimal, hex, octal, binary, HTML entity or \x/\u escapes); Decode mode reconstructs the original text from codes. ### Full-width ↔ Half-width Converter (Zenkaku / Hankaku) URL: https://bench.bozmoz.com/text/full-width Convert ASCII and katakana to full-width (zenkaku) or back to half-width (hankaku), including half-width katakana ↔ full-width katakana. Normalize Japanese text and form input instantly, in your browser. How it works: In Japanese typography, Latin letters, digits and katakana exist in both full-width (zenkaku, occupying a full em square) and half-width (hankaku) forms. This converter maps ASCII to its full-width range and back, and converts half-width katakana (アイウ) to and from full-width katakana (アイウ). It also converts between hiragana and katakana. These conversions are essential when normalizing user input before storing, searching or comparing Japanese text — for example, unifying ハンカク and ハンカク so they match. Q: What are zenkaku (全角) and hankaku (半角)? A: Zenkaku are full-width characters that occupy one em square; hankaku are half-width. The same letter or katakana can appear in either form, and Japanese systems often normalize one to the other before storage or comparison. Q: Does it convert half-width katakana? A: Yes. Half-width katakana like アイウ (hankaku) convert to full-width アイウ (zenkaku) and back, alongside ASCII letters, digits and punctuation. Q: Can it convert hiragana to katakana? A: Yes — use the Hiragana → Katakana and Katakana → Hiragana modes to switch between the two kana scripts (ひらがな ⇄ カタカナ). Q: Why normalize full-width and half-width text? A: Mixed widths cause string comparisons and searches to fail (e.g. ABC vs ABC, or ハンカク vs ハンカク). Normalizing to a single width makes data consistent and searchable. ### Katakana ↔ Hiragana Converter URL: https://bench.bozmoz.com/text/kana-converter Convert hiragana to katakana or katakana to hiragana instantly, and switch half-width katakana to full-width. A fast, private Japanese kana converter that runs in your browser. How it works: Japanese uses two kana scripts: hiragana (ひらがな) for native words and grammar, and katakana (カタカナ) for loanwords and emphasis. The two map one-to-one, so converting between them is a direct character shift. Paste any kana text to convert it; you can also switch half-width katakana to full-width. Everything runs locally — your text is never uploaded. Q: How do I convert hiragana to katakana? A: Select the Hiragana → Katakana mode and paste your hiragana text (e.g. あいうえお). It is converted to katakana (アイウエオ) instantly. Q: Does it convert katakana back to hiragana? A: Yes. Use Katakana → Hiragana to turn カタカナ into かたかな. The mapping is one-to-one for standard kana. Q: What about half-width (hankaku) katakana? A: Use the full-width / half-width modes to convert half-width katakana カタカナ to full-width カタカナ and back. Q: Is romaji supported? A: Not here — this tool converts between the kana scripts and character widths. Use the Romaji ↔ Kana converter to turn romaji into hiragana or katakana, or kana into Hepburn romaji. ### Finglish to Farsi Converter URL: https://bench.bozmoz.com/text/finglish Convert Finglish / Pinglish (Persian typed in English letters) to Persian script instantly. A 1,000+ word dictionary, a verb conjugation engine and phonetic rules handle chat-style Farsi, with tap-to-fix alternatives for ص ض ط ظ ث ح ع ق غ. Runs in your browser. How it works: Finglish (also called Pinglish) is Persian typed with Latin letters — salam, chetori, khoobam. Turning it back into Persian script is ambiguous: short vowels are not written in Persian, and one Latin letter can stand for several letters (s for س/ص/ث, z for ز/ذ/ض/ظ, t for ت/ط, h for ه/ح, gh for غ/ق). This converter resolves each word in four passes: a dictionary of over a thousand common words, phrases and names; a verb engine that understands prefixes (mi-, nemi-, be-, na-), present and past stems and personal endings, so nemidoonam becomes نمی‌دونم and barmigardam becomes برمی‌گردم; affix rules for plurals, possessives and comparatives (ketabha, khunam, bozorgtar); and finally a phonetic fallback for anything unknown. Words that were not recognised are underlined — tap one to pick a different spelling, and your choices are kept in the shareable URL. Zero-width non-joiners (نیم‌فاصله), Persian digits and punctuation are optional. Everything runs in your browser. Q: What is Finglish? A: Finglish (Pinglish, Penglish) is Persian written in the Latin alphabet, common in chats, SMS and on keyboards without a Persian layout: “salam, khoobi?” for سلام، خوبی؟. There is no official standard, so kh/x, gh/q, oo/u and aa/â spellings are all accepted here. Q: Why is a word underlined or spelled wrong? A: Finglish does not say which of س ص ث, ز ذ ض ظ, ت ط, ه ح or ق غ a sound is, and a single a can be a short vowel (unwritten) or a long â (ا). Words outside the dictionary are guessed phonetically and shown with a dotted underline. Tap the word to choose from its alternatives; picks are stored in the URL so a shared link keeps them. Q: How should I write long vowels? A: Write long â as aa or â (bazaar → بازار), oo or u for و (khoob → خوب) and ee or i for ی (irani → ایرانی). A single a, e or o is treated as a short vowel, which Persian leaves unwritten (man → من). Common words with long vowels are in the dictionary anyway (ketab → کتاب, salam → سلام). Q: Does it handle verbs? A: Yes. It conjugates hundreds of common verbs from their stems with mi-/nemi-/be-/na- prefixes, personal endings and object clitics: miram, nemidoonam, bebakhshid, mikonamesh, naraftam, barmigardam. Colloquial forms (miam, mikham, oomadam) are covered alongside formal ones. Q: What is نیم‌فاصله (ZWNJ) and should I keep it on? A: The zero-width non-joiner keeps prefixes and suffixes attached without joining letter shapes — می‌رم rather than میرم, کتاب‌ها rather than کتابها. It is the correct orthography and is recommended; switch it off if you are pasting somewhere that mishandles the character. Q: Is my text uploaded? A: No. The dictionary, verb engine and rules are all in the page; nothing is sent to a server. ### Romaji to Hiragana & Katakana Converter URL: https://bench.bozmoz.com/text/romaji Convert romaji to hiragana or katakana the way a Japanese IME does (shi/si, tsu/tu, nn, doubled consonants, ō/ou/-), or turn hiragana and katakana into Hepburn or wāpuro romaji. Instant, private, in your browser. How it works: Type romaji and it is converted to kana exactly as a Japanese IME would: Hepburn (shi, chi, tsu, fu, ji), Kunrei (si, ti, tu, hu, zi) and Nihon-shiki spellings all work, doubled consonants become っ (kitte → きって, matcha → まっちゃ), n before a consonant, nn or n' become ん (kanji → かんじ, shin'ya → しんや), and long vowels can be written with macrons, doubled letters or a hyphen (Tōkyō, toukyou, to-kyo-). Standalone wa, e and o are treated as the particles は, へ and を. Small kana use the x or l prefix (xtsu → っ, xa → ぁ), and in katakana mode ti/di become ティ/ディ for loanwords. Kana → Romaji produces modified Hepburn with macrons (とうきょう → tōkyō, しんや → shin'ya) or wāpuro style spelled out as you would type it. Kanji and other characters pass through unchanged. Q: Which romaji systems are accepted? A: Hepburn, Kunrei-shiki and Nihon-shiki, mixed freely — shi/si, chi/ti, tsu/tu, fu/hu, ji/zi/di, sha/sya, ja/jya/zya all produce the same kana, the same as typing into a Japanese IME. Q: How do I type ん, っ and small kana? A: ん: nn, n' or just n before a consonant (kanji, shinbun). っ: double the following consonant (kitte, matcha) or type xtsu/ltu. Small vowels and ゃゅょ: prefix with x or l (xa → ぁ, xyu → ゅ). Q: How are long vowels handled? A: Macrons or circumflexes (ō, ô), doubled vowels (ou, oo, uu) and a hyphen (ko-hi-) all work. In hiragana ō becomes おう and ē becomes ええ; in katakana every long vowel becomes ー. Converting kana back to Hepburn merges おう/おお/うう/ああ/ええ into macrons, while いい and えい are kept as ii and ei. Q: Why did “wa” become は? A: Hepburn writes the particles は, へ and を as wa, e and o. A standalone wa, e or o is treated as a particle (watashi wa → わたし は); type ha or wo to get the literal kana. The greetings konnichiwa and konbanwa are also spelled with は. Q: Can it convert kanji to romaji? A: No. Reading kanji needs a dictionary and context (生 alone has a dozen readings), which is beyond a rule-based converter. Kanji pass through unchanged; paste hiragana or katakana (furigana) for a full romaji reading. Q: Is my text uploaded? A: No. The conversion tables run entirely in your browser. ## JSON & Data A professional JSON viewer with virtualized trees, JSONPath search, validation and conversion between JSON, YAML, CSV and more. ### JSON Viewer & Formatter URL: https://bench.bozmoz.com/json/viewer A professional JSON viewer: pretty-print or minify, validate with precise error locations, explore an interactive collapsible tree, search by key or JSONPath, and copy any path or value. Handles large documents. How it works: Paste or type JSON and it is parsed instantly in your browser. Switch between a formatted text view and an interactive tree: expand and collapse nodes, see type badges, search keys and values, and copy the dotted path to any node. Invalid JSON is reported with the line and column of the problem. Nothing is uploaded. Q: How large a file can it handle? A: The tree view renders only what is visible, so multi-megabyte documents stay responsive. Extremely large files depend on your device's available memory. Q: Can I find a value deep in the structure? A: Yes. Use the search box to match keys or values; matches are highlighted and the tree expands to reveal them. You can also copy the path to any node. Q: Is my data private? A: Completely. Parsing and formatting happen locally in your browser; no JSON is ever sent to a server. ### JSON Schema Validator & Designer URL: https://bench.bozmoz.com/json/schema Validate JSON against JSON Schema (draft-04 through 2020-12) with every error and its path, infer a schema from sample JSON, and design or refine a schema in a visual editor that outputs standard 2020-12. Runs in your browser. How it works: Validate mode takes a schema on the left and JSON on the right and checks them as you type with Ajv, the reference JSON Schema implementation. The draft is read from $schema (draft-04, draft-06, draft-07, 2019-09 or 2020-12; draft-07 when absent) or picked by hand; formats such as email, uri, date-time, uuid and ipv4 are checked; the schema itself is validated against the draft's meta-schema, and $ref or compile problems are reported. Every violation is listed with its path in the data, the message, the keyword that failed and its parameters. Design mode builds a schema visually: infer one from a sample JSON value (types, integer versus number, detected string formats, required keys, nullable fields — arrays merge their elements), or import the validator's schema, then edit properties, types, required flags, enums, const, formats, patterns, ranges, item and key counts and extra-key rules in a collapsible tree of any depth; the result is a standard 2020-12 schema you can copy or send straight back to the validator. Reusable definitions ($defs or definitions) are edited in their own section, a property of type $ref points at one (with completion) and shows what it allows — the referenced object's properties, required marks, formats, patterns, enums and ranges, following nested references all the way down with a guard against recursion — and a link scrolls to the definition, which says how often it is used. Rules the designer does not edit are still shown in words: if/then/else conditions (“if status = "released" then releasedAt is required”), oneOf/anyOf/allOf, and any other keyword appears as a chip and is written back unchanged. Everything runs in your browser. Q: Which JSON Schema drafts are supported? A: draft-04, draft-06, draft-07, 2019-09 and 2020-12, via Ajv. The draft is detected from the schema's $schema URI; without one, draft-07 is assumed. You can force a draft from the selector. Q: Are string formats validated? A: Yes. email, uri, uri-reference, hostname, ipv4, ipv6, date, time, date-time, duration, uuid, regex and json-pointer are checked with ajv-formats. Unknown formats are ignored rather than failing. Q: Does it check that my schema is well-formed? A: Yes. The schema is validated against the draft's meta-schema first, and compile-time problems such as unresolvable $ref or invalid regular expressions are reported under “The schema itself has problems”. Q: How does schema inference work? A: Each sample value maps to a type — integers are told apart from numbers, strings get a format when they look like an email, URI, date, date-time, time, UUID or IPv4 address. Object keys become properties and are marked required. Arrays merge their elements: a key missing from some items becomes optional, and null next to another type makes it nullable. Q: Can I edit an existing schema in the designer? A: Yes — Open in designer converts it. Types, properties, required flags, enums, const, formats, patterns, ranges, item and key counts, extra-key rules and the $defs are editable, and the schema round-trips: what you don't change is written back exactly as it was. Anything the designer doesn't model (if/then/else, allOf, anyOf, patternProperties, custom keywords…) is shown as a chip — conditions in plain words — and preserved. Q: How are $ref and $defs shown? A: Definitions have their own section under the tree, each with its pointer and how many references point at it. A property of type $ref names a definition (the field completes from the ones you have) and shows, under the row, what that definition allows: its type, constraints and properties with required marks, resolving references inside it as well, however deep, until a definition would repeat itself. The link next to the reference scrolls to the definition, and editing the definition updates every preview. Q: Is my data uploaded? A: No. Validation, inference and the designer all run in your browser; nothing is sent to a server. ## Images & Video Convert and resize images, turn them into data URIs or GIFs, check Content Credentials, edit Telegram stickers, cut and grade 8K video, tag MP4s, fix slow-motion clips, and make or scan QR codes — all processed in your browser with no uploads. ### Image Converter URL: https://bench.bozmoz.com/media/converter Convert images between PNG, JPG and WebP, adjust quality and resize — all in your browser. Batch-convert multiple files at once with no uploads. How it works: Drop in one or more images and choose an output format — PNG (lossless), JPG or WebP (with a quality slider). Optionally cap the width to resize while keeping the aspect ratio. Conversion runs on a canvas in your browser, so nothing is uploaded; download each result individually. Q: Which formats are supported? A: Input: any image your browser can decode (PNG, JPG, WebP, AVIF, GIF). Output: PNG, JPG or WebP. Q: Are my images uploaded? A: No. Decoding and re-encoding happen locally via the Canvas API; your files never leave your device. Q: How do I make a smaller file? A: Choose WebP or JPG and lower the quality, and/or set a maximum width to downscale. The converted size is shown for each image. ### Base64 Image Encoder & Decoder URL: https://bench.bozmoz.com/media/base64 Convert PNG, JPG, WebP, GIF or SVG images to Base64 data URIs with ready-to-paste HTML, CSS and Markdown snippets, or decode Base64 back into a downloadable image. 100% in your browser. How it works: Drop, pick or paste an image and it's read locally and Base64-encoded into a data URI (data:image/png;base64,…). Switch the output between the bare data URI, an HTML tag with width and height, a CSS background-image rule and Markdown. Optionally re-encode first — convert to WebP or JPG with a quality slider, or cap the width — to shrink the result before embedding; the size readout shows the image bytes, the Base64 length and the ~33% overhead. SVG files also get a URL-encoded data URI, which is usually smaller and stays readable. The decoder accepts a data URI, raw Base64 (padded or not, Base64URL, wrapped lines) or a pasted CSS url() / fragment, detects the real format from the file signature, previews it and downloads it with the right extension. Q: How do I convert an image to Base64? A: Drop the file into the tool (or paste it from the clipboard). The data URI appears immediately with Copy and Download buttons, plus HTML, CSS and Markdown variants. Q: When should I inline an image as Base64? A: For tiny assets — icons, small logos, placeholders — where saving an HTTP request matters. Base64 adds about 33% to the size and can't be cached separately, so above roughly 50 KB a normal image file is usually faster. Q: How do I use a Base64 image in CSS or HTML? A: Pick the CSS tab for background-image: url("data:image/png;base64,…") or the HTML tab for . Both are copied ready to paste. Q: Can it decode Base64 back to an image? A: Yes. Paste any data URI or bare Base64 string; the tool sniffs the format (PNG, JPEG, GIF, WebP, AVIF, BMP, ICO, TIFF, SVG), shows a preview with dimensions and downloads the file. It also flags when the declared MIME type doesn't match the bytes. Q: Is my image uploaded? A: No. Reading, re-encoding and Base64 conversion all run in your browser; nothing is sent to a server. ### C2PA Content Credentials & SynthID Inspector URL: https://bench.bozmoz.com/media/content-credentials Drop any image, video, audio or PDF to validate its C2PA Content Credentials (signature, trust list, hash binding, edit history, ingredients), scan EXIF/XMP/IPTC for AI-generation declarations such as Google's SynthID-adjacent metadata, and sign a demo manifest — all in your browser. How it works: The inspector reads the file locally and does two independent things. First it locates the C2PA manifest store in the container — APP11 JUMBF segments in JPEG, the caBX chunk in PNG, the C2PA chunk in WebP and WAV, the C2PA_GIF application extension, the C2PA uuid box in MP4/MOV/HEIC/AVIF, tag 0xCD41 in TIFF/DNG, a GEOB frame in MP3, or the element in SVG — and parses it byte by byte: JUMBF boxes, the CBOR claim and assertions, the COSE_Sign1 signature and the X.509 certificate chain, all shown raw. Then the official c2pa-web SDK (c2pa-rs compiled to WebAssembly) validates it properly: signature, certificate validity, content-hash binding, ingredients, timestamps, and trust against the Content Authenticity Initiative trust list, so you see Trusted, Valid-but-untrusted, or Invalid with the exact reason. Alongside that it extracts EXIF, XMP, IPTC and text-chunk metadata and turns them into AI signals: IPTC digital source types like trainedAlgorithmicMedia, C2PA actions and software agents, and generator fingerprints from Stable Diffusion, ComfyUI, Midjourney, Firefly, DALL·E, Google and others. SynthID — Google's invisible pixel/audio/text watermark — cannot be detected by anyone but Google, and the tool says so plainly while showing the C2PA and IPTC declarations Google ships next to it. Finally, a demo lets you add a real, spec-compliant manifest to any file using a public test certificate, signed in the browser with WebCrypto, so you can watch validation succeed while trust fails. Q: Can this tool detect SynthID? A: No — and neither can any third-party tool. SynthID is a keyed statistical watermark; only Google's detector (the SynthID Detector portal, or asking the Gemini app) can read it. What can be checked are the C2PA Content Credentials and IPTC 'trained algorithmic media' metadata Google attaches to its AI output, which this inspector reads and validates. Q: What do Trusted, Valid and Invalid mean? A: Invalid means the manifest is broken or the content was changed after signing (hash mismatch). Valid means the signature and hash check out but the signing certificate isn't on the C2PA trust list — anyone can sign with any certificate, so treat the claims as unverified. Trusted means the certificate chains to a trust-list anchor (Adobe, camera makers, OpenAI, Google and other known signers). Q: Is my file uploaded anywhere? A: No. Parsing, hashing and signature validation run in your browser (the verifier is c2pa-rs compiled to WebAssembly). The only network requests fetch the public trust list from the Content Authenticity Initiative and, for remote manifests, the manifest URL embedded in the file. Q: Why does an AI image show no AI signal? A: Because provenance metadata is fragile: screenshots, most social platforms and many editors strip C2PA and XMP entirely. A missing declaration is not evidence that a file is human-made — only a positive signal tells you something. Q: Which formats are supported? A: JPEG, PNG, WebP, GIF, TIFF/DNG, AVIF, HEIC/HEIF, MP4/MOV/M4A, MP3, WAV, SVG and PDF. Validation follows what c2pa-rs supports; the structural scan works on all of them. Q: What is the demo signing certificate? A: The public ES256 test certificate from the c2pa-rs project ('C2PA Test Signing Cert — FOR TESTING ONLY'). Files signed with it are real C2PA assets that validate everywhere but are never trusted, which makes the trust-list step visible. Don't use them as proof of anything. ### GIF Maker URL: https://bench.bozmoz.com/media/gif-maker Combine images into an animated GIF with full control over frame order, speed, size, looping, dithering and quality. Reverse or boomerang the sequence. Everything is processed locally — no uploads. How it works: Drop in a series of images, reorder them by dragging, and set the playback speed, output size and color quality. The GIF is encoded in your browser using a Web Worker, so the interface stays responsive and your images never leave your device. Preview the animation, then download the finished GIF. Q: Are my images uploaded? A: No. Encoding runs entirely in your browser via a Web Worker. Your images are never sent anywhere. Q: What controls do I get? A: Frame order, per-frame and global delay (speed), output dimensions, loop count, maximum colors, dithering quality, and reverse or boomerang playback. Q: Why is my GIF large? A: GIFs grow with dimensions, frame count and color count. Reduce the output size, lower the maximum colors, or remove frames to shrink the file. The tool shows an estimated size as you adjust settings. ### TGS Sticker Viewer & Editor URL: https://bench.bozmoz.com/media/tgs Open .tgs Telegram stickers and Lottie animations: play them, check Telegram's sticker rules, recolor the palette, and convert to TGS, Lottie JSON, GIF or PNG. Everything runs locally, no uploads. How it works: A .tgs Telegram sticker is a gzip-compressed Lottie (Bodymovin) animation, so the studio unpacks it with the browser's native decompression, parses the JSON and plays it on a canvas with the Lottie player — with scrubbing, loop and speed controls. It also opens plain Lottie .json files and .lottie (dotLottie) containers. An automatic checklist verifies Telegram's animated-sticker rules: 512×512 canvas, at most 3 seconds, at most 60 fps, vector-only (no bitmap images or text layers) and the 64 KB size cap. The editor lists every solid fill and stroke color in the animation as swatches — pick a new color to recolor the sticker live (gradients are left untouched), with one-click reset. Export the result as a .tgs (re-gzipped with the tgs marker, size-checked against the 64 KB limit), as pretty-printed Lottie JSON, as a PNG of the current frame, or as an animated GIF encoded in a Web Worker. Nothing ever leaves your device. Q: What is a .tgs file? A: Telegram's animated sticker format: a Lottie/Bodymovin vector animation JSON compressed with gzip. This tool unpacks, previews, edits and repacks it entirely in your browser. Q: Is my sticker uploaded anywhere? A: No. Decompression, playback, recoloring and every export run locally — .tgs files never touch a server. Q: How do I convert TGS to GIF? A: Open the .tgs and click GIF. Frames are rendered on a canvas at up to 30 fps, composited on white (GIF has no smooth transparency) and encoded with a Web Worker so the page stays responsive. Q: How do I convert Lottie JSON to TGS? A: Open the .json and click .tgs — the JSON is gzipped with the tgs marker added. The checklist and export note tell you if the result breaks Telegram's rules (512×512, ≤3 s, ≤60 fps, ≤64 KB, vector-only). Q: Can I edit the sticker? A: You can recolor it: every solid fill and stroke color appears as a swatch — pick a replacement and the preview updates live. Gradients and bitmap content are not modified. For structural edits, export the Lottie JSON and edit it in After Effects or a Lottie editor. Q: Why doesn't Telegram accept my exported sticker? A: Check the built-in checklist: the canvas must be exactly 512×512, duration at most 3 seconds, frame rate at most 60 fps, the file at most 64 KB, and it must be vector-only. Importing still requires Telegram's @Stickers bot. Q: Does it play regular Lottie files too? A: Yes — plain Lottie .json and .lottie (dotLottie) files open the same way, so it doubles as a local Lottie previewer and Lottie-to-GIF converter. ### Video Editor URL: https://bench.bozmoz.com/media/editor A video editor that runs in your browser and takes long recordings up to 8K: import consecutive recordings and join them, trim and cut out the stretches where nothing moves, rotate, straighten and crop, convert DJI D-Log and D-Log M log footage with exposure, white balance, contrast and saturation, apply one look to every clip, layer music with crossfades and volume keyframes over the original sound, add an intro, titles and a logo, and export HEVC or H.264 at up to 7680 × 4320 with adjustable bitrate. Hardware-accelerated where the browser provides it, with optional 360p to 1080p proxies for smooth editing, autosave and crash recovery. Nothing is uploaded. How it works: Pick a project folder first — proxies, the autosave journal and the finished export live there, next to your footage. Drop your recordings: they are probed, ordered by the date-time and sequence number in their names (DJI, GoPro and phone files all carry them), reorderable afterwards, and joined end to end. The preview plays the originals; if scrubbing 8K stutters, pick a proxy size (360p, 720p or 1080p) and a small copy of each recording is rendered so a three-hour timeline scrubs smoothly, with sound. Split, trim and remove ranges on the timeline; Scan for stops finds every stretch where the picture stands still — a paused talk, an idle camera, a red light — from how little it changes between small frames, lists them with their lengths, and cuts out the ones you tick in one go, keeping a margin at each end so each cut still shows the picture settling and moving again; Merge with next rejoins the two halves of a split into one clip, or joins two different recordings so the cut disappears — no marker, no transition, one shared grade, crop and audio. Give any clip its own speed, from quarter-speed slow motion to a 16× time-lapse: it shortens or lengthens on the timeline, the export keeps the frame rate and drops or holds frames to match, and the original sound follows the speed up to 4×. Rotate in quarter turns, straighten by up to 10°, and crop. In Colour, choose a conversion: DJI's own Osmo Action 6 D-Log M → Rec.709 LUT applied as DJI ships it, a compact model of it, a Study look tuned for long-play study and focus videos (on DJI's file or on the model), a Natural or Vivid variant, D-Log from DJI's published curve and D-Gamut matrix, or your own .cube such as DJI's official download — then set exposure, temperature, tint, contrast and saturation, and apply the look to every clip. Music tracks drop onto three lanes, overlap into equal-power crossfades, and carry fades, mute and volume keyframes; the original sound mixes underneath. Add a whole folder of songs at once and Shuffle & fill lays them end to end in a random order to cover the entire video with crossfades, reshuffling when they run out so no song follows itself. Transitions — a 2 s cross dissolve by default, or dip to black or white, a zoom through, speed blur, a soft wipe and a push — go on any cut: add one at the playhead (the clip splits there if needed), click its marker to change or remove it, or stamp one onto every cut. Each is centred on its cut so nothing shifts in time — and sized to the footage: a dissolve needs spare footage beyond each clip’s edge, so where a side has none (a recording’s first frame, a clip trimmed to its last) the window slides onto the other side, and when both are tight it shrinks, so nothing ever freezes; the panel and the marker say when that happened. Intro scenes are cut with that spare room reserved and never shorter than their style’s transition. Export the whole timeline or just a from–to range. One JSON template covers the intro and the titles: download it from the Intro or Titles tab, let an LLM fill it in from your notes, and import it back to get both at once. The Intro tab builds a cold open from the footage itself — up to twenty scenes of 3 s each with 2 s transitions by default, both adjustable: one click lifts a handful of short scenes from across the footage — skipping the first and last few percent, and picking the liveliest moment in each stretch by motion and contrast when proxies or 4K-or-smaller recordings make that quick to judge, else spacing them evenly — cuts them together in one of ten looks (teaser cuts with a flash on every cut, cinematic letterbox with a slow push-in and warm grade, punch zoom, high-contrast mono, colour pop, retro film grain, glitch with RGB split and jitter, spotlight vignette, 8× hyper-lapse, or clean dips to black) and ends on a title card that dims the last scene under the project name. The scenes are ordinary clips at the head of the timeline, so you can reorder them, retime each one, lift another from wherever the playhead is, swap the look, change the card's text and subtitle, preview just the intro, or remove it; titles and the export range move with the main video while music stays put and plays under it, and the export re-encodes the scenes with their effects so the finished MP4 opens on them. Add an intro card, titles and lower thirds — several at once if you like, each with its own position, colour, backing box, font and size — and a logo watermark. Music that runs past the end of the video is cut there with a fade, and the part past the end is drawn hatched on the timeline so it is plainly not used; a track can never be placed to start after the video ends — a full lane hands it to the next, and the start field is capped. Export plans the timeline into spans: anything untouched passes through at source quality while graded, cropped or titled spans decode, grade on the GPU and re-encode through WebCodecs, hardware-accelerated where the browser provides it — so the estimate you see before exporting is honest. A rendered preview runs that same export at 180p to 720p on 30 s around the playhead, the intro, the export range or the whole timeline — from proxies when there are any — into the browser’s private storage and plays it in the preview box, so cuts, transitions, looks and steady lights can be checked exactly as they will come out. While it runs, a full panel shows position to the millisecond, frames, speed, bytes written, elapsed and remaining time and the expected finish, and lists every step — preparing, each video span, mixing and encoding the audio, finishing the file — with its own estimate, what the estimate rests on (a default guess, the speed of your last export at these settings, or measurement as the step runs), and once done the actual time against what was promised. Finishing the file has two stages, flushing the encoders and closing the file: Chrome reads the whole file back to check it before moving it into place, so that stage grows with the file size, and its estimate is sized from the bytes written and the close speed learned from your earlier exports. Steady lights holds LED lights — signs, displays, traffic and vehicle lights, which pulse faster than the shutter and blink on camera — at their brightest over the last two or three frames, so they stop blinking in the export (the preview shows it while playing). File tags — title, artist, album, genre, year, comment and a music-video media kind — go into the MP4 as the iTunes-style atoms ffmpeg writes from -metadata. The export can be paused and resumed. Save frame writes the frame under the playhead — graded, through any transition, with titles, from the source rather than the proxy — as a YouTube-ready 1280×720 JPEG thumbnail by default, or at full source resolution as JPEG or lossless PNG, into a frames folder beside the export. Space taps play and pause; holding it doubles the speed until it is released, and when the decoder cannot keep up with a held speed the preview eases down to what it can actually show rather than letting the clock run ahead of the picture. Holding Control skims the cuts: three seconds before and after each one, skipping the middle of every clip. The ? key lists every shortcut. The timeline ruler scrubs on click or drag and snaps to cuts (hold Alt to scrub freely), a hover shows the time under the pointer, ⌘ or Ctrl with the wheel zooms around the pointer while the zoom slider keeps the playhead on screen, the view follows playback, clips drag to a new place, the step buttons keep stepping while held, and the time readout can be clicked to type a time. Every edit autosaves; reopen the folder and unsaved work is recovered. Q: Does it really handle native 8K? A: Yes, through WebCodecs, which uses the hardware encoders and decoders where the browser provides them. Export is 7680 × 4320 at the source frame rate in HEVC (or H.264). The practical limit is time: re-encoding 8K runs near real time on a recent computer, which is why untouched footage is copied rather than re-encoded. Q: How long does a three-hour video take to export? A: It depends on how much you changed. Trim-and-join with music re-encodes nothing, so it takes minutes. A full colour grade re-encodes every frame — roughly real time, so expect about three hours. The Export tab shows the split before you start. Q: Which browser? A: Chrome or Edge: they provide the File System Access API for the project folder and hardware-accelerated WebCodecs. Safari and Firefox lack one or both. Exports keep going when you switch tabs or minimise the window: the page holds a lock so the browser does not freeze it and keeps the display awake while visible; only closing the tab or putting the computer to sleep stops one. Q: Where are the D-Log LUTs from? A: They are generated from DJI's published D-Log and D-Log M transfer curves and anchored so 18% grey lands at the conventional display value, matching the intent of DJI's official LUTs. You can also download them as .cube files. Q: How can I check a transition exactly as it will export without exporting everything? A: Render preview, under the preview or in the Export tab, runs the real export pipeline at a small size (180p to 720p) on a chosen stretch — 30 s around the playhead by default, or the intro, the export range or the whole timeline — using proxies when there are any, writes it to the browser's private storage and plays it in the preview box with its own controls. Scrubbing the timeline seeks it, and playing it moves the playhead. It is the export itself, so what you see there is what the full export will contain. Q: Why do LED lights blink in my footage, and can it fix that? A: LED lights pulse hundreds of times a second and the camera's shutter catches them at different points of the pulse, so on camera they flicker or drop out for a frame. In Export, LED flicker → Steady lights keeps every bright or strongly coloured light at its brightest over the last two or three frames on the GPU as the frames are encoded, so a light that drops out stays lit. It never darkens anything, resets at every cut and seek, and the preview shows it while playing. Fast-moving lights at night can leave a short trail; the 2-frame setting keeps that to one frame. Q: Can it cut out the stretches where nothing moves? A: Yes. In Trim, Scan for stops decodes small frames through every recording and marks each stretch where the picture stays still for longer than the minimum you set (2 s by default) — a paused talk, an idle camera, a red light. The stops are listed with their lengths and hatched on the timeline; untick any you want to keep, set how much to keep at each end (half a second by default, so each cut still shows the picture settling and moving again), and Cut out removes the rest in one go. The scan is many times faster with proxies, and its results stay with the project. Q: How do I make an intro? A: Open the Intro tab and press Make an intro from this video. It picks a handful of short moments spread across the footage — the liveliest in each stretch when it can scan quickly (proxies, or recordings up to 4K), otherwise evenly spaced — cuts them together in the chosen look and ends on a title card with the project name, all before the main video starts. Change the look among ten (teaser cuts, cinematic, punch zoom, mono, colour pop, retro film, glitch, spotlight, hyper-lapse, clean), retime or reorder scenes, add one from under the playhead with Use this moment, edit the card, and preview the intro on its own. The export renders the scenes with their effects, so the MP4 opens on the intro. Q: Can I follow an export from another window? A: Yes. With notifications allowed (the editor asks the first time an export starts, and the setting lives in the Export tab), a notification shows the progress — a bar, the percentage, the phase, the time left and the expected finish — refreshed every ten seconds while the tab is hidden, replacing itself rather than piling up and without a sound; one more arrives when the export finishes or fails, and the tab title carries the percentage throughout. Q: What if the disk fills up during an export? A: Before an export starts, the editor compares the expected file size with the space the browser reports (a conservative figure: Chrome keeps a reserve of about 1 % of the disk) and warns when it looks short — you can still go ahead. While it writes, a watchdog checks every few seconds: under 2 GB it pauses the export, turns the tab title into a warning, sends a notification if you allowed them and beeps twice. Free some space and it continues by itself once 3 GB are free, or press Resume. A write the disk refuses is retried after the pause rather than failing, so nothing written so far is lost. Q: What if an export fails, or I stop it, hours in? A: Nothing finished is lost. The export writes its video in numbered parts to a folder next to the output (one every three minutes, plus whatever was done the moment it stopped) and keeps a small manifest with them. When an export fails or you cancel it, the Export tab says where it stopped and offers Resume, which carries on from the last finished part and then joins the parts into the file — a copy, not a re-encode — and mixes the audio; Discard removes the parts. The join needs no extra room: when the disk has less free space than the file plus the parts, each part is removed the moment its frames are in the file, so a 160 GB export needs about 160 GB plus one three-minute part; with room to spare the parts stay until the file is closed, which is safer. Should a join in that saving mode stop before the file is finished, only the parts it had already removed are exported again. The parts belong to the project as it was: change the edit and they cannot be continued. If a single frame fails (a decoder or GPU hiccup, say), the export pauses and asks: skip that frame — or every frame that fails from then on — and carry on, or stop and keep what is done. Skipped stretches are listed when the export finishes. Q: What happens if the browser crashes? A: Every edit is written to an autosave journal in the project folder within two seconds. Reopen the tool, choose the same folder, and the journal is restored — the banner says so. Proxies are cached there too, so nothing is re-rendered. Files are remembered by their handle and by their place — the path inside the project folder, or inside any folder you ask the editor to remember (Remember a folder… when something is missing) — so recordings and music that live elsewhere are found again on reopen without a dialog, and a file you locate by hand has its place recorded too. The browser never reveals a file's absolute path, so a remembered folder plus the path inside it is as close as it gets. Q: Is anything uploaded? A: No. Footage never leaves your computer; everything runs locally in the browser. ### MP4 Tag Editor URL: https://bench.bozmoz.com/media/mp4-tags Edit the metadata tags of an MP4, M4V or MOV in your browser: title, artist, album artist, album, genre, year, comment and the media kind (music video, movie, TV show). The tags are the iTunes-style atoms ffmpeg writes with -metadata, saved straight into the file without touching the video or audio, with a staged progress panel and honest estimates for a 100 GB 8K export, and nothing is uploaded. How it works: Choose or drop an MP4, M4V or MOV. The tool reads the file's index (the moov box) and shows the tags it finds: title, artist, album artist, album, genre, year, comment and the media kind, plus the encoder name and a list of anything else it will keep untouched, such as cover art or lyrics. Edit the fields and save. The tags are written as the iTunes-style atoms every player and ffmpeg understand — ©nam, ©ART, aART, ©alb, ©gen, ©day, ©cmt and stik, exactly what ffmpeg writes from -metadata title=…, artist=… and media_type=6 — into moov/udta/meta/ilst, and a QuickTime file's older text atoms are kept in step so no reader sees a stale value. The video and audio are never decoded or re-encoded. How much of the file is rewritten depends on where the index sits: most recordings and ffmpeg exports keep it at the end, so only the last few hundred kilobytes change and the media stays put; a fast-start file keeps the index at the front, where the tool writes it in place if there is room and otherwise moves the media once, patching every chunk offset and leaving 16 kB of spare room so the next edit fits in place. In Chrome and Edge the save goes into the file you picked, through the File System Access API. A browser cannot change a file in place, so the save writes a fresh copy of the whole file in 64 MB pieces (measured faster than the browser's own copy, and the only way to see progress), then Chrome reads the copy back to check it before moving it into place, then the result is read once more to confirm the tags. A progress panel shows the stage in words, a bar, bytes written, elapsed, remaining and the expected finish, each stage's estimate and what it rests on — default guesses at first, then the copy and close rates learned from your earlier saves and video exports on this machine — and a stage that runs past its guess keeps promising a quarter of the time spent rather than zero. A 100 GB file means two passes over the disk, so expect minutes; the copy can be cancelled, which leaves the original untouched. Other browsers download a tagged copy instead, whose progress only the download manager shows. Nothing is uploaded. Q: Does it re-encode the video? A: No. Only the index of the file changes; the video and audio bytes are copied exactly as they were, and the stream hashes before and after are identical. What a save costs is disk time: the browser writes a fresh copy of the file and reads it back once to check it, so a 100 GB export takes minutes, with the progress panel showing where it is and when it will finish. Q: Which tags does it write, and how do they show up in ffprobe? A: Title (©nam → title), artist (©ART → artist), album artist (aART → album_artist), album (©alb → album), genre (©gen → genre), year (©day → date), comment (©cmt → comment) and the media kind (stik → media_type: 6 music video, 9 movie, 10 TV show). The encoder tag (©too) is shown but never changed, and anything else in the item list — cover art, lyrics, custom iTunes tags — is kept byte for byte. Q: Will this make YouTube Music index my video? A: The tags make the file carry its title, artist, album and the music-video kind, which media players, Apple Music and ffmpeg all read, and YouTube pre-fills the title from the file. YouTube decides the category itself, though: set it to Music and add the song credits on the upload page, because that is what YouTube Music lists by. Q: Does it change the whole file? A: The content changes only where it has to. If the index sits at the end of the file — the usual layout for camera recordings, ffmpeg's default output and the exports of the video editor — only the tail is different afterwards. If the index sits at the front (a fast-start file), the new tags go in place when they fit, and otherwise the media is moved once, with chunk offsets patched and spare room left so later edits fit in place. The tool says which case applies before you save. The browser still writes the whole file again either way, because the File System Access API works in a swap file that replaces the original; the progress panel sizes its estimate from that. Q: Which browsers can save into the file itself? A: Chrome and Edge, through the File System Access API: pick the file with the chooser or drop it onto the page, and the save writes into that file, then reads it back to verify the tags. Safari and Firefox cannot write into a chosen file, so they download a tagged copy instead; its progress shows in the download manager, not on the page. Q: How long does a big file take, and how good is the estimate? A: Two passes over the file: the copy, at the write speed of your disk, then Chrome's read-back check, at its read speed. The first save on a machine estimates from default guesses of 400 MB/s for both; after that the copy rate comes from your last save and the close rate from the newest save or video export on this machine, and the copy rate is re-measured within the first second of the copy. The panel shows elapsed, remaining, the expected finish time, bytes written and the current speed, and lists each stage with its estimate and what it rests on. Q: What about fragmented MP4s? A: A fragmented file (moof boxes, as produced by streaming encoders) has its index at the front and its media cannot be moved, so the tags are written in place when they fit the existing room and the tool refuses otherwise, rather than writing a broken file. ### Slow-Motion to Normal Speed Video Converter URL: https://bench.bozmoz.com/media/slow-mo Convert a slow-motion video (Osmo Action, GoPro, phone) back to normal speed without introducing judder: frames are resampled at exactly even intervals, encoded as constant-rate H.264 MP4, with optional frame blending and camera-shake smoothing. Runs in your browser with WebCodecs. How it works: Action cameras and phones record slow motion at 120 or 240 frames per second and save the file to play at 30 fps, so every second of real life takes four or eight seconds on screen — and every real frame is still in the file. This tool reads the clip with your browser's video decoder, then rebuilds it at real speed: choose the factor (120 fps → 4×, 240 fps → 8×) and an output frame rate, and the converter samples the source at exactly even real-time intervals — the same step every frame — so motion stays as smooth as the camera captured it. Naive tools that drop frames unevenly or write variable timestamps are what cause the stutter people notice; here the output is a constant-frame-rate MP4 with precise timestamps. Blend skipped frames averages the frames between samples for natural motion blur. Reduce camera shake tracks the frame-to-frame movement, smooths the camera path over a window you pick, and cancels the difference, zooming about 5% to hide the edges — a translation-only stabiliser that tames handheld jitter (it does not correct rotation or rolling-shutter wobble). Encoding uses hardware H.264 through WebCodecs where the browser offers it, and in Chrome or Edge the MP4 is streamed to a file you choose as it is produced, so clips of any length fit; audio is dropped, since a sped-up slow-motion track is never useful. Nothing is uploaded. Q: Which speed factor should I use? A: Divide the recording frame rate by the file's playback rate. DJI Osmo Action and GoPro slow-mo at 120 fps saved as 30 fps → 4×; 240 fps → 8×; a 60 fps recording shown at 30 fps → 2×. The tool shows the file's playback rate and what the real capture rate works out to for the factor you pick. Q: Why doesn't this introduce judder? A: Because the source is resampled at a perfectly regular interval and written as a constant-frame-rate file. Judder comes from uneven frame selection or variable timestamps; every output frame here is exactly one step apart in real time. Choosing an output rate that divides the real rate evenly (e.g. 240 → 60 keeps every 4th frame) is ideal, and Blend skipped frames adds motion blur if you prefer a filmic look. Q: What does “Reduce camera shake” do? A: It estimates how much each frame moved relative to the previous one, smooths that camera path over the chosen window (light, medium, strong) and shifts frames to cancel the jitter, cropping about 5% so the edges stay filled. It handles handheld translation well; rotation and rolling-shutter distortion are beyond it. Q: Which formats and browsers work? A: MP4, MOV, WebM and MKV inputs with H.264, HEVC (where the OS supports it), VP8, VP9 or AV1 video, in browsers with WebCodecs — current Chrome, Edge, Safari and Firefox. Output is an MP4 with H.264 (or HEVC if H.264 encoding isn't available for the size). If your browser can't decode the clip, the tool says so before you start. Q: Is there a file size limit? A: The input is read straight from disk, so a 17 GB clip is fine. In Chrome and Edge the result is streamed to a file you choose while it encodes, so its size is limited only by disk space. Other browsers have to assemble the MP4 in memory, where a single buffer is capped at roughly 2 GB — the tool estimates the output size and warns before starting; pick 1080p or medium quality to fit, or use Chrome/Edge for long 4K clips. Q: What happens to the audio? A: It is removed. Slow-motion clips usually have no usable sound, and speeding audio up 4–8× only produces noise. ### QR Code & Barcode Scanner URL: https://bench.bozmoz.com/media/qr-scanner Scan QR codes and barcodes (EAN, UPC, Code 128 …) with your camera or from an image — every code in the frame is found and decoded locally in your browser. Nothing is uploaded. How it works: Point your camera at a code, or drop in a screenshot or photo — you can also paste an image straight from the clipboard. Frames are decoded locally by the ZXing decoder compiled to WebAssembly (served from this site, not a CDN), so no image or video ever leaves your device. It reads QR codes (plus Micro QR, rMQR, Data Matrix, Aztec and PDF417) and 1D barcodes (EAN-13, EAN-8, UPC-A/E, Code 128, Code 39, Code 93, ITF, Codabar, DataBar) — and when several codes appear in one image, every one is detected, outlined and numbered on the preview and listed separately. Decoded payloads are classified automatically: URLs become clickable links, Wi-Fi codes reveal the network name and password, contact cards, calendar events, email, phone, SMS and geo payloads are split into labeled copyable fields, and EAN/UPC numbers are recognized as product codes — ISBNs even link to the book. One click turns any result back into a new QR code with the generator. Q: Is my camera feed or image uploaded? A: No. Decoding runs entirely in your browser via WebAssembly — camera frames and images are processed locally and never sent to a server. Q: Which barcode formats are supported? A: 2D: QR Code, Micro QR, rMQR, Data Matrix, Aztec and PDF417. 1D: EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, Code 93, ITF, Codabar and GS1 DataBar. Q: Can it read multiple codes in one image? A: Yes. Every QR code and barcode visible in the image or camera frame is detected at once — each is outlined and numbered on the preview and decoded separately, with a copy-all option. Q: Why doesn't the camera start? A: Your browser asks for camera permission the first time; if it was denied, re-enable it in the site settings for this page. Camera access also requires a secure HTTPS connection. You can always scan from a screenshot instead. Q: Which QR contents are recognized? A: URLs, Wi-Fi credentials (WIFI:), contact cards (vCard and MECARD), calendar events, email (mailto: and MATMSG), phone numbers, SMS, geo coordinates, product numbers (EAN/UPC/ISBN) and plain text. Q: Can I read a QR code from a screenshot? A: Yes — click Image to browse, drag and drop a file onto the tool, or paste an image from your clipboard with Ctrl/Cmd+V. ### QR Code Generator URL: https://bench.bozmoz.com/media/qr-code Generate a QR code from any URL or text with adjustable error correction, quiet zone and colors. Download as PNG or scalable SVG — generated entirely in your browser. How it works: Enter a URL or any text and a QR code is generated instantly. Choose an error-correction level (higher levels survive more damage but are denser), adjust the quiet-zone margin, and set the foreground and background colors. Download a high-resolution PNG or a crisp, scalable SVG. Q: What do the error-correction levels mean? A: L, M, Q and H allow roughly 7%, 15%, 25% and 30% of the code to be damaged while still scanning. Higher levels make the code denser. Q: Can I download a vector? A: Yes — export as SVG for print or further editing, or PNG for quick use. Q: Is the content sent anywhere? A: No. The QR code is rendered locally in your browser. ## Audio & Music Convert between MP3, WAV, FLAC, AAC and Opus in your browser, and convert notes, frequencies, MIDI numbers, tempos, keys, decibels, pitch ratios and bitrates. ### Audio Converter URL: https://bench.bozmoz.com/audio/converter Convert audio between MP3, WAV, FLAC, AAC/M4A, Opus (Ogg/WebM) and extract audio from video, entirely in your browser: choose bitrate, sample rate and channels, trim, normalise, and edit or strip tags. No uploads. How it works: Drop audio or video files and pick an output: MP3 (via a WebAssembly LAME encoder), AAC in M4A or ADTS, Opus in Ogg or WebM, FLAC, or WAV at 16/24-bit or 32-bit float. The file is demuxed and decoded locally, optionally resampled and remixed to mono or stereo, trimmed to a start/end time, gain-adjusted or peak-normalised to −1 dBFS, then encoded with the browser's WebCodecs — nothing leaves your device. Tags (title, artist, album, cover art) are carried over, edited, or stripped. Formats the current browser can't encode are greyed out; Chrome and Edge support the full set. Q: Which formats can I convert between? A: Input: anything the browser can demux — MP3, WAV, FLAC, AAC/M4A, Ogg Vorbis/Opus, WebM, MP4/MOV/MKV video (the audio track is extracted). Output: MP3, AAC (M4A or raw ADTS), Opus (Ogg or WebM), FLAC and WAV. Q: Is the conversion lossless? A: WAV and FLAC are lossless. MP3, AAC and Opus are lossy; converting one lossy format to another always loses a little more, so keep the bitrate at or above the source's. Q: Are my files uploaded? A: No. Decoding and encoding run in your browser with WebCodecs and a WASM MP3 encoder. Large files work, limited only by your device's memory. Q: Why is a format greyed out? A: Encoders come from the browser. Safari and Firefox lack some WebCodecs audio encoders (AAC, FLAC or Opus depending on the version); MP3 and WAV work everywhere because they don't rely on the browser. Q: Can it normalise loudness? A: It peak-normalises to −1 dBFS (a measuring pass followed by the encode) and applies a manual gain in dB. LUFS loudness normalisation isn't included. ### Audio Bitrate & File Size Calculator URL: https://bench.bozmoz.com/audio/bitrate Calculate audio bitrate and file size: uncompressed PCM from sample rate, bit depth and channels, or any bitrate (MP3, AAC, Opus, FLAC) for a duration, plus how long a given size lasts. How it works: PCM bitrate = sample rate × bit depth × channels: CD audio is 44,100 × 16 × 2 = 1,411 kbps, about 10 MB per minute. Compressed formats are simply their bitrate × duration, so 320 kbps MP3 is 2.4 MB per minute and 96 kbps Opus 0.7 MB. Enter a bitrate (or pick a preset) and a duration for the size, or a size to see how long it lasts, and compare it with the PCM you set. Q: How big is a minute of WAV audio? A: At CD quality (44.1 kHz, 16-bit, stereo) about 10.1 MB; at 48 kHz 24-bit stereo about 16.5 MB; at 96 kHz 24-bit stereo about 33 MB. Q: How big is a 320 kbps MP3 per minute? A: 320 kbps × 60 s ÷ 8 = 2.4 MB per minute, 144 MB per hour. Q: How much smaller is FLAC than WAV? A: Typically 50–60% of the PCM size for music; silence and simple material compress far more. ### Note ↔ Frequency ↔ MIDI Converter URL: https://bench.bozmoz.com/audio/note-frequency Convert musical notes to frequencies in hertz and MIDI note numbers (and back), with cents deviation, alternative concert pitch (432, 442 Hz…), wavelength and period, plus a full piano frequency chart. How it works: Type a note (A4, C#3, B♭2), a frequency in hertz, or a MIDI number; the other two update, and a frequency that falls between notes shows how many cents sharp or flat it is. Equal temperament is assumed: f = A4 × 2^((midi − 69) / 12). Change A4 to 432, 442 or any value to retune everything, switch between sharps and flats, hear the pitch with the Play button, and scroll the 88-key table. Q: What frequency is middle C? A: C4, MIDI 60, is 261.63 Hz at A4 = 440 Hz. A4 itself is MIDI 69. Q: How do I convert a frequency to a MIDI note? A: midi = 69 + 12 × log2(f / 440). Round to the nearest whole number for the note; the fraction × 100 is the deviation in cents. Q: What does 432 Hz change? A: Every note drops by about 32 cents (≈1.8%). Set A4 = 432 to see the exact frequencies. ### BPM to Milliseconds & Delay Time Calculator URL: https://bench.bozmoz.com/audio/bpm Convert BPM to milliseconds, hertz and samples for whole to 64th notes (straight, dotted, triplet), tap a tempo, convert bars to seconds and back, and see the pitch shift of a tempo change. How it works: A quarter note lasts 60000 / BPM milliseconds; every other value scales from that (dotted × 1.5, triplet × 2/3). The table gives each note value in ms, as an LFO rate in Hz and in samples at your sample rate — the numbers you type into delays, compressors' release times and LFOs. Tap tempo averages your last taps. The converters go the other way (a 375 ms delay is an eighth note at 80 BPM), turn bars into seconds for loop lengths, and show what a tempo change does to speed and pitch if the audio is repitched rather than time-stretched. Q: How do I convert BPM to milliseconds? A: One beat (quarter note) = 60000 ÷ BPM ms. At 120 BPM that's 500 ms; an eighth is 250 ms, a dotted eighth 375 ms, an eighth-note triplet 166.7 ms. Q: What is a dotted or triplet delay? A: Dotted values are 1.5× the straight value; triplets are 2/3 of it. Dotted-eighth delays give the classic U2 rhythm; triplet delays swing. Q: How do I turn a delay time into a tempo? A: BPM = 60000 × beats ÷ ms. Enter the milliseconds and the note value it represents. ### Chord & Key Transposer URL: https://bench.bozmoz.com/audio/transpose Transpose chords and chord sheets up or down by semitones or from one key to another, with sharp/flat spelling, slash chords, capo positions, key signatures, relative keys and diatonic chords. How it works: Paste a chord sheet (chord lines above lyrics, or a bare progression) and step the transposition up or down, or pick the song's key and the key you want. Chord symbols — including qualities like m7, sus4, maj7(#11) and slash basses like G/B — are recognised and shifted; lyric lines are left alone unless you say otherwise. Spelling follows the original accidentals or your ♯/♭ choice. A capo setting shows the shapes to play so the result sounds in the target key, and the key cards list the scale, key signature, relative and parallel keys and the diatonic chords of both keys. Q: How do I transpose a song from G to A? A: Choose G as the from-key and A as the to-key (or press + twice): every chord moves up two semitones, so G D Em C becomes A E F#m D. Q: How does the capo help? A: A capo raises the pitch of open shapes. To sound in E with a capo on fret 2, play D-shapes; the tool shows the shapes for any capo position. Q: Sharps or flats? A: By default a chord keeps its own spelling (Bb stays flat, F# stays sharp). Force ♯ or ♭ for keys that read better one way — flats for F, Bb, Eb, Ab; sharps for G, D, A, E, B. ### Decibel Converter URL: https://bench.bozmoz.com/audio/decibel Convert decibels to amplitude and power ratios and back, dBu, dBV and volts, perceived loudness, bit depth to dynamic range, and sound pressure level at a different distance. How it works: Amplitude (voltage) ratios use 20 log10, power ratios use 10 log10: −6 dB halves the amplitude and quarters the power. dBu is referenced to 0.7746 V RMS and dBV to 1 V, so +4 dBu (pro line level) is 1.228 V and −10 dBV (consumer) is 0.316 V. Linear PCM has a theoretical dynamic range of 6.02 × bits + 1.76 dB, and a point source loses 6 dB of SPL each time the distance doubles. Q: Is −6 dB half as loud? A: It's half the amplitude and a quarter of the power, but perceived loudness only drops by about a third — roughly 10 dB is needed to sound twice as loud or quiet. Q: What's the difference between dBu and dBV? A: Different reference voltages: dBu uses 0.7746 V, dBV uses 1 V, so dBu = dBV + 2.22. Q: How much dynamic range does 24-bit audio have? A: About 146 dB theoretical (6.02 × 24 + 1.76); 16-bit gives 98 dB. Real converters reach less. ### Semitones, Cents & Pitch Ratio Converter URL: https://bench.bozmoz.com/audio/pitch-ratio Convert between semitones, cents, frequency ratios and playback speed percentages, name the interval, find the nearest just-intonation ratio, and see how playing at the wrong sample rate shifts pitch. How it works: In equal temperament a semitone is a frequency ratio of 2^(1/12) ≈ 1.0595 and a cent is 2^(1/1200). Enter any one of semitones, cents, ratio or speed percentage and the others follow, along with the interval name, the nearest just-intonation ratio (a perfect fifth is 2 cents narrower than 3:2) and the length change if audio is sped up rather than time-stretched. The sample-rate calculator shows the pitch shift when a file recorded at one rate is played at another. Q: How many cents in a semitone? A: 100 cents. An octave is 1200 cents, or a frequency ratio of exactly 2. Q: How much does 10% faster playback raise the pitch? A: 12 × log2(1.10) ≈ 1.65 semitones (165 cents), like an old tape or turntable pitch control. Q: What happens playing 44.1 kHz audio at 48 kHz? A: It runs 8.8% fast and rises 1.47 semitones — the classic accidental sample-rate mismatch. ## Files & Archives Create ZIP and TAR archives, extract ZIP, RAR, 7z and TAR files, and read comic book archives — all unpacked locally in your browser with WebAssembly, no uploads. ### Archive Extractor URL: https://bench.bozmoz.com/files/unzip Open and extract ZIP, RAR, 7z, TAR (.gz/.bz2/.xz), GZ and ISO archives online — browse the contents, download single files or repack everything as ZIP. Extraction runs locally via WebAssembly, no uploads. How it works: Drop in an archive — ZIP, RAR (4 and 5), 7z, TAR and compressed tarballs (.tar.gz/.tgz, .tar.bz2, .tar.xz), single .gz files, ISO images and comic archives (CBZ/CBR). It is opened by libarchive compiled to WebAssembly, served from this site and running in a Web Worker, so the file never leaves your device. The contents are listed instantly with per-file sizes (in natural order, without extracting everything first); download any single file on demand, or use “All as ZIP” to extract the whole archive and repack it as a standard ZIP — which also makes this a RAR-to-ZIP or 7z-to-ZIP converter. Password-protected ZIP archives are supported: you'll be prompted and the password never leaves the local extractor. Q: Is my archive uploaded anywhere? A: No. Listing and extraction run entirely in your browser via libarchive compiled to WebAssembly. Files exist only in your tab's memory. Q: Which archive formats can it open? A: ZIP, RAR (v4 and v5), 7z, TAR, TAR.GZ/TGZ, TAR.BZ2, TAR.XZ, bare .gz files, ISO images, and comic book archives (CBZ, CBR, CB7, CBT). Q: Can it convert RAR to ZIP? A: Yes — open the RAR and click “All as ZIP”. The contents are extracted locally and repacked into a standard ZIP with folder structure preserved. The same works for 7z and TAR. Q: Can it open password-protected archives? A: Password-protected ZIP archives work — you'll be asked for the password, which is used only by the local extractor. Encrypted RAR archives are not supported. Q: Do I have to extract the whole archive? A: No. The contents are listed without extracting anything; each file is decompressed individually only when you download it. Q: Is there a size limit? A: No fixed limit, but everything happens in your browser's memory — very large archives (multiple GB) may be slow or fail depending on your device. ### Archive Creator URL: https://bench.bozmoz.com/files/zip Create ZIP or TAR.GZ archives from any files, compressed entirely in your browser with the native compression engine. Pick a format, name the archive, download it — nothing is uploaded. How it works: Add any files — drag and drop or browse, any type and any number. Choose the output container: ZIP (deflate-compressed entries, opens everywhere, falls back to stored entries when deflate wouldn't help) or TAR.GZ (a ustar tarball gzipped whole, the Unix standard). Both are assembled directly in your browser: compression uses the browser's native CompressionStream, so your files never leave your device. Name the archive, click Create, and download the result — the before/after size and compression ratio are shown for every build. Q: Are my files uploaded anywhere? A: No. The archive is assembled entirely in your browser and compressed with the browser's built-in compression engine. Your files never touch a server. Q: Which formats can it create? A: ZIP (deflate-compressed) and TAR.GZ. ZIP is the most compatible; TAR.GZ is standard on Linux and macOS. Q: Which format compresses best? A: Both use the same DEFLATE algorithm, so ratios are similar. TAR.GZ compresses the files as one stream, which helps with many small similar files; ZIP compresses each file separately but allows extracting single files quickly. Q: Can I password-protect the archive? A: No — classic ZIP encryption is insecure and modern AES zips aren't widely supported, so it's not offered. Your files stay on your device anyway, since nothing is uploaded. Q: Does it keep folder structure? A: Files are stored flat under the names they were added with. To preserve a folder tree, open an existing archive in the extractor and repack it — that keeps its paths. Q: Is there a size limit? A: ZIP output is capped at the format's 4 GB (non-ZIP64) limit; in practice browser memory is the real constraint for multi-gigabyte inputs. ### CBR / CBZ Comic Reader URL: https://bench.bozmoz.com/files/comic-reader Read CBR, CBZ, CB7 and CBT comic book archives online — pages are extracted locally in your browser with WebAssembly, with keyboard navigation, thumbnails, fit modes and fullscreen. No uploads. How it works: Drop in a comic book archive — CBZ (ZIP), CBR (RAR, including RAR5), CB7 (7-Zip) or CBT (TAR), or any plain archive of images. The file is unpacked directly in your browser by libarchive compiled to WebAssembly (served from this site, not a CDN), so the comic never leaves your device. Pages are sorted in natural reading order (page 2 before page 10) and non-image entries like ComicInfo.xml or macOS metadata are skipped. Read with the arrow keys, space bar, on-page arrows, the page scrubber or the thumbnail strip; switch between fit-to-screen, fit-to-width and actual-size views; go fullscreen for a distraction-free read; and download any single page as an image. Password-protected CBZ (ZIP) archives are supported — you'll be prompted for the password, which is only used locally. Q: Is my comic uploaded anywhere? A: No. The archive is extracted entirely in your browser using libarchive compiled to WebAssembly. Pages are held in memory on your device and are gone when you close the tab. Q: Which formats are supported? A: CBZ (ZIP), CBR (RAR 4 and RAR 5), CB7 (7-Zip) and CBT (TAR) — plus plain .zip, .rar, .7z and .tar archives of images. Pages can be JPG, PNG, GIF, WebP, AVIF or BMP. Q: How do I turn pages? A: Use the ← and → arrow keys (or space, PageUp/PageDown, Home/End), click the on-page arrows, drag the page slider, or click a thumbnail. A fullscreen mode is one click away. Q: Can it open password-protected archives? A: Password-protected CBZ (ZIP) archives work: you'll be asked for the password, which is used only by the local WebAssembly extractor and never transmitted. Encrypted RAR archives are not supported. Q: Why are pages in the wrong order? A: Pages are sorted in natural order by filename (page2 before page10), the same way desktop comic readers sort them. If a comic still reads oddly, the files inside the archive are likely misnamed. Q: What's the difference between CBR and CBZ? A: Both are ordinary archives of images renamed with a comic extension: CBZ is a ZIP file, CBR is a RAR file (CB7 is 7-Zip, CBT is TAR). This reader opens all of them the same way. ## Crypto & Hashing Generate SHA and Keccak hashes, decode JWTs, and compute address checksums entirely client-side. ### Hash Generator URL: https://bench.bozmoz.com/crypto/hash Generate MD5, SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-512 and Keccak-256 hashes from any text. Computed in your browser as you type. How it works: Type or paste text and every supported digest is computed live using the Web Crypto API (SHA family) and pure-JS implementations (MD5, SHA-3, Keccak-256). Results are shown in hexadecimal, with an uppercase toggle. Nothing is sent to a server — hashing happens entirely in your browser. Q: Which hash algorithms are supported? A: MD5, SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-512 and Keccak-256. Q: Is the input uploaded? A: No. SHA hashes use the browser's built-in Web Crypto API and the rest are computed in JavaScript locally. Q: What's the difference between SHA3-256 and Keccak-256? A: Keccak-256 is the original pre-standardization algorithm (used by Ethereum); SHA3-256 is the NIST-standardized variant. They produce different outputs. ### ECDSA Sign & Verify URL: https://bench.bozmoz.com/crypto/ecdsa Generate ECDSA key pairs (P-256/P-384/P-521), sign messages and verify signatures in your browser using the Web Crypto API. Keys and signatures never leave your device. How it works: Generate an elliptic-curve key pair on the P-256, P-384 or P-521 curve, then sign any message with the private key and verify it with the public key — all using the browser's built-in Web Crypto API. Keys are shown as JWK so you can copy and reuse them. Because everything runs locally, your private keys and messages are never transmitted. Q: What is ECDSA? A: The Elliptic Curve Digital Signature Algorithm — a widely used scheme for signing data so others can verify it came from the holder of the private key and was not altered. Q: Are my keys safe here? A: Yes. Key generation, signing and verification all happen in your browser via Web Crypto. Nothing is uploaded. Q: Which curves are supported? A: P-256 (default), P-384 and P-521, paired with SHA-256/384/512 hashing. ### Ethereum Address Checksum (EIP-55) URL: https://bench.bozmoz.com/crypto/eip55-checksum Convert a lowercase Ethereum address to its EIP-55 checksummed (mixed-case) form, normalize to lowercase, or compute a Keccak-256 hash — all client-side. How it works: EIP-55 adds a checksum to Ethereum addresses by selectively capitalizing the hex digits based on the Keccak-256 hash of the lowercase address. Wallets use the resulting mixed-case form to catch typos. Paste any address (with or without the 0x prefix) to get its checksummed version. Q: What is an EIP-55 checksum? A: It encodes a checksum into the capitalization of an Ethereum address's hex characters. Each letter is uppercased when the corresponding Keccak-256 hash nibble is 8 or higher, allowing wallets to detect mistyped addresses. Q: Does this verify the address on-chain? A: No. It computes the canonical mixed-case form locally. It does not check whether the address exists or holds a balance. Q: Keccak-256 or SHA-3? A: Ethereum uses the original Keccak-256 (pre-standardization), which differs from NIST SHA3-256. This tool uses Keccak-256, as the EIP-55 specification requires. ### Crypto Wallet Generator URL: https://bench.bozmoz.com/crypto/wallet Generate an Ethereum wallet in your browser: a BIP39 recovery phrase, derived addresses (BIP44 m/44'/60'/0'/0/i) and keys — or a single random key. Fully client-side, for development and learning. How it works: Generate a BIP39 recovery phrase (12 or 24 words) and the tool deterministically derives Ethereum accounts along the standard BIP44 path m/44'/60'/0'/0/i — each with its checksummed (EIP-55) address, public key and private key. You can also paste an existing mnemonic to view its addresses, or generate a single standalone random key. Everything is computed locally with audited libraries; nothing is transmitted, and keys are never placed in the URL. Q: Is this safe to use for a real wallet? A: No — treat it as a development, testing and learning tool only. Never store funds in a wallet generated in a web page. Use a hardware wallet or an audited application for real assets. Q: Are the keys generated locally? A: Yes. Generation and derivation run entirely in your browser using the browser's secure random source and audited @noble / @scure libraries. No key is ever uploaded, and keys are never put in the shareable URL. Q: What derivation path is used? A: The standard Ethereum BIP44 path m/44'/60'/0'/0/i, the same one used by MetaMask and most wallets, so the derived addresses match. Q: Can I import an existing seed phrase? A: Yes — paste a valid BIP39 mnemonic into the phrase field to view its derived addresses. It stays in your browser. ## Generators Generate UUIDs, NanoIDs, lorem ipsum and other placeholder data in bulk. ### UUID & NanoID Generator URL: https://bench.bozmoz.com/generators/uuid Generate random UUID v4, time-ordered UUID v7, or compact NanoID values in bulk. Configure count, length and formatting, then copy them all — generated client-side. How it works: Pick an ID type — UUID v4 (random), UUID v7 (time-ordered, sortable), or NanoID (short, URL-safe) — set how many you need, and they're generated using the browser's cryptographic random source. Toggle uppercase or hyphens, adjust NanoID length, and copy individual IDs or the whole list. Q: What is UUID v7? A: A newer UUID format whose first bits encode a millisecond timestamp, making the IDs sortable by creation time while staying globally unique — useful as database keys. Q: Are the IDs cryptographically random? A: Yes. They use crypto.getRandomValues / crypto.randomUUID, the browser's secure random source. Q: What is NanoID? A: A compact, URL-safe unique ID (21 characters by default) — shorter than a UUID with a similar collision resistance. ### Password Generator URL: https://bench.bozmoz.com/generators/password Generate strong, random passwords or memorable passphrases with full control over length, character sets and word count. Cryptographically secure and 100% local. How it works: Choose ‘Characters’ for a classic random password — set the length and toggle lowercase, uppercase, digits and symbols, optionally excluding ambiguous characters — or ‘Passphrase’ for a memorable sequence of words. Everything uses the browser's cryptographically secure random source (crypto.getRandomValues), and a live strength meter estimates the entropy. Nothing is transmitted or stored. Q: Are the passwords cryptographically secure? A: Yes. They're generated with crypto.getRandomValues using unbiased sampling, entirely in your browser — no password is ever sent anywhere. Q: What is a passphrase? A: A password made of several random words (e.g. amber-tiger-cabin-09). Passphrases are easier to remember and can be very strong when long enough. Q: How long should my password be? A: Aim for at least 16 characters with mixed character types, or a 4+ word passphrase. The strength meter shows the estimated entropy in bits. ### Random Generator URL: https://bench.bozmoz.com/generators/random Generate random integers, decimals, strings, hex bytes, dice rolls and coin flips with cryptographically secure randomness — configurable and shareable. How it works: Pick a mode — integers, decimals, strings, raw bytes, dice (NdM) or coin flips — set the parameters, and generate. All randomness comes from the browser's cryptographically secure generator, so results are unpredictable. Copy individual results or the whole batch. Q: Is the randomness secure? A: Yes — it uses crypto.getRandomValues, the browser's cryptographically secure random source, not Math.random. Q: Can I generate unique numbers? A: Yes. In integer mode, enable ‘unique’ to draw without repetition within the requested range. ### Lucky Draw / Random Picker URL: https://bench.bozmoz.com/generators/lucky-draw Paste a list of names or entries and draw random winners with a fair, cryptographic shuffle. Pick one or many, with or without repeats — a free raffle and random picker. How it works: Paste your entries one per line, choose how many winners to draw and whether to allow repeats, then hit Draw. A cryptographic Fisher–Yates shuffle picks the winners fairly, with a quick reveal animation. Everything stays in your browser — perfect for raffles, giveaways and picking who goes first. Q: Is the draw fair? A: Yes. It uses a Fisher–Yates shuffle seeded by the browser's cryptographically secure random source, giving every entry an equal chance. Q: Can I draw multiple winners? A: Yes — set the number of winners. You can draw without replacement (no repeats) or allow the same entry to win more than once. ## Time & Date Convert Unix timestamps to readable dates, work across timezones and compute relative time. ### Unix Timestamp Converter URL: https://bench.bozmoz.com/time/timestamp Convert Unix timestamps (seconds or milliseconds) to human-readable dates in ISO 8601, UTC and local time — or convert a date to epoch. Includes relative time and a live clock. How it works: Enter a Unix timestamp in seconds or milliseconds (auto-detected) or any date string, and it's broken down into epoch seconds, epoch milliseconds, ISO 8601, UTC, your local time, and a relative description. Leave it empty to see the current time tick live. The “Now” button fills in the current epoch. Q: Seconds or milliseconds? A: Both — the tool auto-detects: values of 13+ digits are treated as milliseconds, shorter values as seconds. Q: What is a Unix timestamp? A: The number of seconds (or milliseconds) elapsed since 00:00:00 UTC on 1 January 1970, the Unix epoch — a compact, timezone-independent way to store time. Q: What date formats can I paste? A: Any string the browser can parse, including ISO 8601 (2026-06-23T00:00:00Z) and common date formats. ### Date Converter — Formats, Calendars & Timezones URL: https://bench.bozmoz.com/time/date-converter Convert any date to ISO 8601, RFC 2822, Unix time and locale formats — and into the Hijri (Islamic), Hebrew, Persian, Indian, Buddhist, Japanese, Chinese, Coptic, Ethiopic and Minguo calendars. Plus Julian Day, zodiac, season and 400+ timezones. How it works: Enter a date in almost any form — ISO, a locale string, or a Unix timestamp — and it's rendered every way at once. Standard formats include ISO 8601 (UTC and local), RFC 2822, Unix seconds/milliseconds, US/European locale, day of week, day of year, ISO week, quarter, leap year, Julian Date and more. The date is also converted into a dozen calendar systems — Gregorian, Hijri (Umm al-Qura and Civil), Persian (Solar Hijri), Hebrew, Indian National, Buddhist, Japanese imperial era, Chinese, Coptic, Ethiopic and Minguo — and shown across 400+ timezones with offsets. Leave the field empty to watch the current time live. Q: Can it convert Gregorian dates to Hijri (Islamic)? A: Yes. Every date is shown in the Hijri calendar in both the Umm al-Qura (Saudi official) and tabular Civil variants, alongside the Persian, Hebrew and other calendars — using your browser's Intl calendar support. Q: Which calendar systems are supported? A: Gregorian, Islamic/Hijri (Umm al-Qura and Civil), Persian (Solar Hijri), Hebrew, Indian National (Śaka), Buddhist (Thai), Japanese imperial era, Chinese lunisolar, Coptic, Ethiopic and Minguo (ROC). Q: What date formats can I paste? A: Anything the browser can parse, including ISO 8601 (2026-06-23T00:00:00Z), locale date strings, and Unix timestamps in seconds or milliseconds. Q: Does it handle timezones? A: Yes — pick from over 400 timezones to see the date there with its UTC offset, plus a built-in list of major world cities. ### Day Calculator URL: https://bench.bozmoz.com/time/day-calculator Count the days, weeks and business days between two dates, add or subtract time from a date, or calculate an exact age. A fast, shareable date calculator. How it works: Three modes in one tool. ‘Between’ counts the total days, weeks, months and business days between two dates. ‘Add / Subtract’ shifts a date by a number of days, weeks, months or years and shows the resulting date and weekday. ‘Age’ turns a birthdate into an exact age in years, months and days, total days lived, and a countdown to the next birthday. Q: How do I count days between two dates? A: Use the ‘Between’ mode, pick a start and end date, and you'll get the total days plus a weeks/months breakdown and the number of business days. Q: Can it add or subtract days from a date? A: Yes. In ‘Add / Subtract’ mode, enter a date and a signed amount with a unit (days, weeks, months or years) to get the resulting date. ### Cron Expression Parser & Builder URL: https://bench.bozmoz.com/time/cron Paste a cron expression to see it in plain English with its next run times in any timezone, or build a schedule field by field. Validates ranges, steps, lists, names and @aliases. How it works: A cron expression has five fields — minute, hour, day of month, month and day of week — and this tool reads all the standard syntax: * for any value, lists (1,15), ranges (MON-FRI), steps (*/10, 5/10, 0-30/10), month and weekday names, Sunday as 0 or 7, and the @hourly/@daily/@weekly/@monthly/@yearly aliases. A sixth leading seconds field is supported for schedulers that use it. Each field is validated with a precise error, the schedule is described in plain English, and the next runs are computed in the timezone you choose, taking daylight-saving changes into account (a time that doesn't exist on a spring-forward night is skipped, and a repeated fall-back hour runs once). The builder edits the same expression one field at a time — every value, specific values, every n starting at x, or a range — so typing and clicking always stay in sync. Like POSIX cron, when both day-of-month and day-of-week are restricted, a day matches when either one does. Q: What do the five fields in a cron expression mean? A: In order: minute (0–59), hour (0–23), day of month (1–31), month (1–12 or JAN–DEC) and day of week (0–7 or SUN–SAT, where 0 and 7 are both Sunday). * means any value; 0 9 * * 1-5 runs at 09:00 Monday to Friday. Q: How do I write “every 5 minutes” in cron? A: */5 * * * *. The */n step syntax means every nth value starting from the field's minimum; 0 */6 * * * runs every six hours on the hour. Q: Which timezone does cron use? A: Whatever the server or scheduler is configured for — often UTC on cloud platforms and the system zone on a Linux box. Pick that zone in the Next runs panel to see the real wall-clock times; the tool shows the zone's current UTC offset. Q: Does it support the seconds field or Quartz syntax? A: A leading seconds field (six fields total) is supported. Quartz-only tokens such as L, W and # are not — they aren't valid in standard cron, Vercel, GitHub Actions or Kubernetes CronJobs. Q: Why does 0 0 15 * 1 run on the 15th and every Monday? A: That's the POSIX rule: when both day-of-month and day-of-week are restricted, the schedule fires on days matching either field. To get “the third Monday of the month” you need scheduler-specific extensions or a check inside the job. ### Earth, Sun & Moon Simulator URL: https://bench.bozmoz.com/time/earth-sun-moon An interactive globe with every country and capital: pin a place, slide the time of day and the day of the year, and watch the day/night line, twilight, seasons, sunrise and sunset, the Sun's path and the Moon's phase and visibility change. How it works: The globe shows real country borders with their names and capitals, lit as the Earth is at the chosen instant: the bright line is where the Sun is rising or setting, and three darker bands mark civil, nautical and astronomical twilight. Pin any capital, city or point, then use two sliders — time of day turns the Earth, day of the year moves it around its orbit — or press Play at anything from real time to thirty days a second. Everything else follows the pin: Sun and Moon altitude and direction, sunrise, sunset, solar noon and the three twilights, day length and how it changed since yesterday, the Moon's phase drawn the way it looks from that spot, moonrise and moonset, and whether the Moon is actually visible. Charts show the Sun and Moon's height through the day, daylight through the year (with daylight-saving steps), a sky dome with the solstice paths, and Earth's orbit with the tilted axis that causes the seasons. Positions come from the astronomy-engine library, accurate to about an arc-minute, and all of it runs in your browser. Q: Why are there seasons? A: Earth's axis is tilted 23.4° and keeps pointing the same way as it orbits. In June the northern hemisphere leans toward the Sun, so the Sun climbs higher and days are longer; in December it leans away. Distance is not the cause — Earth is closest to the Sun in early January. Slide the day of the year with the Sunrise line view to watch the day/night line tilt. Q: What is the line between day and night called? A: The terminator. Because the atmosphere scatters light, darkness arrives in stages: civil twilight (Sun 0–6° below the horizon), nautical (6–12°) and astronomical (12–18°). The globe shades each band a little darker. Q: How do I see when the Moon is visible from my city? A: Pin the city, then read the Moon card: it shows the Moon's altitude and direction now, moonrise and moonset, and whether it is up in a dark sky. Turn on 'Where the Moon is up' to draw the half of the Earth that can see it. Q: Does the Moon look the same from everywhere? A: The phase is the same worldwide, but its orientation is not: the lit edge is tilted differently depending on latitude and time, and it appears upside-down from the southern hemisphere. The Moon disk is drawn as seen from the pinned place. Q: How accurate is it? A: Sun and Moon positions use astronomy-engine and are good to roughly an arc-minute; rise and set times to within a minute for a flat horizon with standard refraction. Mountains, buildings and unusual weather change what you actually see. Q: Can I check the midnight sun or polar night? A: Yes. Pin Longyearbyen, Tromsø, Reykjavík or an Antarctic station and slide the date: the tool reports a 24-hour day or a day with no sunrise, and the year chart shows the whole pattern. ### Sun, Earth & Moon to Scale URL: https://bench.bozmoz.com/time/sun-earth-moon-scale An interactive true-scale model of the Sun, Earth and Moon: zoom across a million-fold range, watch each body rotate and orbit at its real rate, compare sizes and distances, and build a scale model (if the Sun were a 1 m ball, Earth is a 9 mm bead 107 m away). How it works: The main view looks down on the plane of Earth's orbit with every size and distance in true proportion, positioned for the date you choose. Because space is almost entirely empty, that is humbling: with the whole orbit in view the Sun is two pixels wide and Earth a fiftieth of a pixel, so rings mark what is too small to draw, and you can zoom in more than a million times — to the Earth–Moon pair, then to one body filling the screen. A Schematic switch gives the familiar textbook picture with sizes enlarged. Three magnified close-ups always show the rotations: the Sun turning in about 25 days, the Earth (with real coastlines, seen from above the pole) once every 23 h 56 min, and the Moon once per orbit so the same face stays toward Earth. Play time at up to thirty days a second or scrub the day and hour. Below are the three bodies drawn to scale side by side, the Earth–Moon gap to scale with light crossing it at its true speed, a scale-model calculator, and a table of sizes, spins, speeds and live distances. Positions come from the astronomy-engine library; everything runs in your browser. Q: How big is the Sun compared with the Earth and Moon? A: The Sun is about 1.39 million km wide — 109 Earths across, with room for roughly 1.3 million Earths inside. The Moon is 3,475 km wide, 27% of Earth's width. Q: How far apart are they, in those terms? A: The Moon is about 384,400 km away, roughly 30 Earth-widths; all the other planets would fit in the gap. The Sun is about 149.6 million km away — 107 Sun-widths, or nearly 12,000 Earth-widths, and about 390 times farther than the Moon. Q: If the Sun were a 1 m ball, how big and far is Earth? A: Earth would be a 9 mm bead 107 m away, and the Moon a 2.5 mm grain 28 cm from the Earth. Light would crawl at about 22 cm per second. The calculator works for any size, starting from any of the three. Q: Does the Moon rotate? A: Yes — once every 27.3 days, exactly the time it takes to orbit the Earth. That tidal locking is why we always see the same face. The close-up shows the dark patches of the near side staying pointed at Earth. Q: Why is a day 24 hours if Earth turns in 23 h 56 min? A: Earth turns once relative to the stars in 23 h 56 min, but in that time it has moved about 1° along its orbit, so it needs roughly four more minutes of turning for the Sun to return to the same place in the sky. Q: Why do the Sun and Moon look the same size? A: A coincidence of this era: the Sun is about 400 times wider than the Moon and about 400 times farther away, so both span roughly half a degree — which makes total solar eclipses possible. ## Color & Design Convert between HEX, RGB, HSL and OKLCH, build palettes and check contrast. ### Color Converter URL: https://bench.bozmoz.com/color/converter Convert any CSS color between HEX, RGB, HSL and OKLCH, preview it, and check WCAG contrast against black and white. Supports named colors and modern color syntax. How it works: Type any CSS color — a hex code, rgb()/hsl()/oklch() value, or a named color like 'tomato' — or use the picker. It's parsed by the browser and converted to HEX, RGB, HSL and OKLCH, each ready to copy. The contrast panel shows WCAG ratios against white and black so you can check legibility. Q: What is OKLCH? A: A modern, perceptually-uniform color space (Lightness, Chroma, Hue) supported in CSS. It makes lightness and hue adjustments look more consistent to the eye than HSL. Q: Which inputs are accepted? A: Anything the browser understands: hex (#rgb / #rrggbb / #rrggbbaa), rgb()/rgba(), hsl()/hsla(), oklch(), and named colors. Q: How is contrast calculated? A: Using the WCAG relative-luminance formula. A ratio of 4.5:1 meets AA for normal text; 3:1 meets AA for large text. ### Color Palette Generator URL: https://bench.bozmoz.com/color/palette Generate colour palettes from a base colour (analogous, complementary, split, triadic, tetradic, monochromatic), a Tailwind-style 50–950 tint and shade scale, random palettes you can lock and shuffle, or the dominant colours of an image. Computed in OKLCH for even lightness; export as CSS variables, Tailwind, SCSS or JSON. Runs in your browser. How it works: Pick a base colour and a scheme, and the generator rotates the hue in OKLCH — the perceptual colour space behind modern CSS — so every colour in an analogous, complementary, split-complementary, triadic or tetradic palette keeps the same perceived lightness and vividness as the base, then pulls chroma back only as far as needed to stay inside sRGB. Monochromatic spreads one hue across lightness. Tints & shades builds a Tailwind-style 50–950 scale with evenly spaced OKLCH lightness steps, chroma that fades toward white and black, and your exact base colour placed at its nearest step. Random draws a mid-toned base and a scheme; lock the swatches you like and press Shuffle (or the space bar) to regenerate the rest. From image downsizes a picture on your device and clusters its pixels with k-means in OKLab to find the dominant colours. Every swatch copies its hex on click, shows whether white or black text reaches WCAG AA on it, and lists HSL and OKLCH values; the export panel writes the palette as CSS custom properties, a Tailwind theme block, SCSS variables or JSON. The palette lives in the URL, so Share reproduces it. Q: Why OKLCH instead of HSL? A: HSL hue rotations change how light a colour looks — yellow at 50% HSL lightness is far brighter than blue at 50%. OKLCH lightness matches perception, so a triadic palette in OKLCH has three colours of genuinely equal weight, and a tint scale steps evenly. It is also what CSS oklch() uses. Q: How is the tint and shade scale built? A: Eleven fixed OKLCH lightness targets from 97.5% (50) down to 20% (950) with the base hue throughout. Chroma follows a curve that peaks around mid-lightness and fades toward the ends, scaled so your base keeps its own chroma; the base colour itself replaces the step whose lightness is closest to it. Q: How does extraction from an image work? A: The image is drawn at up to 96 pixels on its long side, its pixels are converted to OKLab and clustered with k-means (deterministic seeding, so the same image gives the same palette). Colours are listed by how many pixels they cover; near-duplicates are merged. Nothing is uploaded. Q: What does the contrast note on each swatch mean? A: It reports whether white or black text on that colour reaches the WCAG AA ratio of 4.5:1, and the table shows both ratios. Use it to decide text colour on buttons and badges. Q: Which export formats are there? A: CSS custom properties (--palette-1 … or --primary-50 … for scales), a Tailwind theme.extend.colors block, SCSS variables, and JSON. Click any swatch to copy just its hex. Q: Can I share a palette? A: Yes — mode, base colour, scheme, count and the generated colours are in the page URL, so the Share button reproduces exactly what you see. ## Math & Units Convert number bases and units, simulate loans and crunch everyday numbers — fast, exact and entirely in your browser. ### Number Base Converter URL: https://bench.bozmoz.com/math/base-converter Convert numbers between binary, octal, decimal, hexadecimal and any base from 2 to 36. Handles arbitrarily large integers with BigInt — instant and client-side. How it works: Enter a number and its current base, and it's shown simultaneously in binary (grouped into nibbles), octal, decimal and hexadecimal, plus any custom base from 2 to 36. All arithmetic uses BigInt, so even very large integers convert exactly without precision loss. Q: What's the largest number it can convert? A: Effectively unlimited for integers — conversions use JavaScript BigInt, so there's no 64-bit ceiling or floating-point rounding. Q: Which bases are supported? A: Any base from 2 to 36 (digits 0–9 then A–Z), in addition to the standard binary, octal, decimal and hexadecimal views. ### Unit Converter URL: https://bench.bozmoz.com/math/unit-converter Convert between units of length, mass, temperature, area, volume, speed, time and digital storage. Enter a value and see every other unit at once — fast and offline. How it works: Pick a category — length, mass, temperature, area, volume, speed, time or digital storage — enter a value and choose its unit, and every other unit in that category updates at once. Temperature uses exact formulas (so 100°C = 212°F = 373.15 K); the rest convert through a common base unit. Q: Which categories are covered? A: Length, mass/weight, temperature, area, volume, speed, time and digital storage, with both metric and imperial units. Q: Does it convert temperature correctly? A: Yes — Celsius, Fahrenheit and Kelvin use their exact formulas rather than a simple multiplier. ### Loan & Mortgage Simulator URL: https://bench.bozmoz.com/math/loan-simulator Calculate monthly payments, total interest and a full amortization schedule for any loan or mortgage. Compare repayment types — equal-payment, equal-principal and interest-only (balloon) — add a down payment, extra payments, an interest-only period and a start date. How it works: Enter the amount, annual rate and term, then tune any detail: pick a repayment type (equal-payment annuity, equal-principal with declining payments, or interest-only with a balloon at the end), pay interest only for an initial period, add a down payment or extra monthly payments, choose a currency and a past or future start date. The tool computes the payment(s), total interest and total cost, draws the remaining-balance curve, and lays out a year-grouped amortization schedule with real calendar dates. Everything defaults to a standard fixed-rate mortgage and updates instantly. Q: Which repayment types are supported? A: Equal-payment (annuity) — a fixed monthly payment; equal-principal — a fixed principal portion each month with a declining payment; and interest-only — pay only interest with the full principal due as a balloon at the end. You can also make an annuity loan interest-only for an initial period. Q: Can I model extra payments? A: Yes. Add an extra monthly amount and the tool shows the months and interest saved versus the baseline schedule and the earlier payoff date. Q: Can the start date be in the future? A: Yes — pick any past or future start month; the amortization schedule and payoff are labeled with the corresponding calendar dates. Q: How is the monthly payment calculated? A: With the standard fixed-rate amortization formula based on the principal, the monthly interest rate and the number of months. A 0% rate divides the principal evenly across the term. ## Web & Dev Diff text, test regular expressions, preview Markdown and more. ### Markdown Editor & Previewer URL: https://bench.bozmoz.com/web/markdown A Markdown editor with live preview: GitHub-flavoured tables, task lists, strikethrough and highlighted code, a toolbar with ⌘B/⌘I/⌘K shortcuts, synchronised scrolling, word count, autosaved drafts, and export as .md, standalone .html or PDF via print. Runs in your browser. How it works: Write in the left pane and the right pane renders as you type, using GitHub-flavoured Markdown: headings with anchor ids, emphasis, links, images, block quotes, ordered, bulleted and task lists, tables with alignment, footnote-free autolinks, and fenced code blocks highlighted for JavaScript, TypeScript, JSON, Python, Go, Rust, Java, C, SQL, Bash, CSS, HTML/XML, YAML, Markdown and diffs. The toolbar wraps or prefixes the current selection — bold, italic, strikethrough, headings, quote, lists, task list, link, image, code, table, rule — and ⌘B, ⌘I, ⌘K and Tab/Shift-Tab work in the editor. Scrolling is synchronised between the panes; an Outline lists the headings and jumps to them. Raw HTML in the source is sanitised before rendering, so pasted documents can't run scripts. The draft is saved in your browser as you type and restored on your next visit; Load sample and Clear are one click. Export the Markdown, the rendered HTML fragment, a standalone .html file with styles, or print to PDF. Share carries the whole document compressed in the link. Code blocks carry a language label and a copy button, Mermaid fences are drawn as diagrams (lazily, cached, in the site’s theme), GitHub-style alerts — [!NOTE], [!TIP], [!IMPORTANT], [!WARNING], [!CAUTION] — render as callouts, headings get hover anchors and tables scroll in their own box. The preview can fill the browser window or go full screen for reading, and a share link carries the view, the outline and that choice softly, so the document still opens if those ever change. Annotate lets you review a document in the preview: select any stretch of text and a small bar offers a highlight in yellow, red, green or blue, or a comment; every annotation ends in a numbered marker, clicking a mark opens its comment, colour, resolved state and removal, and the Annotate panel lists them all in document order, jumps to each, hides the marks, copies them as a Markdown list or clears them. Annotations are anchored to the quoted text and its surroundings, so they follow the text when the document is edited around them and are listed as lost rather than misplaced if it disappears; they are saved with the draft, travel in the share link, and the exported HTML and the printout keep the highlights and end with the numbered list. Q: Which Markdown features are supported? A: CommonMark plus GitHub extensions: tables with column alignment, task lists, strikethrough, autolinked URLs, fenced code blocks with language highlighting, and headings that get anchor ids. Raw HTML is allowed but sanitised (no scripts, no event handlers). Q: Where is my document stored? A: Only in your browser. The draft is autosaved to local storage on this device and restored when you come back; nothing is uploaded. Clear removes the draft. Share puts the document, compressed, into the link itself. Q: How do I get a PDF? A: Use Print / PDF — it opens the rendered document in a print view; choose “Save as PDF” in the print dialog. Download .html gives the same styled document as a file. Q: Are there keyboard shortcuts? A: ⌘B / Ctrl+B for bold, ⌘I / Ctrl+I for italic, ⌘K / Ctrl+K to insert a link, Tab and Shift+Tab to indent or outdent the selected lines. Toolbar buttons toggle: applying bold to bold text removes it. Q: Can I paste HTML into the source? A: Yes, Markdown allows inline HTML and it will render, but it is sanitised first — script tags, inline event handlers and javascript: links are removed, and external links open in a new tab with rel="noopener". Q: How do annotations work, and do they survive edits? A: Select text in the preview and pick a highlight colour or Comment from the bar that appears; a numbered marker follows the highlighted stretch. Click a mark to edit the comment, change its colour, mark it resolved or remove it (Delete also removes the selected one), and open Annotate for the full list. Each annotation remembers the quoted text with a little of what surrounds it, so when the document changes the mark is found again by its text rather than its position; if the text is gone the annotation is listed as lost until you remove it. Annotations are saved with the draft, travel in the share link, and appear in the downloaded HTML and the printout as highlights plus a numbered list at the end. ### Code Editor URL: https://bench.bozmoz.com/web/code A code editor in the browser for 90 languages: syntax highlighting, folding, bracket matching, autocomplete, search and replace, multiple cursors, Prettier formatting for JavaScript, TypeScript, JSON, HTML, Vue, CSS, SCSS, Less, Markdown, YAML, GraphQL and Handlebars, SQL formatting for eight dialects, live syntax checking with problems listed by line, file open and drop, download, drafts and share links. Nothing is uploaded. How it works: Pick a language from the list of 90 (or press Detect to guess it from the text; opening or dropping a file picks it from the name) and the editor highlights as you type, with line numbers, code folding, bracket matching, autocomplete, search and replace (⌘F), multiple cursors and the usual editor keys. Prettify runs Prettier on JavaScript, JSX, TypeScript, TSX, JSON, HTML, Vue, Angular templates, Handlebars, CSS, SCSS, Less, Markdown, MDX, YAML and GraphQL, and sql-formatter on SQL, MySQL, MariaDB, PostgreSQL, SQLite, T-SQL, PL/SQL and BigQuery, at the indentation and line width you choose (Shift+Alt+F or ⌘⇧F). Syntax checking runs as you type: those same parsers report the first error with its line, column and message, JSON and XML are checked by purpose-built parsers, and every other language with a real grammar (Python, Go, Rust, Java, C, C++, C#, PHP, Kotlin, Swift and more) is checked through the editor's own parse tree, with problems underlined in the text, marked in the gutter and listed under the editor; click one to jump there. Open loads a file from your device, Download saves the text with the language's extension (⌘S), Copy copies it, and the draft is kept in your browser between visits. Share carries the code compressed in the link, together with the language and your view settings. Everything runs locally; nothing is uploaded. Q: Which languages can it format? A: JavaScript, JSX, TypeScript, TSX, JSON, HTML, Vue, Angular templates, Handlebars, CSS, SCSS, Less, Markdown, MDX, YAML and GraphQL through Prettier 3, and SQL, MySQL, MariaDB, PostgreSQL, SQLite, T-SQL, PL/SQL and BigQuery through sql-formatter. Languages marked ✦ in the list can be formatted; for the others Prettify explains that no formatter is available, and highlighting and checking still work. Q: How does syntax checking work? A: For languages with a formatter, the formatter's parser is run on the text and the first error is reported with its line and column; JSON is checked with a scanner that explains the error in plain words, and XML with the browser's XML parser. For Python, Go, Rust, Java, C, C++, C#, PHP, Kotlin, Swift, Ruby, Lua and the other languages with a real grammar in the editor, the parse tree's error nodes are reported instead, each with the text it tripped on. A handful of languages only have simple highlighting and are not checked; the status says so. Q: Does the Prettier output match my project's config? A: It follows the indentation and line width chosen in the toolbar and Prettier's defaults for everything else (double quotes, semicolons, trailing commas where valid). It is not reading a .prettierrc, so for a project with its own options run Prettier there; this is for quick formatting of snippets and files. Q: Is my code uploaded? A: No. Highlighting, formatting and checking all run in your browser; the formatters are downloaded as code the first time they are needed and nothing you type leaves the page. The draft is kept in your browser's local storage, and a share link carries the text compressed inside the URL. Q: What are the keyboard shortcuts? A: Shift+Alt+F or ⌘⇧F (Ctrl+Shift+F) prettifies, ⌘S (Ctrl+S) downloads, ⌘F finds and ⌘H replaces, Tab and Shift+Tab indent and outdent, ⌘/ toggles a comment, ⌘D selects the next match for multiple cursors, Alt+↑/↓ moves lines, ⌘Z / ⌘⇧Z undo and redo, and Esc leaves the fill-window mode. ### Mermaid Diagram Editor URL: https://bench.bozmoz.com/web/mermaid A full Mermaid editor in the browser: live preview with zoom and pan, 20 templates covering flowcharts, sequence, class, ER, state, Gantt, mind maps, timelines, Git graphs, pie and XY charts, themes and a hand-drawn look, syntax errors with line numbers, print to A4 or Letter, and SVG, PNG and Markdown export. How it works: Type Mermaid text on the left and the diagram renders on the right as you type — flowcharts, sequence, class, state, entity-relationship, C4, architecture, Gantt, timeline, Kanban, mind map, Git graph, requirement, packet, pie, XY, quadrant, Sankey and radar diagrams, every type in Mermaid 12. Pick a template to start, switch themes or the hand-drawn look, and zoom and pan the preview. A syntax error names the line and leaves the last good drawing on screen while you fix it. Print opens a clean page with the diagram scaled to one sheet — A4 or Letter, portrait or landscape — optionally with the source appended; export gives a standalone SVG, a PNG at 2× or 4×, the image on the clipboard, a Markdown ```mermaid fence for GitHub, Notion or Obsidian, or the .mmd file. Rendering happens entirely in your browser; drafts are kept locally, and Share puts the diagram in the link. Q: Which Mermaid diagram types work? A: Flowchart, sequence, class, state, entity-relationship, user journey, Gantt, pie, quadrant, requirement, Git graph, C4, mind map, timeline, Sankey, XY chart, packet, Kanban, architecture and radar — everything in Mermaid 12 except block diagrams (block-beta), which the current Mermaid release cannot render inside a React page. Q: How do I print a Mermaid diagram? A: Press Print. The diagram opens on a clean white page scaled to fit one sheet in the paper size you chose, and the browser's print dialog lets you save it as a PDF or send it to a printer. Q: How do I export to PNG or SVG? A: SVG downloads the vector file as rendered. PNG 2× and 4× rasterise it at two or four times screen resolution — 4× is right for slides and documents. 'Copy image' puts a PNG on the clipboard for pasting straight into chat or a doc. Q: Can I use the diagram in GitHub or Notion? A: Yes — 'Copy Markdown' copies a ```mermaid code fence, which GitHub, GitLab, Notion, Obsidian and many wikis render natively. Q: Is anything uploaded? A: No. Mermaid runs in your browser with its strict security level, your draft is saved only in this browser, and a Share link carries the diagram compressed in the URL. ### Diff Checker URL: https://bench.bozmoz.com/web/diff A complete text diff: line, word and character granularity, unified and side-by-side views with intra-line highlights, ignore whitespace or case, JSON compared with sorted keys, folded context, change stats, unified .patch export and patch application. Runs in your browser. How it works: Paste an original and a changed version. Lines mode runs Myers' diff over lines and pairs changed lines so the exact words that differ are highlighted inside them; switch to Words or Characters to diff the whole text as one stream. View the result unified (like a patch) or side by side with line numbers. Whitespace can be compared, ignored at line edges, or ignored entirely; case can be ignored; and with JSON: sort keys, two JSON documents are compared with keys sorted and formatting normalised so only real differences show. Long unchanged runs fold to a few lines of context — expand them as needed. The header shows added, removed and modified counts and how similar the texts are. Copy or download the result as a standard unified .patch, or paste a unified diff and apply it to the original (with optional fuzz) to produce the changed text. Share writes both texts into the link, compressed. Q: What is the difference between the three modes? A: Lines treats each line as a unit and, for changed lines, highlights the words that differ — best for code and config. Words and Characters diff the whole text as one stream, which suits prose or short strings. Q: Can it ignore whitespace or letter case? A: Yes. Whitespace can be compared exactly, ignored at the start and end of lines, or ignored everywhere; Ignore case compares letters case-insensitively. The original text is still shown — only the comparison changes. Q: How do I compare two JSON documents? A: Turn on JSON: sort keys. When both sides parse as JSON they are pretty-printed with keys sorted before diffing, so key order and formatting differences disappear and only value changes remain. Q: Can I get a patch file? A: Yes — Copy patch or .patch gives a standard unified diff (as produced by diff -u or git) with the chosen number of context lines. Apply patch does the reverse: paste a unified diff and apply it to the original, with a fuzz factor for slightly shifted context. Q: Does it handle large files? A: It uses Myers' algorithm (the same as git), so files with thousands of lines diff instantly. Intra-line highlighting is skipped for lines over 2,000 characters, and unchanged regions fold to keep the view short. Q: Is my text private? A: Yes — everything runs in your browser. Text only leaves your device inside a link you create with Share (compressed into the URL fragment). ### Regex Tester URL: https://bench.bozmoz.com/web/regex Test a regular expression against sample text as you type: matches highlighted in the editor, every match with its numbered and named capture groups, all JavaScript flags, a replace preview with $1 / $, and a cheat sheet. Runs in a worker, so runaway patterns can't freeze the page. How it works: Type a pattern and toggle flags (g, i, m, s, u, v, y, d); the test text is matched as you type using your browser's own JavaScript regular-expression engine, so results are exactly what new RegExp(pattern, flags) gives in JavaScript and Node. Matches are highlighted in place in the editor, and the list on the right shows each match with its position and every capture group — numbered ($1, $2 …) and named ($) — with undefined groups shown as such and, with the d flag, the exact span of each group. Enter a replacement to preview text.replace(regex, replacement) with all the usual tokens ($1, $, $&, $`, $'). Matching runs in a Web Worker with a time limit, so a pattern that backtracks catastrophically is stopped and explained instead of freezing the tab. The pattern and flags live in the URL; Share also carries the test text and replacement, compressed. Q: Which regex flavour is this? A: JavaScript (ECMAScript), as implemented by your browser — the same engine used by new RegExp() and String.prototype.match/replace. It supports lookbehind, named groups, Unicode property escapes (\p{…} with u or v), the v flag's set operations and the d flag for group indices. Q: What do the flags mean? A: g finds every match instead of the first; i ignores case; m makes ^ and $ match at line boundaries; s lets . match newlines; u enables full Unicode; v is Unicode-sets mode (a superset of u with class set operations); y is sticky (match only at the start here); d records the start and end of each capture group. Q: Why did my pattern time out? A: Nested or overlapping quantifiers like (a+)+ or (\w*\s?)* can make the engine try an exponential number of paths — catastrophic backtracking. The tester stops it after 2.5 seconds. Anchor the pattern, make quantifiers possessive-like by using more specific classes, or avoid nesting quantifiers. Q: How do I use groups in the replacement? A: $1, $2 … for numbered groups, $ for named ones, $& for the whole match, $` and $' for the text before and after it, and $$ for a literal dollar sign — exactly as String.prototype.replace works. Q: Can I share a test? A: Yes. The pattern and flags are in the page URL as you type; Share copies a link that also includes the test text and replacement, compressed into the URL fragment. Q: Is my text uploaded? A: No. Everything runs in your browser; nothing is sent to a server. ### JWT Decoder, Verifier & Encoder URL: https://bench.bozmoz.com/web/jwt Decode any JWT into header, payload and claims with readable dates and expiry status; verify HS256/384/512, RS, PS, ES and EdDSA signatures with a secret, PEM, JWK or JWKS; and sign new tokens. Everything stays in your browser. How it works: Paste a token (a leading “Bearer ” is fine). The three base64url parts are decoded and colour-coded, the header and payload are shown as JSON, and the registered claims are explained: iss, sub, aud, jti, and the time claims exp, nbf and iat as local and UTC dates with a relative time, so you see at a glance whether the token is expired, not yet valid, or good for another few hours. To verify the signature, enter the shared secret for HS256/384/512 (as text or base64) or paste the public key for RS256/384/512, PS256/384/512, ES256/384/512 or EdDSA — as PEM, a single JWK, or a whole JWKS, from which the key is picked by the token's kid. Verification uses your browser's WebCrypto; secrets and keys never leave the page. Tokens with alg “none” are flagged as unsigned. Encode & sign does the reverse: edit the header and payload JSON, set iat/exp with one click, provide a secret or private key (or generate a key pair in the browser), and get a signed token you can decode and verify right away. Share links carry the token compressed in the URL fragment, never a secret. Q: Which algorithms can it verify and sign? A: HS256, HS384, HS512 (HMAC with a shared secret); RS256/384/512 (RSASSA-PKCS1-v1_5); PS256/384/512 (RSA-PSS); ES256/384/512 (ECDSA on P-256/384/521); and EdDSA (Ed25519, where the browser supports it). Tokens with alg none are decoded but flagged as unsigned. Q: Is it safe to paste a real token or secret? A: Decoding and verification run entirely in your browser with WebCrypto; nothing is sent to a server. Secrets and keys are kept in memory only and are never written to the URL. The token is only placed in a link if you press Share, and then compressed into the URL fragment. Q: What key formats are accepted? A: PEM public keys (BEGIN PUBLIC KEY / SPKI) for verifying, PEM private keys (BEGIN PRIVATE KEY / PKCS#8) for signing, a JWK, or a JWKS document — the key whose kid matches the token header is used. PKCS#1 blocks (BEGIN RSA PUBLIC KEY) and X.509 certificates need converting first; the tool tells you how. Q: How is the expiry shown? A: exp, nbf and iat are converted from Unix seconds to your local time and UTC, with a relative time such as “expires in 2 h 14 min” or “expired 3 d ago”. The header shows an overall status: valid, expired, not yet valid, or no expiry. Q: Can I create a token? A: Yes. In Encode & sign, edit the header and payload, enter an HS secret or a private key — or generate an RSA/EC/Ed25519 key pair in the browser — and sign. The result can be decoded and verified in one click, and the public half of a generated pair is available to copy. Q: Why does verification say “can't verify”? A: The key couldn't be used: wrong format, a JWKS without the token's kid, a public key given where a private one is needed, or an algorithm the browser doesn't implement. The message says which. ### URL Shortener URL: https://bench.bozmoz.com/web/short-url Shorten very long URLs (up to 10,000 characters) into a short bench.bozmoz.com link. Links are stored on Vercel's free tier and cleared oldest-and-largest first when space runs out — ideal for sharing a huge URL briefly, not for permanent references. How it works: Paste any http(s) URL up to 10,000 characters and press Shorten. This is the one Bench tool that talks to a server: the destination is saved in a private Vercel Blob store (the code is a fingerprint of the URL, so the same URL always gets the same link) and /s/ answers with a 302 redirect. Storage is capped well inside Vercel's free allowance; when the cap is reached, links are evicted first-in-first-out weighted by size — an old, large link is cleared before a recent, small one. There is no guarantee that any link lives forever; that is the trade-off for a free, no-signup shortener. Use it to hand a giant URL to someone today, not as a permanent reference. The long URL never enters this page's address bar, and nothing is logged beyond what Vercel keeps for the request. Q: How long does a short link last? A: As long as there is room. The store is capped below Vercel's free Blob quota; once it fills, links are removed oldest-and-largest first (ranked by bytes × age). A small link may live a long time, a 10,000-character link will go sooner. Nothing is guaranteed — do not rely on these links in published documents or code. Q: Why the 10,000-character limit? A: Most browsers and servers handle URLs of around 2,000 characters comfortably and start failing somewhere between 8,000 and 32,000. A 10,000-character ceiling covers huge query strings, data-heavy deep links and share URLs from other Bench tools while keeping every stored link small. Q: Is it private? A: The destination URL is stored server-side in a private Vercel Blob store — it is not publicly listable, but anyone holding the short link can follow it. Do not shorten URLs that contain secrets or tokens you would not paste into a chat. Q: What happens if I shorten the same URL twice? A: You get the same short link. The code is derived from a SHA-256 fingerprint of the URL, so repeating a request never creates duplicates. Q: Why does the redirect use 302? A: Because links can expire. A temporary (302) redirect tells browsers and crawlers not to cache the mapping permanently, and the redirect responses are marked noindex. Q: Can I delete a link? A: Not yet. Links are cleared automatically as the store fills. If you need one gone sooner, open an issue on GitHub with the code. Q: Do the Share buttons use it? A: Yes. When a tool's share link is longer than 2,000 characters, Share copies a short link instead of the full URL (shift-click to copy the full URL). Short links are best-effort, so the full URL — which still carries the entire state — remains the durable form.