Skip to content

Releases: zbw-zbw/image-harvest

v1.1.3

Choose a tag to compare

@github-actions github-actions released this 02 Sep 06:27

πŸ› Fixed

  • Trial-expiry funnel events: the trial_expired event was defined but never wired up β€” expiring trials silently vanished from analytics. It now fires exactly once when a trial lapses, from both the periodic license check and license validation.

✨ Added

  • Grace-period banner analytics: the upgrade banner shown during the 3-day post-trial grace window now reports when it is shown (throttled to once per day) and when its upgrade button is clicked.

v1.1.2

Choose a tag to compare

@github-actions github-actions released this 27 Aug 07:07

✨ Added

  • Link-resolve quota in Settings β†’ usage quotas: the settings page now lists the free-tier monthly quota (3/month) alongside AI tags and color copy, with a live remaining counter that grays out when exhausted.

  • "Resolve originals" toasts show remaining quota: each successful run tells free users how many link resolves are left this month; the final one says plainly that Pro removes the cap β€” a soft upsell that never interrupts the flow.

🌍 i18n

  • New quota-row and toast strings translated across all 15 supported languages.

v1.1.1

Choose a tag to compare

@github-actions github-actions released this 26 Aug 11:44

πŸ› Fixed

  • Right-click "Extract image" / "Extract linked image" now open the side panel: with the panel closed, both context-menu items looked completely dead. The panel-opening call must run while the click's user gesture is still active, but the handler awaited another Chrome API first β€” the gesture expired, the open call threw, and the error was swallowed. Images actually landed in a silent queue, so they only appeared the next time you opened the panel manually. The open call now fires first (same fix applied to the welcome page's "Try it now" button and the settings' display-mode switch), restoring the intended behavior: right-click β†’ panel pops open with the image already in it.

  • Resolved / right-click images now group with their tab: images added by "resolve originals" or the right-click extractor carried no tab identity, so the "group by tab" view split one tab into two groups β€” the page's scanned images under the tab title, and every injected image under a stray untranslated "Current Tab" group. Injected images now carry the owning tab's title and index, legacy persisted ones pick it up on restore, and the last-resort fallback group name is localized ("Unknown tab") instead of hardcoded English.

  • The "found N gallery links" bar no longer disappears after switching tabs: the candidate list was cleared on every tab load but never cached, so switching to another tab and back left the banner gone until a rescan. Gallery-link candidates are now saved and restored with the tab's image cache, so the bar (and its per-link status dots) survives the round trip.

  • Ticking an off-page image no longer toasts "this image came from a link…": selecting a resolved / right-clicked image fired an informational toast every time, because those images have nothing on the page to highlight. Selection is now silent β€” the card's "from link" badge already explains where the image came from. The duplicate right-click toast was also shortened from "Already in the results β€” not added again" to "Image already exists".

πŸ”„ Changed

  • Gallery-links bar: smoother expand/collapse: the candidate list now glides open/closed (height + opacity animation) instead of popping in and out, the expander got a rotating chevron matching the group headers, and the "Found N gallery links" title is now visually stronger (hover highlights it instead of underlining).

  • "Resolve originals" now works behind logins: the deep resolve fetched detail pages without the browser's session cookie (the extension's service worker is a cross-site origin, so the default fetch mode never sent one) β€” on intranet or login-walled sites every fetch landed on an auth redirect and the whole batch failed. Page fetches now carry the session cookie for links on the site you're browsing (see the Security note below for the scoping), and pages that render client-side get a fourth extraction rung (schema.org JSON-LD image) after og:image / twitter:image / image_src.

  • Per-link resolve feedback in the gallery-links bar: "Resolve failed" was one aggregate toast with no hint of which link failed or why. Each candidate link now shows a status dot after resolving β€” green (extracted), red (failed, hover shows the reason: unreachable / needs login / no image declared / network timeout) β€” and the list itself was restyled: links render full-width with a real ellipsis at the edge (the old fixed 72-character cut left the right half of the bar empty), entries are real clickable links, and URLs use a monospace font.

  • Icon-heavy pages no longer look broken in the results list: pages full of 16Γ—16 base64 SVG glyphs (intrachrome toolbars, sprite sheets) rendered as mostly-empty thumbnail strips that read as broken cards. Small images (≀64px) now get a compact thumbnail, and data-URI images show data:image/svg+xml;… (size) in the URL row instead of a wall of base64 (the full value is still on hover / in copy).

πŸ”’ Security

  • "Resolve originals" no longer attaches your login cookie to arbitrary links: the candidate links come from page content, so blanket credentials: 'include' would let a hostile page fire credentialed requests at any site you're signed into (CSRF-style, including cookie-guarded intranet GET endpoints). The session cookie is now only attached to links on the same site as the page you're browsing β€” same-site estates on one domain root (e.g. *.company.com intranets, the case this feature was built for) keep working unchanged; everything else resolves anonymously. A whitespace-only image declaration is also rejected instead of injecting the page itself as a bogus "original".

🌍 i18n

  • 7 new translation keys across all 15 languages for the per-link resolve status tooltips.

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 12:22

✨ Added

  • Link penetration β€” get the image the link actually points to: pages full of "thumbnail β†’ full-size" links (the classic Reddit / gallery pattern) no longer stop at the thumbnail. Three layers:
    • Direct image links are extracted automatically (free): <a href="…jpg"> targets become their own image cards, badged "Linked original", alongside the thumbnail itself β€” part of every scan, no toggle needed. A visible thumbnail makes its original visible too, so originals survive the default "Visible only" filter.
    • Right-click any image or image link to send it straight to the panel (free): new context-menu items "Extract image" / "Extract linked image" inject the item directly β€” no full-page scan. If the panel is closed, the item waits and appears on next open.
    • Deep resolve for gallery pages (Pro): when a scan finds thumbnails linking to detail pages, a "Found N gallery links Β· Resolve originals" bar offers to fetch every detail page and pull its og:image original in one click. Click the count to expand the full list of candidate links before resolving. Free tier gets 3 resolves per month (server-adjustable); originals arrive badged "From link".

πŸ› Fixed

  • Resolved/link-image originals no longer disappear under "Visible only": the post-scan visibility re-check looked for each image's DOM element β€” link targets have none (the URL lives in an href, not an img src), so freshly extracted originals were wrongly flagged hidden. Link-penetrated items now keep the visibility they inherited from their thumbnail.

  • Right-clicked and resolved images survive panel reloads and rescans: items injected via the context menu (or pulled in by "Resolve originals") lived only in the panel's memory β€” reloading the panel, or any background rescan, silently dropped what the user explicitly extracted (and, for resolves, what the monthly quota paid for). Injected items are now flagged, persisted per-tab, and re-merged after every scan or cache restore; deleting one from the grid also removes it for good.

  • "Resolve originals" bar reappears when two scans race the same tab: when a second scan request arrived while the first was still running, the background's per-tab dedup reused the in-flight result but dropped the second caller's gallery-links callback β€” the resolve bar never showed on the second panel. Gallery links are now delivered to every concurrent caller.

  • Total resolve failure no longer shows a success toast or burns quota: when every gallery link failed (anti-bot 4xx, timeout, security guard), the panel reported "Added 0 original images" as success and still counted the attempt against the free monthly quota. A total failure now shows the error toast and doesn't consume the quota.

  • Context-menu titles no longer leak raw __MSG_…__ placeholders: menu items were registered with the manifest __MSG_*__ substitution, which Chrome silently fails to perform on some setups β€” leaving literal __MSG_contextExtractLinked__ in the right-click menu. Titles are now resolved through chrome.i18n.getMessage() at registration time, with an English fallback for missing keys.

  • Right-clicked images are no longer invisible ghosts under active filters: injected items arrive with unknown metadata (0Γ—0 size, "unknown" format) until their real dimensions load β€” any active size/format filter silently swallowed them right after the "added" toast, so the count never moved. Explicitly injected items now bypass content filters (the user's explicit request outranks filtering), and re-right-clicking an image that's already in the results says "Already in the results" instead of silence.

  • Link-sourced images explain themselves: the "Resolved" badge told users nothing about where an image came from β€” renamed to "From link" (direct-link originals: "Linked original"), both with tooltips spelling out the source. Ticking such a card now shows "This image came from a link and isn't displayed on the page itself" instead of failing to highlight with no explanation. The gallery-links bar shows what it will actually do, and the found count expands to the candidate link list.

πŸ§ͺ Test Coverage

  • 70 new tests (unit suite now 1620): isDirectImageUrl URL matrix, the link-image extraction stage (visibility inheritance, dedup, gallery-candidate collection), the background og:image resolver (meta ladder, security guards, timeouts), the linkResolve monthly quota, injected-item persistence/restore lifecycle, concurrent-scan gallery-links fan-out, and i18n-driven context-menu registration incl. the missing-key fallback. Three new e2e specs (link-image grid behavior, gallery-resolve bar incl. link-list expansion and the failure path, context-menu injection live + queue fallback) bring the browser suite to 124.
  • e2e now runs headless: the suite used to open a visible Chromium window per test (stealing focus on every test start); it now uses the new headless mode (full Chromium kernel, Playwright β‰₯1.49), which supports MV3 extensions and service workers β€” CI no longer needs xvfb, and the full run is ~2Γ— faster (7.7m vs 16m). npm run test:e2e:headed brings the window back when debugging.

v1.0.18

Choose a tag to compare

@github-actions github-actions released this 25 Aug 04:20

πŸ› Fixed

  • Collection export is back: the "Export as ZIP" button in the Collections modal had silently vanished during a UI-framework migration β€” clicking Export did nothing. The button (and the batch-download shortcut when rows are selected) is restored.

  • No more false "restricted page" flashes when switching tabs: the panel briefly cached an empty snapshot of its own tab while booting, which could be mistaken for a restricted-site marker and surface the wrong state when switching back. Empty snapshots are no longer saved.

  • Minor: the AI-tag filter no longer breaks on cached state that predates the feature; the format-conversion dropdown now closes before the upgrade dialog opens (the menu no longer lingers behind it).

πŸ§ͺ Test Coverage

  • End-to-end suite fully repaired: all 30 accumulated e2e failures (stale copy expectations, missing visibility flags in test seeds, race conditions, two real product bugs) are fixed β€” the suite now runs 119/119 green locally and in CI, so regressions actually get caught again.

v1.0.17

Choose a tag to compare

@github-actions github-actions released this 24 Aug 09:02

πŸ› Fixed

  • Anonymous telemetry no longer ships wrong versions: side-panel events (the majority of all usage events β€” scan triggered, images shown, downloads completed) carried version 0.0.0 because the side panel never re-seeded the extension version into its own telemetry client instance. Version-based analysis (e.g. adoption of a new release) was effectively blind; the side panel now reads the version from the manifest at runtime.

v1.0.16

Choose a tag to compare

@github-actions github-actions released this 24 Aug 06:55

πŸ”„ Changed

  • Telemetry is now silent-by-design: anonymous usage events are collected by default with no in-product toggle. v1.0.9 had muted new installs "until the Privacy Opt-In Modal is accepted" β€” but that modal had already been removed from the UI in the v1.0.10 revamp, and the Settings toggle with it, so installs were silently muted forever (analytics UV collapsed ~97%). The data is zero-PII (event counts only β€” no URLs, no images, no identifiers) and disclosed in the Chrome Web Store listing. On update, installs muted by the old dead-toggle bug are un-muted once.

πŸ› Fixed

  • Saving settings no longer force-disables telemetry: since v1.0.6, every "Save & Apply" wrote telemetryOptIn=false (the toggle's HTML had been removed while its wiring survived, and the read fell back to false). The dead wiring is gone, and a one-time migration clears the bogus stored flag on update.

  • Admin dashboard funnel percentages no longer exceed 100% (e.g. "Used Scan 1000%"): the step-vs-first-install ratio is now clamped to 100% β€” a later step can legitimately exceed the window's new-install count when returning users (extension updates) join in, which used to render as a four-digit percentage.

v1.0.15

Choose a tag to compare

@github-actions github-actions released this 03 Aug 03:16

✨ Added

  • Guided first-run onboarding (A/B test): new installs in the treatment bucket now see a demo gallery on the welcome page and the side panel opens on that same page, with three lightweight coach marks that advance from the user's real actions (scan β†’ select β†’ download) instead of a tour. Control bucket keeps the legacy welcome. Why: only ~2.6% of installs ever completed a first download over the prior 90 days β€” the welcome page told people to "click the toolbar icon" and closed itself.

πŸ§ͺ Test Coverage

  • 6 new tests (suite now 1537): the onboarding-state gate's arming, stickiness-after-resolution, and persisted-state hydration.

v1.0.14

Choose a tag to compare

@github-actions github-actions released this 31 Jul 02:46

πŸ”’ Security

  • License tamper-protection is now live: cached Pro licenses are cryptographically signed by the server and verified offline β€” editing the local license record (plan, expiry, status) invalidates it and forces a fresh server check. Legacy and trial licenses are unaffected.

✨ Added

  • Optional uninstall feedback: removing the extension now opens a short, fully anonymous one-click survey β€” helping us learn why people leave. No account, no identifiers, answering is optional.

πŸ”„ Changed

  • A/B testing groundwork: the experiment framework now supports multiple concurrent experiments with independent, stable assignments β€” existing participants keep their variant.

πŸ§ͺ Test Coverage

  • 4 new tests (suite now 1531): multi-experiment bucket isolation and pinned assignment stability for live experiment participants.

v1.0.13

Choose a tag to compare

@github-actions github-actions released this 29 Jul 03:04

πŸ› Fixed

  • Excessive background license checks: installs with an expired trial or license were re-contacting the server on every browser event instead of once a day β€” wasted network, battery, and backend load. The 24-hour check cadence now applies to every license state; the 3-day trial grace window behaves exactly as before.

πŸ”„ Changed

  • Store listing in your language: the extension's Chrome Web Store title and summary are now localized in all 15 supported languages instead of English-only.
  • Better-timed review prompt: the "Enjoying Image Harvest?" dialog now appears right after a successful download (when it's least disruptive) instead of interrupting you at panel open.

🌍 i18n

  • 2 new keys Γ— 15 languages: localized store-listing name and summary (extName / extDesc) added to every language catalogue.

πŸ§ͺ Test Coverage

  • 9 new tests (suite now 1527): license-cache regression net (EXPIRED honors the 24h window, trial grace without network) and rating-prompt telemetry + re-check timing.