FindThatPage

Private, local-first browser-memory search. Public releases and privacy policy.

View the Project on GitHub asik-mydeen/find-that-page-releases

Changelog

All notable changes to FindThatPage are documented here.

1.9.1 — 2026-05-04 — “This site” defaults ON when the tab is pivotable

Follow-up to 1.9.0. Opening the popup/overlay/full-search on an http(s) page now defaults straight into the This site pill — so you see your history for the current site immediately, no click required.

Auto-fallback safety net: if you’re on a site you’ve never indexed before (and therefore “This site” would filter to nothing), the first search response silently drops the scope back to Recent. You never open to an empty list.

Manual clicks on any pill disable the auto-fallback for that session, so your choice always wins.

On pages where there’s no pivotable domain (chrome://, about:, extension pages), behavior is unchanged — pill hidden, Recent is the default.

1.9.0 — 2026-05-04 — “This site” empty-state filter

New third pill in the empty-state sort toggle: This site. Click it with the search box empty to see only pages from the domain of your currently-active tab, sorted by frecency.

Available in:

Pill is hidden when there’s no pivotable domain (chrome://, about:, extension pages, data:/blob: URIs) — offering it there would point at zero results.

No schema change. No persistence: opens in its default off state every popup/overlay/tab, so it’s opt-in per visit.

Tests

1.8.7 — 2026-05-04 — Top sources “Delete pages” actually deletes

1.8.6 — 2026-05-04 — Fix adjacent-element text gluing (searchability)

Reported: indexing an Amazon phonetool page with DOM like <span>Sup Soln-Fxd</span><h3>Harsh Shah</h3> stored the body text as "Sup Soln-FxdHarsh Shah" — two consecutive elements with no space between their text content. Searching for Harsh then returned no result, because the token in the index was fxdharsh.

Root cause: both extraction paths (Mozilla Readability output + legacy tag stripper) called Node.textContent, which concatenates all descendant text verbatim with no separator. Whatever the DOM looks like, textContent gives you one fused string. Block-level boundaries are invisible to it.

Fix: replaced both paths with extractTextWithSeparators(), a block-aware walker that emits a space around every block-level element (<p>, <h1><h6>, <div>, <li>, <br>, <td>, etc., 40+ tags). Inline elements (<span>, <em>, <a>, <strong>) still concat without a gap, so <em>bold</em>face stays boldface and doesn’t hurt phrase-match fidelity.

No schema change. Newly indexed pages extract cleanly from now on. Previously indexed pages keep their glued text — revisit the tab to re-index and pick up the fix, or wait for the next auto-reindex pass (10 min on visible tabs).

Tests

1.8.5 — 2026-05-04 — Show matching text from deep in the page

Result cards were showing each page’s summary instead of the actual phrase that matched your query. When the match was buried deep in the page body — which is most of the time for long articles and docs — there was no visual cue about why a result made it in.

Root cause: FTS5 is configured in contentless mode (no body text stored in the FTS index — just the inverted index, to save ~50% of DB size). SQLite’s built-in snippet() can’t quote from a contentless index, so it was returning empty strings for deep-body matches. The card code then fell back to page.summary.

Fix: client-side snippet synthesis. After FTS returns its ranked rows, for any row whose highlight columns are empty, we batch-load pages.text (already stored in the main table), find the first location of your query tokens, and slice ~180 chars of context around it with the matched phrase wrapped in <mark>. Runs only on the visible result set (default 30 rows) — no FTS index bloat, no schema change, no per-page network round-trips.

Tests

User feedback made it clear that Related had the wrong mental model. The feature was computing “topically similar pages” (shared keywords), but the expected behavior is “pages opened in the same sitting.” Rewritten to match:

Previous ±4h window was catastrophically wrong: it swept in every unrelated tab in the same browser session. Tightening to ±10 min fixes the reported “Amazon approvals” → “Chrome extensions” problem.

Reports on 1.8.2 showed Related still surfacing unrelated pages: clicking Related on an Amazon approvals page pulled up “What’s new in Chrome extensions” because both were visited in the same browser session. Three underlying problems, all fixed:

Tests

Bulk operations

Ergonomics

New setting

Tests

Extraction quality

Language

Faceted search (full-tab page)

Tests

Schema

1.6.0 — 2026-05-03 — Time filters, pagination, title highlights, domain collapse

Power-user query grammar

Scale

Speed

UX polish (Tier C bundle)

Result list ergonomics

Tests

1.5.0 — 2026-05-03 — Faster search, cleaner titles, recent-queries, better empty states

Five independent wins, all shipping together. No schema change.

Search speed

Indexing quality

UX

Tests

1.4.1 — 2026-05-01 — Popup UX fixes

1.4.0 — 2026-05-01 — High-coverage indexing for chat sites

Long AI chats (ChatGPT, Claude, Gemini) now get 3× the indexing coverage of regular pages, with near-real-time re-indexing so streaming replies become searchable within a minute.

What changed

Scope guard

Tests

1.3.0 — 2026-05-01 — Chunked body search, fuzzy fallback, redesigned settings

Search depth

Fuzzy “Did you mean?”

Options page redesign

New user preferences (all sync-mirrored)

New bulk action

Import & reliability

Testing

Performance

1.2.0 — 2026-04-30 — Bigger empty state, sort toggle, Firefox install polish

1.1.0 — 2026-04-30 — Branding + new icon set

1.0.1 — 2026-04-30 — CI pipeline verification

1.0.0 — 2026-04-30 — First public release

UI

Indexing

Privacy

Extension plumbing

Known limitations