Releases: clay/clay-devtools
🍕 Clay Slip v2.4.1 — Restore page clicks when the panel is collapsed
A small, focused patch on top of v2.4.0. One bug, one fix, recommended for everyone.
Fixes
Restore page clicks on Clay-managed regions when the FAB is collapsed (#19)
Symptom: with the panel collapsed to the floating Clay button (FAB), clicking on a [data-uri] element in the page — links, buttons, anything Clay manages — sometimes did nothing. The click was being swallowed.
Root cause: the panel's click-to-inspect handler attaches to the document so that any click on a [data-uri] region selects that component in the panel (with preventDefault() + stopPropagation() so the click doesn't double-fire as both a page navigation and a panel selection). The handler had a passive-mode bypass (for Clay ?edit=true pages) but no bypass for the collapsed-FAB state. So while you were on the FAB, the handler kept swallowing clicks even though there was no expanded panel to inspect into.
Fix: also skip attaching the click/hover listeners while collapsed === true. The FAB-only state now behaves the way the rest of the extension treats "I'm not actively inspecting": the page gets all its native click and hover behavior back, the toolbar badge still updates as you navigate, and one click on the FAB brings the full panel + selection behavior right back.
Behavior on every other state is unchanged:
- Panel expanded → click-to-inspect works exactly as before.
?edit=trueClay page → passive mode, click-to-inspect was already off, still off.- Disabled extension (v2.4.0 kill-switch) → content script never mounted in the first place, so this code path isn't reached.
Verification
npm run validate(typecheck + lint + format + 200 unit tests) — green.npm run release:dry:both— both Chromium and Firefox zips build cleanly from the same source.
Install / Update
Same flow as every Clay Slip release: download the zip that matches your browser family, sideload it. No Chrome Web Store / AMO listing.
Chromium browsers (Chrome / Edge / Brave / Arc / Vivaldi / Opera)
- Updating from v2.4.0: unzip
clay-slip-v2.4.1.zipover your existing extension folder (replace all files), then click the ↻ Reload button on the extension's row atchrome://extensions. All preferences carry over. - First-time install: download
clay-slip-v2.4.1.zipfrom Assets below, unzip to a stable folder (don't move or delete it later — Chrome reads from it on every browser start), thenchrome://extensions→ flip Developer mode on → Load unpacked → pick the unzipped folder.
Firefox 121+
- Updating from v2.4.0 (temporary install): download
clay-slip-v2.4.1-firefox.zip, unzip, then onabout:debugging#/runtime/this-firefoxclick Reload on the existing add-on after pointing it at the newmanifest.json(or Remove the old entry first and Load Temporary Add-on… with the new one). - First-time install (temporary, no signing required): download
clay-slip-v2.4.1-firefox.zip, unzip, openabout:debugging#/runtime/this-firefox, click Load Temporary Add-on…, pickmanifest.jsoninside the unzipped folder. Temporary add-ons unload on Firefox restart. - First-time install (persistent): Firefox Developer Edition / Nightly with
xpinstall.signatures.required = falseinabout:config, then drag the zip onto the browser window.
Full install + update instructions and troubleshooting (greyed-out toolbar icon, "extension disappeared after restart", Firefox signature errors) live in the README → Install section.
Carried over from v2.4.0
Everything from the v2.4.0 release is still in: persistent enable/disable kill-switch, visually distinct highlight modes, smarter toolbar popup. See the v2.4.0 release notes if you're updating from any earlier version.
🍕 Clay Slip v2.4.0 — Persistent enable/disable + visually distinct highlight modes
First release with a true kill-switch and the long-promised fix that makes every highlight mode actually look different on the page. Distributed as zip files attached below — see Install / Update at the bottom for the two-click sideload flow on Chromium and Firefox.
Highlights
Persistent enable/disable kill-switch
- A new checkbox in the toolbar popup (and in the Options page → Extension section) fully disables Clay Slip on every page until you turn it back on. Distinct from Highlight mode → Off (which leaves the extension running, panel and all, just silent on the page): this is dormant, full stop, until I say otherwise.
- When disabled, the content script never paints outlines, never mounts the panel, never touches the host DOM. The toolbar badge clears to zero.
- The popup stays reachable from every tab while disabled — including Clay pages, where it's normally suppressed in favor of the in-page FAB — so re-enabling is always one click away no matter which tab you're looking at.
- The choice rides on
chrome.storage.sync, so it persists across browser restarts and follows you to any browser profile signed into the same browser-vendor account, on both Chromium and Firefox. - Cross-tab propagation via
storage.onChanged: a flip from any tab tears down or brings up the panel everywhere with no reload.
Visually distinct highlight modes
- Earlier iterations only mode-gated the ambient layer (the rainbow / corner-tick outlines), so hover and click always flashed the blue inspection outline regardless of mode. The dropdown felt inert and there was no way to silence the page entirely.
- The mode now owns every paint on the host page (ambient + hover + selection + name badge + find-on-page dim/highlight):
- Off — fully silent on the page. No ambient, no blue hover, no selection outline, no name badge, nothing. The panel still works; pick components from the Tree tab.
- Selection (default) — pristine page; hover and click paint blue; hold ⌃ Control to peek at the rainbow over every component.
- Editable only — always-on corner accents on
[data-editable], plus blue hover + click on top. - All components — always-on rainbow over every component, plus blue hover + click on top.
- Locked in by a new CSS-contract test so a future stylesheet edit can't silently regress it.
Smarter toolbar popup
- On non-Clay pages: friendly "Not a Clay page" message with the enable/disable toggle.
- On Clay pages: the popup is suppressed by default so the toolbar icon mounts/unmounts the in-page panel in one click — but if the extension has been disabled, the popup is force-shown so you always have a UI surface to flip it back on.
Docs
- README → Usage table picks up two new rows ("Disable Clay Slip entirely" / "Re-enable from any tab").
- README → new Configuration → Extension on/off subsection with the dormant-vs-running distinction spelled out explicitly.
- PRIVACY → storage table updated to list the master enable/disable toggle alongside the existing
storage.syncpreferences.
What's NOT in this release
- The new Globals panel tab for inspecting configured
window.*values — that's on its own branch (PR #18) and will ship in a future release after review.
Install / Update
Same as every Clay Slip release: download the zip that matches your browser family, sideload it. There is no Chrome Web Store or AMO listing.
Chromium browsers (Chrome / Edge / Brave / Arc / Vivaldi / Opera)
- First-time install: download
clay-slip-v2.4.0.zipfrom Assets below, unzip it to a stable folder (don't move or delete it later — Chrome reads from it on every browser start), then openchrome://extensions, flip Developer mode on, click Load unpacked, and pick the unzipped folder. - Updating from v2.3.0: unzip the new release over your existing extension folder (replace all files), then click the ↻ Reload button on the extension's row at
chrome://extensions. The Persistent enable/disable preference carries over; you don't have to reconfigure anything.
Firefox 121+
- First-time install (temporary, no signing required): download
clay-slip-v2.4.0-firefox.zip, unzip it, openabout:debugging#/runtime/this-firefox, click Load Temporary Add-on…, and pick themanifest.jsoninside the unzipped folder. Note: temporary add-ons unload on Firefox restart. - First-time install (persistent): use Firefox Developer Edition or Nightly with
xpinstall.signatures.required = falseinabout:config, then drag the zip onto the browser window. - Updating from v2.3.0: if temporary, just Reload the add-on on
about:debuggingafter pointing it at the newmanifest.json. If persistent, drag the new zip onto the browser window to overwrite.
Full install instructions including troubleshooting (greyed-out toolbar icon, "extension disappeared after restart", etc.) live in the README → Install section.
Verification
- Full validate suite green: typecheck, ESLint (0 warnings), Prettier check, 200 unit tests.
- Both Chromium and Firefox builds produced by the same release workflow that ships them, from the same source — see
.github/workflows/release.yml. - SHA-256 digests for both zips are visible on the asset detail page if you want to verify the download.
Clay Slip v2.3.0
Highlights
🦊 Firefox 121+ is now a first-class target alongside Chromium. Same source, dual build pipeline, one zip per browser family in every release.
This release adds Firefox support end-to-end without changing any Chromium behavior — same MV3 manifest, same webextension-polyfill, same panel UI, just a second build target with a postbuild step that swaps the MV3 background into the form Firefox 121+ expects (background.scripts instead of background.service_worker) and strips Chromium-only manifest keys.
Install
Pick the zip for your browser, unzip, and sideload:
| Browser family | Asset | How |
|---|---|---|
| Chrome, Edge, Brave, Arc, Vivaldi, Opera, … | clay-slip-v2.3.0.zip |
chrome://extensions → Developer mode → Load unpacked |
| Firefox 121+ | clay-slip-v2.3.0-firefox.zip |
about:debugging#/runtime/this-firefox → Load Temporary Add-on… → pick manifest.json |
Firefox unloads temporary add-ons on restart. For a persistent install (Firefox Developer Edition / Nightly with
xpinstall.signatures.required = false), see the README → Install → Firefox section.
Updating from v2.2.1? Replace the unzipped folder with the new version's contents and click ↻ Reload on your extensions page. Settings, notes, and recently-viewed history persist across updates — they live in browser storage, not in the extension folder.
What changed
- Cross-browser runtime: every
chrome.*call now goes throughwebextension-polyfill. Promise-based on both Chrome and Firefox; identical behavior on Chromium. browser_specific_settings.geckoin the Firefox manifest:id,strict_min_version: 121.0,data_collection_permissions: { required: ['none'] }(we collect nothing — the only honest value for the AMO disclosure).- Manifest postbuild (
scripts/firefox-manifest.mjs+firefox-postbuild.mjs): the rewrite logic is a pure, in-place mutation with 5 unit tests locking in the contract — service_worker → scripts swap,use_dynamic_urlstrip, throws if there's nothing to rewrite. - Release CI now builds + zips both targets and attaches both to the draft GitHub release in one pass.
- New scripts:
npm run build:firefox/npm run zip:firefox/npm run release:dry:firefox— Firefox-only flow.npm run release:dry:both— validate once + both builds + both zips (recommended local smoke-test before tagging).
- README + PRIVACY updated with the full Firefox install matrix, troubleshooting rows, and cross-browser storage terminology.
- Tests: +9 new tests, total 176 (5 for the manifest rewrite, 4 for the
TARGET=firefoxbranching contract insrc/manifest.ts).
Acknowledgements
Firefox support kicked off by @macgyver in #16 — thanks for the cross-browser nudge.
Full changelog: v2.2.1...v2.3.0
v2.2.1
What's Changed
- 🍕 fix(zip): strip source maps + verify manifest at root by @jjpaulino in #5
- 🍕 fix(manifest): trim description to 121 chars + add build-time guard by @jjpaulino in #6
- 🍕 feat(seo): collapsible JSON-LD viewer + inline validator by @jjpaulino in #8
- 🍕 feat(panel): copy-to-clipboard buttons next to page + component URIs by @jjpaulino in #9
- 🍕 chore(icons): replace placeholder S logo with Clay icon everywhere by @jjpaulino in #10
- 🍕 feat(copy): inline 'Copied' feedback + always-https URLs by @jjpaulino in #12
- 🍕 feat(highlight): refined modes + single accent + selection labels by @jjpaulino in #11
- 🍕 Subtle ambient highlight: corner accents in 'all' mode by @jjpaulino in #14
- 🍕 chore(theme): unify accent on blue across panel + page + popup + badge by @jjpaulino in #13
- 🍕 Reshape highlight modes (rainbow, click feedback, ⌥-peek) + drop env config + passive edit mode by @jjpaulino in #15
Full Changelog: v2.0.2...v2.2.1
v2.0.2
What's Changed
- 🍕 fix(security): patch Rollup CVE-2026-27606 via npm overrides by @jjpaulino in #4
Full Changelog: v2.0.1...v2.0.2
v2.0.1
What's Changed
- 🍕 v2.0: full rewrite — MV3, TypeScript + React, Shadow DOM, FAB, cross-env tooling by @jjpaulino in #2
- 🍕 Add release workflow + cross-platform zip helper by @jjpaulino in #3
New Contributors
- @jjpaulino made their first contribution in #2
Full Changelog: https://github.com/clay/clay-devtools/commits/v2.0.1