Release history

Loupely Lens Changelog

Every release, documented. What shipped, what changed, and why it matters.

16 releases

version 1.2.0
9 Jun 2026 Patch

Phase 1 ships: element coordinates captured, double-submit guard, and update interruption handling

Phase 1 of the build-out shipped. 4 correctness items that needed to be in place before any further work could begin.

The first: element coordinates are now captured with every pick. The x, y, width, and height of the element get stored in the capture alongside everything else. This is required for CDP Track 2, which will use the coordinates to resolve @layer priority on cross-origin sites in a later phase.

The second: a double-submit guard was added to the Diagnose button. Clicking it twice rapidly was able to consume 2 credits and write 2 session rows. The guard prevents startDiagnosing() from being re-entered while a diagnosis is already in flight.

The third and fourth: when an extension update happens while a capture is in progress, the service worker now writes a flag to storage. The next time the popup opens, it reads that flag, shows a notice that says "Lens updated while you were capturing. Pick your element again," and resets to idle instead of trying to resume a capture that's no longer valid.

What it answers

- why did lens charge me twice for one diagnosis
- what happens when lens updates while i'm capturing
- why does lens say pick your element again after an update
- what is element_rect in the lens capture file
- what shipped in lens phase 1

Why we built it

The double-submit bug was a real credit loss. The update interruption was a known bad state with no recovery path. Both needed to be closed before build-out.

Improvements 3
  • Element_rect field added to every capture: stores x, y, width, and height of the picked element. Required by CDP Track 2 in Phase 2B
  • Service worker onInstalled handler now checks for an in-flight capture before clearing storage. If one is present, writes ll_update_interrupted with a timestamp
  • InitPopup() reads ll_update_interrupted on open: if the flag is set, clears it, shows the update notice in the idle state, and stops there
Bug Fixes 1
  • Double-submit guard added: _diagnosisInFlight module-level boolean prevents startDiagnosing() from being entered twice. Button is disabled for the duration and re-enabled in the finally block
version 1.1.08
5 Jun 2026 Patch

Stabilisation: login loop fixed, capture race fixed, dead code removed

This release closed out the stabilisation pass before build-out begins. Nothing new shipped. Everything that was already in the extension got verified, fixed, or cleaned up.

The biggest fix was the login loop. When a diagnosis returned an auth error, the extension was routing to the login screen without clearing the capture from storage. On the next open, the capture was still there, the user clicked Diagnose again, hit the same error, and ended up in a loop. The fix adds a storage clear at both points in the code where auth failure can happen.

The Vision Capture race was also confirmed and fixed. The popup was opening and polling for capture data before content.js had finished writing it. The polling interval was widened from 200ms to 350ms, giving the write enough time to land.

Several pieces of dead code were removed: a side-panel block that was never reachable, an unused auth message handler in the service worker, and 2 popup functions that referenced HTML elements that don't exist.

What it answers

- why does lens keep taking me back to the login screen
- why does lens show the idle state instead of my capture
- what was in the lens stabilisation pass
- why does lens not show my element after capturing it
- what dead code was removed from lens

Why we built it

The login loop was a direct user report. The Vision Capture race was confirmed live via diagnostics logs. Neither could go into build-out unfixed.

Improvements 1
  • Force Auth Failure button added to the diagnostics page to support auth debugging: clears the refresh token with a confirmation dialog
Bug Fixes 6
  • Login loop fixed: capture keys (ll_capture_ready and ll_capture_result) now cleared before routing to the unauthenticated state on auth_invalid and account_not_found errors
  • Login loop fixed on second path: same storage clear added to the no-token-after-retry path in startDiagnosing()
  • Vision Capture race fixed: initPopup polling interval widened from 200ms to 350ms, extending the total window from 1,200ms to 2,100ms
  • Dead side-panel block removed from initPopup(): _tabId, _isSidePanelActive, _allStorage full-storage read, _spFallback, and the unreachable isSidePanelActive block
  • Dead REFRESH_AUTH_TOKEN message handler removed from service-worker.js: nothing in the codebase was sending this message
  • Dead popup functions removed: getActiveTab (defined, never called) and renderAlternativeProblemOptions (referenced HTML elements that don't exist in popup.html)
version 1.1.05
30 May 2026 Patch

Expanded confirming state, branding update, and auth stability fixes

The confirming state got a full redesign. When you capture an element, the popup now expands to 400px and shows the screenshot at full popup width, with the description field below it. The screenshot is right there in the popup: no separate preview page to open, no guessing whether the capture worked.

The extension also got a visual overhaul: new icons, a refreshed popup CSS system, and updated triage page styles.

2 auth stability fixes shipped alongside these. The first corrected a bug where any transient network failure was logging users out. The second removed a synchronous network call that was running after every successful diagnosis.

What it answers

- how do i see my screenshot in lens before diagnosing
- why does lens keep logging me out
- why does the lens popup look different
- what is the lens confirming state
- how do i know lens captured the right element

Why we built this

The screenshot existed in the confirming state but wasn't visible without opening a separate page. The capture preview page solved that problem but added a step. The expanded popup removes the step entirely.

Improvements 2
  • Confirming state expanded to 400px with inline screenshot at full popup width and description field below
  • New icons, popup CSS visual system, and triage CSS visual system shipped across the extension
Bug Fixes 2
  • Ll_auth_expired now only written on 401 and 403 responses: transient network failures no longer trigger a logout
  • RefreshCreditsAfterSuccess no longer makes a synchronous network call immediately after diagnosis
version 1.0.98
24 May 2026 Patch

Diagnosis accuracy fixes: override routing, ancestor signals, and wrong-element hint

3 bugs in the diagnosis path were fixed in this batch, all of them causing Lens to route users to "ask a developer" when the problem was actually solvable.

The first: Lens was checking visual properties like box-sizing and transition for override safety, which caused Elementor sites to hit developer handoff on elements that were actually fixable. The check is now scoped to visual properties only.

The second: when a stylesheet's origin couldn't be traced, Lens was treating the element as undiagnosable. It wasn't. The override confidence was raised and the guidance was rewritten without DevTools jargon.

The third: Lens was missing cases where an ancestor element was causing the problem, not the element you clicked. Line-height zero, inline-attribute spacing overrides, and anomalous container heights were added to the ancestor scan, and the Edge Function was updated to surface these as the primary finding when they're present.

The wrong-element hint was also added: when the captured element has a transparent background or an unresolvable origin, a soft note tells the user the background may be coming from a parent and suggests picking one level up.

What it answers

- why is lens sending simple fixes to a developer
- why does lens say i need a developer when i think i can fix it myself
- why isn't my elementor element getting a fix suggestion
- how does lens know when the problem is in a parent element
- what does wrong element mean in lens

Why we built it

Diagnosis accuracy is the only thing that matters. Routing a fixable problem to developer handoff is a failed diagnosis.

Improvements 5
  • Tier-1 ancestor signal pre-ranking added: LINE_HEIGHT_ZERO, INLINE_ATTRIBUTE_OVERRIDE, and ANOMALOUS_HEIGHT now surface as the primary finding when present, before secondary signals
  • TOUCH_LIKELY_PROPERTIES expanded to include border-spacing, border-collapse, clip-path, mask, filter, backdrop-filter, transform, and transform-origin
  • Context flags added: elementor_editor_active fires when the Elementor editor is open; inside_modal fires when the captured element is inside a dialog or modal ancestor
  • SYSTEMIC_ZERO_SPACING pattern detection added: fires when 3 or more consecutive ancestors have vertical spacing zeroed by a plugin-internal rule
  • Wrong-element hint added to the confirming state when the captured element has a transparent or unresolvable background
Bug Fixes 3
  • Override_safe check scoped to visual properties only: box-sizing, transition, and other non-visual properties no longer trigger false developer handoff on Elementor sites
  • Origin-unresolvable no longer treated as undiagnosable: override confidence raised to medium, DevTools jargon removed from strategy strings
  • Capture_number was never incrementing between captures: storageGetSessionData now writes the next number back to storage after each use
version 1.0.90
20 May 2026 Patch

Lens ships capture preview, security hardening, and a privacy policy rewrite

A lot shipped in this batch. The most visible change: clicking "View captured element" now opens a dedicated preview page with the full screenshot, a description field, the Diagnose button, and a privacy disclosure, instead of rendering an image inline in the popup.

The extension's screenshot disclosure was also corrected. The old copy said screenshots were "processed and deleted within 30 days." That wasn't accurate. The new copy reads: "Stored locally in your browser. Sent to Anthropic only if you run a diagnosis, then deleted immediately." The privacy policy was updated to match, with a new section on screenshot retention and a corrected Chrome Web Store Limited Use Disclosure.

On the security side, the dev diagnostics tool was accessible to any external URL. That's been fixed, and a partial refresh token that was showing in the diagnostics page has been removed.

What it answers

- why does the lens extension keep signing me out
- how does lens handle my screenshots
- what data does lens send to anthropic
- how do i see what lens captured before running a diagnosis
- does lens store my website screenshots

Improvements 5
  • Capture preview page added: screenshot, description field, Diagnose button, Download button, and privacy disclosure, accessible from the confirming state
  • Rotating diagnosis messages added during the diagnosing state: 5 messages cycling every 1,800ms, replacing an invisible status indicator
  • Squarespace (YUI block IDs) and Webflow (w-node hex IDs) selector patterns added to the dynamic selector check, flagging CSS overrides as unsafe for both builders
  • Crop TTL raised from 10 to 30 minutes, giving users more time between capture and diagnosis
  • Idle state copy updated, Pick button renamed to "Click what looks wrong," result state visual treatment refreshed
Bug Fixes 4
  • Random sign-outs caused by the MV3 service worker lifecycle fixed: the extension now attempts a token refresh before returning an auth error when the service worker wakes from idle
  • Screenshot disclosure in popup and capture preview corrected from "deleted within 30 days" to accurate language describing local storage, Anthropic transmission, and immediate deletion
  • Dev diagnostics page removed from web_accessible_resources, closing external URL access to the tool
  • Partial refresh token display removed from the diagnostics page