Changelog
What has changed in ToyTools, release by release: new tools, engines, and fixes.
Currently running beta-v12.2.
beta-v12.2 2026-09-30
Changed
- Eighteen tools added since mid-August now say what they do not do. Book Tracker, Breathing Circle, CIDR Calculator, Gears, Habit Streak Tracker, Hash Identifier, JSON Diff, Kinetic Sand, Regex Tester, Shop UPI Tally, Slime, Fidget Spinner, Split Bill, Statistics Visualizer, UPI MDR Estimator, UUID Inspector, What Is My IP, and Molecular Geometry Calculator each set a citation. That sentence is the
abstracton the tool page structured data, and the "Does not:" line in llms-full.txt. The visible page copy is unchanged. The other 131 tools stay on the backlog. - A new tool declares the job it exists to do.
jobon the tool config, or on a simulation manifest, records the intent, the user job, and how repeatable, interactive, private, and chat-replaceable the tool is. The 166 tools already in the catalog are on a frozen backlog and are unchanged. The backlog only excuses a tool with nojobyet: ajobthat is present has to be one usable sentence, and the build fails until it is. Nothing on the page renders the field.
beta-v12.1.6 2026-09-30
Changed
- Tool pages drop the "When to send someone here" block. The 17 tools that set a citation showed a short block above the More about row: what the tool is for, its privacy line and what it does not do. The block is gone from the page on phone and desktop, markup included, not hidden. The same words are now the
abstractof the tool's SoftwareApplication structured data, and llms.txt and llms-full.txt still carry them, byte-for-byte as before. Those 17 pages are 164 bytes smaller, and the stylesheet every tool page loads lost the block's rules. Apart from that, the version number in the site's version badge, the name of one script file the feedback page loads, and this entry, every page, llms.txt and llms-full.txt is byte-for-byte what it was.
beta-v12.1.5 2026-09-30
Changed
- The llms files read each tool from one place.
llms.txtandllms-full.txtnow take every tool's name, blurb, address, privacy line and non-goal from one per-tool summary,toolFacts()insrc/lib/llms/facts.ts. It gathers what the tool's own files already say (its config, knowledge and FAQ, its guide and its citation), with every address made by the URL builder. A committed copy of both files now sits next to the renderer, and a test compares the output to it byte for byte, so any change to either file shows up in the pull request. Apart from the version number in the site's version badge, the name of one script file the feedback page loads, and this entry, every page, llms.txt and llms-full.txt is byte-for-byte what it was.
beta-v12.1.4 2026-09-30
Changed
- Guide links come from the one URL builder. Every link in the 145 guides, to the guide's own tool, to sibling tools and to categories, is now made by
src/lib/paths.tsinstead of being spelled by hand. A sibling tool is named by slug and its address is looked up in the registry while the site is built, so a typo'd or removed tool fails the build instead of shipping a dead link. The guide redirect table is built the same way. Apart from the version number in the site's version badge, the name of one script file the feedback page loads, and this entry, every page, link, sitemap, llms.txt and llms-full.txt is byte-for-byte what it was. - The URL lint is stricter. It now covers
/guide/paths too, and catches a path split across strings, one joined from an array, an absolute toytoolsapp.com address and a path on a line that starts with*. It reads each page file the way Astro does, so a link written between//or/* */in page markup, where they are plain text, is flagged like any other link. A test plants one after every place in every page file where the markup changes context and checks that it is caught. No guide is exempt any more. The only exceptions left are the offline page's inline script, the search index's link format, the shared text-tool widget, and the pomodoro timer and keep-screen-awake widgets.
beta-v12.1.3 2026-09-29
Added
- Shared links show a ToyTools card. Every page's
og:imageandtwitter:imagenow point at one branded 1200x630 PNG,https://toytoolsapp.com/og.png: the site mark, the name and the homepage line on the site's paper colour. They used to point at the SVG favicon by a relative path, which most link previews cannot use at all. There are no per-tool images.
Changed
- The service worker registers only on toytoolsapp.com, in the top window. It now follows the same host rule as analytics, so a preview deploy, a mirror, a proxy host or a page framed by another site no longer installs one. Nothing changes for anyone on toytoolsapp.com or www.toytoolsapp.com, including the installed app, and no existing worker is ever removed.
- One home for the site's identity, and one URL builder. The production address, brand name, title suffix, X account and GA id live in
src/config/site.ts, and the layouts, shared components, engines, sitemaps, llms files, manifests and redirect stubs make their tool, category and guide links withsrc/lib/paths.ts. A few places still spell the path themselves and are listed as known exceptions: the guide pages (moving in C4), the offline page's inline script, the guide redirect table, the search index's link format, the shared text-tool widget, and the pomodoro timer and keep-screen-awake widgets. The calculators that suggest a next tool now name it by slug, and a test checks each one is a real tool page. A new raw/tool/or/category/path, quoted or as a template, now fails the unit tests. Page titles, links, URLs, sitemaps, llms.txt and llms-full.txt are byte-for-byte what they were.
beta-v12.1.2 2026-09-29
Changed
- Google Analytics runs on toytoolsapp.com and nowhere else. It used to load on any address except localhost, so a preview deploy, a mirror, a copy of the site on another host or a page framed by another site would all have reported as real traffic. It now loads only on toytoolsapp.com and www.toytoolsapp.com, in the top window. Local development and E2E runs stay excluded as before. The service worker, and so offline support, is unchanged everywhere.
- The privacy page says exactly what analytics sees. It now explains that the site hands Google Analytics page addresses without the query, that Google Analytics can still read the full address when it counts a Back-button return on its own, and that any address carrying a search parameter, such as the search page or a "Suggest it" link, is reported as a site search. It also names www.toytoolsapp.com alongside toytoolsapp.com. No other page changed.
- The unused analytics event list and its
trackEventhelper are gone. Nothing ever called them. The three equalizer events are the only custom events and still fire as before.
Fixed
- Calculator inputs are kept out of the addresses the site gives Google Analytics. Tools that keep their inputs in the address sent them to GA with every page view, and again as the referrer on the next page. The site now gives GA the address without the query or hash, for both, and keeps GA's automatic history page views off the address updates those tools make while you type, which had also been counted as extra page views. GA can still count a Back-button return from the full address by itself until that automatic measurement is switched off in GA admin.
beta-v12.1.1 2026-09-29
Changed
- llms.txt names every category. Its summary sentence is now generated from the category list, so it covers physics, chemistry, applied math, music, fidgets, generators and productivity, which the hand-written version left out. The overview paragraph now names chemistry alongside the physics and applied math simulations. No page, URL or sitemap entry changed.
- Deploys wait for the unit tests. The deploy workflow runs vitest beside the build and only publishes once both pass, so a push to main with a failing test no longer ships.
Fixed
- Quality Guardian checks real pages again. Its tool-page rules (SoftwareApplication schema, the tool page size warning, the FAQ cross-link) and the weekly Lighthouse picks matched the old plural /tools/ and /categories/ addresses, which only hold redirect stubs, so they checked nothing. They now select live /tool/, /category/ and /guide/ pages and skip stubs by structure, and every PR run fails if any of those rules stops reaching a real page. Category pages now get a CollectionPage and BreadcrumbList schema check too. Rerunning every validator against the build found no new failures on live pages.
- The registry validator checks two more things. A guide's URL prefix must be its own tool's category slug or segment (both styles stay, so no guide moved). A new tool must say what it does not do (a specific citation non-goal), which becomes its "Does not:" line in llms-full.txt; the 149 tools that predate the rule sit on a frozen list that can only shrink.
beta-v12.1 2026-09-29
Changed
- Prep tools are slimmer on a phone. The six /tool/prep/ pages are built to fit about one 390x844 screen, with the result on or near the first screen. Measured widget height on a 390x844 phone, empty page, before and after: Prompt Packer 1.40 to 0.91 screens, Chat Export Cleaner 1.43 to 0.76, JSON to JSON Schema 1.24 to 0.72, JSON Schema Validator 0.77 to 0.62, Context Fit Checker 0.72 to 0.45, llms.txt Generator 1.31 to 1.04.
- Prompt Packer: Role and Task stay open; Context, Constraints and Output format sit behind "More fields (3)", which opens itself when any of them holds text. The Markdown / Tags switch moved into the prompt's own header. On desktop the fields and the prompt sit side by side.
- Chat Export Cleaner: the six cleanup switches and four keep modes fold into one line that says what they are set to ("Cleanup: 6 of 6 on · Keep: Everything") and expands on tap. The cleaned text sits directly under the status line.
- JSON to JSON Schema: the explanation card and Technical details moved to "More about"; Paste, Clear, Download and Sample share one row. Other JSON tools are unchanged.
- JSON Schema Validator: a Valid / Invalid badge right under the two boxes, the first three problems with "Show all (N)" for the rest, and Paste on the same row as Sample and Clear.
- Context Fit Checker: one result line ("~1,000 tokens · 0.8% of 128,000 · Fits") with the estimate label beside it. The window source and checked date moved to "More about".
- llms.txt Generator: Name, URL, Purpose and Tools stay open; Contact, Usage and Crawler policy sit behind "Optional (3)". On desktop the fields and the file sit side by side.
- Copy stays in reach on a phone. Prompt Packer, Chat Export Cleaner and llms.txt Generator pin Copy (and Download on llms.txt) to the bottom of the screen while the tool is in view.
- The pinned bar never hides the field you are typing in. Moving focus with Tab scrolls the field clear of the bar, so the focused box always starts above it (WCAG 2.2 Focus Not Obscured).
- Box heights retuned. Inputs open at three to six rows; results open at 12rem on a phone (they were 80px to 128px after beta-v12.0.2) and 16 to 20rem on desktop. All still resizable.
- Moved text is still on the page, under "More about", not deleted.
beta-v12.0.2 2026-09-27
Changed
- Textareas are resizable across the site. Every text box in a tool pane can be dragged taller or shorter (never wider), between 5rem and 80% of the screen height, and still scrolls inside itself rather than growing as you type. The height moved from the pane to the textarea: panes used to force a fixed 280px box, so every field was 224px tall and could not be resized. Desktop fields now open at the viewport-based pane height (500px on a 1280x800 screen); phones open at about a third of the screen (295px on a 390x844 phone), because touch resize handles are inconsistent.
- Per-tool pane heights now take effect. Prompt Packer, Chat Export Cleaner, JSON Schema Validator, Context Fit Checker, llms.txt Generator, JSON Diff and Hash Identifier already declared shorter panes; the old 280px floor overrode them. They now open at their declared heights (80px to 144px) and can be dragged taller.
- Text boxes outside the shared panes (for example Statistics Visualizer's value list) are resizable vertically by default unless the tool chose otherwise.
- Kept fixed on purpose: JSON Tree Viewer keeps its fixed, equal Input and Tree panes; Text Repeater keeps its fixed box; Notepad focus mode keeps its tall editor; Encoding Detector's hidden copy target is untouched; JWT Decoder keeps its compact 120px token field (now resizable). Printing still prints every box at full height.
- Fixed: Text Repeater's boxes had grown to the new viewport-based height (320px on desktop, 295px on a 390x844 phone). Its panes size the boxes again as before, so the input is 180px and the result 224px on desktop and phones, both still not resizable.
beta-v12.0.1 2026-09-26
Changed
- Unique install-icon glyph per tool. Every registry tool now resolves to a distinct glyph id (166 tools, 166 glyphs in use). Crowded families — cleanup brooms, prep checklists, hash digests, body-composition gauges, JSON braces, and the rest — get meaningful per-slug marks instead of sharing a shape and relying on hue-shift. Hue-shift remains secondary gradient polish. Spark stays the unknown-family fallback only. Regenerated
public/icons/tool/*PNGs.
beta-v12.0 2026-09-25
Added
- Prep for a model, at
/category/prep/. Deterministic browser tools that prepare text before you paste it into a model. ToyTools does not run a model. - Prompt Packer, at
/tool/prep/prompt-packer/. Assembles role, task, context, constraints, and output format into Markdown sections or XML-style tags. Empty fields are left out. It does not write the prompt. - Chat Export Cleaner, at
/tool/prep/chat-export-cleaner/. Turns a copied transcript into plain text: timestamps, speaker labels, empty fences, and citation chips, with a choice to keep user turns, assistant turns, or code blocks. It says when a choice drops text. It does not rewrite the words. - JSON to JSON Schema, at
/tool/prep/json-to-schema/. Builds a schema from the types in one JSON example. It does not mark fields required or guess what a string means. - JSON Schema Validator, at
/tool/prep/json-schema-validator/. Checks JSON against the schema keywords this page lists, and names any keyword it does not check. - Context Fit Checker, at
/tool/prep/context-fit-checker/. Estimates tokens as characters divided by 4 and compares that with a context window copied from the vendor page named on the tool. It is an estimate, not a tokenizer count. No prices. - llms.txt Generator, at
/tool/prep/llms-txt-generator/. Writes a short site description in the same H1, blockquote, and H2 layout ToyTools publishes. Empty optional sections are left out. It does not claim that layout is an official standard. - Guides for the six prep tools, under
/guide/prep/. Each one says what the tool does, what it refuses to infer, and that ToyTools does not call a model. /llms-full.txt. One block per published tool, generated from the registry: URL, what it is for, the privacy claim that tool can actually make, and what it does not do./llms.txtstays short and links to it.- When to send someone here. Tools that set a citation show that block on the page. JSON Formatter, JWT Decoder, the hash generators, the word, character, and sentence counters, Password Generator, and UPI 1999 Split have one.
- Crawler policy in
robots.txt. Public pages stay allowed for every crawler, and GPTBot, ClaudeBot, PerplexityBot, and Google-Extended are named so the file says so.
beta-v11.16.1 2026-09-25
Fixed
- Regex Tester nit cleanup (follow-up to #228). Wire
PRIVACY_LINEinto the tool description (drop the dead partial import). Align guide privacy copy with the exact privacy line. Remove unusedkind: 'cap'. Replace a flagged em dash in a lib comment. Move the Blob-Worker script intosrc/lib/text/regex-tester.ts(workerSource) so the Worker path has a single source. No new features.
Older releases are in CHANGELOG.md in the repository.
Something here not working the way it reads? Report it.