100% client-side processing
Your files never leave this device.
Free, secure, client-side tools for document conversion, media processing, image editing, and more. 388 of them. All processing happens in your browser: your files never leave your device.
0 requests to another server since load
PDF38
n→1Merge PDFCombine several PDFs into one.Combines the files you drop1→1Split PDFBreak a PDF into separate files.Takes one file1→1Split PDF by size, bookmark or textBreak a PDF wherever a size limit, a top-level bookmark, or a text match starts.Takes one file1→1Split odd/even pagesPull the odd or even pages (1-based) into their own PDF.Takes one file1→1Reorder PDF pagesPut pages in any order you like.Takes one file1→1Remove PDF pagesDelete pages from a PDF.Takes one file1→1Extract PDF pagesPull selected pages into a new PDF.Takes one file1→1Delete blank PDF pagesDrop pages with nothing drawn on them.Takes one filen→nRotate PDFTurn pages 90, 180 or 270 degrees. Drop as many PDFs as you like.Runs on each file you dropn→nCrop PDFTrim margins off every page.Runs on each file you dropn→nResize / scale PDF pagesScale every page up or down.Runs on each file you drop1→1N-up / booklet impositionLay several pages onto one sheet as a grid (n-up), or reordered for booklet printing.Takes one file1→1PDF to Word (DOCX)Best-effort pdf to word (docx), from extracted text and a heading/list heuristic.Takes one file1→1PDF to PowerPoint (PPTX)Best-effort pdf to powerpoint (pptx), from extracted text and a heading/list heuristic.Takes one file1→1PDF to JPG or PNGTurn PDF pages into images.Takes one filen→nPDF to textExtract the text from a PDF.Runs on each file you drop1→1PDF to HTMLBest-effort pdf to html, from extracted text and a heading/list heuristic.Takes one file1→1PDF to MarkdownBest-effort pdf to markdown, from extracted text and a heading/list heuristic.Takes one filen→1Images to PDFCombine JPG and PNG images into one PDF.Combines the files you drop1→1Make a scanned PDF searchable (OCR)Add an invisible text layer to a scanned PDF so it can be searched and copied.Takes one filen→nAdd page numbersNumber the pages of a PDF. Drop as many files as you like.Runs on each file you dropn→nPDF page labelsGive the whole document a numbering style: i, ii, iii or A, B, C instead of 1, 2, 3.Runs on each file you dropn→nAdd header/footerStamp a header and/or footer line on every page. {page} and {total} are live.Runs on each file you dropn→nAdd watermarkStamp text across every page. Drop as many PDFs as you like.Runs on each file you dropn→1Bates numberingStamp a continuing legal control number across several PDFs at once.Combines the files you dropn→1Sign PDF (draw or image)Stamp a typed or image signature onto a page. Not a certificate/PKI signature.Combines the files you dropn→nPassword protect PDFLock a PDF with a password using AES-256. Drop as many PDFs as you like.Runs on each file you dropn→nUnlock PDFRemove the password from a PDF you can open. Drop as many PDFs as you like.Runs on each file you dropn→nFlatten PDF formBake filled-in form fields into static page content. Drop as many PDFs as you like.Runs on each file you drop1→1Fill PDF formFill an AcroForm from a JSON object of field name to value.Takes one file1→1Extract PDF form dataRead every AcroForm field name, type and value out as JSON.Takes one filen→nCompress PDFShrink a PDF by recompressing its streams and images. Drop as many as you like.Runs on each file you dropn→nRepair PDFRewrite a damaged PDF's cross-reference table and structure. Drop as many as you like.Runs on each file you dropn→nPDF metadataInspect, edit, or strip PDF metadata.Runs on each file you dropn→1Compare PDFsDiff two PDFs by page count, page size and metadata.Combines the files you dropn→nInvert PDF colors (dark mode)Flip every page to a dark background with light text.Runs on each file you drop1→1Extract PDF imagesPull embedded JPEG/JPEG2000 images out of a PDF, unmodified.Takes one file1→1Extract PDF attachmentsPull embedded files back out of a PDF.Takes one file
Image31
n→nConvert imageChange images between JPG, PNG and WebP. Drop as many as you like.Runs on each file you dropn→nCompress imageShrink JPG, PNG and WebP files without uploading them anywhere.Runs on each file you dropn→nResize imageChange image dimensions on your device. Drop as many as you like.Runs on each file you dropn→nCrop imageCut a rectangle out of an image.Runs on each file you dropn→nRotate imageTurn images 90, 180 or 270 degrees. Drop as many as you like.Runs on each file you dropn→nSocial preset resizerCrop-to-fill an image to a named social platform size.Runs on each file you dropn→nID / passport crop presetsCenter-crop a photo to a named ID/passport aspect ratio, then resize to that preset's standard pixel size. This crops and resizes only. It does not check face position, background color, or any country's actual photo requirements.Runs on each file you dropn→nPhoto editor (adjust/filters)Brightness, contrast, saturation and colour filters, on your device. Crop separately with Crop image.Runs on each file you dropn→nAdd border / frameAdd a solid colour border around an image.Runs on each file you dropn→nRounded cornersRound the corners of an image, on your device. Always outputs PNG for the transparency.Runs on each file you dropn→nDrop shadowAdd a soft drop shadow behind an image, on your device. Always outputs PNG for the transparency.Runs on each file you dropn→nDuotone / recolorMap an image onto two colours by luminance.Runs on each file you dropn→nDither imageFloyd-Steinberg dithering to a reduced palette.Runs on each file you dropn→nHalftone imageClassic newsprint-style dot halftone.Runs on each file you dropn→nMeme generatorStamp top/bottom caption text onto an image.Runs on each file you dropn→1Watermark imageStamp one image onto another as a watermark.Combines the files you dropn→nDocument enhanceClean up a photographed or scanned document: grayscale with contrast stretched to the full range, or a hard black/white threshold for a photocopier look. Operates on an already-captured image file. No camera access.Runs on each file you dropn→1Collage / gridArrange several images into one grid image.Combines the files you dropn→1Sprite sheet makerPack several images into one sprite sheet with a JSON frame index.Combines the files you dropn→nApp icon setGenerate a full iOS/Android app icon size set from one square image.Runs on each file you dropn→nOG / social image generatorFit a background image to the 1200x630 Open Graph size and stamp a title on it.Runs on each file you dropn→nPlaceholder generatorA tiny grid-average colour code for image placeholders, on your device. Decode only, not the BlurHash format.Runs on each file you dropn→nExtract colour paletteDominant colours in an image, on your device. Decode only. No image is re-encoded.Runs on each file you dropn→nView EXIF dataSee the hidden metadata in a photo, including GPS.Runs on each file you dropn→nRemove image metadataStrip EXIF, GPS and camera data from photos before you share them.Runs on each file you dropn→nPixelate / blur regionMosaic or blur a rectangle of an image: redact a face or a plate.Runs on each file you dropn→1Image diffHighlight the pixels that differ between two same-size images.Combines the files you dropn→nImage to Base64Turn an image into a data URI you can paste into CSS or HTML.Runs on each file you dropn→nRemove image backgroundCut the subject out of a photo and leave the background transparent. The matting model is served from this site andRuns on each file you dropn→nUpscale imageDouble an image's resolution with a super-resolution model rather than a plain resize. The model is served from this site andRuns on each file you dropn→1Image to text (OCR)Read the text out of a scan or photo. The OCR model is served from this site andCombines the files you drop
Dev73
n→nBase64 encodeBase64 encode.Runs on each file you dropn→nBase64URL encodeBase64URL encode.Runs on each file you dropn→nBase32 encodeBase32 encode.Runs on each file you dropn→nBase45 encodeBase45 encode.Runs on each file you dropn→nBase58 encodeBase58 encode.Runs on each file you dropn→nBase62 encodeBase62 encode.Runs on each file you dropn→nBase85 (Ascii85) encodeBase85 (Ascii85) encode.Runs on each file you dropn→nBase92 encodeBase92 encode.Runs on each file you dropn→nBech32 encodeBech32 encode.Runs on each file you dropn→nHex encodeHex encode.Runs on each file you dropn→nBinary encodeBinary encode.Runs on each file you dropn→nOctal encodeOctal encode.Runs on each file you dropn→nDecimal encodeDecimal encode.Runs on each file you dropn→nCharcode encodeCharcode encode.Runs on each file you dropn→nURL encodeURL encode.Runs on each file you dropn→nHTML entity encodeHTML entity encode.Runs on each file you dropn→nQuoted-Printable encodeQuoted-Printable encode.Runs on each file you dropn→nPunycode encodePunycode encode.Runs on each file you dropn→nModhex encodeModhex encode.Runs on each file you dropn→nMorse encodeMorse encode.Runs on each file you dropn→nCOBS encodeCOBS encode.Runs on each file you dropn→nVarInt (LEB128) encode / decodeLEB128-style variable-length integer encoding, the same scheme protobuf and WASM use for compact integers. Encode extracts every digit run from the input text; decode reads raw LEB128 bytes.Runs on each file you dropn→nJSON format / validateParse, validate and pretty-print JSON, with a clear parse-error message if it is broken.Runs on each file you dropn→nJSON sort / minify / escapeSort object keys, minify to one line, or escape/unescape JSON for embedding inside another string.Runs on each file you dropn→nJSONPath queryQuery JSON with a JSONPath expression: dot/bracket access, wildcards (*), recursive descent (..). No filter expressions (?()) or slices; those need a full JSONPath engine this build does not have.Runs on each file you dropn→nJSON Schema generatorInfer a draft-07 JSON Schema from an example JSON document. Every observed key is marked required, arrays are typed from their first element.Runs on each file you dropn→nJSON to TypeScriptJSON to TypeScript. Infers types from an example JSON document. Nested objects become named types by their key; mixed-type arrays fall back to a broad/any type.Runs on each file you dropn→nJSON to GoJSON to Go. Infers types from an example JSON document. Nested objects become named types by their key; mixed-type arrays fall back to a broad/any type.Runs on each file you dropn→nJSON to RustJSON to Rust. Infers types from an example JSON document. Nested objects become named types by their key; mixed-type arrays fall back to a broad/any type.Runs on each file you dropn→nJSON ↔ CSVConvert a flat JSON array of objects to CSV and back. CSV has no type system: JSON->CSV renders numbers/booleans/null as text and CSV->JSON always comes back as strings. A nested object or array field is refused by name rather than silently flattened. CSV parsing is fully quote-aware, embedded newlines included; a file with an unterminated quote is refused rather than guessed at.Runs on each file you dropn→n.env ↔ JSONConvert a .env file to a flat JSON object and back. Values are treated as strings both ways. No nesting, no type coercion of numbers/booleans on the JSON->env direction beyond JSON.stringify.Runs on each file you dropn→nJSON ↔ CBOREncode JSON to CBOR bytes (shown as hex) or decode CBOR bytes back to JSON. Covers uint/negint/text/array/map/float/bool/null; no byte strings, tags, or indefinite-length items.Runs on each file you dropn→nJSON ↔ MessagePackEncode JSON to MessagePack bytes (shown as hex) or decode MessagePack bytes back to JSON. Covers nil/bool/int/float64/str/array/map: no bin, ext, or timestamp extension types.Runs on each file you dropn→nJSON ↔ RisonConvert JSON to Rison (the compact URI-safe notation Kibana/Elasticsearch use for query params) and back. This tool's own encoder/decoder for the documented core grammar (no reference implementation in this codebase to check against). Exotic edge cases like embedded control characters or surrogate-pair characters are not guaranteed byte-identical to the reference grammar.Runs on each file you dropn→nPHP serialize / unserializeConvert JSON to PHP's serialize() format and back. Covers null/bool/int/float/string/array. PHP objects (O:) are not implemented since they need a class registry this tool doesn't have.Runs on each file you dropn→nPLIST viewerView an XML property list (.plist) as JSON. Binary plist (bplist00) is not supported. It needs a separate binary-format parser this tool does not implement.Runs on each file you dropn→nGeoJSON ↔ CSVConvert GeoJSON Point features to CSV rows and back. LineString/Polygon geometries export as a flattened coordinate list (one-way; CSV->GeoJSON always builds Points). CSV parsing is fully quote-aware (src/csv.ts), so a quoted field holding a comma or a newline no longer shifts the coordinate columns.Runs on each file you dropn→nKML/GPX to GeoJSONConvert a GPX (waypoints/tracks/routes) or KML (Placemarks: Point/LineString/Polygon) file to GeoJSON. A hand-rolled tag scan, not a general XML parser: no styles, nested Folder hierarchy, MultiGeometry, or extended data.Runs on each file you drop·→1Coordinate format convert (DD/DMS/UTM)Convert between decimal degrees, degrees-minutes-seconds, and UTM. WGS84, standard 6° zones, non-polar only. MGRS grid-square lettering is not implemented (its edge cases are a separate, riskier piece of work).Takes no file·→1JWT decode / verifyDecode a JWT's header and payload. Signature verification only covers HS256/384/512 (via WebCrypto HMAC). RS*/ES*/PS* tokens are decoded but not verified, since that needs asymmetric key material this tool has no way to be given.Takes no file·→1UUID v4 generatorUUID v4 generator, random IDs from crypto.getRandomValues,Takes no file·→1ULID generatorULID generator, random IDs from crypto.getRandomValues,Takes no file·→1NanoID generatorNanoID generator, random IDs from crypto.getRandomValues,Takes no file·→1Mock / random data generatorGenerate fake person/address/company/product rows as JSON or CSV, from a fixed static word pool, not a large-scale faker corpus, so values repeat at higher counts.Takes no filen→nMinify CSSminify css. Strips comments and collapses whitespace via regex, not a real parser (might mishandle markup-like sequences inside string/attribute values). JS minification isn't offered here: doing it safely needs a real parser this task can't add.Runs on each file you dropn→nMinify HTMLminify html. Strips comments and collapses whitespace via regex, not a real parser (might mishandle markup-like sequences inside string/attribute values). JS minification isn't offered here: doing it safely needs a real parser this task can't add.Runs on each file you dropn→nMinify XMLminify xml. Strips comments and collapses whitespace via regex, not a real parser (might mishandle markup-like sequences inside string/attribute values). JS minification isn't offered here: doing it safely needs a real parser this task can't add.Runs on each file you drop·→1SQL formatter / minifierReformat SQL for readability (newline before major clauses, indented parens) or minify it to one line. Token-based, not a real SQL parser; dialect-specific syntax or deeply nested queries might format oddly.Takes no file·→1Syntax highlighterHighlight code as HTML spans or ANSI colors, for js/python/json/html/css/sql. Regex-tokenizer based and approximate, not a full language grammar.Takes no file·→1Number base converterConvert an arbitrarily large integer between any base 2-36, using exact bigint arithmetic (no float precision loss).Takes no file·→1Bitwise calculatorAND / OR / XOR / NOT / shifts on integers, shown in binary, octal, decimal and hex. 64-bit two's-complement width.Takes no file·→1Chmod calculatorConvert Unix permissions between octal (755) and symbolic (rwxr-xr-x) form, including setuid/setgid/sticky bits.Takes no file·→1CSS unit converterConvert between px, em, rem, pt and % using a configurable root font-size and parent font-size.Takes no file·→1Color converter + paletteConvert between hex, rgb() and hsl(), and generate a shade/tint/complementary/analogous/triadic palette in HSL space. OKLCH is not supported. It needs chroma.js/culori, a dependency this build does not add.Takes no file·→1Gradient generatorBuild a CSS linear/radial gradient from 2+ hex colors, and optionally emit N discrete hex stops. Interpolation is linear in sRGB, not perceptual (that needs OKLCH, which needs chroma.js/culori, not available here).Takes no file·→1Bounding-box calculatorCompute the min/max lat/lon bounding box around a set of points.Takes no file·→1Haversine distanceGreat-circle distance between two lat/lon points on a spherical Earth model.Takes no file·→1Angle converterAngle converter, no network, no rounding surprises.Takes no file·→1Area converterArea converter, no network, no rounding surprises.Takes no file·→1Data size converterData size converter, no network, no rounding surprises.Takes no file·→1Length converterLength converter, no network, no rounding surprises.Takes no file·→1Mass converterMass converter, no network, no rounding surprises.Takes no file·→1Speed converterSpeed converter, no network, no rounding surprises.Takes no file·→1Time converterTime converter, no network, no rounding surprises.Takes no file·→1Volume converterVolume converter, no network, no rounding surprises.Takes no file·→1Timestamp & date converterConvert between Unix seconds, Unix milliseconds, and ISO 8601, auto-detected from the input shape.Takes no file·→1Cron parser / builderExplain a 5-field cron expression in plain English and list its next upcoming run times. Standard fields with *, lists, ranges and steps; no @-shorthands, seconds field, or timezone handling.Takes no file·→1Discord timestampTurn a Unix timestamp into every Discord <t:...> markdown style, or extract the creation time embedded in a Discord snowflake ID.Takes no file·→1MIME type lookupLook up the MIME type for a file extension, or the extensions for a MIME type. A common-cases table, not the full IANA registry.Takes no file·→1HTTP status referenceLook up an HTTP status code, or list every code in the standard IANA registry range. Static table,Takes no file·→1User-agent parserExtract browser, OS, rendering engine, and device type from a User-Agent string via pattern matching, not backed by a maintained real-world UA database, so rare or new strings might parse partially.Takes no file·→1Regex tester + explainerTest a regex against sample text (matches, capture groups) and get a best-effort, segment-by-segment plain-English explanation. This is a tokenizer, not a full regex-AST parser, so complex nested/lookaround patterns get a generic per-token description.Takes no file·→1docker run → composeTurn a `docker run` command into a docker-compose.yml service. Covers -p/-v/-e/--name/--network/--restart/-w/--entrypoint plus image+command; anything else is kept as a trailing comment instead of being silently dropped.Takes no file
Crypto58
n→nAES-GCM encryptEncrypt a file with AES-256-GCM under a password.Runs on each file you dropn→nAES-GCM decryptDecrypt a file produced by AES-GCM encrypt.Runs on each file you dropn→nAES key wrap (RFC 3394)Wrap a raw key under a key-encrypting key (AES-KW).Runs on each file you dropn→nAES key unwrap (RFC 3394)Unwrap a key that was wrapped with AES-KW.Runs on each file you dropn→nRSA-OAEP encryptEncrypt a small file with an RSA public key (RSA-OAEP).Runs on each file you dropn→nRSA-OAEP decryptDecrypt a file produced by RSA-OAEP encrypt, with the matching private key.Runs on each file you drop·→1RSA key pair generateGenerate an RSA key pair, on your device; the private key never leaves your browser.Takes no filen→nRSA-PSS signSign a file with an RSA private key (RSA-PSS/SHA-256).Runs on each file you dropn→nRSA-PSS verifyCheck a file against an RSA signature (RSA-PSS/SHA-256).Runs on each file you drop·→1ECDSA key pair generateGenerate an ECDSA key pair, on your device; the private key never leaves your browser.Takes no filen→nECDSA signSign a file with an ECDSA private key.Runs on each file you dropn→nECDSA verifyCheck a file against an ECDSA signature.Runs on each file you drop·→1Argon2id hashHash a password with Argon2id, on your device. For password storage, not for hashing files.Takes no file·→1Argon2 verifyCheck a password against an Argon2 hash.Takes no file·→1bcrypt hashHash a password with bcrypt, on your device. For password storage, not for hashing files.Takes no file·→1bcrypt verifyCheck a password against a bcrypt hash.Takes no file·→1scrypt deriveDerive a key from a password with scrypt.Takes no file·→1PBKDF2 deriveDerive a key from a password with PBKDF2.Takes no file·→1HKDF deriveDerive a key from input keying material with HKDF.Takes no file·→1TOTP generatorTime-based one-time password (RFC 6238), computed on your device. The secret never leaves your browser.Takes no file·→1HOTP generatorCounter-based one-time password (RFC 4226), computed on your device. The secret never leaves your browser.Takes no file1→1Generate all hashesCompute every hash-wasm digest of a file in one pass, on your device. (MurmurHash3 and the Fletcher checksums have their own dedicated tools.)Takes one filen→nHMACCompute an HMAC of a file with a key.Runs on each file you dropn→nMD4 hashCompute an MD4 digest of a file, on your device. MD4 is cryptographically broken, useful only for legacy or forensic work, not integrity or security.Runs on each file you drop·→1NT hashCompute a Windows NT hash (MD4 of UTF-16LE) from a password, on your device. Unsalted and trivially cracked, this is a forensics tool, not a way to protect anything.Takes no filen→nMurmurHash3 (32-bit)Compute a MurmurHash3 (x86, 32-bit) digest, a fast non-cryptographic hash, not for security.Runs on each file you dropn→nFletcher-8 checksumFletcher-8 checksum. A fast error-detection checksum, not a cryptographic hash. No authoritative spec exists for this word size (unlike -16/-32/-64): this implementation sums 4-bit nibbles mod 15, low nibble then high nibble per byte. A different convention (whole bytes mod 15) gives a different digest. Check your other tool uses the same convention before comparing.Runs on each file you dropn→nFletcher-16 checksumFletcher-16 checksum. A fast error-detection checksum, not a cryptographic hash.Runs on each file you dropn→nFletcher-32 checksumFletcher-32 checksum. A fast error-detection checksum, not a cryptographic hash.Runs on each file you dropn→nFletcher-64 checksumFletcher-64 checksum. A fast error-detection checksum, not a cryptographic hash.Runs on each file you dropn→nLuhn checksumValidate a number against the Luhn checksum, or compute its check digit. Used by credit card and ID numbers.Runs on each file you dropn→nAnalyse hashGuess which algorithm(s) produced a hash, from its length and charset. A heuristic, not a proof.Runs on each file you dropn→nCaesar encodeCaesar encode. A classical cipher, computed on your device.Runs on each file you dropn→nCaesar decodeCaesar decode. A classical cipher, computed on your device.Runs on each file you dropn→nCaesar brute forceCaesar brute force, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nCaesar Box encodeCaesar Box encode, classical cipher, a puzzle not a protection, computed on your device. Not reversible to the exact input: the text is padded with X to fill the next perfect square, and the padding is indistinguishable from real text afterwards. "HELLO WORLD" decodes back as "HELLO WORLDXXXXX".Runs on each file you dropn→nCaesar Box decodeCaesar Box decode, classical cipher, a puzzle not a protection, computed on your device. The X padding the encoder added to reach a perfect square cannot be told from real text and is returned with the plaintext. Expect trailing X characters that were not in the original.Runs on each file you dropn→nVigenère encodeVigenère encode. A classical cipher, computed on your device.Runs on each file you dropn→nVigenère decodeVigenère decode. A classical cipher, computed on your device.Runs on each file you dropn→nSubstitution cipher encodeSubstitution cipher encode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nSubstitution cipher decodeSubstitution cipher decode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nAffine cipher encodeAffine cipher encode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nAffine cipher decodeAffine cipher decode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nBifid cipher encodeBifid cipher encode, classical cipher, a puzzle not a protection, computed on your device. Not reversible to the exact input: the classic 5x5 Polybius square has no J, so J is folded into I, and everything that is not a letter, including spaces, digits and punctuation, is dropped. Output is uppercase. "The fox jumps, 42 times!" comes back as "THEFOXIUMPSTIMES".Runs on each file you dropn→nBifid cipher decodeBifid cipher decode, classical cipher, a puzzle not a protection, computed on your device. Not reversible to the exact input: J was folded into I at encode time and all spacing, digits and punctuation were dropped, so plaintext comes back as uppercase letters only.Runs on each file you dropn→nRail Fence encodeRail Fence encode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nRail Fence decodeRail Fence decode, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nBaconian cipher encodeBaconian cipher encode, classical cipher, a puzzle not a protection, computed on your device. Non-letters pass through this direction, but they carry no information and the decoder drops them: a round trip returns lowercase letters only, so "The fox jumps, 42 times!" comes back as "thefoxjumpstimes".Runs on each file you dropn→nBaconian cipher decodeBaconian cipher decode, classical cipher, a puzzle not a protection, computed on your device. Only the A/B letters carry information, so every space, digit and punctuation mark in the ciphertext is dropped and the plaintext comes back lowercase, letters only.Runs on each file you dropn→nAtbash cipherAtbash cipher. A classical cipher, computed on your device.Runs on each file you dropn→nA1Z26 encodeA1Z26 encode. A classical cipher, computed on your device.Runs on each file you dropn→nROT5 (digits)ROT5 (digits). A classical cipher, computed on your device.Runs on each file you dropn→nROT13ROT13. A classical cipher, computed on your device.Runs on each file you dropn→nROT47ROT47, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nLeetspeakLeetspeak. A classical cipher, computed on your device.Runs on each file you dropn→nReverse textReverse text. A classical cipher, computed on your device.Runs on each file you dropn→nXOR cipherXOR cipher, classical cipher, a puzzle not a protection, computed on your device.Runs on each file you dropn→nXOR brute force (single-byte key)XOR brute force (single-byte key), classical cipher, a puzzle not a protection, computed on your device.Runs on each file you drop
Security45
1→1File checksumCompute a cryptographic hash of any file, locally.Takes one filen→nMD5 hashCompute a MD5 digest of any file.Runs on each file you dropn→nSHA-1 hashCompute a SHA-1 digest of any file.Runs on each file you dropn→nSHA-256 hashCompute a SHA-256 digest of any file.Runs on each file you dropn→nSHA-384 hashCompute a SHA-384 digest of any file.Runs on each file you dropn→nSHA-512 hashCompute a SHA-512 digest of any file.Runs on each file you dropn→nSHA3-256 hashCompute a SHA3-256 digest of any file.Runs on each file you dropn→nSHA3-512 hashCompute a SHA3-512 digest of any file.Runs on each file you dropn→nKeccak-256 hashCompute a Keccak-256 digest of any file.Runs on each file you dropn→nKeccak-512 hashCompute a Keccak-512 digest of any file.Runs on each file you dropn→nBLAKE2b hashCompute a BLAKE2b digest of any file.Runs on each file you dropn→nBLAKE2s hashCompute a BLAKE2s digest of any file.Runs on each file you dropn→nBLAKE3 hashCompute a BLAKE3 digest of any file.Runs on each file you dropn→nRIPEMD-160 hashCompute a RIPEMD-160 digest of any file.Runs on each file you dropn→nSM3 hashCompute a SM3 digest of any file.Runs on each file you dropn→nWhirlpool hashCompute a Whirlpool digest of any file.Runs on each file you dropn→nCRC32 checksumCompute a CRC32 digest of any file.Runs on each file you dropn→nAdler-32 checksumCompute a Adler-32 digest of any file.Runs on each file you dropn→nxxHash3Compute a xxHash3 digest of any file.Runs on each file you dropn→nxxHash64Compute a xxHash64 digest of any file.Runs on each file you dropn→nX.509 certificate parserDecode a PEM or DER X.509 certificate into subject/issuer/validity/public key/extensions. Reports what the certificate says about itself. No chain building, no revocation check, no clock: it does not tell you whether to trust it.Runs on each file you dropn→nCSR parserDecode a PEM or DER PKCS#10 certificate signing request into subject, public key and requested extensions (including subjectAltName, when present in an extensionRequest attribute). Reports the request, not a decision about whether it should be signed.Runs on each file you dropn→nCRL parserDecode a PEM or DER Certificate Revocation List into issuer, update times, and each revoked serial with its revocation date/reason. Reports what the CRL states, not whether it is current, or whether a given certificate is on it if you have not checked.Runs on each file you dropn→nJWK ↔ PEMConvert an RSA or EC key between JWK (JSON) and PEM (SPKI/PKCS8), via crypto.subtle import/export. Ed25519/OKP keys are not supported. On your device.Runs on each file you dropn→nPEM ↔ HexConvert a PEM block to the raw hex of its DER payload, or wrap hex bytes back into PEM armor. On your device.Runs on each file you dropn→nPublic key from cert / private keyExtract the public key from an X.509 certificate (always available; it is right there in the cert), or from an RSA/EC private key. RSA is always derivable (n/e are part of the private key itself); EC only when the key embeds its public point (SEC1's optional field; usually present, not guaranteed). This tool does not do elliptic-curve scalar multiplication to compute a missing one.Runs on each file you drop·→1Password generatorGenerate a random password from crypto.getRandomValues, drawn uniformly from the selected character classes combined (does not guarantee at least one of each class). On your device, never sent anywhere.Takes no file·→1Passphrase generatorGenerate a random passphrase from a bundled list of 264 common English words (not the EFF/Diceware list; see src/wordlist.ts). Entropy is exactly words * log2(264) bits; words drawn with crypto.getRandomValues.Takes no file·→1Password strength (offline heuristics)Reports observable properties of a password, including length, character classes, repeated/sequential/keyboard-row runs, and membership in a small bundled list of ~130 famously common passwords. This is NOT zxcvbn (that needs a dependency this build does not add) and renders no verdict: no breach corpus, no crack-time estimate, "strong"/"weak" is a guess this tool refuses to make.Takes no file·→1Subnet / CIDR calculatorCompute network address, broadcast/last address and host count for an IPv4 or IPv6 CIDR block. Pure arithmetic on the address you give it. No lookup, no network.Takes no file·→1IP range parserParse an IPv4/IPv6 range ("start-end" or CIDR) into its address count and the minimal set of CIDR blocks that cover it exactly. Pure arithmetic, no lookup.Takes no file·→1IPv4/IPv6 format convertShow one IP address in every common representation (dotted/expanded, integer, and hex), computed locally.Takes no file·→1IPv6 transition addressesBuild IPv4-mapped/6to4/NAT64 IPv6 forms from an IPv4 address, or decode an IPv6 address back to its embedded IPv4 (and, for Teredo, server/client/port/flags). Reports what pattern was recognised, not whether the address is reachable or in use.Takes no filen→nIPv4 / TCP / UDP header parserDecode an IPv4 header, then its TCP or UDP header if the protocol field says so (checksum verified against the standard Internet checksum, not TCP/UDP's, which need a pseudo-header this tool is not given the source context to build). Give it bytes starting at the IP header, e.g. an Ethernet frame's payload.Runs on each file you dropn→nEthernet frame parserDecode an Ethernet II frame: destination/source MAC, EtherType (unwrapping one 802.1Q VLAN tag if present), and payload length. IEEE 802.3 LLC/SNAP framing is not handled, only Ethernet II.Runs on each file you dropn→nTLS record parserDecode a raw TLS record (RFC 8446 §5.1): content type, version, length, and for a ClientHello/ServerHello, the cipher suites/extensions inside. Give it bytes captured off the wire, not a PEM.Runs on each file you drop·→1MAC address formatterReformat a MAC address between colon, dash, Cisco dot-quad and bare-hex notation, and report the multicast/locally-administered bits.Takes no file·→1MAC / OUI vendor lookupLook up a MAC address's OUI against a small bundled table of 16 well-known prefixes, not the IEEE registry (2.9M+ entries, updated continuously, no offline way to bundle it here). "Not in bundled list" means exactly that, not "no vendor exists."Takes no filen→nIOC extractorPull URLs, IPs, domains, emails, hashes, MAC addresses, file paths and dates out of text in one pass. Regex-based pattern matching, not a validator: a matched hash might be any 64 hex characters, not necessarily a real SHA-256 of anything, and "domain" filters out a small blocklist of common file extensions (.php/.exe/.sh/...) rather than knowing real TLDs. Categories can overlap by design (a domain inside a matched URL is listed under both).Runs on each file you dropn→nDefang / Fang URLDefang / Fang URL. Defang turns a live indicator into inert text (won't render as a link); fang reverses it. Pure text substitution.Runs on each file you dropn→nDefang / Fang IPDefang / Fang IP. Defang turns a live indicator into inert text (won't render as a link); fang reverses it. Pure text substitution.Runs on each file you dropn→nJA3 / JA3S fingerprintCompute the JA3 (ClientHello) or JA3S (ServerHello) TLS fingerprint from a raw captured TLS record. JA4 is not implemented. See the tool source for why. A matching fingerprint means two handshakes look alike, not that either endpoint is safe or malicious.Runs on each file you dropn→nHASSH fingerprint (SSH)Compute the HASSH fingerprint from a raw SSH KEXINIT packet. Best-effort recollection of the published field composition (kex;encryption_c2s;mac_c2s;compression_c2s, MD5), NOT checked against the reference hassh tool's output (no network access to verify). The KEXINIT wire parsing itself is plain RFC 4253. A matching fingerprint means two handshakes announced the same algorithms, nothing about trust.Runs on each file you dropn→nUniversal metadata scrubberStrip metadata from a PDF, image (jpg/png/webp), or Office document (docx/xlsx/pptx). Dispatches to the engine each format already has (pdf-lib, jsquash re-encode, a new OOXML docProps stripper covering all three docProps parts, custom properties included, plus Word tracked-change and comment author names). It does not touch the document's own body text, or comment authorship inside xlsx/pptx parts; the output line names exactly what was and was not scrubbed. Video files are refused, not silently passed through: this tool does not have a verified metadata-strip path for them.Runs on each file you dropn→nPrivacy risk scannerScan a PDF for unapplied /Redact annotations (marked but not removed: a real black rectangle drawn in a page's own content stream with no annotation at all is not detected) and hidden optional-content layers, or a .docx for tracked changes, hidden text runs, and the author names and user ids left in word/*.xml (word/people.xml included, where Word keeps a comment author's name and e-mail address). Reports what was found, not a verdict. "Clean" here means these specific checks found nothing, not that the file is safe to share. Cropped-but-embedded image data is explicitly not checked (see the tool source for why).Runs on each file you drop
Document32
1→1Markdown to HTMLConvert markdown to html with pandoc.Takes one file1→1Markdown to Word (DOCX)Convert markdown to docx with pandoc.Takes one file1→1Markdown to EPUBConvert markdown to epub with pandoc.Takes one file1→1Markdown to LaTeXConvert markdown to latex with pandoc.Takes one file1→1Markdown to reStructuredTextConvert markdown to rst with pandoc.Takes one file1→1Markdown to AsciiDocConvert markdown to asciidoc with pandoc.Takes one file1→1Markdown to DocBookConvert markdown to docbook with pandoc.Takes one file1→1Markdown to MediaWikiConvert markdown to mediawiki with pandoc.Takes one file1→1Markdown to OrgConvert markdown to org with pandoc.Takes one file1→1Markdown to TextileConvert markdown to textile with pandoc.Takes one file1→1HTML to MarkdownConvert html to markdown with pandoc.Takes one file1→1Word (DOCX) to MarkdownConvert docx to markdown with pandoc.Takes one file1→1Word (DOCX) to HTMLConvert docx to html with pandoc.Takes one file1→1LaTeX to MarkdownConvert latex to markdown with pandoc.Takes one file1→1reStructuredText to MarkdownConvert rst to markdown with pandoc.Takes one file1→1AsciiDoc to MarkdownConvert asciidoc to markdown with pandoc.Takes one file1→1DocBook to MarkdownConvert docbook to markdown with pandoc.Takes one file1→1MediaWiki to MarkdownConvert mediawiki to markdown with pandoc.Takes one file1→1Org to MarkdownConvert org to markdown with pandoc.Takes one file1→1Textile to MarkdownConvert textile to markdown with pandoc.Takes one file1→1SRT to VTTConvert SRT to VTT subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one file1→1VTT to SRTConvert VTT to SRT subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one file1→1SRT to ASS/SSAConvert SRT to ASS subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one file1→1ASS/SSA to SRTConvert ASS to SRT subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one file1→1SRT to SBV (YouTube)Convert SRT to SBV subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one file1→1SBV (YouTube) to SRTConvert SBV to SRT subtitles. Cue timings are re-parsed and re-formatted exactly, not merely re-punctuated. ASS/SSA override tags ({\i1}, {\an8}, ...) are carried through as literal text, not re-rendered or stripped. Use Strip subtitle formatting for that. VTT cue settings (align, position, line, size, ...) are dropped, not preserved. This converter carries dialogue and timing, not layout.Takes one filen→1Merge subtitle tracksCombine 2+ subtitle files (e.g. two language tracks, or a track split across parts) into one file, sorted by start time. Each input keeps its own format on read; the output takes the first file's format. Overlapping cues (e.g. two languages at once) are kept as separate cues, not merged into one.Combines the files you drop1→1Split subtitles by timeSplit an SRT/VTT/ASS/SSA/SBV file into two at a given timestamp, e.g. for a video cut into two parts. Cues are assigned to a part by their start time; the second part's timestamps are re-based to start at 0.Takes one file1→1Shift subtitle timingShift every cue in an SRT/VTT/ASS/SSA/SBV file by a fixed offset, to resync against a re-encoded video. Negative offsets shift earlier; a result below 0ms is clamped to 0 rather than going negative. A negative offset large enough to clamp both a cue's start and end collapses it to a zero-duration cue at 0ms rather than warning you its duration was destroyed.Takes one file1→1Strip subtitle formattingRemove inline styling from subtitle cue text: ASS/SSA override tags ({\i1}, {\an8}, ...) and HTML-ish tags (<b>, <i>, VTT <c.class>/<v Speaker>), while keeping the same format and exact timings.Takes one file1→1Subtitle to plain textExtract the dialogue from an SRT/VTT/ASS/SSA/SBV file. No timestamps, no cue numbers, formatting tags stripped, one cue per paragraph, in file order.Takes one filen→nVCF ↔ CSVConvert vCard (.vcf) contacts to CSV and back. A repeated property (two TEL lines with different TYPEs) becomes distinct columns rather than overwriting each other.Runs on each file you drop
Video18
n→nConvert videoChange videos between MP4 and WebM, in the browser only. It encodes with WebCodecs, which Node has no equivalent of, so the CLI and MCP surfaces refuse it.Runs on each file you dropn→nCompress videoShrink a video by re-encoding it at a lower quality, in the browser only, like video-convert (src/tools/video-convert.ts), because mediabunny encodes through WebCodecs, which Node has no equivalent of. Always outputs MP4.Runs on each file you dropn→nTrim / cut videoCut a video down to a start-to-end range without decoding a single frame. Packets are copied straight from the source into a new MP4, so this runs in Node, the CLI and MCP as well as the browser. The cut snaps back to the nearest keyframe before the start you asked for, the same trade-off ffmpeg -c copy makes.Runs on each file you dropn→1Merge videosConcatenate two or more videos, one after another, into a single MP4. A packet-level copy with no decoding, so this runs in Node, the CLI and MCP as well. Every input must share the same video codec (and audio codec, if present); mixed-codec inputs need re-encoding first, which this tool deliberately does not do.Combines the files you dropn→nResize / crop videoResize and/or crop a video, in the browser only, like video-convert (src/tools/video-convert.ts), because mediabunny decodes and re-encodes through WebCodecs, which Node has no equivalent of. Always outputs MP4.Runs on each file you dropn→nRotate videoRotate a video by a multiple of 90° by writing rotation metadata into the container, the same trick phones use for orientation, rather than re-encoding every frame. A packet-level copy, no decoding, so this runs in Node, the CLI and MCP as well as the browser. Most players honour this metadata; a player that ignores it will show the original orientation.Runs on each file you dropn→nChange video speedSpeed a video up or down by rescaling the timestamp on every packet. A packet-level copy, no decoding, so this runs in Node, the CLI and MCP as well as the browser. Audio speeds up with the video and its pitch shifts along with it, the same trade-off most simple speed-change tools make; correcting pitch back to normal needs decoding and resampling the audio, which this tool deliberately does not do.Runs on each file you dropn→nConvert audioChange an audio file between MP3, WAV, FLAC, Ogg and M4A (AAC). In the browser only, like video-convert (src/tools/video-convert.ts), because mediabunny decodes and encodes through WebCodecs, which Node has no equivalent of.Runs on each file you dropn→nNormalize audio volumeScale an audio (or video's audio track) so its loudest sample hits a target peak level: a two-pass peak scan followed by a gain-scaled re-encode, both through WebCodecs, so this runs in the browser only, like video-convert (src/tools/video-convert.ts). Always outputs MP4 with an unchanged video track (if any).Runs on each file you dropn→1Trim or merge audioCut an audio file down to a start-end range, or concatenate two or more audio files one after another. A packet-level copy with no decoding, so this runs in Node, the CLI and MCP as well as the browser. Output is always an MP4 audio file (.m4a).Combines the files you dropn→nExtract audio from videoPull the audio track out of a video into its own MP4 audio file. A packet-level copy with no decoding or re-encoding, so this runs in Node, the CLI and MCP as well as the browser.Runs on each file you dropn→nMute videoDrop the audio track from a video, keeping the picture untouched. A packet-level copy of the video track only, no decoding, so this runs in Node, the CLI and MCP as well as the browser.Runs on each file you dropn→nVideo thumbnailGrab a single frame from a video as a PNG or JPEG, in the browser only, like pdf-to-image (src/tools/pdf-to-image.ts), because decoding a frame needs WebCodecs, which Node has no equivalent of.Runs on each file you dropn→nExtract video framesPull out one frame every N seconds as a sequence of PNGs, in the browser only, like pdf-to-image (src/tools/pdf-to-image.ts), because decoding frames needs WebCodecs, which Node has no equivalent of.Runs on each file you dropn→nVideo to GIFConvert a video clip to an animated GIF. In the browser only, like video-extract-frames (src/tools/video-extract-frames.ts), because decoding frames needs WebCodecs, which Node has no equivalent of. WebCodecs has no GIF codec at all, so this decodes frames with mediabunny/WebCodecs and then builds the GIF89a bytes itself (src/gif.ts): one shared 256-colour palette (median-cut, sampled across every frame this tool decodes, not per-frame) so colours stay consistent frame to frame, with each pixel mapped to its nearest palette entry. No dithering.Runs on each file you dropn→nGIF to videoConvert an animated GIF into a video, in the browser only, like video-convert (src/tools/video-convert.ts), because encoding needs WebCodecs, which Node has no equivalent of. WebCodecs has no GIF codec at all, so this parses the GIF89a bytes itself (src/gif.ts), including disposal method and transparency compositing, so a GIF built from partial-frame deltas decodes to the same full frames a browser would show, not only its raw per-frame rectangles. It then feeds the composited frames to mediabunny/WebCodecs to encode. Always outputs MP4, following every other Node-native remux tool in this codebase; each frame's own GIF delay becomes its video frame duration. MP4 has no alpha channel, so any transparent GIF pixel, composited onto a canvas that starts fully transparent black, becomes opaque black in the video, not the checkerboard a GIF viewer shows; verified by executing this tool against a transparent fixture and reading the pixel back out.Runs on each file you dropn→nWatermark videoStamp a text watermark onto every frame of a video, in the browser only, like video-convert (src/tools/video-convert.ts), because compositing needs a decoded frame from WebCodecs, which Node has no equivalent of. Always outputs MP4.Runs on each file you dropn→1Burn in subtitlesDraw a subtitle track directly onto video frames, permanently. In the browser only, like video-watermark (src/tools/video-watermark.ts), because compositing needs a decoded frame from WebCodecs, which Node has no equivalent of. Reuses src/subtitleFormats.ts to parse the subtitle file (SRT, VTT, ASS/SSA or SBV) rather than parsing it a second time. Cues whose timing runs past the end of the video are never reached, and reported in the result text rather than as an error. Always outputs MP4.Combines the files you drop
Data15
1→1Reorder / insert CSV columnsReorder (and drop) a CSV's columns by name, and optionally insert one new column with a constant value at a given position. Quote-aware. A record with a quoted field containing a literal newline stays one record.Takes one file1→1Map CSV column namesRename a CSV's header to a new schema ("old=new" pairs), and optionally drop every column that isn't named in the mapping. Column order and data are otherwise untouched. Quote-aware. A record with a quoted field containing a literal newline stays one record.Takes one file1→1Change CSV separatorRe-delimit a CSV (comma, semicolon, tab or pipe), auto-detecting the current separator when not told what it is. Quote-aware. A record with a quoted field containing a literal newline (including in the header) stays one record.Takes one file1→1Transpose CSVSwap a CSV's rows and columns. Column 1 becomes row 1, and so on. A ragged row (fewer cells than the widest row) is padded with empty cells rather than refused. Quote-aware. A record with a quoted field containing a literal newline stays one record, not two.Takes one file1→1Split CSV into partsCut a CSV into several smaller files of N data rows each, repeating the header in every part. Quote-aware: a record with a quoted field containing a literal newline stays one record.Takes one filen→1Merge CSV filesConcatenate several CSVs with the same header into one file, in the order given. Quote-aware. A record with a quoted field containing a literal newline stays one record.Combines the files you drop1→1Remove duplicate CSV rowsStrip repeated rows from a CSV. Compares whole records, not physical lines, so a quoted field containing a newline is one record and stays one record.Takes one file1→1Find incomplete CSV recordsReport every record whose cell count doesn't match the header: too few cells (a truncated record) or too many (an unescaped comma). Read-only: nothing is changed. Quote-aware, so a record with a quoted field containing a literal newline still counts as one record with the right cell count.Takes one file1→1Query a SQLite databaseRun SQL against a .db / .sqlite file and read the answer as a table. The database never leaves your device.Takes one file1→1Profile a CSV datasetPer column: null count, a heuristic majority type (integer/float/boolean/string, over non-empty cells), and cardinality (distinct non-null values). Read-only. Nothing is changed. Quote-aware. A record with a quoted field containing a literal newline counts as one record.Takes one filen→1Diff two CSV datasetsCompare two CSVs. With a key column: report rows added, removed, and changed (by that key). Without one: a whole-row multiset diff, added/removed counts of exactly-equal rows, order-independent, duplicates counted. Read-only. Quote-aware: a record with a quoted field containing a literal newline is compared as one record.Combines the files you drop1→1JSONL processorValidate a JSON Lines file line by line, or convert it to/from a JSON array. validate never throws on a bad line, naming every one instead; the two convert modes refuse (naming the first bad line) rather than silently dropping or mangling a record.Takes one file1→1Filter / grep a log fileKeep (or drop) lines matching a plain substring or a regex. Like every tool here the whole file is held in memory at once (see src/defineTool.ts). A log genuinely in the multiple-GB range can exceed what a browser tab can hold; this does not stream from disk.Takes one file1→1CSV to ParquetConvert a CSV to a Parquet file. Every column is written as text (Parquet BYTE_ARRAY/UTF8), same reasoning as json-csv-convert: CSV has no type system, so a numeric-looking cell is stored as its exact original text, never parsed and reformatted as a number. Quote-aware. A record whose quoted field contains a literal newline stays one record.Takes one file1→1Parquet to CSVConvert a Parquet file to CSV. Numbers and text come back as their own values, unrounded and unreformatted; dates/timestamps render as ISO-8601; a nested list or struct column (CSV has no such shape) is serialized as JSON text in its cell rather than dropped. Snappy and uncompressed Parquet are supported; other codecs (GZIP, ZSTD, ...) are refused by name.Takes one file
Text26
n→nWhitespace / zero-width cleanerWhitespace / zero-width cleaner.Runs on each file you dropn→nRemove duplicate linesRemove duplicate lines.Runs on each file you dropn→nSort linesSort lines.Runs on each file you dropn→nRemove ANSI escape codesRemove ANSI escape codes.Runs on each file you dropn→nRemove diacriticsRemove diacritics.Runs on each file you dropn→nUnicode normaliseUnicode normalise.Runs on each file you dropn→nText-encoding brute force (mojibake rescue)Try a file's bytes against common text encodings to find the one that isn't garbled.Runs on each file you dropn→nInvisible-character & homoglyph detectorInvisible-character & homoglyph detector.Runs on each file you dropn→nCase converterCase converter.Runs on each file you dropn→nSlugifySlugify.Runs on each file you dropn→nTransliterateTransliterate.Runs on each file you dropn→nFind & replace (regex)Find & replace (regex).Runs on each file you dropn→nText to columnsText to columns.Runs on each file you dropn→nWord & character counterWord & character counter.Runs on each file you dropn→nFrequency distributionCharacter or word frequency counts.Runs on each file you dropn→nReadability scoreReadability score.Runs on each file you drop1→1Levenshtein distanceLevenshtein distance between a file and a second text you paste in.Takes one file1→1Hamming distanceHamming distance between a file and a second text you paste in.Takes one filen→nUnicode inspectorUnicode inspector.Runs on each file you dropn→nBraille encodeBraille encode.Runs on each file you dropn→nBraille decodeBraille decode.Runs on each file you dropn→nNATO phonetic alphabet encodeNATO phonetic alphabet encode.Runs on each file you dropn→nNATO phonetic alphabet decodeNATO phonetic alphabet decode.Runs on each file you drop·→1Lorem ipsum generatorPlaceholder text, generated on your device.Takes no file·→1ASCII art bannerTurn short text into a block-letter ASCII banner.Takes no filen→nMarkdown editor / previewA self-contained, editable markdown preview page: open it anywhere, offline, nothing leaves your device.Runs on each file you drop
Forensics24
n→nHex viewer with structure overlayA hexdump annotated with any known file signatures found in the bytes, including magic bytes and embedded formats.Runs on each file you dropn→nHexdumpClassic offset / hex / ASCII dump of any file, like `hexdump -C`.Runs on each file you dropn→nFrom hexdumpTurn a hex dump (offset / hex / ASCII text) back into the original bytes.Runs on each file you dropn→nByte frequency & chi-squareCount how often each byte value appears and compare the distribution to uniform random. A chi-square test, not a verdict.Runs on each file you dropn→nEntropy analysisMeasure the byte-level randomness of a file. High entropy suggests compression or encryption, not proof of either.Runs on each file you dropn→nSwap endiannessReverse byte order within fixed-size words: flip a file between little- and big-endian.Runs on each file you dropn→nTake bytesCut out a byte range from a file and keep only that.Runs on each file you dropn→nDrop bytesCut out a byte range from a file and keep everything else.Runs on each file you dropn→1Diff bytesByte-by-byte comparison of two files: where they diverge, by how much, and where they realign.Combines the files you dropn→1Offset checkerCompare 2+ files position by position and report which byte offsets agree across all of them.Combines the files you dropn→nDetect file typeIdentify a file by its magic bytes, not its extension;Runs on each file you dropn→nExtract stringsPull runs of printable text out of any binary file: the classic first look at an unknown file.Runs on each file you dropn→nExtract embedded filesCarve out the bytes starting at each detected file signature, up to the next signature or end of file.Runs on each file you dropn→nScan for embedded/appended filesScan every offset for known file signatures: finds a file hidden or appended inside another, e.g. a ZIP tacked onto a JPEG. A match means "signature found here", not "a file was deliberately hidden".Runs on each file you drop1→1File tree from archiveList the paths, sizes and structure inside a ZIP or TAR archive, without extracting anything.Takes one filen→nParse ASN.1Decode a DER-encoded ASN.1 structure (certificates, keys, PKCS blobs) into a readable tree.Runs on each file you dropn→nParse Object IdentifierDecode a raw ASN.1 OBJECT IDENTIFIER byte string (tag and length already stripped) into dotted-decimal form.Runs on each file you dropn→nParse TLVWalk a generic Tag-Length-Value byte structure with a configurable tag and length width: protocol frames, binary records, custom containers.Runs on each file you dropn→nELF infoRead an ELF binary's header and section table: class, architecture, entry point, sections. No disassembly.Runs on each file you dropn→nBit-plane viewerRender one bit-plane of one colour channel as a black/white image. A classic first look for hidden LSB data.Runs on each file you dropn→nLSB steganography extractPull the least-significant bit out of an image's colour channels and check whether it spells out readable text. Finding nothing proves nothing; finding text does not prove it was hidden on purpose.Runs on each file you dropn→nSplit colour channelsPull an image apart into separate red, green, blue and alpha grayscale images.Runs on each file you dropn→nExtract ID3 / audio metadataRead the descriptive tags (title, artist, album, cover art, ...) mediabunny finds in an audio or video container. ID3v2/v1, MP4 atoms, Vorbis comments and more, whichever the file has.Runs on each file you dropn→nIndex of coincidenceClassic cryptanalysis statistic on the letters in a file. Helps tell natural-language text from a well-mixed cipher or random data.Runs on each file you drop
Archive15
n→1Create ZIPBundle files into a single .zip.Combines the files you drop1→1Extract ZIPUnpack a .zip into its files, on your device. Refuses an archive whose own headers declare more than 1 GB of uncompressed content, so a decompression bomb cannot take the page down with it.Takes one filen→1Create tarBundle files into a plain (uncompressed) .tar, on your device. Hand-rolled USTAR, so see Extract tar for what it does not handle.Combines the files you drop1→1Extract tarUnpack a plain (uncompressed) .tar into its files, on your device. Hand-rolled USTAR reader: regular files and nested paths only; GNU long-name and PAX extended headers (common for paths over 100 bytes from some tars) are rejected with a clear error rather than mis-read, and it does not decompress .tar.gz/.tar.bz2/etc, only plain .tar.Takes one filen→nGzip compressGzip compress a file locally. Nothing leaves your device.Runs on each file you dropn→nGzip decompressGzip decompress a file locally. Nothing leaves your device.Runs on each file you dropn→nDeflate compressDeflate compress a file locally. Nothing leaves your device.Runs on each file you dropn→nDeflate decompressDeflate decompress a file locally. Nothing leaves your device.Runs on each file you dropn→nZlib compressZlib compress a file locally. Nothing leaves your device.Runs on each file you dropn→nZlib decompressZlib decompress a file locally. Nothing leaves your device.Runs on each file you drop1→1Split large fileCut a file into fixed-size parts named <name>.partNNN, on your device. Not the same naming as the Unix split(1) tool.Takes one filen→1Join split filesConcatenate parts back into one file, in filename order. Pairs with Split large file. For a recognised .partNNN set, a gap at the start or in the middle is detected and refused (e.g. part001 or part003 missing). A gap at the end (the last part missing entirely) cannot be detected from the parts alone, so verify the count yourself.Combines the files you drop1→1Checksum verifyCompare a file against an expected checksum, computed locally.Takes one filen→nData URI generatorEmbed any file as a base64 data: URI.Runs on each file you dropn→nLine-ending & BOM normalizerRewrite a text file to consistent line endings and BOM handling, on your device. Refuses input that is not valid UTF-8 text. This is not a binary-safe tool.Runs on each file you drop
Barcode3
n→nRead QR / barcodeDecode any QR code or barcode from an image.Runs on each file you drop·→1Generate QR / barcodeTurn text or a URL into a scannable barcode image.Takes no file·→1vCard builderBuild a vCard 3.0 contact card (.vcf) from plain fields, with full Unicode support. Feed the output text straight into "Generate QR / barcode" to make a scannable contact card.Takes no file
Font4
1→1Convert a font to OTFRe-encode a TTF, OTF or WOFF font as OpenType/CFF (.otf). This build of opentype.js only writes CFF outlines (verified by execution: it always emits the OTTO sfnt tag, never TrueType glyf, regardless of the source format), so OTF is the one honest direction: a real outline-format change coming from a TrueType source, a clean re-serialize coming from an OTF one.Takes one file1→1Inspect a font fileRead a TTF/OTF/WOFF font's name table, glyph list or metrics table: one parse, three views.Takes one file1→1Render a font specimen sheetDraw a sample of a font's own glyphs to a PNG. It flattens the real bézier outlines and fills them with a nonzero-winding scanline rasterizer (no <canvas>, no upload), so what you see is what the font file contains.Takes one file1→1Subset a font to specific charactersDrop every glyph except the characters you list. A smaller file that still renders exactly the text you use.Takes one file
SVG2
3D4
1→1Convert 3D modelTurn an OBJ, STL, PLY, FBX, DAE, 3DS or 40-odd other 3D formats into glTF or GLB.Takes one file1→13D model mesh infoRead vertex/face/material counts and the bounding box out of an OBJ, STL, FBX, DAE or 40-odd other 3D formats, via assimp's import side, the wide side of the engine model-convert also uses.Takes one file1→1Strip 3D model metadataRemove authoring metadata (generator string, copyright, node/mesh names, and any glTF "extras" fields) from a 3D model before sharing it. Converts through assimp's import side to glTF/GLB first, so the input can be any of the 40-odd formats assimp reads, then edits the resulting scene JSON directly.Takes one file1→1Convert STL between ASCII and binaryConvert an STL 3D model between its ASCII (text) and binary encodings. Both describe the same triangle mesh, so this is a direct parse-and-rewrite with no 3D engine involved.Takes one file