YAKA310/studio
Updates — 43 entries Newest first

What changed, newest first.

Development and release notes for YAKA310 STUDIO projects. Each entry keeps its original date and store status.

43 updates shown

2026

Four platforms, a clearer Library, and a new name. The v0.49.0 upload candidate expands the existing Post Library with supported Facebook and X saves, separate article previews, explicit X refresh controls and a more readable interface.

Store status Prepared for store upload

Threads, Instagram, Facebook, X Posts Library & Downloader, formerly Post Library, is the same extension and local Library. Its existing product URL and Chrome Web Store item remain unchanged.

This is the v0.49.0 upload candidate, compared with the published v0.48.9 shown in the owner’s store dashboard on 5 September 2026. Submission, approval and publication of v0.49.0 are not confirmed. The existing install link still opens the current public release.

  • Four platforms, with defined limits. Threads keeps Saved, publicly loadable original posts from an entered profile, and supported exact post/reply links. Instagram keeps Saved, entered public profiles and supported exact post/Reel links. Facebook adds supported exact text/photo posts, photo carousels, direct Photo links and Reels; Facebook Saved-list import is not supported. X adds Bookmarks, Likes History and exact post links.
  • X skips existing posts by default. History checks the status ID, even for a post saved from another list or a single link. Enable Update existing X posts in Settings to refresh those records. Pasting one X link and choosing Save explicitly updates the same record without creating a duplicate.
  • Separate X article previews. Supported external article cards keep a searchable title, site and URL in a labelled Link preview. A valid thumbnail is saved locally when available; otherwise the text preview remains. Preview artwork is separate from native photos, Download photos only and OCR picture-text recognition.
  • Save a post, or just its media. Supported exact links offer Save this post, Download photos only and Download videos only. Download-only actions do not add Library records. Video availability depends on the site and format; a save may keep only a poster and be marked Partial. X quoted-post media and reply bodies are not copied.
  • A more readable Library. Recently added uses the first-added date. Saved likes/replies counts are snapshots, not live counters. Add-posts settings have clearer labels, spacing and controls; the longer product name wraps on narrow screens.
  • Choose the card buttons you see. Reminder and Related posts buttons can be hidden independently in Settings. Hiding reminder buttons does not cancel existing reminders.

Categories, search, local OCR, offline reading of saved local copies, JSON export/import and Full Backup & Restore remain available. Keep backups: storage is not permanent preservation, and imports cannot promise complete account history or private, deleted or blocked content. The extension does not bypass site restrictions.

Optional AI categorization uses your own API key and sends selected text directly to your chosen provider; provider limits or charges may apply. Explicit sharing passes only the selected share file to the person or app you choose. This is an unofficial tool, not affiliated with or endorsed by Meta Platforms, Inc. or X Corp.

View Threads, Instagram, Facebook, X Posts Library & Downloader
Provider-aware API check. The former Test connection action is now Check API and reports a clear, tested result from the provider response: API available, rate limit reached, daily quota reached, invalid API key or model unavailable.

Store status not yet submitted to the store

Provider-aware API check. The former Test connection action is now Check API and reports a clear, tested result from the provider response: API available, rate limit reached, daily quota reached, invalid API key or model unavailable.

  • Each check still makes exactly one short request to the selected provider; it does not make a second quota request and does not claim to know a remaining-quota number.
  • A daily-quota result is shown only when Gemini’s structured quota details explicitly name a per-day limit. Other 429 responses, including Agnes AI responses without a documented daily-quota signal, safely report the general rate limit.
  • All four local interface catalogues contain the same action and result states.
View Post Library
Complete Threads Article preservation when the full text is present in Threads page data. Saving a Threads Article now keeps the outer post caption and the Article title and body as separate fields.

Store status not yet submitted to the store

Complete Threads Article preservation when the full text is present in Threads page data. Saving a Threads Article now keeps the outer post caption and the Article title and body as separate fields.

  • The complete Article is readable and searchable in Library and in newly generated offline backup.html files. JSON Export/Import, Full backup/restore, Markdown export and selected-post sharing retain it too.
  • Extraction uses the Article plaintext embedded by Threads, merges duplicate copies of the same main post, and never treats an Article attached to quoted/reposted content as the main Article.
  • /media, query-string and canonical spellings still resolve to one record; re-saving refreshes that record. If the complete Article is not available in page data, Library shows that only the visible preview was saved.
View Post Library
Search controls with explicit matching and scope. Library search now lets the user choose All words, Exact phrase or Any word, then search Everything, Post text, Pictures or Replies.

Store status not yet submitted to the store

Search controls with explicit matching and scope. Library search now lets the user choose All words, Exact phrase or Any word, then search Everything, Post text, Pictures or Replies.

  • All words keeps the existing quoted-phrase and -word exclusion syntax. Any word matches at least one positive term while still applying exclusions; Exact phrase treats the trimmed input as one literal phrase.
  • Everything covers the existing searchable fields; Post text uses only the saved post body, Pictures uses only text read from pictures, and Replies uses reply author/text. Existing sidebar filters remain additional conditions rather than being replaced by the search controls.
  • The extension and each newly generated offline backup.html use the same matching modes and field scopes. Both default to All words and Everything; the extension remembers its chosen mode and scope across reloads.
  • Invalid saved search state now falls back to an empty query, and an offline search cannot match reply text hidden by that backup’s minimum-like threshold.
View Post Library
Public-profile reliability and Add-posts polish. Normal original posts are no longer counted as reposts when Threads places the ordinary Repost action inside a non-interactive wrapper.

Store status not yet submitted to the store

Public-profile reliability and Add-posts polish. Normal original posts are no longer counted as reposts when Threads places the ordinary Repost action inside a non-interactive wrapper.

  • Newly seen replies and reposts still count as page progress, so a scan does not stop at the first 25 originals; it stops only at the selected cap or after repeated checks at the actual end of what Threads loaded.
  • Public-profile controls stay on one desktop row and Username now sits inside its input without losing its screen-reader label. Repost skip totals come only from relationship chrome, not ordinary card actions.
  • Save one post is a folded native disclosure using the same typography as the other sections. The old-picture reader now describes only existing library pictures, Pause between posts replaces the vague Gentle pacing label, and a dotted marker appears while a real run is active.
View Post Library
User-requested public-profile import. Add posts now accepts a Threads username, @username or exact Threads profile URL and imports the publicly loadable original posts Threads shows in that run. Pinned originals are included; replies, reposts, other-author posts and ambiguous cards are skipped. “All available” is explicitly bounded by what Threads loads and is not a promise of complete account history.

Store status not yet submitted to the store

User-requested public-profile import. Add posts now accepts a Threads username, @username or exact Threads profile URL and imports the publicly loadable original posts Threads shows in that run. Pinned originals are included; replies, reposts, other-author posts and ambiguous cards are skipped. “All available” is explicitly bounded by what Threads loads and is not a promise of complete account history.

  • The collector uses the existing browser session and existing visit/process/media/OCR/merge pipeline. It stops without bypass or automatic retry on login, private/not-found, soft-block or rate-limit pages, and Stop keeps records already completed.
  • All four local catalogues carry the same UI and failure states; Russian remains visibly Testing. Store and privacy claims now cover this local, user-initiated public-content path without adding a host permission.
View Post Library
Four local interface languages. Settings now offers Auto, English, Traditional Chinese, Simplified Chinese and Russian (Testing). The chosen local language covers the Library, Add posts, activity, tasks, dialogs, notifications and newly generated offline backup/share artifacts. Russian stays visibly labelled Testing, and its checked-in provenance says TESTING ONLY — NOT NATIVE-REVIEWED.

Store status not yet submitted to the store

Four local interface languages. Settings now offers Auto, English, Traditional Chinese, Simplified Chinese and Russian (Testing). The chosen local language covers the Library, Add posts, activity, tasks, dialogs, notifications and newly generated offline backup/share artifacts. Russian stays visibly labelled Testing, and its checked-in provenance says TESTING ONLY — NOT NATIVE-REVIEWED.

Centered top bar and foldable Tasks filters. The brand and controls remain one centered responsive group. Tasks opens by default and can be folded without changing task records or the selected task filter; that display preference survives a dashboard reload. The Store package ships the fixed compiled language table and runtime resolver, while its build-time parser/compiler remains test-only.

View Post Library
Daily library UX. The dashboard now starts in the existing Library when it has posts, otherwise in Add posts; it remembers the last view after that. Backup & Restore is its own clear destination, and a Full restore now checks and previews an archive before an explicit Merge or Replace confirmation can write.

Store status not yet submitted to the store

Daily library UX. The dashboard now starts in the existing Library when it has posts, otherwise in Add posts; it remembers the last view after that. Backup & Restore is its own clear destination, and a Full restore now checks and previews an archive before an explicit Merge or Replace confirmation can write.

  • A storage-read failure is visibly different from an empty library and has a real Retry control. Search and filter zero-results states explain how to recover, while a truly empty library offers Add posts and Full restore.
  • The activity log stays as a one-line summary when idle and opens for work or errors. Saved cards put reminder, Related and sharing actions together above the post, including a direct Set reminder action for a taskless post.
  • Library filters use keyboard-operable controls, selected-post sharing is always discoverable, and narrow layouts preserve the same small-radius visual language.
  • Theme and first-run/local setup moved behind a small same-page Settings control, so a Library opens on its search rather than a long notice. A failed read never leaves a stale “0 posts” success line; Merge into library is neutral, while Replace this library alone carries destructive wording and styling.
View Post Library
Library entry recovery. When optional system alerts have not been allowed, Chrome can omit its notifications API entirely. The background worker now stays alive, so clicking the Post Library toolbar icon opens or focuses the Library; if alerts are allowed later, the reminder click handler registers then.

Store status not yet submitted to the store

Library entry recovery. When optional system alerts have not been allowed, Chrome can omit its notifications API entirely. The background worker now stays alive, so clicking the Post Library toolbar icon opens or focuses the Library; if alerts are allowed later, the reminder click handler registers then.

View Post Library
Release hardening. The reminder worker now serializes concurrent rebuilds and updates the current post record's task field instead of risking a stale whole-row write. A full archive with a checksum-valid but record-unowned media file is rejected before Restore writes anything; when Chrome uniquifies a restored media filename, the saved record follows the browser-reported filename within the complete configured Downloads base, including a base folder that itself contains “library”.

Store status not yet submitted to the store

Release hardening. The reminder worker now serializes concurrent rebuilds and updates the current post record’s task field instead of risking a stale whole-row write. A full archive with a checksum-valid but record-unowned media file is rejected before Restore writes anything; when Chrome uniquifies a restored media filename, the saved record follows the browser-reported filename within the complete configured Downloads base, including a base folder that itself contains “library”.

  • The packaged Instagram collection illustration now uses a generic fixture, not an account handle or collection identifier.
  • The dashboard privacy footer now states both real user-initiated transfers: optional AI categorization to the provider selected with the user’s own key, and a selected share file handed through the operating system to the person or app the user chooses. Neither transfer goes to the developer.
  • New runtime and deliberate-break tests cover stale reminder writes, competing earliest alarms, unowned archive media, restore filename collisions, package metadata and the visible Share disclosure.
View Post Library
Selected offline sharing. Tick specific Library cards, review the exact count and estimated size, then make one bounded local HTML file. It is not a Full backup, a public link or a developer upload.

Store status not yet submitted to the store

Selected offline sharing. Tick specific Library cards, review the exact count and estimated size, then make one bounded local HTML file. It is not a Full backup, a public link or a developer upload.

  • The default share contains only author/handle, date, text, source URL and safe local thumbnail/poster bytes. Categories/tags, replies, picture-reading text, transcripts and videos are separate opt-ins; video additionally needs a clear high-risk acknowledgement.
  • The static file has a restrictive CSP and embeds no remote media. Tasks/reminders, API keys/tokens, private settings, computer/library paths, unselected posts and derived caches are excluded. A missing local media item is shown in the preview rather than silently claimed as included.
  • On a browser that supports the operating system’s file-sharing API, the final user click opens that Share sheet; cancelling it never secretly downloads anything. Other browsers download the same local file. The product claim is local and bounded; it does not claim a public hosting service or browser-specific visual proof.
View Post Library
Local related posts. Opening Related posts on a saved card now makes a bounded local scan of up to 100,000 saved records and shows no more than five meaningful, non-duplicate matches with a clear reason.

Store status not yet submitted to the store

Local related posts. Opening Related posts on a saved card now makes a bounded local scan of up to 100,000 saved records and shows no more than five meaningful, non-duplicate matches with a clear reason.

  • The scan uses existing category, tags, saved text, OCR and replies. An existing transcript is a low-weight optional signal, not a transcription feature or requirement. Han/Cantonese bigrams and English words are handled deterministically, while ubiquitous terms are ignored so they do not manufacture a match.
  • It is on demand, leaves no derived related-result field in saved records, JSON Export or Full backup, and makes no related-post network request. A library mutation cancels a pending result rather than displaying stale recommendations.
  • The matcher has fixed source/token/shortlist/cache bounds and a query-time scan, not a corpus-wide index. The shipped claim is bounded local behaviour; it does not claim AI relevance, low-end-device performance or a live-browser benchmark.
View Post Library
Saved-post to-do reminders. Any saved post can now be added to a local To do list, given a due date, snoozed, marked done or kept without a date. The Library sidebar shows To do, Due today, Overdue and Done with live counts.

Store status not yet submitted to the store

Saved-post to-do reminders. Any saved post can now be added to a local To do list, given a due date, snoozed, marked done or kept without a date. The Library sidebar shows To do, Due today, Overdue and Done with live counts.

  • A bounded, versioned task object lives on the same saved-post record as the rest of the library. A re-scrape, JSON Export/Import and Full backup/restore keep it instead of making a second task database.
  • In-app tasks work without a permission prompt. When a due date is first saved, the user can separately allow optional system alerts; declining still saves the task. If allowed, the service worker holds just one next-due alarm and shows a generic count only — no post text, author, category, media or OCR.
  • On browser wake it catches up a missed due date once, rather than promising a perfectly timed alert. A completed, removed or snoozed reminder cannot repeat its previous alert cycle.
View Post Library
Full device-move backup. The original JSON Export / Import remains for a lightweight record backup or sharing. Settings now also has Full backup and Full restore for moving the whole usable library to another computer.

Store status not yet submitted to the store

Full device-move backup. The original JSON Export / Import remains for a lightweight record backup or sharing. Settings now also has Full backup and Full restore for moving the whole usable library to another computer.

  • Full backup asks for the real library folder, then writes one local .plbackup containing post records, category order, whitelisted non-sensitive settings, in-app media Blobs and the listed photos/videos it can actually read. It stores media as raw file entries, not one base64-expanded JSON string.
  • Every archive entry carries its byte size and SHA-256 fingerprint. Restore stages and validates the whole file — version, file/count/size limits, paths, duplicate names, checksums and records — before it writes downloads, settings or IndexedDB. Newer major formats are refused.
  • A missing or unreadable listed file makes the archive Partial and names the relative files; it never calls that result Complete. API keys, tokens, login/session data, OS paths and computer-account names are excluded.
  • Restore defaults to Merge. Replace first creates a separate complete safety archive of this computer; if that safety archive cannot finish, Replace changes nothing.
View Post Library
New light-theme promo tiles. The small and marquee tiles now match the current interface, use the real extension icon and accurately describe one offline library for Threads and Instagram. They replace the old dark tiles, which named Threads alone and made an unqualified “100% local” claim that did not explain optional AI actions. The five screenshots were recaptured too, so every visible version badge matches v0.47.3.

Store status not yet submitted to the store

New light-theme promo tiles. The small and marquee tiles now match the current interface, use the real extension icon and accurately describe one offline library for Threads and Instagram. They replace the old dark tiles, which named Threads alone and made an unqualified “100% local” claim that did not explain optional AI actions. The five screenshots were recaptured too, so every visible version badge matches v0.47.3.

View Post Library
New light-theme store screenshots. The four old dark screenshots still showed v0.41.3 and predated Instagram, the smarter Library search and the current AI privacy wording. They are replaced by five current 1280×800 screenshots covering the Library, search, Threads backup, Instagram backup and optional AI categorization. Every account, post and count shown is fictional demo data; no real library or API key was used. The developer structure notes now also name the bundled ONNX Runtime and PP-OCR reader instead of the removed Tesseract reader.

Store status not yet submitted to the store

New light-theme store screenshots. The four old dark screenshots still showed v0.41.3 and predated Instagram, the smarter Library search and the current AI privacy wording. They are replaced by five current 1280×800 screenshots covering the Library, search, Threads backup, Instagram backup and optional AI categorization. Every account, post and count shown is fictional demo data; no real library or API key was used. The developer structure notes now also name the bundled ONNX Runtime and PP-OCR reader instead of the removed Tesseract reader.

View Post Library
A full reliability and security review. Two independent follow-up reviews were run after the first fixes, and every reproduced defect was fixed and given a regression test.

Store status not yet submitted to the store

A full reliability and security review. Two independent follow-up reviews were run after the first fixes, and every reproduced defect was fixed and given a regression test.

  • Running a complete Threads or Instagram backup again, refreshing one post, or importing a backup now keeps your categories, tags, summaries, recognised picture text and downloaded-file links instead of replacing them with blank scrape data.
  • Changes made while the browser database is temporarily unavailable — including deletions — are replayed in order when it returns. Old recovery state that could overwrite newer records is quarantined instead of applied.
  • Imported backups now have size, record-count, URL, field-shape and media-folder checks. A bad record is rejected before anything is written, and asking to delete a post’s files cannot be redirected to another post’s folder.
  • Instagram media folders now use the post’s permanent shortcode rather than its account name. Existing folders still open after an account is renamed, while unknown authors and same-named Threads posts no longer collide.
  • The gallery and JSON bundle are published as one recoverable pair. Interrupted runs roll both files back together, reject forged or damaged recovery markers, and distinguish a real concurrent run from an unrelated reused process ID.
  • The AI privacy wording now says exactly what the code does: only when you start an AI action, the selected post text and API credential go to the provider you chose; they are not sent to the extension developer or sold.
  • The release archive now includes the Instagram and picture-reading code, locked dependency versions, vendor source/checksum/licence records, and one command that discovers and runs every test suite.
View Post Library
Pictures that would not open. Every download was asked for as img_1.jpg whatever the picture actually was, and Chrome — correctly — saves a PNG or a WebP under its own name. The name we asked for went into the record; the name on disk was different. In a 698-post library that is 164 files across 54 posts: broken pictures in the offline backup page, and nothing when you click through from the Library. Three things now fix it, because one of them is not enough for everybody:

Store status not yet submitted to the store

Pictures that would not open. Every download was asked for as img_1.jpg whatever the picture actually was, and Chrome — correctly — saves a PNG or a WebP under its own name. The name we asked for went into the record; the name on disk was different. In a 698-post library that is 164 files across 54 posts: broken pictures in the offline backup page, and nothing when you click through from the Library. Three things now fix it, because one of them is not enough for everybody:

  • New downloads record the name Chrome actually wrote, read back from the download itself rather than assumed.
  • Settings → “Fix broken picture links” checks every record against what is really on disk and corrects the name. It changes records only — no file is moved, renamed or deleted — and it runs itself once, quietly, after this update. It stands down if a backup or a picture-reading pass is running, because those write whole records too, and it does not mark itself done unless it really ran.
  • The offline backup.html now retries a picture that fails to load under the other file types. That one needs no permissions and no download history, so it works even for someone who has cleared theirs — and it repairs backups written by any earlier version.

The Chromebook half of the install base. ChromeOS is the platform most people run this on, and nothing here knew it existed:

  • The example of where your library lives was a macOS path — a folder shape that cannot exist on a Chromebook or on Windows. It now matches the machine you are on, and the location is described the way that machine’s own file manager describes it (Files › My files › Downloads › saved_library).
  • A first-run note, on ChromeOS only: sign in to Threads in this browser. Being signed in to the Threads or Instagram app on a Chromebook looks the same to you and tells the extension nothing — the apps and Chrome keep separate sign-ins, and a run would stop at an empty Saved list. It shares the existing first-time box rather than adding a third notice, and it comes back once for Chromebook users who dismissed that box before this note existed.

Pictures only (skip videos). A clip is by far the biggest thing a post brings with it, and a Chromebook is usually the device with the least room. Skip them and a post still keeps its text, replies, pictures and the video’s still frame. Off by default, remembered between sessions, and shown in the collapsed settings line so you can see it is on without unfolding.

What a run will cost, measured. Starting a backup now says what your library takes up on disk and what that rate implies for the posts you are about to fetch — added up from your own files, not estimated. It counts a file once no matter how many times it has been re-downloaded, and if there is nothing to measure it says nothing rather than reporting zero as a fact.

View Post Library
Searching finally understands more than one word. It used to be a single substring test, so cursor ai found nothing unless those exact characters sat next to each other — on a 600-post library you rarely remember the original wording. Now:

Store status not yet submitted to the store

Searching finally understands more than one word. It used to be a single substring test, so cursor ai found nothing unless those exact characters sat next to each other — on a 600-post library you rarely remember the original wording. Now:

you typeit finds
cursor aiposts containing both, anywhere, in any order
"claude code"that exact run of characters
cats -dogscats, but not the ones that also mention dogs

Measured on a real 698-post library: ai 工具 went from 10 results to 119, "claude code" from 0 to 57. The box itself explains the three rules, and a line underneath says how your query was read, so the syntax teaches itself. The offline backup.html uses exactly the same rules — a copy that searched differently would be a quiet trap.

Every link your saved posts point at, in one place. A new Links entry in the sidebar lists them grouped by site — often the link is the thing worth keeping. Each one opens directly, and “the post” takes you back to where it came from. It only appears when your library actually contains links.

Pick several posts at once. Every post now has a tick box; picking any brings up a bar to set a category on all of them or delete them together. “Select all shown” means exactly what it says — it never reaches past the filter or search you have on. Deleting uses the same confirmation as deleting one, including the “also delete the downloaded files” box that is never pre-ticked. The selection clears whenever the view changes, because a selection you cannot see is one you delete by accident.

A light theme. Three settings — follow your system, or pin light, or pin dark — reachable from the button in the header. Every colour in the extension now comes from a named token rather than being written into a rule, which is what makes a second theme possible at all. A test re-reads the two stylesheets and fails if a colour is written into a rule again — as hex, as rgb(), as hsl(), or by name.

Every colour is checked, not eyeballed. The suite computes the contrast of fifteen text-on-surface pairs in both themes and fails below WCAG AA. Doing that found two real problems: the light placeholder was unreadable at 2.3:1, and white text on the accent colour had been sitting at 3.1:1 in the dark theme all along — the accent was doing two jobs (button background, and link text on a dark card) that need opposite values, so the button surface now has its own.

View Post Library
"Save one post" takes an Instagram link now. Paste instagram.com/p/… or instagram.com/reel/… into the same box and that post — text, pictures, video, preview comments — goes straight into your library, exactly as a Threads link already did. Pasting an Instagram link used to be answered with "That is not a Threads post link", which was true and useless in an extension that backs Instagram up.

Store status not yet submitted to the store

“Save one post” takes an Instagram link now. Paste instagram.com/p/… or instagram.com/reel/… into the same box and that post — text, pictures, video, preview comments — goes straight into your library, exactly as a Threads link already did. Pasting an Instagram link used to be answered with “That is not a Threads post link”, which was true and useless in an extension that backs Instagram up.

  • The first Instagram link asks Chrome for access, the same one-time question the Instagram backup asks.
  • Re-pasting a link you already have refreshes the post without losing its category, tags, summary or the words read from its pictures.
  • It will not start while a backup or a picture re-read is running, and they will not start while it is.
  • It does not know which collection a post is in — a post link does not carry that. The next Instagram backup will fill it in, since collection names only ever fill an empty category.
View Post Library
Your Instagram collections become categories. If you file saved posts into collections, those names were being thrown away — every Instagram post landed in the library uncategorised, even though the library has categories and the collection names are your own organising. After the posts are safely in, the backup now reads your collections and files each post under its collection's name. It opens and downloads nothing twice: every saved post is already in All posts, so this pass only reads the names.

Store status not yet submitted to the store

Your Instagram collections become categories. If you file saved posts into collections, those names were being thrown away — every Instagram post landed in the library uncategorised, even though the library has categories and the collection names are your own organising. After the posts are safely in, the backup now reads your collections and files each post under its collection’s name. It opens and downloads nothing twice: every saved post is already in All posts, so this pass only reads the names.

  • A post in more than one collection takes the first one, so its category does not flip between runs.
  • A category the post already has is never replaced — whether the AI picked it or you renamed it by hand. The log says how many were left alone.
  • Turn it off with use my collection names as categories next to the Instagram username.
  • Same 8-second pacing floor between collections as between posts.

Measured on a real account before any of this was written: a collection page’s grid is identical to the All posts grid (so the existing reader works on it unchanged), and a post filed into a collection also stays in All posts (so nothing was ever being missed — only the names were lost).

View Post Library
The Scrape page, rebuilt around what you actually do there. Six changes, each one tested before the next was started.

Store status not yet submitted to the store

The Scrape page, rebuilt around what you actually do there. Six changes, each one tested before the next was started.

  • A status strip that stays put. How big your library is, where it writes, and what it is doing now — parked under the page header instead of buried in a log line that scrolls away five lines into a run. It marks itself while something is running. (The folder shown is always the relative one; the absolute path contains your computer’s username and never appears on screen.)
  • One place to press Start. There were two, identical in word and style, in two cards — and only one backup can run at a time anyway. Now a single card with a Threads / Instagram picker. Switching is refused while a backup is running, because the pair you would be hiding holds that job’s Stop button. It remembers which one you use.
  • The options you change, separated from the ones you set once. Only new, Stop after and Read text in pictures stay in front of you — those are the three both backups read. Gentle pacing, the delay range, minimum reply likes, saving every reply and the folder fold away behind Settings, which shows what they currently are without being opened: gentle pacing · 5–14s between posts · replies with 1+ likes · top 5 replies · Downloads/…
  • “Read them now” sits with picture-reading, not under Settings & backup beside Export JSON and Clear all. Turning the option on only affects posts saved from then on, and the button that fixes that is now where you form the thought.
  • The Instagram explanation folds away. Eight points sat permanently between the button and the log; the one that actually stops people — being logged in — stays visible and the rest is one click. Two of those points had also gone stale: they named a setting that had been renamed, and warned that reading pictures makes a run slower, which stopped being true when the engine changed.
  • The log says which job wrote each line. One log serves the Threads backup, the Instagram backup, the AI categoriser and the picture reader; lines now carry [Threads], [Instagram], [AI] or [Pictures]. Indented detail lines stay untagged — they belong to the line above.

Mutation testing is faster with no loss of rigour. The baseline used to run each suite twice against identical source; it now runs once, and is reused while every file that could change the answer is byte-identical to the last time it was proven green (--nocache to re-prove). The test harness waits for the app’s own readiness signal instead of a fixed 250 ms, which is quicker and also removes a latent flake on slower machines. Checking a single mutation went from 168 s to 84 s.

View Post Library
A new reader for the text inside pictures, and the old one is gone. OCR text is part of local search, so an unreliable reader can make a picture look searchable when it is not.

Store status not yet submitted to the store

A new reader for the text inside pictures, and the old one is gone.

  • OCR text is part of local search, so an unreliable reader can make a picture look searchable when it is not. The old reader has been removed rather than kept as a hidden fallback.
  • The reader is PP-OCRv5 (Baidu, Apache 2.0) running on ONNX Runtime Web, bundled with the extension for local use.
  • It runs entirely on your own device, like the old one: the models are inside the extension, nothing is fetched, no picture is uploaded.
  • There is no engine setting. One reader, and if it cannot start on your computer the log says so and the pictures go unread — it will not quietly fall back to something that makes words up.
  • The old Tesseract reader and its 19 MB of data are deleted, not merely switched off.

“Re-read pictures” (Settings & backup). Posts saved before you turned picture-reading on have no words stored, so searching cannot find what is written in them. This goes back over the pictures already saved and reads them properly. It only ever writes the words: your categories, tags and summaries are untouched, nothing is downloaded again, and a picture it cannot open leaves whatever was already there alone. There is a Stop button, and it will not run while a backup is running.

Instagram posts are easier to find. They sort by their own post date, so the Library now has a “Saved from” filter in the sidebar (Threads / Instagram, with counts) and shows an Instagram badge on those posts. The filter only appears when there is more than one place to choose between.

When an Instagram run cannot read its window, it now says what Chrome actually refused. It used to report “that window stopped responding” while the window sat there working perfectly; the real message — usually about permission — was being thrown away.

Four things that make a large Library easier to use.

  • The search box stays on screen. It now rides just under the page header. (The offset is measured from the header’s real height rather than guessed, because that height depends on the font your system picked.)
  • A “Top” button appears once you have scrolled down, and puts you back at the start of the list.
  • A “Next match” button while you are searching. It jumps to the next post that matched — not the next occurrence of the word inside the post you are already reading — and shows where you are, e.g. 2 / 12. Past the last match it wraps around to the first.
  • Searching no longer unfolds every reply. Replies past the first five are normally folded behind a “Show N more” toggle. The fold now opens only when the match really is inside a hidden reply — which is the case that rule was written for.
View Post Library
Text found inside pictures is now searchable in the extension itself. The OCR option always promised "screenshots become searchable", but that was only true in the offline backup page — the Library view's search never looked at the recognised text. It does now, for Instagram and Threads posts alike. (Searching still matches nothing when nothing matches; the extra text only adds results.)

Store status not yet submitted to the store

  • Text found inside pictures is now searchable in the extension itself. The OCR option always promised “screenshots become searchable”, but that was only true in the offline backup page — the Library view’s search never looked at the recognised text. It does now, for Instagram and Threads posts alike. (Searching still matches nothing when nothing matches; the extra text only adds results.)
View Post Library
The 8-second gap between posts could be skipped entirely. Two adversarial reviews of the Instagram work found real defects — including one my own previous fix had created — plus several tests of mine that could never have failed.

Store status not yet submitted to the store

Two adversarial reviews of the Instagram work found real defects — including one my own previous fix had created — plus several tests of mine that could never have failed. All fixed:

  • The 8-second gap between posts could be skipped entirely. The wait sat at the end of the loop, and any post that could not be read jumped over it — and “could not be read” is exactly what a verification page looks like. So the pace collapsed to two or three seconds precisely when Instagram was least happy. The wait now happens before each post, where nothing can bypass it.
  • Starting Instagram right after pressing Stop on a Threads backup cancelled that Stop. The check looked at the Stop button, which switches off the instant you press it while the Threads run is still finishing its current post. It now looks at the Start button, which stays off for the whole run.
  • A verification or login page appearing mid-run is now treated as a stop, not as one unreadable post to skip past.
  • A run whose window was closed no longer reports “Done”. Three unreadable posts in a row now end the run and say why — before, it walked the entire list finding nothing and still announced success, so a backup that saved nothing looked complete.
  • A video in a carousel could show the wrong cover picture if an earlier video had failed to download.
  • Clearer wording on the Instagram box: which settings actually apply (and which do not), that OCR makes it slower, and that only one backup runs at a time.
View Post Library
OCR now works on Instagram posts too. If you have "OCR images" ticked, the text inside an Instagram post's pictures is read on your own device, exactly as it already was for Threads — same engine, same limit of four images per post, nothing uploaded anywhere.

Store status not yet submitted to the store

  • OCR now works on Instagram posts too. If you have “OCR images” ticked, the text inside an Instagram post’s pictures is read on your own device, exactly as it already was for Threads — same engine, same limit of four images per post, nothing uploaded anywhere.
  • Known gap, and it is not new: the recognised text is searchable in the offline backup.html page but not in the Library view inside the extension — that view’s search does not look at it. This has always been true for Threads posts as well.
View Post Library
Instagram has its own Start and Stop buttons The first section is now called Threads rather than "Scrape & library", so it is obvious which of the two it belongs to.

Store status not yet submitted to the store

  • The first section is now called Threads rather than “Scrape & library”, so it is obvious which of the two it belongs to.
  • Instagram has its own Start and Stop buttons, laid out exactly like the Threads ones, so the two run independently and you can see at a glance which is which.
  • The Instagram explanation is now a short list instead of a paragraph.
  • Confirmed by test: AI categorization already works on Instagram posts — their caption and author go to the AI the same way a Threads post’s do, and the category, tags and summary come back onto the Instagram record. (At the time of writing OCR was still Threads-only — that changed in v0.45.3 below.)
View Post Library
Stopping a Threads backup used to quietly ruin the next Instagram run. The Stop button leaves a flag set that is only cleared when a Threads run starts — and the shared image fetcher honours it. So an Instagram run started afterwards saved every post with no thumbnail and no playable video, while still reporting "Done", because the files themselves still reached disk by another route. Instagram now refuses to start while a Threads backup is live, and clears that flag when it takes over. The two can no longer run at the same time either.

Store status not yet submitted to the store

Fixes from an adversarial review of the Instagram work:

  • Stopping a Threads backup used to quietly ruin the next Instagram run. The Stop button leaves a flag set that is only cleared when a Threads run starts — and the shared image fetcher honours it. So an Instagram run started afterwards saved every post with no thumbnail and no playable video, while still reporting “Done”, because the files themselves still reached disk by another route. Instagram now refuses to start while a Threads backup is live, and clears that flag when it takes over. The two can no longer run at the same time either.
  • A video inside a mixed photo-and-video carousel showed the wrong picture as its cover — it took the n-th photo instead of the still frame from its own slide.
  • Every piece of user-facing text now mentions Instagram: the store description, the single-purpose statement, the permission list, the first-run notice in the extension, and the privacy policy in this repo (which spells out that Instagram access is optional, asked for only when you press the button, and can be withdrawn). NOTE: the copy published at bu56co-del.github.io still predates this and must be re-published before the extension ships with Instagram. A test now checks these against the manifest, so claiming the wrong set of sites makes the suite fail.
View Post Library
Post Library can now back up your Instagram saved posts too Post Library can now back up your Instagram saved posts too, into the same library as your Threads ones — same search, same categories, same offline backup page, same delete.

Store status not yet submitted to the store Instagram

  • Post Library can now back up your Instagram saved posts too, into the same library as your Threads ones — same search, same categories, same offline backup page, same delete. There’s a new Instagram box on the Scrape tab: put in your username and press the button.
  • It asks for access to Instagram only when you first press that button, and until you say yes the extension cannot touch Instagram at all. You can take the access away again at any time from Chrome’s extension settings. Nothing about the Threads side changed, and updating does not disturb anything you already have.
  • Photos, multi-photo carousels (every slide, not just the first) and reels are all saved, with the caption, date, like count, author and the top comments — the same things it keeps for a Threads post.
  • Deliberately slow, and it gives up rather than pushing. Instagram is much quicker than Threads to answer with “try again later”, so this never goes faster than 8 seconds between posts however you set the delay, and if Instagram does say that, the run stops immediately and tells you not to start it again for a few hours — retrying is what turns a gentle warning into a real account restriction. Close other Instagram tabs first; they share the same limit.
  • Under the hood the two are entirely separate: Instagram lives in its own file and the existing Threads code was not modified at all.
View Post Library
No more download pop-up every time the offline backup page is rewritten. backup.html is refreshed after almost everything you do — deleting a post, categorizing, renaming a category, clearing — and because writing it is technically a download, Chrome announced it each time. It is now written silently. Your own downloads still show normally, and media downloads during a scrape were already quiet.

Store status not yet submitted to the store

  • No more download pop-up every time the offline backup page is rewritten. backup.html is refreshed after almost everything you do — deleting a post, categorizing, renaming a category, clearing — and because writing it is technically a download, Chrome announced it each time. It is now written silently. Your own downloads still show normally, and media downloads during a scrape were already quiet.
View Post Library
"Clear library" now offers the same choice. Its final step is the same dialog as the per-post delete: it says how many posts and how many downloaded files will go, with the "also delete the files" box unticked by default. The two "are you sure" steps before it are unchanged. Cancelling it clears nothing at all.

Store status not yet submitted to the store

  • “Clear library” now offers the same choice. Its final step is the same dialog as the per-post delete: it says how many posts and how many downloaded files will go, with the “also delete the files” box unticked by default. The two “are you sure” steps before it are unchanged. Cancelling it clears nothing at all.
  • Clearing a big library used to need one lookup per post; it is now a single lookup for the whole library, and lookups no longer stop at the browser’s default limit of 1000 results.
  • Fixed before anyone saw it: the delete dialog was attached inside the Library view, which is hidden while you are on the Scrape tab — so the Clear-all dialog would have been invisible and the whole action would have appeared to do nothing. It now lives at the page level.
  • Privacy policy rewritten to describe deletion accurately (what it can and cannot reach, and that it is opt-in), and a test now compares that wording against the code so it cannot quietly go stale again.
View Post Library
It was missing most of the files. Deletion matched the file paths written on each post's record — but posts that came in through Import keep their paths in a different field, and about one path in five names a .jpg where the file on disk is actually a .webp or .png. On the real 639-post library that meant 473 posts would have been told "no downloaded files" while 272 of them really had files: 779 files that could never be deleted. It now works off the post's own download folder instead of the recorded paths, so every file in it is found regardless of how the record spells it.

Store status not yet submitted to the store

Fixes to the file deletion added in v0.44.0, all found by an adversarial review run against the real library:

  • It was missing most of the files. Deletion matched the file paths written on each post’s record — but posts that came in through Import keep their paths in a different field, and about one path in five names a .jpg where the file on disk is actually a .webp or .png. On the real 639-post library that meant 473 posts would have been told “no downloaded files” while 272 of them really had files: 779 files that could never be deleted. It now works off the post’s own download folder instead of the recorded paths, so every file in it is found regardless of how the record spells it.
  • It could say “nothing was deleted” right after deleting. Each re-scrape of a post leaves another entry in the browser’s download list pointing at the same file, and the browser only refreshes its “does this still exist” flag every few seconds — so the check added in v0.44.0 read a stale sibling entry and reported the file as untouched. The check is gone; deletion now goes through every entry for a file, and one success means gone.
  • The dialog could freeze a delete. If the library re-drew itself while the dialog was open (which happens if you had a category dropdown open just before), the dialog was destroyed and the delete waited forever, with a stray key handler eating every later Escape. It now closes as a cancel.
  • The file count in the dialog is now read from the disk rather than from the record, and a post whose files can’t be located says so (“the folder may have been moved or renamed”) instead of claiming it has none.
  • Files are now deleted before the record, so an interrupted delete can’t strand files whose only known location was that record. Declutter also reports if a marked post had already vanished.
View Post Library
Deleting a post now asks whether to delete its downloaded photos and videos too. Until now the media always stayed on disk and you had to go clean it out yourself. The new dialog tells you exactly how many files that post has and lets you tick "also delete them" — left unticked, nothing on disk is touched, exactly as before. The same choice appears when Declutter removes a batch, and posts with nothing on disk simply say so.

Store status not yet submitted to the store

  • Deleting a post now asks whether to delete its downloaded photos and videos too. Until now the media always stayed on disk and you had to go clean it out yourself. The new dialog tells you exactly how many files that post has and lets you tick “also delete them” — left unticked, nothing on disk is touched, exactly as before. The same choice appears when Declutter removes a batch, and posts with nothing on disk simply say so.
  • Honest about what it can reach: it deletes through the browser’s own download record, so a file that was moved, renamed, or already deleted (or whose download history was cleared) cannot be removed — those are counted and reported to you (“2 file(s) could not be found”) instead of being quietly skipped.
  • It only ever deletes inside the folder your “Save to Downloads/” setting points at right now. If you once used a different folder and still have an older copy of the library there, that copy is left completely alone.
  • No new permission is needed for this, so the install prompt is unchanged.
View Post Library
"Export for AI" hidden. Feeding a pile of saved posts to NotebookLM turns them into a podcast nobody would actually sit through, so the button is gone from the library toolbar. The code behind it is still there and still tested — it can be switched back on at any time.

Store status not yet submitted to the store

  • “Export for AI” hidden. Feeding a pile of saved posts to NotebookLM turns them into a podcast nobody would actually sit through, so the button is gone from the library toolbar. The code behind it is still there and still tested — it can be switched back on at any time.
View Post Library
Moved the Save one post box below AI categorization, so the Scrape tab reads top-to-bottom: back up your Saved list → tag it with AI → add a one-off post → settings. Moved the Save one post box below AI categorization, so the Scrape tab reads top-to-bottom: back up your Saved list → tag it with AI → add a one-off post → settings.

Store status not yet submitted to the store

  • Moved the Save one post box below AI categorization, so the Scrape tab reads top-to-bottom: back up your Saved list → tag it with AI → add a one-off post → settings.
View Post Library
Rediscover. The library now opens with three posts you saved a while back and probably forgot, picked from the older half of your library. Click one to jump straight to it. The same three stay all day (so it doesn't shuffle under you), "Show me another 3" draws a fresh set, and anything surfaced rests a month before it can appear again. There's a "Hide for today" if you're not in the mood.

Store status not yet submitted to the store four new features

  • Rediscover. The library now opens with three posts you saved a while back and probably forgot, picked from the older half of your library. Click one to jump straight to it. The same three stay all day (so it doesn’t shuffle under you), “Show me another 3” draws a fresh set, and anything surfaced rests a month before it can appear again. There’s a “Hide for today” if you’re not in the mood.
  • Save one post by pasting its link. New box on the Scrape tab: paste any Threads post link and that single post — text, replies, photos, video — goes straight into your library, without touching your Saved list. Pasting a link you already have refreshes that post instead of creating a duplicate (this also works across the threads.com / threads.net split).
  • Declutter. A “go through them one by one” mode: each post shows on its own with Keep / Remove, it tells you when a post is saved twice or its original is gone, and Back undoes a misclick. Nothing is deleted until you confirm at the end, and posts you already went through don’t come back next time. Keyboard: K keeps, R removes, Esc finishes.
  • Export for AI. One button in the library turns everything currently shown (respecting your category / author / search filter) into a single Markdown document — with each post’s author, date, source link, full text, image text and replies — ready to upload to NotebookLM, Claude, or any AI notebook so you can ask questions about your own library.

Built, then cut before release: “check which originals are still deleted”. A fifth feature was written and then removed once it was measured. Threads decides what to send based on who is asking: a request from the extension gets back an empty app shell with no post information in it, so the check could only ever answer “don’t know” — while downloading roughly 250 KB per post (about 70 MB and 7 minutes for a 272-post library). Only requests identifying themselves as a search-engine/social crawler get the real page, which this extension is not going to pretend to be. Shipping the button would have burned the user’s bandwidth for nothing, so it was cut rather than shipped broken. Refreshing a single post (paste its link in “Save one post”) is the honest way to find out whether one particular post is still readable.

View Post Library
Clearer wording next to Start: it now says only your SAVED posts are backed up — nothing else from the account is collected. Clearer wording next to Start: it now says only your SAVED posts are backed up — nothing else from the account is collected.

Store status not yet submitted to the store

  • Clearer wording next to Start: it now says only your SAVED posts are backed up — nothing else from the account is collected.
View Post Library
ChromeOS pass ChromeOS pass (first ChromeOS installs appeared in the store stats): the per-account profile hash in ChromeOS paths (/home/chronos/u-<hex>) is now masked as ~ in the UI like macOS/Windows usernames; category reordering gets visible up/down buttons on touch screens (drag-and-drop never fires on touch — ChromeOS tablets could not reorder at all); narrow-screen layout fixes for small Chromebooks / split screen (sidebar stacks, inputs go full-width).

Store status not yet submitted to the store

  • ChromeOS pass (first ChromeOS installs appeared in the store stats): the per-account profile hash in ChromeOS paths (/home/chronos/u-<hex>) is now masked as ~ in the UI like macOS/Windows usernames; category reordering gets visible up/down buttons on touch screens (drag-and-drop never fires on touch — ChromeOS tablets could not reorder at all); narrow-screen layout fixes for small Chromebooks / split screen (sidebar stacks, inputs go full-width).
View Post Library
Fixed "AI categorization done: 0/59 succeeded" with no error. New Gemini models think before answering, and that thinking eats the reply's token budget — with our old 2200-token cap the answer often came back completely empty, and the code treated that as "processed". Now: the budget is 8192, Gemini is asked for pure-JSON output, an empty reply fails the batch LOUDLY (with the API's reason), and an unparseable reply logs its first 120 characters so you can see what came back.

Store status not yet submitted to the store

  • Fixed “AI categorization done: 0/59 succeeded” with no error. New Gemini models think before answering, and that thinking eats the reply’s token budget — with our old 2200-token cap the answer often came back completely empty, and the code treated that as “processed”. Now: the budget is 8192, Gemini is asked for pure-JSON output, an empty reply fails the batch LOUDLY (with the API’s reason), and an unparseable reply logs its first 120 characters so you can see what came back.
View Post Library
AI categorization now has a Stop button AI categorization now has a Stop button — it appears while a run is going, halts after the current batch, keeps everything already categorized, and pressing Start again continues with the rest.

Store status not yet submitted to the store

  • AI categorization now has a Stop button — it appears while a run is going, halts after the current batch, keeps everything already categorized, and pressing Start again continues with the rest. Previously a long run (e.g. 272 posts at 4 req/min ≈ over an hour) could not be interrupted at all.
  • Fixed: stopping a scrape used to leave a flag set that silently killed the NEXT AI run at step one.
  • Fixed the Gemini model list: gemini-3.1-pro (preview-only, always 404s) removed and auto-replaced with gemini-2.5-pro for anyone who had it selected; added the current stable gemini-3.6-flash. Model names verified against Google’s official model list (2026-07-23).
View Post Library
The "Hide extra replies" button now floats at the bottom of the screen while a reply list is expanded The "Hide extra replies" button now floats at the bottom of the screen while a reply list is expanded — with 300 replies you can collapse from anywhere, no more scrolling to the very end to find the button.

Store status not yet submitted to the store

  • The “Hide extra replies” button now floats at the bottom of the screen while a reply list is expanded — with 300 replies you can collapse from anywhere, no more scrolling to the very end to find the button. Collapsing also jumps you back to where the replies fold, so you don’t land in the middle of nowhere. Works in both the dashboard library and backup.html.
View Post Library
Replies are now always shown sorted by likes (most-liked first) Replies are now always shown sorted by likes (most-liked first) — in the dashboard library, in backup.html, and in the Markdown export.

Store status not yet submitted to the store

  • Replies are now always shown sorted by likes (most-liked first) — in the dashboard library, in backup.html, and in the Markdown export. Previously the display trusted the stored order, which was only sorted for fresh scrapes; posts imported from the old scraper showed replies in page order.
  • Fixed the “Top reply likes” post sort for those same old imported posts: it now ranks by the highest-liked reply anywhere in the list, instead of assuming the first stored reply is the top one.
View Post Library
FIRST LAUNCH New icon: three book spines (library shelf), replacing the bookmark mark that looked too close to Meta's Save icon.

Store status submitted to CWS FIRST LAUNCH

  • New icon: three book spines (library shelf), replacing the bookmark mark that looked too close to Meta’s Save icon.
View Post Library