Skip to main content

Changelog

Every release, dated and human-written — what changed, which pages it touched, and why. Newest first.

  1. v10.34

    Forty fixes from a second hostile audit and real-browser testing: bounded memory, honest cancels, verified downloads

    • Long files no longer do their heaviest work before being refused: an audio preview past ten minutes is declined up front and its on-device conversion is capped just past the limit, and Audio Cutter's MP3 export yields as it encodes — the page answers, Cancel stops it mid-encode, the progress bar shows where it is, and the screen lock sees the run.
    • Cancels and page leaves do what they say: Compress Video no longer shows a finished result after Cancel during the soundtrack re-encode; Compress Video, Video to GIF and Add Music to Video stop their run and their conversion when the page is left, and no result URL is created on a page that is gone; Video to MP3 keeps its file card and Extract button after a failed run instead of dead-ending.
    • Downloads verify what they already have: a stored model part is checked against its published hash like a fresh download, so a part damaged by an older version or a rewriting middlebox is replaced instead of failing every later visit; the speech engine is handed out by count, so a second tool loading can no longer pull the first one's runtime from under it; a damaged engine file says it was discarded instead of promising a resume that cannot happen; the Hugging Face fallback no longer counts the same bytes twice.
    • Video to GIF: the final LZW pass runs frame by frame with the page responsive and Cancel live instead of one long block with the bar at 100 %; a decoder that stops answering is caught by a 30-second watchdog; a leaked container reader and a dithering cache that quietly defeated its own effect are fixed; a low-frame-rate source is encoded at its own frame rate instead of being padded to 15 fps with repeated frames.
    • Data tools: YAML reads a block scalar as a sequence item (`- |`), whatever spacing follows the dash, as a node of its own, and `--- key: value` as the mapping it is; JWT Decoder's claims table shows numbers exactly as written — past 2^53 and 1e400 — and warns when a segment carries bytes that are not valid UTF-8; Diff Checker returns an empty patch for identical inputs, as GNU diff does; JSON Diff reports both items of a duplicated key instead of silently dropping one; the diff engine's memory is bounded, so two completely different 200 KB sides no longer crash the tab.
    • Details that were wrong: EXIF reading no longer crashes on an odd pointer in a JPEG or PNG container; the screen wake lock no longer leaks after a hidden-tab round trip; Image to Text's and SVG Tracer's refusals speak the page's language; the built-in converter's numeric diagnostics carry their translation templates; the JSON tree, the growing transcript boxes and the command palette each had one wrong behaviour fewer.
    • Checked again before release, with real files in three browsers: Video to GIF no longer fails on detailed footage (“Maximum call stack size exceeded” in Chrome, from the new frame-by-frame assembly); a recording longer than 30 minutes that the browser cannot read itself is refused in Audio Cutter with that reason, instead of being cut to its first 30 minutes without a word; a preview's shortened copy is never handed to the tool's own run; Remove Background gives the speech engine back when its model download is cancelled or fails; and a YAML mapping written on the `---` line keeps the keys below it in the same document, and a plain value that runs on over the next, deeper lines is read as one string, as other YAML readers do, instead of stopping as mis-indented.
  2. v10.33

    Cancel that really stops, errors in your language, downloads checked part by part, and the fixes from an outside audit

    • Cancel now stops what it says. Video to MP3 no longer stays locked after Cancel during decoding. Auto Subtitles and Audio to Text stop decoding and the 10 MB speech-engine download at once, and keep what already arrived. Cancelling the conversion that Compress Video, Video to GIF or Add Music to Video needs first now offers “Convert again” instead of “Reading video…” for ever. Image to Text's Stop ends the image being read, and a preview's conversion stops when you leave the page.
    • The media tools' error messages (Auto Subtitles, Audio to Text, Compress Video, Video to GIF, Add Music to Video, Audio Cutter) now appear in the page's language, as do the progress animation's spoken label and the converter's messages. The bar of a run only moves forward: it no longer drops back to 0 % between the converter, the model and the work itself. On translated pages, these tools now also keep the screen awake and show the keep-the-page-open note.
    • Downloads: every part of the speech models, the converter and the image codecs is checked against its published SHA-256 before it is kept, so a part damaged on the way is fetched again instead of breaking every later visit. A partial answer from a cache is used only from the byte that was asked for, and a connection that keeps breaking before any new byte arrives now gives up instead of retrying for ever. The service worker no longer downloads models, the speech engine or the codecs a second time. Remove Background tries again after a passing network failure instead of staying broken until a reload, counts the engine in its bar and frees the model's memory when you leave.
    • Compress Video: low-frame-rate recordings (a 3 fps screen capture) can now be compressed. The sound is decoded once instead of twice, which spares memory on phones. A result over the target says why and what to change, and a sound that has to be re-encoded is budgeted at the size it will have. Audio to Text and Auto Subtitles read the sound of video files through the right element, and no subtitle runs past the end of the media.
    • Data tools: JSON Diff's collapse no longer hides real changes. JWT Decoder accepts integers above 2^53 and shows them exactly. YAML reads anchors inside [ ] and { }, and reports a mis-indented line instead of quietly splitting the file into two documents. Diff Checker's patch now applies with git apply, also for an empty original and a last line without a line break. CSV errors point at the quote that was never closed. EXIF Date Fixer puts a PNG's EXIF before the image data, where readers look for it. The JSON tree's arrow keys keep working after a search.
    • Phones and small screens: a photo larger than Safari can draw on an iPhone or iPad before iOS 18 (24 MP from recent iPhones) is scaled to fit, with a note on the result, instead of failing. Transcript boxes stop growing at a sensible height and keep a size you drag them to. Long file names wrap inside error cards, Copy works on plain-http addresses, the phone menu searches tool names in your language, and the floating action button brings its target out from under the header. Translated guides link to the same related pages as the English ones.
    • Translated pages: on 28 tools the Spanish, German, French, Portuguese and Japanese guides were a short rewrite with a single question. They now carry the whole English page — every guide section, every row of the options table and all six questions — in 104 translated pages, and a new build check refuses a translated page that falls short of the English one again.
    • Video to MP3: “Convert another video” now empties the drop zone; it used to hide the converter and leave the old file listed with no button to act on. Choosing another bitrate after a run offers Extract again. Every audio and video preview that has not opened its file a few seconds after it appears, with no error to show, loads it once more — on a first run in Chrome an MP3 preview could sit at 0:00 / 0:00.
  3. v10.32

    A download bar that reaches 100 %, honest step names, and conversions in the tool's own bar

    • When the speech engine was already on the device (after Remove Background, or on a second attempt), the download bar of Auto Subtitles and Audio to Text stopped short of 100 % (about 81 % on Tiny, 89 % on Base) and then jumped to transcribing. The engine now counts as present, and the bar reaches 100 %.
    • A model already stored on the device now shows as “Loading the speech model from this device…”, and “Transcribing 0 %” appears as soon as transcription starts; before, the previous step's label stayed up for the whole first 30-second window. Audio to Text's button names the converter's steps (“Downloading converter…”, “Converting audio…”) instead of “Extracting audio…”.
    • Compress Video, Video to GIF and Add Music to Video show the built-in converter's download and conversion in the tool's own progress area, with Cancel and the keep-the-page-open note, also when a file turns out to need it only after the button is pressed. A preview never interrupts a tool's conversion any more; it waits for it. Audio to Text's result preview reuses the copy converted for the run instead of converting the whole file a second time.
    • On phones, the screen stays awake across the short gap between two steps instead of the lock being released and taken again. Video to MP3 says “Preparing audio…” while a recording is resampled, instead of “Encoding … 0 %”. “Converting 0 %” no longer flashes before “Downloading the converter”.
    • The speech engine's file is checked against its SHA-256 before use: a damaged copy is cleared and named as such instead of ending in “no available backend”. The page's fetch and the engine's 10 MB in-memory copy are let go as soon as the engine has started. A converter whose script fails to download is reported as a download failure, not as a failed start.
  4. v10.31

    The speech engine starts from the device's own copy, and every step of a run in one progress bar

    • Auto Subtitles and Audio to Text: once the speech engine file (about 10 MB) has arrived in its parts, it is now handed to the engine straight from the device's memory. Before, the engine fetched it again through a temporary link, and a report from Chrome on macOS showed that step failing with “no available backend found … Failed to fetch” after every part had downloaded.
    • An engine copy stored by an older version is used only when its size is exactly right; anything else is downloaded again in parts. The “Copy problem report” text now also says how the engine file was provided and, if its parts failed, why.
    • Every step of a run now shows in the tool's one progress bar, in order. When a file needs the built-in converter first (Auto Subtitles, Audio to Text, Video to MP3, Video to GIF, Add Music to Video, Compress Video), its download and conversion appear in that same bar instead of a second card; Cancel stops it too. On phones, the note to keep the page open sits right under the bar.
    • On phones, an error card's message keeps its full width and its buttons move below it; before, a button beside the text squeezed the message into a one-word column. Error messages no longer show internal file names or retry counts; those are in the problem report and the technical details. Transcript lines in Auto Subtitles and Audio to Text grow to fit their text instead of cutting off the third line.
  5. v10.30

    One more try for a failed speech window, converter errors that name their cause, and a playback loop that breathes only when it must

    • A speech window that fails with the “error code = 6” an iPhone X showed on Tiny as well as Base is now run once more after a short pause, keeping every piece already transcribed. A passing failure finishes; only a second failure is reported as the device's memory limit. The window keeps its length: the speech model pads every window to 30 seconds, so a shorter one would need the same memory.
    • When the model download finishes but the session cannot be created — the report where the page “refreshed itself” and every retry answered code 6 — the load is now retried once from the parts already on the device: the first attempt raced the page's own leftovers, and those are collectable seconds later. Only a second failure is reported as the device's limit, and nothing is ever re-downloaded from a backup host that cannot fix memory.
    • The error cards of Auto Subtitles and Audio to Text now carry a “Copy problem report” button: the engine's own words (error code 6 included), the tool, the model, the phase and window size in effect, WebAssembly SIMD support and the device's facts — nothing about the file. One tap copies it, so the next report from a real phone answers what code 6 was on that device.
    • When Compress Video's last-resort converter fails, the error now names which of its three parts failed: the download (a connection that stopped — what already arrived is kept, and pressing Compress again continues from where it stopped), the start (reload the page), or the encode itself (with the converter's own reason). Before, all three ended as the same unnamed “could not be compressed” — a 1-in-3 failure over a bad connection stayed a mystery. A download that stalls for 150 seconds is now named as a connection problem, not as a device too weak to encode.
    • The in-page encoding path paused before every frame (v10.28); on a device whose frames are cheap, each pause could let a frame pass uncaptured. It now pauses only after about 50 ms of continuous work — the Cancel button still answers in the same instant (measured at 16 ms mid-encode) — and the technical details now record how many frames the file carries and how many were encoded, so a real phone reports the actual number.
    • Verified in a real browser this time: the whole compress route in a browser without hardware encoding, the service worker's byte-range serving for home-screen app previews (206 with the exact requested bytes), and the keep-awake note on a phone for both a granted and a refused screen lock.
  6. v10.29

    Downloads that finish on a bad connection, Firefox fixed, and the screen stays on while a tool works

    • The speech engine (about 10 MB) and the video converter (about 31 MB, plus its version for iOS 15 to 16.3) now download in 1 MB parts, each kept on the device as it arrives, as the models already did. On a connection that drops every few megabytes they started over at every break and never finished; now a break costs at most one part, and a reload continues where it stopped. The engine's download is now part of the speech tools' progress bar.
    • Firefox: v10.28.1 asked the browser to keep downloads with a request Firefox answers through a permission prompt, and waited for that answer. The second run of Auto Subtitles, Audio to Text or Remove Background then stopped at “Extracting audio…” for good. The request is no longer waited on, and Firefox is not asked at all.
    • The out-of-memory notice no longer appears when you reload the page yourself during a run, and it no longer tells someone already on Tiny to switch to Tiny. When the speech engine itself cannot start, the page says so and asks for a reload instead of trying another host.
    • While a tool works, the screen is kept on where the browser allows it, and phones show a note to keep the page open: a phone pauses a page's work when the screen locks or you switch apps.
    • In a web app added to the iPhone home screen, audio and video results now play from the site's own address, served by its service worker with the byte ranges Safari needs. The temporary blob: link used before would not play there.
    • Loading a split model writes each part into the file as it arrives, so memory holds one copy of the file instead of two.
  7. v10.28.1

    Models ask to stay: downloaded files now request persistent storage

    • The speech models, the image codecs and the video converter a visitor downloads are kept in the browser's own storage — but by default that storage is evictable: a device running low on space can throw finished downloads away without asking. The site now asks the browser to mark its storage persistent the first time a downloaded file is saved or read back, so a download that finished stays finished.
    • The ask is best-effort and a refusal changes nothing: each browser decides by its own rules (an installed app, how much is already stored, or a prompt the visitor answers), and one that says no keeps working exactly as before. The stored files were already checksum-verified when they were saved; this only protects them from being evicted.
  8. v10.28

    Out of memory, said honestly: Auto Subtitles after a Base-model crash, Compress Video on an old iPhone

    • An iPhone X report: the Base speech model downloads to 100%, the page reloads by itself, and every retry fails with “error code = 6”. That code is ONNX Runtime's answer to running out of memory — the 80 MB model does not fit a 3 GB phone's browser tab. The failure is now named for what it is, with a one-tap switch to Tiny, and the model is never re-downloaded from a backup host that cannot fix a device limit.
    • When iOS kills the page to free memory and reloads it (the “it refreshed by itself” moment), the reloaded page says so — what ran out of memory, and that Tiny is already selected for the next run. Audio to Text gets the same recovery.
    • Loading a stored model now holds one copy of the file instead of two while joining its parts. On a 3 GB phone that peak is what decides whether the larger model loads at all.
    • Compress Video on an older phone: the software path (browsers without WebCodecs — Safari before 16.4) caps its resolution at 720p, a run that stops making progress for 2½ minutes ends with the honest reason instead of a page that never finishes, and the page warns before a software run starts.
    • The in-page encoding path pauses between frames on every device, so the Cancel button and the progress bar respond while a video encodes; a converter that dies mid-run (a phone taking its memory back) says that instead of claiming it could not start.
  9. v10.25

    Tested on every Safari from 15.4 to 18: older iPhones work again

    • Run on the WebKit engines of Safari 15.4, 16.0, 16.4, 17.0, 17.4 and 18.0 with an iPhone X screen, every video, image and PDF tool turned up failures that are now fixed. On iOS 15 the site's shared script did not even load, so no tool worked on an iPhone 6s, 7 or first SE.
    • The built-in converter needed a WebAssembly feature (SIMD) that Safari only has from 16.4, so on iOS 15 and 16.0–16.3 every conversion failed, including Compress Video's only route there. Those iPhones now get a second converter built without it; an iPhone recording compresses in about a minute on the Safari 15.4 engine.
    • PDF tools work from Safari 15.4: the PDF reader needed functions that Safari gained only in 16.4 and 17.4. WebP output works in Safari again: the build had broken the WebP encoder's script on every version. The build now refuses any script that does not parse.
    • Large downloads (the converter, the AI models) survive a dropped or stalled connection and continue where they stopped, including on hosts that ignore range requests; Auto Subtitles failed with “Load failed” on an iPhone.
    • Compress Video never hands over a file larger than the target or than the original: an encoder that overshoots its bitrate runs again with less. An AV1 video that cannot be decoded says so instead of blaming the device's memory.
    • Smaller fixes: JPEG output when the browser cannot encode JPEG; AVIF results shown in Crop Image, Blur Image and Photo Collage on older Safari; audio the converter has decoded no longer waits on the browser's decoder (Audio Cutter on an AIFF); overlapping AVIF decodes no longer cancel each other; Unlock PDF on iOS 15.
  10. v10.24

    Every video and image format tested end to end; sound that plays on every device

    • Camera recordings in .ts, .m2ts and .mts start a second or more into the file. Compress Video took that offset for extra length and rejected correct results; Add Music to Video and Video to GIF shifted their timing by it. All three now measure from where the video starts.
    • Where the browser has no AAC encoder (Firefox), the sound of an MP4 was written as Opus, which iPhones and QuickTime may play silently. It is now re-encoded to MP3 inside the MP4, which every player handles. MP3 files are always written at a sample rate MP3 allows.
    • A video the browser reads but cannot decode (an old phone's .3gp) no longer gives an empty file or waits for ever in Add Music to Video. After an on-device conversion, Compress Video, Add Music to Video and Video to GIF carry on by themselves instead of waiting for a second click, and they say “Reading the video…” while a file opens.
    • Previews: a video with sound but no picture in this browser shows a still frame; an audio result the browser cannot play is played from a WAV copy. Crop Image, Image to Text, Remove Background and Image to Base64 show HEIC and TIFF originals in every browser.
    • TIFF images open in every image tool in Chrome and Firefox, through the built-in converter. JPG to PDF, Image to Base64 and the creator resizers accept every image format the site reads, BMP and DIB included.
    • Clearer failures: an AV1 video on a device without an AV1 decoder names the codec and the fix; audio the browser decodes to nothing (an AIFF-C in Safari) is converted instead of showing an empty waveform; a browser too old for the file tools says so up front.
    • Smaller fixes: Split PDF names its ZIP after the document; JSON Editor says “1 key” and “1 item”; AI Token Counter shows no $0.00 for a model without a list price; the Open button of SVG to PNG lists .svg files; EXIF Date Fixer previews TIFF photos; Text to Speech lets you pick every voice on Linux, where the browser gives voices no ID; sliders and bars use the brand orange.
  11. v10.23

    Compressed videos play everywhere; previews for every format; no repeat downloads

    • Compressed videos are written in the colour format every camera uses (BT.709, limited range), so Chrome on a laptop previews them; before, a scaled or rotated video could open in a player but not in the browser.
    • Compress Video checks each result before handing it over: a file that is far too small, too short or nearly frameless is discarded and the next method runs. On an iPhone X this replaces the 0.1 MB file that was not the video.
    • When the browser cannot play a video, its preview shows a still frame decoded from the file. Image previews and thumbnails show HEIC and AVIF in every browser.
    • Encoders, the built-in converter and the AI models announce a download only when they actually download; once stored on the device, nothing about downloading is shown. The converter's first download appears in Compress Video's own progress bar, and the speech model's download only moves forward.
    • The file picker of every image tool offers every format the tool reads, HEIC included on Windows; Audio to Text also takes video files.
  12. v10.22

    Compress Video on older iPhones, moving progress bars, brand-orange logo

    • Compress Video now has a third way to finish: when a phone can neither decode the video through WebCodecs nor play it in the page (an iPhone X on iOS 16 with an HEVC recording), the built-in converter compresses it in a single pass instead of converting first and compressing second.
    • A step that stops making progress for 30 seconds hands over to the next way automatically, so the page is never left on a bar that does not move. If every way fails, the error card has a Technical details section to copy into a problem report; it contains nothing from your file.
    • Progress bars in the image tools and the PDF tools move while a single file is processed, instead of staying at 0% until it is done.
    • Audio Cutter also takes video files and cuts their sound, including audio-only WebM recordings that it used to turn away.
    • Video previews try once more before saying the browser cannot play the result.
    • The “ByUs” in the logo is the brand orange in light mode too.
  13. v10.21

    Compress Video keeps the page responsive; cleaner previews

    • Compress Video now does its work in the background, so the page stays responsive while a large phone video is compressed; on iPhone the page could freeze. A compression that stops making progress for a minute now ends with a message instead of hanging.
    • The live previews of the design tools sit on the card's own colour, so dark mode no longer shows black corners around them, and the Glassmorphism preview has square corners.
    • On phones, the SVG Wave preview fills its frame instead of leaving most of it empty.
  14. v10.20

    iPhone videos compress and turn into GIFs without conversion

    • Compress Video and Video to GIF now read MP4, MOV, WebM and MKV files straight from the file with the browser's own decoder, instead of playing them in a hidden video player. On iPhone and iPad this opens the camera's own HEVC recordings, including 4K, which were sent to the slow built-in converter and could run out of memory.
    • Compression no longer runs in real time: a short clip finishes in seconds, and the original AAC sound is kept as it is.
    • Portrait videos stay upright in the compressed file and in the GIF.
  15. v10.19

    AVIF that works on the first try, iPhone videos, and safer limits

    • Saving as AVIF no longer fails on the first attempt right after the encoder downloads: a failed encode is retried once before an error is shown.
    • Compress Video and the other video tools wait for an iPhone or iPad recording to report its real size before they decide how to read it, so MOV files from the camera are no longer sent to the slower built-in converter.
    • Videos longer than 30 minutes are refused before any conversion starts, instead of failing at the end.
    • Video to GIF, Compress Video and Add Music to Video open AVI, MPG, WMV and MKV files more reliably on Safari, and a video without sound now says so in Video to MP3 instead of reporting a decoding error.
    • Very large images (over 150 megapixels), very long audio files, PDFs over 200 pages and oversized text inputs are now refused up front with a clear message, instead of freezing the tab.
    • Model files downloaded from their original host are kept only if they match the exact version this site pins.
    • The privacy policy now also lists YouTube thumbnails, the on-device AI model hosts and every setting the site stores in your browser.
  16. v10.18

    Converters and models download once, and iPhone videos open

    • The built-in video converter (31 MB), the image codecs, the speech and background-removal models and their runtime are now stored in your browser after the first download and reused until a new version of that file is released. Updating the site no longer downloads them again; on iPhone and iPad, Safari used to download the converter on every use.
    • Video tools read your file through a hidden player that is part of the page, which iPhone and iPad need to open their own MOV recordings reliably.
    • When even the on-device conversion cannot open a video, the tool now says so, instead of suggesting that you export it as MP4.
  17. v10.17

    Model loading that cannot hang

    • Audio to Text, Auto Subtitles and Remove Background no longer stay stuck at “Downloading model… 100%”. A load that makes no progress for a while now stops, clears what was cached of that model and fetches it from the original host.
    • The site’s offline worker no longer handles the AI models, the speech runtime or the image and video codecs. Every use of a cached model used to download the whole model again in the background, which slowed the real download on weak connections.
    • The list of accepted file types under each drop zone is now set in smaller, quieter text.
  18. v10.16

    Model downloads that survive a bad connection, and an update prompt that finishes

    • Audio to Text, Auto Subtitles, Remove Background and Image to Text now retry a model download that fails and resume it from where it broke off. If this site still cannot deliver the model, they fetch it from its original host (Hugging Face or jsDelivr) instead of stopping. A failed download is now named in the error; before, it showed as “Unsupported model type: whisper”.
    • The “A new version is ready” bar no longer comes back after you accept it, and its button now says Update.
    • A video or audio file your browser cannot play now shows a short note instead of a black player stuck at 0:00. The file itself is fine to download.
    • Two drop zones side by side, as in Add Music to Video, now have the same height, and a pasted file goes only to the box that accepts it instead of showing the same warning twice. Regex Tester’s match list is as tall as the text beside it.
    • The Add Music to Video and Compress Video illustrations are redrawn.
  19. v10.15

    Every video and audio format opens, models load from this site, and 24 audit fixes

    • Videos and audio the browser cannot play — HEVC in Firefox and Chrome, AVI, WMV, MPEG, MKV with AC-3 sound, WMA — now open in Compress Video, Video to GIF, Video to MP3, Add Music to Video, Auto Subtitles, Audio Cutter and Audio to Text. They are converted on your device first, with a progress card and a Cancel button; nothing is uploaded.
    • AVIF and WebP photos open in every image tool, even in browsers that cannot display them, such as Edge before version 121 or Safari 16 on macOS Monterey for AVIF.
    • Audio to Text, Auto Subtitles, Remove Background and Image to Text now download their models from this site instead of Hugging Face and jsDelivr, so they work wherever those services are slow or blocked, and every page again connects only to this site.
    • Action buttons keep their place when you change options, the menus of every drop-down have even padding on both sides in all browsers, and PDF to Text and Redact PDF show the progress orb.
    • 24 issues from an adversarial audit are fixed, among them PDF Metadata Remover leaving XMP metadata in images, Split and Merge PDF dropping form fields and links, exact cent arithmetic in Invoice Generator, YAML and TOML edge cases, and X character counts that now match X exactly.
    • Twelve tool illustrations are redrawn to show what the tool actually does.
  20. v10.14

    WebP and AVIF now work in every browser

    • Compress Image, Convert Image and the other image tools can now save WebP and AVIF in every browser. On browsers that cannot encode these formats themselves — older Safari for WebP, and every browser we tested for AVIF — the encoder is now loaded on demand, so the option is no longer greyed out and no longer fails with an error. Browsers that encode natively are unchanged and download nothing extra.
    • The AVIF option is no longer disabled on browsers that could not encode it, and the outdated message claiming browsers cannot encode AVIF is removed.
    • The software encoder runs in a background worker, so the page stays responsive while a slow AVIF encodes: the progress card shows the encoder download with real byte counts, an elapsed clock, and a Cancel button that stops the encode instantly.
    • AVIF fallback encoding runs at speed 8 — the encoder's default 6 is tuned for servers — roughly halving the wait on a phone while keeping the image at full resolution. When a browser's security settings block WebAssembly, the tool says so specifically instead of downloading a multi-megabyte encoder and then failing.
  21. v10.13

    Add Music to Video works with phone recordings

    • Add Music to Video now copies the picture into the new file instead of re-encoding it. Removing the sound or adding music works with HEVC, 10-bit and HDR phone recordings that the browser cannot play, keeps the original quality and resolution, and takes seconds instead of the length of the video. Before, these files failed with “could not be played”, even when only the sound was to be removed.
    • Video to GIF now says which codec a video uses when the browser cannot decode it, like Compress Video and Add Music to Video already do since v10.12. It still showed the general message.
    • Videos the browser cannot decode no longer crash Compress Video, Video to GIF or Add Music to Video: files whose picture track yields no frames (for example HEVC 10-bit phone recordings) now show the message naming the codec and how to fix it, instead of failing with an internal error.
  22. v10.12

    Every tool re-tested in Chrome, Firefox and Safari's engine — and what it caught, fixed

    • Blur Image now really blurs in Safari. Safari has no canvas blur filter and ignored it silently, so on iPhone, iPad and Mac the “blurred” photo was exported with the original pixels. The blur is now computed directly where the browser lacks the filter, with the same result as in Chrome.
    • Compress Video works in Safari 16.4 to 18 with sound. Those versions have no audio encoder, so the tool reported the browser as unsupported; it now copies the video's original AAC or Opus track into the new file unchanged.
    • Compress Video in Firefox now writes a clean file. Firefox's H.264 encoder reorders frames and writes a damaged header, which made the output drop frames; frames are now timed correctly and the header is rebuilt from the video itself.
    • When a browser cannot decode a video, the message now names the codec — for example H.265 (HEVC) or 10-bit H.264 — and says how to fix it, in your language, instead of a bare “could not be played”.
    • PDF tools in Safari: the offline cache no longer answers the PDF engine's own background script, which could stop Safari from starting it.
    • Blur Image fits the photo to the frame on every screen, so a phone shows the whole picture instead of one corner, and mouse-wheel zoom works on desktop.
    • EXIF Date Fixer accepts negative shifts again — typing a minus sign used to reset the field to 0 — including on the iPhone keyboard.
    • Reorder and Delete PDF Pages no longer show the same warning twice, and a warning clears as soon as you correct the page list.
    • QR Code Generator: the Wi-Fi and Contact modes now say what is missing (the network name or the full name) instead of pointing to a Try Example button they do not have.
    • Compress PNG keeps working on older Safari without the Compression Streams API.
    • On phones, the file list of Merge PDF, JPG to PDF, Photo Collage and the other multi-file tools shows the file names again. The reorder arrows, size and handle used to take the whole row on a 390 px screen and left the name no width at all.
  23. v10.11

    Loading animation enlarged and shown in the site's orange

    • The animated orb that shows a tool is working is now 64 px and sits centred above the progress bar in Compress Video, Video to GIF, Add Music to Video, Upscale Image, Remove Background, Image to Text, Audio to Text and Auto Subtitles. At its old 20 px size it showed only a few faint dots and was easy to miss.
    • The orb is now drawn in the site's orange instead of grey, in the light, dark and high-contrast themes alike. Each run still picks one of all nine orb animations at random.
    • Homepage: the ToolsByUs.com lockup and the “100% Local Processing” line now sit vertically centred on the monitor's screen instead of low on it.
    • The orb now also appears above every other progress bar that runs to 100 %: the PDF tools (Merge, Split, Rotate, Reorder, Delete Pages, Compress, Unlock, Watermark, JPG to PDF, PDF Metadata Remover, PDF to JPG), the image batch tools (Compress, Resize, Convert, HEIC to JPG) and Video to MP3.
  24. v10.10

    Homepage security policy restored and offline pages fixed on the live site

    • The homepage now receives its Content-Security-Policy on the live site. Cloudflare Pages keeps only the last of two header blocks for the same path, and a separate cache block for “/” was silently replacing the homepage’s policy. Every path now appears once, and the build refuses a repeated one.
    • Offline support works on the live site again: opening a page you had never visited while offline now shows the site’s “You are offline” page instead of the browser’s error. Cloudflare Pages redirects /offline.html to /offline, and the stored redirect was refused by the browser; the service worker now stores the final page.
    • Turning on ads or analytics through the build settings no longer stops the build at the new privacy-copy check; it prints a reminder to revise that copy instead.
  25. v10.09

    Large pastes stay responsive, mode switches show their state, and privacy headers match the page copy

    • Pasting very large text — minified JSON, a base64 blob, a log — no longer freezes the tab. An 8 MB paste into JSON Formatter used to lock the page for close to three minutes while the browser laid out one unbroken line of text; it now settles in about three seconds.
    • Studio tools with a mode switch — EXIF Date Fixer, Mesh Gradient, Box Shadow and the others — now show which option is selected. The highlight was being overridden, so every option looked the same.
    • Compress Video keeps the sound in browsers that have no AAC encoder, such as Firefox and Chromium on Linux: it now encodes the audio as Opus instead of stopping with “Unsupported codec type”.
    • EXIF Remover: exporting as JPEG or WebP works again. The browser adds its own colour profile to those files, and the tool’s final check counted it as leftover metadata, so only PNG ever downloaded. Common tags such as Exif version and colour space are also named now instead of shown as “Unknown tag”.
    • Diff Checker and JSON Diff on phones: the page no longer re-renders from scratch on load. The unified view phones get by default was chosen before the page had hydrated, so the server’s HTML and the phone’s first render disagreed.
    • Photo Collage no longer makes the whole page scroll sideways on a phone: its option rows now wrap.
    • Homepage: the “100% Local Processing” line on the scene’s screen is larger and brighter, so it reads on a desktop monitor, and long translations fit the screen. The scene now animates for everyone; with reduced motion turned on, a pause button appears beside it and the choice is remembered.
    • Security headers: each page now receives only the external hosts its own tool uses. Before, a page could inherit the speech-model, OCR and YouTube hosts of unrelated tools whose address began with the same letter, which contradicted the connect-src 'self' the page cites.
    • Audio to Text and Auto Subtitles no longer request three local model files that do not exist before the first transcription.
  26. v10.08

    Every tool re-tested end to end — and what the testing caught, fixed

    • All 135 tools were exercised one by one with real files and real flows — uploads, every option, edge cases and invalid inputs — on screens from the smallest phone to a large desktop monitor. This entry lists what that testing surfaced and fixed; everything else passed as it was.
    • Dropping a file a tool cannot use now explains itself: the message names the file, the formats the tool accepts and the limit that was hit, in the page’s own language. Before, the same situation could show a raw internal label instead of a sentence.
    • Every drop zone now lists the formats it accepts before you choose a file (for example “Accepted: MP4, WebM, MOV, MKV”), not only while you are dragging.
    • Image tools can no longer wait forever at “Processing… 0%”: each file has a two-minute ceiling, and a file that exceeds it is skipped with a clear message while the rest of the batch carries on.
    • Tools that do their heavy work in background threads — the PDF tools, the SVG tracer, the image upscaler and PNG compression — can no longer wait forever when such a thread never starts answering, which a slow or interrupted connection could cause on the live site (seen once as Compress Image stuck at “Processing… 0%”). Each now has a deadline, after which the work is retried on the main thread or reported as an error.
    • Compress Video: clearing a loaded video could throw a background error, because the panel still read the cleared file’s size from stale probe results. Fixed.
    • On phones, the live preview of the eight studio tools (Barcode, Box Shadow, Contrast Checker, CSS Gradient, Glassmorphism, Mesh Gradient, QR Code, SVG Wave) now stays pinned under the header in a compact form — capped at 45% of the screen height, with the preview image always fully visible, never cropped.
    • The Pin, Share and Print buttons on every tool page now meet the 44-pixel touch height on touch screens.
    • Excel tool previews are capped at the first 10 rows and 50 columns — and when a spreadsheet cannot be converted, the tools now say so instead of silently showing nothing.
  27. v10.07

    Sticky previews can no longer cover their own output

    • Eight studio tools — Barcode, Box Shadow, Contrast Checker, CSS Gradient, Glassmorphism, Mesh Gradient, QR Code and SVG Wave — show the generated code, the readouts and the Copy/Download buttons in a full-width section below the tool instead of inside the sticky column, so a pinned preview can never park itself on top of its own results. Only the live preview stays pinned, capped so it always fits between the header and the bottom of the screen.
    • Contrast Checker: the ratio now sits beside the colour inputs, readable on a phone without scrolling, while the full level-by-level report, APCA, the suggested colour and the copy rows live in the section below. The dead zone a stuck panel used to press over the lower half of a phone screen is gone.
    • The twelve text converters no longer pin a 40%-tall output box over a phone screen: results flow in the page, and the phone's sticky action bar now carries the output's Copy button instead.
    • One header-height token (--header-h) now drives every sticky rail. The invoice generator's preview no longer starts 57px under the header on desktop (7px on a phone), and the all-tools filter bar, the photo collage and the SVG tracer sit exactly one header down.
    • Tapping the phone's mirrored action button now scrolls the real button and its confirmation into view, so the tap visibly did something.
    • The back-to-top button fades out while the footer is on screen instead of covering its links, and sticky panels that scroll internally no longer trap the page scroll.
    • In-page anchors land clear of the sticky header on every page.
    • Each localized homepage's opening copy now echoes its headline: the words the headline promises — good, free, everyday tools — appear in the text itself across the German, Spanish, French, Portuguese and Japanese homepages.
  28. v10.06.1

    Text selection now uses the brand orange in every theme

    • Text selection across the whole site now renders in the brand orange (#f6821f) with dark text, as designed in v10.01: two Tailwind utilities on the <body> element (selection:bg-accent-soft, selection:text-foreground) had silently overridden the global ::selection rule from the day it was added, so selected text showed only a pale tint. The utilities are removed; the global rule in globals.css now governs selection everywhere.
    • Verified against the served production CSS: the overriding selection rules are gone and the orange ::selection is the only selection style in the cascade.
  29. v10.06

    Unified release: both v10.06 lines merged, Japanese and Portuguese bodies retranslated from source

    • The two v10.06 trees were compared file by file and unified: the second line's 46 retranslated Japanese and Portuguese body packs are kept, along with the audit line's six-language changelog, release-note typography and French panel spacing.
    • Japanese packs for 24 tools and Portuguese packs for 20 tools were retranslated from the current English pages, restoring details such as live word highlighting in Text to Speech and the exact password-generator security copy.
    • Portuguese follows the site's Brazilian standard throughout the rewritten packs: senhas, câmera, baixar, cadastro and logotipo replace the European forms that had slipped in.
    • Text to Speech no longer claims 50+ natural voices; the voices available depend on the device, as the English page states.
    • The FAQ answers, guides and schema features that a rewrite had emptied for 14 tools are restored, Japanese prose colons are full-width again, and the French spacing standard now covers twenty-seven previously missed strings: eight body-pack strings and nineteen meta descriptions use the non-breaking space before colons and question marks.
    • All release gates were re-run on the unified tree: typecheck and lint clean, 3,404 unit tests passing, panel, content and mirror checks green.
  30. v10.05

    Image handling, QR camera cleanup, UUID generation and localized guides

    • Added a fallback for stalled native photo decoding and fixed HEIC previews and crop proportions.
    • Fixed late QR scans, camera-stream cleanup and repeated UUID v1 values when the clock does not advance.
    • Completed missing localized tool guides and added a build check for all 530 body packs.
    • Corrected export-size, audio-precision and privacy claims. Cross-browser validation is recorded separately in the release audit.
  31. v10.02 — hostile audit: deploy-ready, changelog entry for v10.01

    A full adversarial audit of v10.01 verified the four polish fixes byte-exact and re-ran every gate; the release notes gained the missing v10.01 entry.

    • Hero line-height 1.25, orange ::selection, full-width update bar and per-language TTS examples verified byte-exact in the source of both v10.00 and v10.01.
    • Translation corpus scanned in all six languages for AI-cliché phrasing and machine-translation artefacts: 0 real findings (German Sie-form census: 0 informal; the only pattern hits are the AI Cliché Remover's own example list and the unlock-pdf tool name).
    • All gates re-run on the delivered tree: typecheck 0 errors, ESLint 0 errors, 3,327/3,327 unit tests, panel localization (1,998 calls, 113 routes), 125 mirrors with 0 drift.
    • Production compile verified with Turbopack; the full 1,248-page static export remains the host's build step and needs more than this audit sandbox's 4 GB of RAM, as documented in FIXES-v10.00.1.md.
    • Changelog: the v9.86 entry is confirmed present in every language; v10.01's four fixes are now documented in all six.
  32. v10.01 — hero line-height, orange selection, full-width update bar, TTS examples per language

    Four polish fixes from owner feedback: calmer hero typography, brand-colored text selection, a safer update prompt and native TTS example text.

    • Hero headline line-height relaxed from 1.04 to 1.25 — CJK and Latin headlines both breathe better on every viewport.
    • Text selection now paints the brand orange with a dark-ink foreground, in the light and dark themes alike.
    • The PWA update prompt is now a full-width bottom bar instead of a floating card — safe over notches and home indicators, and the message wraps instead of truncating.
    • Text-to-speech example text follows the selected voice's language — native samples for English, German, Spanish, French, Portuguese and Japanese.
  33. v10.00 — Security hardening: 3 hostile audits, 40+ findings fixed

    Three hostile audits (GLM 5.3, Gemini Argon, ChatGPT) found 40+ real issues. All fixed: critical PDF data leak, prototype pollution, DoS vulnerabilities, TTS bricking, plus translation corrections.

    • CRITICAL: PDF deleted pages leaked via link annotations — fixed by stripping /Annots from SOURCE before copyPages (was stripping after, too late).
    • HIGH: TOML parser prototype pollution — now uses Object.hasOwn() instead of !== undefined, blocking toString/valueOf/constructor collisions.
    • HIGH: queryStringToJson DoS — array indices now validated (max 10,000), preventing 100M-element sparse array crashes.
    • HIGH: XML/OG entity decoders — now use null-prototype objects and hasOwn(), preventing &constructor; from becoming function source.
    • HIGH: TTS bricked on Desktop Chrome — localService filter now falls back to all voices when zero local voices exist, with conditional privacy warning.
    • HIGH: 36 German informal forms fixed (panel-image, panel-utility, surface-ui, tool-ui, unlock-pdf, pseo specs).
    • MEDIUM: Invoice 'Rate' collision fixed — TTS rate renamed to 'Speech rate' with proper translations.
    • MEDIUM: PDF-to-JPG in-flight URL leaks fixed — producedRef tracks uncommitted URLs, revoked on error/unmount.
    • MEDIUM: TOML whitespace preservation — quoted strings and keys no longer have whitespace normalized/trimmed.
    • LOW: ES/FR/PT 'redaction' mistranslations fixed (redacción → ocultación, rédaction → caviardage, redação → ocultação).
    • LOW: DE/PT Jargon Buster descriptions corrected to indicate English-only.
    • Full npm run check: PASSED (typecheck, lint, 3327 tests, 1261 pages, SEO, CSP, bundle 225.3KB).
  34. v9.99 — Hostile re-audits (GLM 15 + Argon 35 findings): critical fixes, i18n corrections

    Two fresh hostile audits (GLM 5.3: 15 findings, Gemini Argon: 35 findings) drove critical bug fixes, complete German Sie-form conversion, French typographic spacing corrections, and localized changelog completion.

    • CRITICAL: Text-to-Speech voice filter fixed — Play disabled when no local voices exist, privacy note conditional (was claiming 'never uploaded' while using network voices on Android/ChromeOS).
    • CRITICAL: French spacing regex had corrupted TypeScript operators (U+202F/U+00A0 in ?: and ??) across 3 files — fixed.
    • German: 34 remaining informal du/dein forms converted to formal Sie/Ihr across image, utility, and tool-ui dictionaries.
    • French: 119 lines with ASCII spacing corrected to U+00A0/U+202F in panel dictionaries; regenerated.
    • Changelogs: v9.97 and v9.98 entries added to all 5 localized changelogs (were missing entirely).
    • Tool names: 7 missing tools (text-to-speech, video-to-mp3, qr-code-scanner, excel-to-json, invoice-generator, fancy-text-generator, youtube-thumbnail-downloader) added to all 5 locale name dictionaries.
    • Code: PDF-to-JPG unmount URL revocation, 3 aria-labels localized (WatermarkPdf, PassportPhoto, YoutubeThumbnail), TTS no-voices message translated.
    • Panel gate: 0 missing (1997 calls checked). Typecheck: clean. Lint: 0 errors.
  35. v9.98 — ChatGPT translation review: EXIF polish, Sie-form, French spacing

    Applied the ChatGPT GPT-6.1 Sol native translation review: polished EXIF Date Fixer strings, German Sie-form corrections, and French typographic spacing fixes.

    • EXIF Date Fixer: 41 strings polished per ChatGPT review — more precise phrasing (e.g. 'Fecha de modificación del archivo' vs 'Archivo modificado'), correct German Sie-form ('Legen Sie Fotos hier ab'), feminine French agreement ('non définie'), natural French progressive ('Correction en cours…').
    • German: Sie-form applied to EXIF drop zone and date picker strings.
    • French: U+00A0/U+202F spacing verified per ChatGPT corrections.
    • All 41 EXIF strings now match both Argon and ChatGPT native reviews.
  36. v9.97 — Argon hostile audit: 38 findings, translation gate hardened, UI/UX fixes

    A second hostile audit (Gemini Argon, 38 findings) drove translation-gate hardening, native-quality i18n fixes across three languages, and five UI/UX accessibility repairs. The panel gate now catches ternary and parameterized strings.

    • Translation gate hardened (Argon #15): the panel-localization check had three blind spots — it skipped ternary expressions, filtered out every {placeholder} string, and checked exif-date-fixer against the wrong dictionary. All three fixed.
    • French typography: 19 files corrected — U+00A0 no-break space before ':' and U+202F narrow no-break before ';', '!', '?' applied.
    • German register: 24 informal du/dein forms converted to formal Sie/Ihr.
    • Japanese style: 3,644 Western spaced em-dashes replaced with native long dashes across 174 files.
    • Missing translations: 41 exif-date-fixer strings x 5 languages, 18 parameterized utility strings x 5 languages, pdf/color/convert/json strings, 3 upscale tooltips x 6 locales. Gate: 0 missing.
    • UI/UX: PinnedTools scrollbar restored, header search at 640-1023px, dark-mode contrast fixed, CommandPalette focus trap, Recent row scrollbar.
    • Code: video-compress URL leaks fixed, audio cancel resets to idle, upscale tooltips use correct dictionary.
    • Privacy page discloses YouTube fetches and AI model downloads.
    • SEO: two 163-char meta descriptions trimmed.
  37. v9.96 — hostile-audit fixes: full panel translation coverage, header breakpoint

    An external hostile audit (GLM 5.3) found two real issues: 71 panel strings with no translations and a header breakpoint mismatch. Both are fixed, and the release gate now checks translation coverage.

    • Translations: 69 tool-panel strings (mostly from newer tools like AI Cliché Remover, Jargon Buster and the JSON-LD Schema Generator) had no Spanish, German, French, Portuguese or Japanese rows, so five locales silently showed English. All 69 were translated and then independently reviewed by two separate native-speaker AI reviews (Gemini Argon: 30 items; ChatGPT: 26 items), which together produced 120+ corrections — AI-translation fingerprints removed, correct register per language (German Sie-form, French U+00A0/U+202F typographic spacing, Japanese desu/masu politeness and no Western em-dashes). 1,638 panel strings verified across all five locales.
    • Header: the mobile menu's resize listener used a 1200px breakpoint while the layout switches at the lg: 1024px breakpoint, leaving a 1024–1200px band where the menu could keep the page scroll-locked after a resize. The listener now matches the 1024px layout breakpoint.
    • Release gate: the panel-localization check now scans every literal passed to usePanelText(), useSurfaceUI() and useToolUI() in every tool and fails the build if any is missing a dictionary row, so untranslated strings can never ship silently again.
    • Compress Image: dropping an animated GIF showed the raw internal key "gifAnimationNote" instead of a warning in every locale — the key had no dictionary row. It now explains that recompression keeps only the first frame, in all six languages.
    • Audit note: two reported security findings did not survive verification — every target="_blank" link already carries rel="noopener", and the QR generator's SVG is built purely from the QR matrix with no user markup, so neither was a real vulnerability.
  38. v9.95 — mobile homepage tabs rebuilt as pills; menu search bar fixed

    The homepage category tabs are now proper pill buttons with correct touch scrolling, and the mobile menu's sticky search bar is fully opaque.

    • Homepage: the category tab strip (Video, Audio, PDF…) is redesigned from underline-style text tabs to standard pill buttons — active pill in the site accent, inactive pills with subtle borders. Counts stay inside each pill.
    • Homepage: the tab strip now declares touch-action: pan-x, so a horizontal swipe scrolls the strip while a vertical swipe scrolls the page — the two gestures no longer fight each other on touch screens. Overscroll chaining at the strip ends is contained.
    • Mobile menu: the sticky search/filter bar now has a fully solid background with a bottom border and soft shadow, so menu text scrolling underneath can no longer ghost through it.
    • Mobile menu: the redundant "Search 135 tools" button was removed from the sticky bar — the inline filter already searches every tool, and the global search palette stays one tap away on the header's search icon. One search per surface.
  39. v9.94 — text-to-speech voice picker rebuilt and dropdown polish

    The voice selector is now two dropdowns (language, then voice), sliders get a reset button, and dropdowns get proper borders.

    • Text to Speech: the single long voice dropdown is now two — a Language selector showing full names like "Greek (Greece)" instead of "el-GR" (via Intl.DisplayNames, in the user's own language), and a Voice selector listing only that language's voices. Changing language auto-picks its first voice.
    • Text to Speech: Rate, Pitch and Volume sliders get a "Reset to defaults" button that appears only when a value was changed.
    • Dropdowns on Text to Speech, Audio to Text and Auto Subtitles now render with a subtle border so the focus ring no longer looks like an unstyled edge.
  40. v9.93 — background removal rebuilt on direct ONNX inference

    Remove Background now loads its MODNet model directly with onnxruntime-web, bypassing the transformers.js model-type limitation.

    • Remove Background: @xenova/transformers v2 does not register a "modnet" model type, so pipeline("image-segmentation", "Xenova/modnet") always threw "Unsupported model type: modnet". The tool now downloads the model and runs inference directly with onnxruntime-web (ImageNet-normalized 512×512 input, matte-to-alpha postprocessing). Verified end-to-end in a real browser: model downloads, inference completes, transparent PNG result renders.
    • onnxruntime-web is now a direct dependency (v1.14.0, matching the version bundled with transformers.js) so the WASM runtime version cannot drift.
  41. v9.92 — Transformers.js import crash fixed via Turbopack alias

    Audio to Text, Auto Subtitles and Remove Background no longer crash on model load.

    • Turbopack was resolving the browser-field entries of @xenova/transformers (fs: false, path: false) to undefined, which crashed environment initialization with "Cannot convert undefined or null to object" before any model bytes were fetched. A Turbopack resolveAlias now points @xenova/transformers at its prebuilt browser bundle.
    • The speech-to-text pipeline creation moved inside try/catch and the ONNX WASM backend is pinned to single-threaded, no-proxy mode so strict CSP worker rules cannot break initialization.
    • Audio to Text verified live: Whisper Tiny downloads in-browser, transcription completes, TXT/SRT/VTT downloads offered. Auto Subtitles confirmed working by the site owner.
  42. v9.91 — CSP model-host allowlist corrected

    Machine-learning model downloads are allowed through the deployed Content-Security-Policy.

    • The CSP connect-src allowlist for the model-backed tools (Audio to Text, Auto Subtitles, Remove Background) now covers the Hugging Face CDN redirect targets, so first-run model downloads no longer fail silently in production.
  43. v9.90 — full-site functional QA pass

    Every tool page verified loading with its controls; four broken tools identified for repair.

    • All 135 tool pages verified rendering with their input controls and no pre-input errors.
    • Four tools found functionally broken and queued for repair: Audio to Text, Auto Subtitles and Remove Background (Transformers.js initialization crash), Compress Video (unsupported codec on the test fixture).
  44. v9.86 — audit fixes and a lighter homepage hero

    PDF content protection, reliable MP3 initialization and corrected tool outputs.

    • Unlock PDF now normalizes only the parsed encryption permission number; document text is never rewritten. Video to MP3 uses the same tested encoder initializer as Audio Cutter.
    • Colour parsing rejects malformed channels, angle units convert correctly, alpha gradients and HSV output preserve transparency. Generated schemas and source code cover the reported edge cases.
    • Platform presets use verified dimensions and PNG formats. Roblox clothing previews draw the actual template panels. Passphrases use 1296 EFF words with an eight-word default.
    • The homepage illustration retains its SVG geometry and animation definitions, with a cached stylesheet and paused animations while hidden. Build dependencies use a complete npm lockfile and a locally hardened braces package.
  45. v9.85 — the v9.83 fixes actually verified, and the last four mislabels fixed

    Every fix from the audit report was re-verified against real files; the lamejs chain bug, four wrong ICO size labels and a stale Discord banner target are fixed.

    • Video to MP3 and Audio Cutter: the v9.83 lamejs loader tried to import three files that do not exist in lamejs 1.2.1, which silently aborted the whole global-initialisation chain — every encode still died with a ReferenceError. Each submodule import is now isolated, all real lamejs modules are covered, and a full stereo and mono encode is verified in the test suite.
    • PNG to ICO: four size→use associations corrected — 32px is small desktop icons and the taskbar at 125% scaling (not the default taskbar/desktop slot), 64px is macOS Finder's icon view (Windows' large-icon view draws 96px), and 128px is the macOS Dock at its largest setting.
    • Discord profile banner resizer: the bogus "680 × 240 recommended minimum" target — which contradicted the page's own copy — is replaced with a 1200 × 480 2× export for high-DPI screens, in every language.
    • Password Generator: the FAQ's 8-word passphrase figure now says about 53 bits (56.00 with the trailing digit), matching the live meter.
    • Compress PDF: bookmark preservation and zero-metadata output are now guarded by tests that drive the real worker with a 2-bookmark fixture.
    • Unlock PDF: AES-256 R6 files from both qpdf and pypdf are covered by permanent tests with the correct and an incorrect password.
    • JSON to Zod: a round-trip suite proves the generated schema accepts its own input sample for unions, optional fields, mixed formats, recursion and empty shapes.
  46. v9.83 — 43 audit findings fixed, honest entropy, orange icons everywhere

    An independent audit found 43 issues across 34 tools; all are fixed in this release.

    • Video to MP3 and Audio Cutter: MP3 encoding now works in production builds (lamejs globals initialized).
    • Unlock PDF: AES-256 R6 files with correct passwords now open (ISO 32000-2 Algorithm 2.B implemented).
    • YAML to JSON: integers beyond 2^53 are kept as strings with a warning instead of losing precision.
    • CSS Formatter: inline comments like /*brand*/ no longer cause properties to be dropped.
    • HTML Formatter: script, pre, and textarea content is preserved byte-for-byte.
    • JSON to Zod: generated schemas use safe integer checks and validate calendar dates.
    • Password Generator: entropy claims corrected — 4-word passphrases are 26.34 bits, not 105; master password guidance fixed.
    • Contrast Checker: invalid colors show — instead of a fake 21:1 Pass.
    • All 89 tool icons now carry the orange accent; cron validation is stricter.
  47. v9.29 — one layout in every language, and a way back after “Continue with the result”

    Switching language now changes the words and nothing else: the language homepages and the translated tool pages use the English layout, and a tool you reach through “Continue with the result” can take you back.

    • The five language homepages use the English homepage's layout — the same full-size drawing, the same tool catalogue and the same sections — instead of a narrower variant that made the page shrink when you switched language.
    • The translated tool pages match their English originals section for section: the Home / category / tool trail, the privacy badge with Pin, Share and Print, the same six related tools and the same reading column, all in your language.
    • After “Continue with the result”, the next tool shows “Back to …”, which returns to the first tool with your original files still loaded. The suggestions now depend on the tool you came from: a crop leads to resize first, a creator export to compress and convert, and pages turned into images are not offered the way straight back to a PDF.
    • In the homepage catalogue, a category with an odd number of tools no longer ends on a rule that stops halfway.
    • Fixes from a live audit: the search page is kept out of search results in every language, the homepage's address is written the same way in its canonical, language and sharing tags, the footer has no empty list item, how-to pages carry an image in their structured data, and the Cloudflare preview address is marked noindex so only the real domain is indexed.
  48. v9.28 — sources for every standard the guides cite, and each translated tool one click from its English page

    Guides and comparisons now link every specification they cite, and the English pages of the six translated tools link to their Spanish, German, French, Portuguese and Japanese versions.

    • Guides and comparisons end with a Sources list: every RFC, ECMA, W3C, YAML or TOML specification the page cites, linked to its official text — seventeen pages, from RFC 4180 for CSV to RFC 9562 for UUIDs.
    • The English pages of Merge PDF, Split PDF, Compress Image, Resize Image, JPG to PDF and the JSON Formatter now link to their five translations, the way the translations already linked back.
    • Every page points AI assistants to the site's llms.txt summary, and the guides hub no longer promises a visible review date the guides do not show — review dates live in each page's structured data and the sitemap.
  49. v9.27 —creator exports you can download at once, every result ready to take, and a picture of every tool

    The 22 creator resizers render their files as soon as an image arrives, every tool's result has a download or copy button, and each tool page opens with an illustration of what that tool does.

    • Creator resizers now render every required size the moment you drop an image, show each file at its real size with its byte count and platform limit, and offer Download, Share, Download all (ZIP) and the next tool, the way the image tools do.
    • Fixed two creator exports that stretched the picture: the Discord pair now crops the 16:9 server banner as its own shape, and “Fit whole image” pads with a border (or transparency) instead of distorting.
    • Round avatars and rounded tiles are previewed the way the platform cuts them — the shaded area is what gets removed — and the guides can be switched off to see the artwork.
    • Every result can leave the page in one click: Download on formatted, converted and generated code (with the file name each language expects), copy buttons on timestamps, digests, number bases and cron schedules, and Download PNG, Download SVG, Copy image and Share on QR codes and barcodes.
    • The JSON formatter now removes trailing commas as it says it does, sentence and title case work on identifiers, Split PDF suggests a range that exists in short documents, and Base64 decodes to .txt, .json or an image instead of an unnamed .bin — its own example no longer opens on an error, and a pasted JWT shows its header and payload.
    • Merged, split and compressed PDFs show a first-page thumbnail, and PDF to JPG and Crop image link straight to the next tool.
    • Each of the 71 tools and 22 creator pages opens with its own illustration of the job it does, drawn in the site's colours for light and dark mode; guides and comparisons show the tool they are about, and each category page shows a collage of its tools.
  50. v9.26 — native-language tools that remember, installable app and one-click downloads

    The translated tools work entirely in their language, every tool remembers your options and can hand its result to the next one, batch results download as one ZIP, and the site installs as an app.

    • The six fully translated tools — merge, split, compress, resize, JPG to PDF and the JSON formatter — now show every control, warning, progress step and error message in Spanish, German, French, Portuguese and Japanese, not only the page around them.
    • A native-speaker pass over all five languages: formal German, region-neutral Spanish, French typography with non-breaking spaces, Brazilian quotation marks and Japanese without stray spaces. Machine-translated descriptions were removed rather than left in place.
    • The rest of the site follows your language too: the All tools directory, search, the 404 page and the error screen are translated, and a tool whose interface is still English says so in one line above it.
    • Tools remember the options you chose last — quality, target size, format, page size, indent — and a finished PDF or image can go straight into the next tool (merge, then compress) without downloading it and adding it again.
    • Batch results download as a single ZIP instead of one prompt per file, and on phones a result can go straight to the share sheet.
    • ToolsByUs installs as an app from the menu (with Add to Home Screen steps on iPhone), opens full-screen with its own back button, offers an update instead of reloading mid-task, and shows an offline page in your language.
    • Number fields take what you type: entering 100 in “compress under … KB” used to end up as 500.
    • Contact is now a plain email address, info@toolsbyus.com, with one-click drafts for bug reports and tool ideas; the privacy page lists every value the site keeps in your browser.
  51. v9.15 — audit remediation, creator resizers and five languages

    Intent lanes, 22 platform resizers, localised subpaths and worked examples in the HTML.

    • Resolved the keyword cannibalisation between core tools and their long-tail pages: each tool now owns its head term, each satellite owns a scenario, and the split is enforced by a build gate.
    • Added 22 creator-asset resizers under /creator — Discord, Twitch, Roblox, Etsy, Shopify, YouTube, Spotify, X and Bluesky — with exact platform sizes, safe-area overlays, byte-cap enforcement and multi-size ZIP export, all in-browser.
    • Launched localised subpaths for Spanish, German, French, Portuguese and Japanese with reciprocal hreflang, per-locale lang attributes and translated FAQs.
    • Tool pages now ship a real worked example — input and the engine's own output — in the served HTML, so a crawler indexes a populated page rather than an empty shell.
    • Every tool page answers at least six specific questions; eleven URLs were renamed for clarity and redirect permanently to their new homes.
    • IndexNow submission now runs automatically from CI on every green push to main.
  52. v9 — SEO infrastructure & citation-first release

    Search, changelog, breadcrumbs, per-page OG images and an AI-citation layer.

    • Added a client-side tool search page with a real SearchAction target.
    • Tool pages now show the full Home → category → tool breadcrumb, mirrored in BreadcrumbList structured data.
    • Every page ships its own generated Open Graph image instead of sharing one site-wide card.
    • JSON-LD is built from one tested module (schema.ts); Organization and WebSite nodes now carry publishingPrinciples and a working SearchAction.
    • llms.txt gained a citation guide, per-tool standards references and a changelog pointer; robots.txt now names 24 AI crawlers explicitly.
    • IndexNow support added: changed URLs are submitted to Bing/Yandex/Seznam/Naver from CI, keyed by sitemap lastmod diffs.
  53. v8 — interaction & input hardening

    Global file drop, header menu hardening and per-tool scenes.

    • Site-wide drag-and-drop with type, count and size limits; direct drops select their panel.
    • Shared FileReader with stale-callback cancellation across CodePane and Base64 tools.
    • Header menu: hover delay, full keyboard control, Escape, ArrowDown and scroll containment.
    • Every one of the 71 tools received a purpose-drawn scene and label; hero rebuilt as a lightweight inline SVG.
  54. v8-rc — format pipeline

    Formatter and converter surface completed across JSON, CSS, XML and code generation.

    • JSON formatter suite: sort keys, JSONC comment stripping, unicode escape controls.
    • CSS formatter/minifier pipeline with worker-safe replacement path.
    • Code generators (JSON → C#, Go, Java, Python, TypeScript) unified behind one CodegenTool frame.

Older releases are documented in the repository: how we review and ship changes. Per-page review dates are stamped at the foot of every tool page.