Changelog
What changed in each version of the extension, newest first.
4.2.0 — 2026-10-08
About the extension
- The in-browser agent channel (WebMCP) is gone: it only worked behind an experimental Chrome flag. Agents connect to the extension through the local MCP server, as before
- The extension no longer wakes the browser every 30 seconds for nothing: the background check runs only when there is work to do, which saves CPU and battery
- "What's new" describes the highlights of versions 4.0–4.2 instead of changes from 3.x
- The list of libraries used shows current versions: CodeMirror 6 instead of Ace, which was removed in 4.0
- The promise to open the source code on GitHub is removed from the author's note
Styles
- The Sass preprocessor can be turned off for a rule: the "Sass preprocessor" item in the "…" menu of the styles panel
- Agent tools read and change the mode with the
syntaxfield - The "!important" checkbox no longer breaks
@import - Styles can be kept out of nested frames: the "Apply in nested frames" item in the same menu. By default, as in 4.0, CSS goes into all frames. The "All frames" setting for CSS from 3.x is not carried over
- Without developer mode (Chrome) and without the user scripts permission (Firefox), styles are injected only into the page itself: previously a rule with "All frames" turned on in 3.x also put the style into other sites' embedded frames
- Agent tools change the scope with the
allFramesCssfield - Styles can apply inside web components: the "Apply in shadow DOM" item in the "…" menu of the styles panel. It works for open shadow DOM roots and is off by default. The agent changes it with the
shadowDomCssfield - The style of an enabled or new rule, or of a rule with a new site address, appears in open tabs right away, without a reload. Previously only editing the text and disabling took effect right away
- Firefox 136–146 without the user scripts permission: on navigation inside a single-page site, without a page reload, the rule's style is applied and removed for the new address. Previously this happened only after a reload. With the permission, in the same versions such navigation updates the rule counter on the badge
- Editing a style in an open tab no longer leaks it into embedded frames of other addresses until a reload
- "Auto !important for all properties" or "Sass preprocessor" toggled during a save no longer drops out of the style until the next save
- If you switch to another rule during a save, neither the code just saved nor the code typed or toggled meanwhile ("Auto !important for all properties", "Sass preprocessor") disappears after a page reload anymore
Libraries
- External libraries update on their own daily or weekly: the "Library updates" setting in the "Extension" panel. The default is manual, as before
- An empty response or a web page instead of the library file (for example, a Wi-Fi login page) counts as a download error, not a new version
- The library window shows when the file was downloaded: it tells you the library has not been updated for a long time
- "Download again" keeps the previous version of the library on a network failure or server error: previously the file was overwritten with an empty one, and the rules using it stopped working
Rules
- Any rule can become a template: the "Use as template for new rules" item in the rule menu. New rules start with its JS and style code and its panel toggles. To reset, use "Reset template for new rules"
- Previous versions of a rule's code: the "Previous versions" item in the rule menu. The extension keeps the last 10 versions per rule — the code before each save, including before an agent's edit. "Restore to editor" opens the selected version unsaved. Versions are stored only in this browser: they do not go into the cloud backup or the export. An agent over MCP sees the same versions and can restore a rule to one of them itself
- An agent over MCP sees site addresses the browser does not accept for an already saved rule too: in reading the rule, in the rule list and in diagnostics. Previously only in the response to its own write
- "Upload JSON" opens a window with the list of rules and libraries from the file: you can add only the checked ones. Rules the checked ones depend on are checked automatically. A rule with the same id is replaced, and its previous code stays in "Previous versions". The old full replacement is the "Replace all" button in the same window
- Deleting a rule no longer shows an error if the rule was deleted but the browser did not let its code be disabled on sites right away: the rule leaves the list, a toast warns that the code is still running, and the extension disables it on its own
- The "+ New rule" button in an empty list opened an editor that did not save the rule and instead reported it had been deleted in another window
Interface
- The settings page opens faster: "Beautify" loads only when you use it
- Hints, notifications and error messages are rewritten to be shorter: what will happen, without technical details
- Sentences with links in the developer mode window and on the "About" page read as a whole in both languages; the Chrome documentation on developer mode opens in the browser's language
- In the Russian interface, the popup button is renamed to match the English "New rule: site"
- The rule list sorting menu items are left-aligned
Site access
- If the extension does not have access to all sites, the settings page and the popup warn about it and offer an "Allow" button. Previously rules in Firefox silently did not work without access, and the browser only showed a green "needs permission" dot on the icon
4.1.0 — 2026-10-01
URL patterns
- A pattern in browser format (
https://site.com/*) no longer silently extends to all subdomains: the rule matchessite.comandwww.site.com, as the popup shows. The same goes forhttp*://site.com. To include subdomains, write*.explicitly:https://*.site.com/* - An address without a path (
https://site.com,https://site.com?x=1) no longer extends to subdomains either - Old patterns without a scheme work the way the popup has always shown them.
site.com,*site.com*and*.site.commean the site and its subdomains onhttpandhttps;www.site.commeanswww.site.comandsite.com. Previously, JS for*site.com*and*.site.comdid not run on the site itself, even though the popup showed the rule./adminmeans that section on any site - The popup, the badge counter and CSS without the user scripts permission (Firefox without the permission, Yandex without developer mode) now determine a rule's sites exactly the way the browser does for JS. A pattern like
*site.com*no longer matches other sites' addresses wheresite.comappears in the query - A pattern the browser will not accept (an asterisk inside the host, such as
https://customer*.site.com/*, or a scheme the extension does not inject into, such aschrome-extension://) is marked red in the URL field and in the rule list. Previously it silently disabled the whole rule; now only that pattern is skipped and the rule's other patterns work. The popup and the badge counter do not show such a rule on those addresses - If the browser will not accept an exclusion (
!https://login*.site.com/*), the rule still runs nowhere — otherwise it would run on the excluded addresses — but the URL field and the rule list now say which exclusion to fix - An explicit exclusion
!https://www.site.com/*no longer affectssite.com: exclusions are passed to the browser as written - The "outdated URL format" mark and the yellow conversion hints are gone: the MV3 transition period is over, and the extension converts patterns without a scheme on its own. Strict URL mode (a flag of old rules and of the agent API) is gone too: all patterns are converted the same way
- Cyrillic domains in patterns (
пример.рф,https://пример.рф/*) work: the extension converts them to punycode - Firefox: a pattern with a port (
localhost:3000,http://localhost:*/*) works. Previously:*disabled the whole rule, and a port number matched nowhere. Firefox does not distinguish ports, so there such a rule matches all ports of the host, and an exclusion with a port removes the rule from all ports. A pattern like*://*:8080/*(any site on a specific port) is marked red in Firefox: without the port it would mean all sites - A pattern with uppercase letters in the scheme or domain (
HTTPS://Site.com/*) no longer disables the rule: the scheme and domain are converted to lowercase
Libraries
- A library whose file did not download is marked with a red icon in the library list, and the rules that depend on it are marked in the rule list. Previously such a library silently dropped out of the rule, and the page showed
$ is not definedwith the jQuery checkbox on - A failed "Download again" shows an error with the reason (for example,
HTTP 404) instead of a success message - Changing a library's address in the editor downloads the file from the new address right away. Previously rules kept getting the old file's code until you deleted the library and created it again
- "Download again" in the library editor downloads the saved address. Previously it downloaded the typed but unsaved address, and after "Cancel" rules got a file that was not in the list
Agent tools
list_ruleswithinclude: ["digest"]also returns theimportantflag: checking rules against your own copy takes one call, withoutget_rulefor each rule- With the browser closed, the MCP server answers a tool list request in 4 seconds instead of 45. Previously
claude mcp listreportedtools fetch failedeven though the server was running, and the agent session took half a minute longer to start. A browser opened later is picked up automatically: the server tells the agent about the new tools
Rules
- The rule options menu in the editor (enable, cloud, shared rule, cancel changes, remove) and the "Modules" menu open from the keyboard: Tab to the button, Enter moves focus to the first item, Esc goes back. Previously they opened only on mouse hover, and a rule could not be removed from the keyboard. Rule list sorting and confirmation dialogs also keep focus inside and close on Esc
- Hovering over the "Modules" menu or the rule options no longer takes focus away from the field you are typing in
- Clicking outside the delete confirmation dialog closes it as a cancel
- A deleted rule can no longer keep running on sites. Previously, if a rule was deleted while the background was re-registering scripts, its script could in rare cases come back and be injected until the next full re-registration
- A new rule address or set of libraries, saved in the editor or by an agent, applies right away. Previously, with a slow write, the rule was occasionally registered with the old address and worked that way until the next save
4.0.0 — 2026-09-26
Editor
- Switched from ACE Editor to CodeMirror 6: better performance, mobile support, a modern extension architecture
- Enter in the editor once again just inserts a new line. Previously Enter accepted the autocomplete suggestion, and while typing code a random property or variable name was inserted instead of a new line. Suggestions are now accepted with Tab
- Find and replace (Ctrl+F) moved to its own panel above the code: a search field with a match counter ("1 of 6"), navigation with Enter and Shift+Enter, "Match case", "Regular expression" and "Whole word" modes, replacing one match or all at once. The panel uses the interface language and the editor theme
- The search panel no longer covers the editor's bottom elements — the run mode switches and the red compile error panel. The same applies to the go-to-line dialog (Ctrl+Alt+G)
- Matches are highlighted in the extension's accent color instead of the default bright cyan; the current match stands out from the rest
- Autocomplete suggestions look like the other popup panels: rounded corners, the editor's background and font
CSS
- The "Programmatic CSS injection" option (isoCSS) is removed — CSS is now always injected through the DOM (
<style>), which gives stable rendering and a predictable cascade - CSS Live: styles update on open tabs without a reload — after you save CSS, changes apply instantly
Firefox
- Firefox MV3 support (Firefox 136+)
- SCSS and Sass compile in Firefox again. Previously the extension page's security policy blocked the compiler, and styles were not built
- In Firefox, JSON upload, reset and "Download from cloud" no longer end with a red error toast for rules that have both JS and CSS. The data was written, but scripts were not re-registered, and pages ran old versions of the rules
Rule list
- The rule row is rearranged: name and address on the left, the switch and status icons on the right, each on its own level. The list reads in columns rather than as a solid mass
- Instead of the whole URL pattern, the name is now followed only by sites —
youtube.com,jira.company.com. The scheme, path and asterisks are the same in almost every rule and got in the way of reading the list; the full pattern shows on hover - The switch of an enabled rule no longer clutters the view: it appears when you hover over the row. A disabled rule is always visible — the switch stays in place and the row itself is dimmed
- Statuses ("Draft", "Shared rule", "outdated URL format") became neat icons with a tooltip instead of colored dots whose meaning you had to guess
- Only a rule with a compile error is marked red: the only status that needs action
- A rule with broken SCSS gets the error mark after a JSON upload or a cloud restore too — when the style in the file is not built yet (an old version's backup, JSON without css) or its mark does not match the error. Previously there was no mark, and a rule with a broken style looked like it worked
- The switch became a proper button: you can hit it with the mouse, reach it with Tab and press it from the keyboard; on touch screens it is always visible
- A visible focus outline is back across the whole settings page — without it, keyboard work was blind. Input fields clicked with the mouse keep a single yellow outline, without a second ring on top of it
URL patterns
- New URL pattern editor: a textarea with one pattern per line and inline validation instead of a popup with documentation
- Colored indicators for each URL: green — a valid V3 pattern, yellow — will be converted
- The "Do not convert" option is removed from the UI (conversion is always on)
Interface
- The interface font is more compact: 13px in body text and 11px in captions instead of 14 and 12. More rules and settings fit on screen, while list density and spacing are unchanged
- Font size in code editors is not affected: it stays as set in the editor settings
- An error message says what failed and why: "Could not import JSON" and the reason instead of a single word "Error" — for import, reset, cloud operations, library download, code formatting, copying and loading data at startup. Such an error stays on screen until you close it, and its text can be selected and copied. The same error does not pile up, and there are no more than three on screen
- "Storage is read-only" and "Failed to save changes" stay for 7 seconds instead of 3 and are marked with a warning icon, not a success check mark
- Notifications appear at the bottom center again and are as wide as their text, not in the top left corner across the whole window
- Agent tool settings no longer show the internal "(no_api)" note after "unavailable"
- Settings fields are rearranged: the label sits above the field, and the field and dropdown take the full panel width. A long value — a font name, an editor theme — is no longer cut off in the middle
- A checkbox now comes before its label, not at the end of the line: you can see what is on at a glance from top to bottom
- Checkboxes in the settings panel can now be reached with Tab and toggled with Space. Previously Tab skipped them
- Editor font size and indent size are on one line — the two settings no longer take two rows on screen
- Text fields have a light background instead of a permanent border; the border appears on hover. The settings panel no longer looks like a grid of borders
- Corners of input fields and dropdowns are less rounded — 4px instead of 8px, like buttons
- Checkboxes are smaller (18px instead of 24px), and an unchecked one now has a gray border, not a yellow one: a yellow outline on every unchecked box read as "needs attention"
- The settings panel is split: MCP and agent connection moved to a separate tab, backups and sync to the "Storage" tab. Extension settings keep language, the counter and the editor
- Group headers in the left panel lost the gray bar: groups are separated by a thin line, and the collapse triangle sits at the right edge
- In the popup, rules are sorted by how precisely they match: first those written for a section of this site, then for the whole site, last those that run everywhere. Previously the order was random (by creation date), and a rule written specifically for the open page ended up at the end behind the universal ones and below the scroll — it looked like it was missing
- In a rule row, the site that brought the rule here comes first and is not dimmed. For a rule with a dozen domains, the matching domain no longer hides in the "+N" tail
- The popup is taller (600px instead of 400): the rule list hits the scroll less often
AI agent integration
- New setting "Allow MCP connections" (off by default): external MCP clients — Claude Code, Cursor and others — through a local server, and an agent in the browser while the settings page is open, can view rules, create, edit, enable and delete them
- The agent sees which rules apply to a specific address and which match but are disabled — the usual answer to "why doesn't my rule work"
- A rule open in the editor with unsaved changes is not writable for the agent: save or close it first
- The permission does not carry over in a backup: restoring data on another device does not turn on agent access automatically
- External agents (Claude Code, Cursor) connect through a local MCP server: the connection command is shown right in the settings, and an open extension page is not required
- The server installs with one command from npm (
npx -y user-js-css-mcp) — a path to the extension files is no longer needed. If you have bun,bunx user-js-css-mcpworks too: previously the bridge silently hung under bun - The agent can create, rename and delete a library; deleting a library that rules depend on is rejected with a list of those rules
- The agent sees which rules a change affects: when a shared rule changes, the response lists the rules whose behavior changes too
- New "what I don't use" report: how many times each rule matched an open page, and which libraries no rule needs. Only matches are counted — page addresses are not stored, and counting runs only with the "Allow MCP connections" setting on
- Diagnostics show libraries that did not download: a common reason for "the rule is saved but does not work"
- The MCP tab shows the connection state with a colored dot: not connected, connected (with client names), reconnection or server update required — each with one action, and below the heading, what to check or why access was refused. Previously a refusal was visible only in the console
- Everything on the MCP tab is visible at once, without collapsed sections, in installation order: client, launch method, the command and copying it, the secret. Until connections are allowed, the fields are visible but inactive
- Installing the server for your client: a ready command for Claude Code, Codex and Gemini CLI, JSON for Claude Desktop and others, one-click install for Cursor and VS Code; launch through npx or bunx. The command is visible right away — the secret in it is hidden, but the real one is copied. Claude Code and Gemini CLI have an "Install only in the project folder" checkbox
- The bridge secret is hidden on screen (the settings page gets shown in screenshots); next to it are buttons to show, copy and replace it if it leaks
- The agent can export a full backup straight to a file and re-register all scripts if the browser refused registration
- The agent can restore data from a backup file: entirely or by merging by id — rules from the file go on top of the current ones, the rest stay in place
- Several agent sessions work at the same time: the second and later ones connect to the one that took the port instead of being left without tools
- Search in rule code: the agent finds which rule defines a function or a call without reading the rules one by one
- Batch rule editing in one call: the whole set is checked before the first write
- A rule edit can be protected with a fingerprint: if a person changed the rule in the browser while the agent was preparing the edit, the write is rejected instead of silently overwriting
Fixes
- The rule switch on the settings page turns the rule off right away again. Previously it changed only the mark in the list, and the script kept being injected into the site until the rule was opened in the editor
- JSON upload and cloud restore rebuild styles from SCSS instead of taking ready CSS from the file. Previously a style built in the file with an error or from an old version of the source arrived as is and was fixed only by editing the rule
- A rule whose code or address was erased completely stops working on the site. Previously its previous version kept running
- The counter on the extension icon no longer counts disabled rules
- A rule included as a module into another rule, and a library shared by several rules, run on the page once. Previously such code ran again: the second rule failed with "Identifier has already been declared", and the library reloaded and lost the plugins attached to it
- A syntax error in a module no longer stops the code of the rule that includes it, and line numbers in a rule's errors match the editor and are not shifted by the length of modules
- After an extension update, the console of already open tabs no longer shows "Extension context invalidated" on every navigation within the site
- A cloud backup takes ~7% less sync quota: data is encoded more densely (Z85 instead of base64). Backups in the old format restore as before. A backup uploaded by this version cannot be read by a device with an older version of the extension — update it
- URL patterns with a scheme (
https://site.com/*) are now anchored to the start of the address — the rule no longer falsely matches when the domain appears in another site's query string - Data loss protection: if a storage migration fails, data on disk is no longer overwritten with an empty state
- Correct error handling during cloud restore — corrupted data no longer causes an uninformative failure
- External library modules load only over http(s) (
file:/data:/javascript:are blocked) - The save debounce duration is respected in the popup again (50 ms)
- Protection against saving a rule twice and against a race with draft autosave
- Fixed duplicate CSS on SPA sites after the Service Worker unloads: tracking of applied styles is kept in session storage and restored when the SW restarts
- Cloud sync errors (corrupted or incompatible data) now show a notification instead of failing silently and closing the dialog "as if it succeeded"
- Popup: the "no access" warning no longer flashes on regular pages when opening and is not shown on system pages (chrome://, files, new tab) — only when injection is really unavailable
- Fixed a draft being written into another rule: when switching between rules quickly (within the 500 ms autosave window), rule A's code could overwrite rule B
- Replacing storage data is now atomic: if a write fails (cloud quota, browser error), old data is no longer erased — a cloud restore or a migration cannot leave storage empty
- Before an upload to the cloud, the data size is checked against current data, not the value from when the page was opened
- Unsaved rule edits (name, flags) no longer roll back when working in the popup and on the settings page at the same time
- Chrome: rules now apply on SPA navigation through
history.replaceState(previously onlypushStateand history navigation) - Chrome: enabling Developer mode is now picked up automatically within 30 seconds — previously detection did not survive the Service Worker unloading and required re-saving a rule
- SCSS rules without compiled CSS (for example, after a migration from old versions) are now compiled when the settings page opens — previously the style was silently not applied until the rule was re-saved
- Closed a hole in URL matching: the patterns
*://site.com/*,http*://site.com/*and*://*.site.com/*no longer match when the target address is embedded in another URL's query string (a scheme or host wildcard does not cross://and/) - If migrating data from an old version fails, the extension switches to read-only mode instead of writing the new version over the old data — the migration is retried after a fix, and no data is lost
- A failed cloud restore or import no longer leaves all scripts disabled: re-registration happens only after the data is replaced successfully
- Pressing "Save" again during a long save (SCSS compilation) is no longer ignored — saves run one after another
- Uploading to the cloud with leftovers of an old legacy backup is no longer blocked forever by the quota: when space runs out, the old data is freed and the write is retried
- Read-only mode after a failed migration now recognizes all old data formats (v1–v10), shows the user a notification and does not get in the way of recovery: storage reset, backup import and cloud restore work and lift the lock
- Cloud restore no longer picks up a stray ancient backup in the old format when a new one is next to it
- Patterns with schemes like
chrome-extension://are anchored to the start of the address too - Fixed races during simultaneous work: creating or deleting a rule is no longer lost when the popup writes, a deferred save no longer commits another rule's draft after switching, and background SCSS compilation no longer overwrites freshly saved edits
- A pattern without a path (
https://example.com) no longer matches similar domains (example.com.evil.com) - A rule save queued before switching to another rule now completes, and pressing "Save" twice on a new rule no longer creates an empty duplicate
- Restore, import and reset apply in full — unsaved local edits no longer "survive" an explicit restore
- Firefox's quota error format is handled when uploading to the cloud
- If a chunked cloud backup is corrupted (an interrupted write), restore uses the surviving old backup instead of failing
- A failed save of a new rule no longer "breaks" the save button for good: the draft stays a draft, an error notification is shown, and saving again works
- After a cloud restore, the open editor rereads the rule content — previously it could write old code over the data just restored
- A deleted rule no longer "comes back" empty if the popup or a second window wrote changes at the moment of deletion
- Toggling a rule from the popup no longer silently rolls back when the same rule is open and being edited on the settings page (merging by field instead of "as a whole")
- Unsaved edits of libraries and settings are no longer overwritten by a write from another window (the same protection rules already had)
- If a data migration fails, the settings page no longer breaks on legacy data: defaults are shown in read-only mode, and data on disk is untouched
- A failed storage load in the background no longer removes working scripts: re-registration is skipped until a successful start
- Cloud restore and storage reset for users without Developer mode no longer show a false error when the operation succeeds; deleting a rule without dev mode no longer leaves a "zombie" in the list
- Uncompiled SCSS is no longer lost if compilation fails when the settings open (a sandbox or write failure) — it is retried the next time the settings open, not on a random SW restart; the catch-up also runs if the settings open before the background sets the marker
- Backup import and cloud restore no longer turn off "Allow MCP connections": the setting describes the browser, not the data, and is not included in a backup — previously you had to turn it on again by hand
- A temporary failure to update a tab's styles no longer erases the tracking of applied CSS — an outdated style is correctly removed after recovery
- The "saved" indicator in the editor no longer lights up when a write fails — the rule stays marked as a draft until it is saved successfully
- A new rule no longer opens with someone else's JS/CSS: the draft is no longer read from disk, and a junk draft key written by old versions is deleted at startup
- Ctrl+S now saves a rule on any keyboard layout, including Russian and alternative Latin ones (Dvorak, Colemak)
- Fixed the rounded corners of the extension popup (tooltips in the popup are no longer cut off)
- Cloud restore, import and reset now reach all open windows: previously a second settings tab or the popup could write its old state back to disk, and an open editor could write old code over a restored rule
- Deleting a rule no longer disrupts a save of changes coming from another window at that moment
- Settings no longer fail on old-format data if a migration fails: the rule list and script registration work with valid values
- Backup import is applied in one operation — applying it twice disrupted the restore of the rule open in the editor
- SCSS that compiles to empty CSS (for example, only comments) no longer makes the settings rerun compilation every time they open
- Opening the settings page is lighter: style catch-up compilation reads only the rules it needs, not the whole storage
- The read-only mode message no longer appears when the extension is just still finishing a data update, and no longer suggests a storage reset — it would destroy the data that needs to be recovered
- Uploading to the cloud no longer archives data twice per click; when space runs out, a notification is shown instead of the button silently doing nothing
- A failed save of rules, libraries or settings is now always visible: previously, on a write error the change stayed on screen but disappeared after a page reload
- If the cloud backup is corrupted and restore uses an older backup copy, you are told so — previously the usual "Done" was shown
- A rule with SCSS that compiles to empty CSS no longer makes the extension recompile it every half minute
- A failure to clean up outdated keys during import or reset no longer looks like a failed migration and no longer leaves the extension in read-only mode with data that is already correct
- A rule change from the popup is no longer lost if the rule was created in the settings at the same moment
- If a data migration fails, toggling Developer mode no longer removes all registered scripts
- A settings page opened during a data update can no longer stay in read-only mode until a reload
- A failed code autosave in the editor is now visible: previously typed text was silently not saved
- Style catch-up compilation while a rule page is open is no longer rolled back by editor autosave
- Ctrl+S on Dvorak and Colemak layouts no longer intercepts Ctrl+O
- Uploading to the cloud builds the backup after confirmation — edits made while the dialog was open also make it into the copy
- A rule with an address without a path but with parameters (
https://example.com?utm=1) matches addresses with a longer query string again - Renaming a rule in one window is no longer lost if code autosave was running in another at that moment
- The settings page can no longer get stuck in read-only mode because of a timing overlap with a background data update
- The counter on the extension icon is cleared if data did not load — previously it could stay outdated
- Ctrl+Shift+S is no longer intercepted by the editor
- Notifications now show in the popup too: a failed save when switching rules no longer goes unnoticed
- A failed load of CDN modules no longer stops styles from applying in all tabs
- A pattern with a wildcard in the domain (
https://*.example.com) no longer matches when the target address is hidden in another link's parameters - Dragging libraries no longer rolls back if a change from another window arrives at that moment
- Fixed rules being lost when updating from versions 2–8: old-format data was erased before the migration could read it
- The "Upload to cloud" button is disabled until data is migrated: previously it could overwrite a working backup with broken data
- Restoring from a surviving old copy also works when the cloud backup is corrupted in the middle
- Tracking of applied styles no longer hits the internal storage limit with broad rules and many tabs
- Enabling Developer mode is picked up in browsers without session storage too
- SCSS styles compiled when the settings open now apply on pages right away — previously you had to re-save the rule by hand
- After restoring data from the cloud (or a reset), the extension applies styles again without a browser restart
- A rule's modification time is no longer lost if a change from another window arrived during a save
- Edits made in the settings are no longer lost when changed from the popup at the same time: the merge result is now written to disk instead of staying only on screen
- A save error is shown once, not as a stream of notifications on every edit
- A rule deleted in another window no longer pops back up if its content was being read at that moment
- Toggling "!important" is no longer rolled back by the next keystroke: the rebuilt style stays in the editor and on disk
- A style compile failure during autosave no longer cancels saving the typed code
- If a rule was deleted in another window, the editor says so instead of pretending it saved the changes
- Rolling the extension back to an older version no longer overwrites data in the new format: it stays untouched in read-only mode
- Leftover data from very old versions is removed from disk and no longer takes space in the cloud copy
- Cloud restore no longer clears the "Draft" and "error" marks of the open rule
- An error when uploading a backup file or resetting storage is now shown instead of going unnoticed
- Importing an incomplete backup file no longer breaks the extension until a page reload
- A rule save started before a cloud restore is no longer written over the restored data
- If style compilation fails on save, the rule no longer keeps CSS from the previous version of the code: it is rebuilt the next time the settings open
- A just-created rule no longer disappears from the list if a write from another window arrived at that moment
- Editor settings changed in two windows at the same time no longer roll each other back
- Uploading the wrong file in "Upload JSON" no longer erases all rules: an empty or unsuitable file is rejected with an error
- Importing a file missing part of the data no longer leaves rules in the list that no longer exist
- The settings page no longer stays empty if data could not be loaded — defaults and an error notification are shown
- Cloud restore in a second tab no longer erases libraries and settings it did not touch
- A corrupted backup file is rejected before writing, not after the data has already been replaced
- Notifications raised while the page is opening are no longer lost
- The settings page opens after importing a file without a settings block too — default values are used
- Importing a file without libraries is no longer undone by a second open window
- A rule saved after switching to another one no longer stays marked as a draft
- Switching between rules no longer carries the "Draft" mark over to the previous rule
- A backup file with corrupted rule entries is rejected entirely, not after writing to disk
- Importing backups made by old versions of the extension works again
- Restoring from a cloud copy in the old format works again
- Settings changed in another window no longer roll back if they were not on disk yet
- AltGr+S (Polish and similar layouts) types a letter again instead of saving the rule
- In read-only mode, deleting a rule no longer erases the data the extension protects from being overwritten
- A just-added library no longer disappears during a simultaneous write from another window
- A rule deletion error is now visible instead of going unnoticed when the dialog closes
- A failed cloud restore shows the real reason, not a read-only mode message
- If data could not be loaded, changes are no longer saved at all: previously the very first edit could erase the rule list (the rules themselves stayed on disk). A notification asks you to reload the page
- After a successful cloud restore, saving works again without a page reload
- Importing very old backups (versions 2–8) works again
- A library deletion error is now visible; deleting a library missing from the list no longer deletes a different one
- The "ligatures" checkbox in the editor settings matches how the code looks again
- If a library could not be deleted, it stays in the list — and you can try again
- Toggling "!important" when compilation is unavailable no longer leaves the rule with the old style forever — it is rebuilt the next time the settings open
- The permission for AI agent tools no longer resets when the settings page reloads
- The MCP server bridge secret survives import, reset and cloud restore — a connected agent does not silently lose access
- The bridge secret no longer changes when the settings page opens — a connected MCP server does not lose access
- The MCP server connection command on the settings page runs it under node: under bun the bridge silently did not start
- An AI agent sees and changes extension settings and rule behavior (run before page load, isolated world, nested frames, strict URL, exclusion from the cloud)
- AI agent tools no longer throw an error to the console on sites that use document.domain
- An AI agent sees why a rule does not work: the browser refused to register the script, or the style did not build
- Rule scripts are named after the rule in DevTools — the console shows right away which one threw an error, instead of
<anonymous>
Agent integration fixes
Import with replacement through the agent (
import_storage) marks rules whose SCSS did not build:get_diagnosticsfinds them by this mark, while previously it missed themget_diagnosticsno longer reports a registration refusal for a script that is actually registered. Previously an import or re-registration by the agent that coincided with a rule save or with the settings page gave a false "duplicate id" refusalA library downloaded in the background (first run, cloud restore, import) gets into rules right away: previously the rule kept working without its code until a manual "Refresh" in the library card
An AI agent sees a library that is in the list but has never downloaded:
get_diagnosticsnames it as the cause, andlist_librariesshows the cache sizeA style fixed by an AI agent is rebuilt: previously an SCSS or important flag edit through the agent was saved, but pages kept the style from the old code
The style of a rule written by an external agent through MCP is built right away, not the next time the settings page opens. The same goes for import through the agent and for a style whose build once failed: the extension catches it up on its own at the next start. An error in such a style is shown with an icon in the rule list and in the agent's diagnostics
A refusal to register tools for the agent in the browser is logged to the console once and as text, not twenty times; the settings do not call WebMCP working while it is refused