Skip to content

v0.0.4

Choose a tag to compare

@SysAdminDoc SysAdminDoc released this 18 Oct 13:39
  • General has a Language choice now. The panel and every notice the script raises read from one list of phrases with English as the fallback, so a translation can drop in without touching anything else. No translation ships yet. Two test layouts stand in for one. Long text accents every letter and makes each phrase about 40% longer, and right to left mirrors the panel while keeping the English readable. Search still finds a setting by its English words whatever the language. The log and Copy report stay in English, and so do the values in Diagnostics. Facebook's own language doesn't change the choice. A backup keeps it, and Reset to defaults leaves it alone. At phone width the search box now grows to fit a longer phrase. Checked in Chromium at 320, 360, 640 and 1024 px in English and both test layouts, across every section, Diagnostics, search, a field error, an error notice and the recovery cards. Nothing spilled sideways or got cut off, apart from one long choice in a closed dropdown that ends in an ellipsis at phone width, and no phrase skipped the list. Not tried in Firefox or with a real translation yet.

  • Requests that HushFacebook Web holds back or answers itself now behave like real ones when Facebook's code watches them. They used to jump from sent straight to done, with none of the steps in between and no response header. A finished or cancelled one also took changes a real request turns down. Now each one goes through every step a browser shows, in the same order, and refuses the same things. In Chromium a request held while your settings load used to show Facebook its start twice, and it shows it once now. Checked in Chromium 155 and Firefox 156 against an untouched request answered by a local server with the same text. Where the two browsers disagree, it follows the XHR standard, which one of them always does. Not tried on Facebook itself yet.

  • Facebook no longer sits on gray loading placeholders when another extension or script changed how the page reads request answers before HushFacebook Web loaded. The two kept asking each other for the same text until the browser gave up with "Maximum call stack size exceeded" ("too much recursion" in Firefox). Tried in Chromium and Firefox with a stand-in for that other script, which reproduces the error on the old code.

  • A slow photo or video save can be cancelled now. If it's still going after a moment, a Saving notice with a Cancel button stays up until it ends, and Cancel stops the transfer in the browser instead of letting it run on. The whole save has one ten minute limit, so a stalled transfer ends with a message rather than hanging, and neither a cancel nor the limit starts a second try behind your back. In the extension a long video counts as saved only once the browser has all of it (it used to say Saved after 20 seconds while the file was still coming in). When the browser gives up on a download partway, the message says why. Closing the tab leaves the file saving, and a save still finishes when Chrome restarts the extension's background in the middle of it. Tried in Chromium with the extension against a local server: a quick save, a 25 second one, Cancel, a server that cut off every transfer, a restarted background and a closed tab. Tried in Tampermonkey 5.5.1 too, through its own downloads and through the fallback for file types it won't save: a quick save, a stalled one and Cancel.

  • A photo or video save that fails now shows one notice saying why. A second one used to pop up right with it ("Couldn't save a photo or video. Details are in Diagnostics."), which said the same thing. Diagnostics still has the details.

  • Publishing a release now downloads every file back from GitHub (the script, the .meta.js, the extension zip and SHA256SUMS.txt) and stops if any of them differs from what was built, or if the version inside one doesn't match the release. It used to check only the script.

  • Firefox no longer logs a burst of errors when Marketplace only sends Home to Marketplace. For a moment Firefox keeps the page it's leaving, with no body, and every switch that watches the page tried to watch that empty one too. They now skip a page that finishes loading with no body. Tried in Firefox 156 with the extension: Marketplace only still redirects, and the page shows no errors from the script.

  • The build now makes a Firefox copy of the extension too, in dist/extension-firefox, for Firefox 128 or newer. Load its manifest.json with Load Temporary Add-on on about:debugging (the README has the steps). Mozilla hasn't signed it yet, so Firefox drops it when you close the browser. Tried signed out in Firefox 156, installed from the built folder: the script started in the page, settings went both ways through the extension's storage, a Facebook image saved under the name it was given, and the toolbar button opened the settings. Marketplace only, saved in the extension, sent Home to Marketplace, and the daily release check found nothing newer. Firefox 128.0esr, the oldest it takes, passed the same checks as Chrome 120 against a local stand-in for Facebook: the background and both page scripts started, Hold back usage logs stopped the page's first log posts with it on and let them through with it off, and a switch turned off in the panel was saved and still off after a reload.

  • A re: line in Hide posts by words can't freeze Facebook anymore. Patterns used to run on the browser's own matcher, and one like (a+)+$ could lock up the tab on a long post. They run on RE2JS now, whose time grows only with the length of the post, whatever the pattern. Case, accents and other alphabets match the way they did before. RE2JS has no look-ahead ((?=, (?!) or back-references (\1, \k<name>) and won't take a group inside a look-behind, so a line that uses one is skipped. It stays in your list and your backups exactly as you wrote it, Diagnostics names it with the reason, and a notice says so once per list. A look-behind without a group, like (?<!not )sponsored, still works. The script is about 270 KiB bigger for it.

  • Screen readers now read each switch with its help text, and a switch that can't run says why. It stays reachable with Tab so that reason gets heard, and Diagnostics names the reason too. A feature that broke partway can still be switched off, which stops whatever part of it did start, with no need for Reset or Pause. The setting search announces how many settings match after you stop typing, rather than with every letter. Switch and text box edges are easier to see now, and a switch that's on has a dark knob instead of a pale one that was hard to make out. Checked in Chromium and Firefox at phone widths, at 200% zoom and with forced colors, by reading each browser's accessibility tree. It hasn't been tried with a real screen reader yet.

  • One document in a Facebook answer that runs past about 8 million characters (four times the biggest one seen) now goes to the page as it came, piece by piece, instead of being held whole until it ends. It isn't filtered as it arrives. Diagnostics counts these under Answers too long to filter and the log mentions the first one, so a missed ad there doesn't look like a filter that worked. Documents before and after it in the same answer are filtered as usual. A long document is also no longer searched again from the start each time more of it arrives.

  • The extension asks for Chrome 120 or newer now, which is what its code is built for. It used to say 111, though nothing older than 120 was ever tried. Tried in Chrome 120 itself: the extension started, Hold back usage logs stopped the page's first log posts before its settings had even loaded, and a switch turned off in the panel was saved and still off after a reload. The README now lists the oldest browsers the userscript runs in too (Chrome and Edge 120, Firefox 128, Safari 17).

  • The toolbar button's settings still open when Chrome stops the extension's background while Facebook is loading. Chrome stops an idle background whenever it likes, and the wait used to live only in its memory, so a stop in between would have lost it. Now the button writes down which tab it's waiting on, and that page asks as it starts, which wakes the background again. The panel opens once. Clicking again while the tab loads takes you to it instead of opening another Facebook tab or reloading. If the page hasn't asked within a minute, that tab's button shows a "!" and its tooltip says to reload Facebook and click again. Nothing watches your other tabs, and it needs no new permissions. Tried in Chrome 120 and current Chromium with the background stopped on purpose halfway through a load.

  • For anyone working on the code, the stand-in pages the tests use can't reach the network anymore. With happy-dom 20 they could load stylesheets and iframe pages from the Facebook addresses inside a fixture. Every test page now comes from one helper that turns off stylesheets, iframes, images, scripts, navigation and requests, and a test checks that against a local server. The tests moved to happy-dom 21 too. This only touches development. The script and the extension never run in happy-dom, so nothing you install changes.

  • General in the extension now says how the last release check went. It shows when GitHub last answered and says plainly when a check couldn't reach GitHub or got an answer that made no sense. It only says you have the newest release after a check that worked. Check now asks GitHub right away. A failed check used to wait a whole day, and now it tries again in 15 minutes, then an hour later, then four hours, then once a day. When GitHub asks for a pause, the next check waits until GitHub says it's fine. A newer release it already found stays shown while later checks fail. It still only tells you, and nothing gets downloaded or installed.

  • A settings backup with nothing in it this version can use is turned away now, with a message, instead of putting every setting back to its default. Files from another app or backup format were already turned away, and neither kind changes anything. The README now says what moving or removing the extension does to what it remembers. Unzipping over the same folder and clicking Reload keeps all of it. Another folder, or Remove and load it again, starts from nothing, so back up first and restore in the new copy. Backups hold your choices only, not seen posts, video spots, speed or volume, and the Back up and restore row says so too. Tried in Chromium starting from an older build. Its choices and picked video speed were still there after the new build went over the same folder and Reload. The same files in another folder started empty and took the backup without the speed, and Remove cleared everything. A backup from the userscript restores into the extension too, which the tests check through both storage layers.

  • Hide posts by words has a Preview switch. While it's on, your lines and post kinds are checked the same way as always, but nothing gets hidden. Instead the card counts how many posts each line would catch. It counts the stories in what Facebook sends and the posts it draws on the page separately, since the two can't be matched up one to one. Before anything has been checked it says so, so an empty count never looks like a list that matches nothing. Turn Preview off and the posts it counted are hidden. The counts live only in memory and stop at 1,000 posts a layer. Changing the list starts them over. Diagnostics and Copy report get line numbers and counts, never the words or any post text. Everything else, sponsored posts and Hide seen posts included, works as usual while Preview is on. Tried in Chromium with the extension against a local stand-in page.

  • Hide posts by words has four new lists next to the one you already had. One hides posts by people, Pages or groups and one hides posts that link to sites. Each looks only at who posted or only at the links, so a name in someone's post text doesn't count. A name has to match in full, though case and extra spaces don't matter. Names aren't unique on Facebook, so a line hides everyone who goes by it. A site line like news.example also catches www.news.example and video.news.example, but never badnews.example or news.example.other.net. You can paste a whole link and it's cut down to its site. The other two lists always show posts by the people or sites on them, even when something else here would hide them. They only win over this feature, so a sponsored post from someone you always show still goes. A site line that isn't a site name is skipped, Diagnostics names it, and a notice says so once. Your old list works exactly as before and still checks everything in a post at once. Backups keep all five lists. Tried in Chromium with the extension against a local stand-in page, a reload included.

  • A friend's share of an ad stays in your feed when Hide sponsored posts is on. Facebook sends the shared post several times inside a share, and only one of those copies was left out of the search for the "Sponsored" label, so a label in another copy could take the whole share with it. Every copy is left out now, and so is any Follow button inside a shared post when Hide suggested posts has to search a whole story. A label on the share itself still hides it, and Hide AI-labeled posts still hides a share of an AI-labeled post. This came from adding a label to a captured share by hand. A share shaped like that hasn't been seen on Facebook yet.

  • A full settings backup with a broken value for a setting this version knows is turned away now, and nothing changes. It used to skip that one setting and restore the rest, which quietly put the skipped one back to its default and still said the restore worked. The message names the setting, and when the backup came from a newer version it says to update first. Settings this version doesn't know yet are still left out, so a newer backup restores everything else. A file with only some settings in it, rather than a full backup, still takes what it can use and skips the rest. Backups made by the script never hold a value like that, so this only matters for a file that was edited or damaged.

  • Two Facebook accounts on the same browser can't end up sharing settings anymore. Each account's settings were saved under a short code made from its id, and two different ids could get the same code, so a change on one account showed up on the other. The code is now 128 bits of a SHA-256 hash, long enough that a repeat isn't a real worry. After the update each account copies the settings it had before, once. When a second account had the same old code, nobody can tell whose those settings were, so that account starts from the browser's shared settings and the old copy stays where it is. In the extension a page can read its own account's old copy and mark it as taken, and nothing more. Checked in the tests with two ids that shared an old code, through the userscript's storage and the extension's, but not yet by upgrading a real 0.0.2 install.

  • On a video's own page, Download and Resume long videos give the id in the address only to the page's main player. A video in a comment, a reply or a post further down used to get that id whenever nothing near it named it, so Download could save the main video instead, and the comment video's spot could land on the main one's. Now Download says it can't tell which video that is, and Resume leaves it alone. A comment's link back to a moment in the main video doesn't count as naming the comment's own video anymore either. Reels work the same way. Tried in the tests against a made-up Watch page, not on Facebook yet.

  • Tap to play no longer lets Facebook start a new video in a player you already started. A tap used to unlock the player itself, and Facebook reuses one player for the next video, so that next one could start on its own. Now a tap counts for the video you tapped, and seeking or looping it still works without another tap. In Reels and stories nothing changes when you open the viewer or skip with the arrows, but a reel that moves on by itself in the same player now waits, the same as when Facebook brings in a new player for it. Tried in the tests only, not on Facebook yet.

  • Hide seen posts lets the old account's seen posts go when the page switches to another Facebook account without a reload. It kept its own copy of the list for the visit, so those posts stayed hidden on the new account's feed and kept being taken out of Facebook's data. Forgetting the list in another tab brings the posts back in this one too, apart from any seen after you forgot it. The tests now also cover the extension's storage arriving a moment after the page starts. Posts seen on an earlier visit go as soon as it's in, with no page change, and ones you read on this visit stay put. Tried in the tests only.

  • Hide seen posts counts a post's second only while you're on Home or your groups feed with the tab in front. Time in a background tab or on another page used to add up, and so did time with the feature switched off, so a post you glanced at for a moment could count as seen once you came back and scrolled past it. A post that already had its second still counts when you switch tabs or go to another page. One that hadn't starts over when you're back, if it's still on screen. Tried in the tests and in headless Chromium. Headless Chromium never puts a tab in the background, so the tab hiding there was faked.

  • Show every reply keeps opening replies when Facebook shows the next photo or post in the same window. Each post gets a limit of clicks, but the limit belonged to the window, so after one post used it up the next one there stayed folded. A reply button Facebook kept around for the next post also counted as already clicked if it said the same thing. Both go by the post's address now, and going back to an earlier post picks up where it left off, so it can't get around its limit that way. Tried in the tests only.

  • Default comment order no longer picks an order after you've switched it off. Facebook takes a moment to open its order menu, and the pick used to go through even if, in the meantime, the switch went off, Pause went on, you chose another order, or the post or photo changed. Now it clicks nothing once any of that happens and leaves the menu as it is. It tries again when the order is still wanted, and a menu that never opens, or opens without your order in it, gets two tries before that post is left alone. Tried in the tests only.

  • Hold a reel for 2x lets go when it should. Switching it off, Pause (in this tab or another), leaving Reels or the next reel loading in the same player used to leave a hold running at 2x, and could even start one if it happened in the moment between pressing and the speed-up. Now any of those ends the hold or calls it off, with no click kept from Facebook. Letting go puts back the speed the reel had only while it's still at 2x, so a speed you picked during the hold stays. Tried in the tests only.

  • Resume long videos keeps your spot in a video that was already playing when it started paying attention. Switching it on or turning Pause off partway through, picking a shorter length, or a feed video that only got its post link after it started all used to leave that video with no spot saved, however long you watched. Now the next moment of playback picks it up. A video that's still in its first few seconds jumps to its old spot as usual. One that's further in carries on from where it is and is saved from there, so an older spot never yanks you away from what you're watching. Pressing play on a video you'd already paused partway works the same way, and a link that opens a video at a set time no longer gets moved to an old spot either. Reels, stories, short videos and muted ones are left alone as before. Tried in the tests only.

  • Expand long posts opens a post you scrolled to while it was switched off or paused, once it's back on. A See more that came on screen in that time was marked as handled without being clicked, so it stayed cut off for the rest of the visit. Now it's looked at again when the script is back on and opens then, still just once. A See more that Facebook takes off the page and puts back later gets watched again too, unless it was already opened. Tried in the tests only.

  • Marketplace only takes you to Marketplace as soon as you switch it on while Home is open. The feed went blank right away but nothing moved you off Home until you went somewhere else. Turning Pause off does the same, and so does switching it on in another tab while this one sits on Home. Pages other than Home stay where they are. If Marketplace has been sending the tab back to Home, the loop protection still applies and the feed shows instead of a blank page. Tried in the tests only.

  • Following feed on Home leaves a Home link alone when it's meant to open in a new tab or another window, or to download. It already left Ctrl, Shift and middle clicks alone, but a link set to open in a new tab still got cancelled and the feed opened in the tab you were in. Marketplace only and Following feed now decide this the same way, and a target written as "_Self" counts as this tab for both. Tried in the tests only.

  • Hide seen posts keeps its list to 30 days and 5,000 posts every time the list loads or another tab's copy comes in. In the extension the saved list loads a moment after the page starts, so the cleanup that ran at startup found nothing, and merging another tab's list could push it past 5,000 until the daily cleanup came round. A trimmed list is saved back once. Tabs that already agree don't write to each other, and posts you forgot still stay forgotten. Tried in the tests only.

  • Accent color keeps button text, links and focus rings readable with any color. Orange, green and teal buttons now get black text, since white on them was hard to read, and so does any light color you enter yourself. A link, field label or outlined button whose shade would be too faint on its background moves darker in light mode or lighter in dark mode, keeping your hue, so a yellow gets deep olive links on white instead of yellow ones you can barely see. Facebook's own blue looks the same in light mode, and in dark mode its links, focus ring and highlighted field labels come out a little lighter. Checked by contrast math against the backgrounds Facebook's stylesheet gives light mode, both dark mode palettes it serves and AMOLED, not yet on a signed-in page.

  • For anyone working on the code, the fixture privacy test now reads the compressed page markup capture too. It only looked at plain .jsonl files, so the 100 posts the ad check runs against skipped it. Plain and compressed fixtures now get the same checks for leftover ids, emails, CDN links and name-like Facebook paths, and page markup also gets the scrubber's check for real words in text and labels. The current capture passes.

  • Find a setting knows the backup buttons by their own words now. Searching "backup" as one word, "export", "import", "Restore from a file" or "Reset to defaults" used to find nothing, and the In General link on that row always landed on Back up settings. Now it lands on the button you searched for, so "reset" goes to Reset to defaults (or to Back to defaults under Quick setups) and "restore" to Restore from a file. Every other button in General works the same way, and "bug" finds Report a problem. Tried in the tests only.

  • For anyone working on the code, the fixture scrubber no longer keeps short names or tokens it doesn't know by name. A two or three letter name in page text or a label used to stay as written, because every short bit of text did. Now a short bit stays only when it has one letter at most (a time like "2h", or one letter of the Sponsored label), or when it's one of Facebook's own words. Every other name gets a stand-in. A key named as a token, cursor, nonce, hash or signature has its whole value replaced now, unless the value is one of Facebook's enums. Writing a page markup fixture stops if any text or label in it wasn't replaced, and a test checks that against a name left unscrubbed on purpose. The committed fixtures were gone through by hand. The page markup one was rebuilt from its capture, and six hashes in a translation fixture were replaced. What they had kept was common words, acronyms and words cut short to two or three letters, none of it anyone's name, and the hashes are Facebook's feature switches, nothing tied to an account. Nothing you install changes.

  • Privacy holds now catch a request even when Facebook packs the whole form into a ready-made request object, including one made in another frame of the page. The script reads a copy of the form to find out what the request is, and only when it's a small form (64 KB at most, read within a quarter second). Anything it can't read in time goes out untouched. Responses the script rewrites keep the address they came from, whether they were redirected and their type, on copies too, so Facebook's code sees the same answer it would without the script. Tried in headless Chromium and Firefox next to the browser's own fetch.

  • Each Facebook account now keeps its own seen posts, video spots, video speed and volume, the way it already kept its own settings. Signed out gets its own set too. Hide seen posts on one account no longer hides what someone else on the same browser scrolled past, and a change in another tab only reaches tabs signed in to the same account. If the page ends up signed in to someone else without a reload, it lets go of what it was holding for the old account and saves nothing more until you reload, and a notice offers the reload. The lists from before this were shared by everyone on the browser, so they aren't given to anyone on their own. General shows them with a button to add them to the account you're on (the shared copy stays) and one to delete them, which you can undo.

  • Copy report in Diagnostics is safe to paste into a public issue now. It used to copy your filter words, custom CSS, the phrases that matched, file names and full error details. Now it carries your versions, the browser's name and main version, which switches are on, the choices you changed, counts, rule names and error names. Text settings show up only by name and rows that hold text say "left out". Log lines keep only the script's own message, and a link or long number in one is swapped for a placeholder. Posts get fresh labels in every report, so two reports can't be matched up post by post. Diagnostics itself still shows everything.

  • When one of the script's data rules fails on part of an answer, that part now reaches the page exactly as Facebook sent it. Before, edits the other rules had already made could get through half finished, and Diagnostics could count posts as hidden that were still on screen. Diagnostics counts and the decision list now change only for data the page gets, and so does what Default video quality and Show comments as written remember between answers. The download index, post dates and comment order titles read the same data the page does. JSON that Facebook reads with its own reviver callback is left untouched, so that callback sees each value once, as the browser built it.

  • Download, Pop out and the note on hidden posts now work from the keyboard. Tab to a photo, video or reel and its buttons come up without the mouse. The next Tab steps onto them and then carries on down the page, and Shift+Tab goes back through them in reverse. They stay put while you scroll or Facebook redraws the post. The note is a real button now, so Tab reaches it and screen readers read out why the post was hidden. Enter or Space shows the post and moves focus to its first link.

  • A request object Facebook reuses no longer shows the last request's answer. After a rewritten feed response, a held-back privacy request or a cancelled one, the next request on the same object reads only its own response, state and events. A held-back request that Facebook cancels now ends the way a real cancelled request does, and its local answer comes back as JSON, binary or text, whichever Facebook asked for.

  • Undo after Reset no longer vanishes with its notice. It waits in General until you dismiss it, change a setting or leave the page, and works from the keyboard there. A notice you're pointing at or have focused stays until you move off it. Undo belongs to the account that reset, a failed Undo keeps its choices for Retry, and resetting settings that were already at their defaults offers nothing to undo.

  • The extension's page script now gets only what it needs from the extension. Facebook's code shares the page with that script, so the extension checks every request against the keys and value shapes the script really uses. Settings are tied to the account signed in on that tab, which the extension reads for itself. Other accounts' settings and the extension's own bookkeeping no longer reach the page, and a game frame sees just the Instant Games ads switch. Requests have size and rate limits (downloads stop at eight in ten seconds), and the background only answers Facebook's top frame. It needs no new permissions.

  • A photo or video whose name would come out as a Windows device name like CON now saves as "Facebook CON" instead of failing.

  • The extension now applies saved privacy choices before recognized startup requests leave the page. Story views, watch reports, usage logs, read receipts and typing signals wait briefly for storage. If storage fails, the account changes or a request can't be held safely, the operation gets a local success instead of being sent. Unknown traffic isn't delayed, and General keeps Retry available.

  • Extension settings now wait for browser storage before reporting success. Changes from different tabs merge instead of replacing each other, while two changes to the same setting use the order the extension accepts them. A failed save keeps the last confirmed choice running, leaves the draft visible and puts a Retry row in General. Reset, restore and Quick setups wait for the same confirmation.

  • The extension now holds bridge requests until its storage side is ready, so saved choices load in either startup order. Newer changes and deletions win over an older startup snapshot. Filtering and storage-backed housekeeping wait for confirmation. If storage can't be reached, General keeps a Retry notice instead of treating default choices as loaded.

  • General now has Quiet and Privacy Quick setups, plus Back to defaults. Each one says exactly how many settings changed. Find a setting covers General and nested choices too, and those controls work in the results even when their parent switch is off.

  • Report a problem now sits above Ko-fi in General. It opens GitHub with the script, browser, userscript manager and checked switches filled in, while leaving out account ids and private values. The report stays under 6,000 characters and leaves space to describe what happened and what was expected.

  • Pressing and holding the Facebook logo now opens HushFacebook Web settings. A normal click still goes Home.

  • Settings that need Facebook reloaded now show a Reload row at the top of the panel. It reloads Facebook and brings the same settings page back for up to 90 seconds. Block Instant Games ads uses it when an open game needs the new choice.

  • General now ends with a Buy me a coffee row that opens the project's Ko-fi page in a new tab.

  • Redesigned all 18 settings pages with a charcoal sidebar, section icons, larger headings and rectangular lavender switches. Related settings share a panel, nested choices line up with their parent controls, and search results use the same grouping. Diagnostics separates environment details, hidden-post reasons and recent logs. The corner button, media actions and hidden-post notes follow the same style, with fresh screenshots in the README. Existing settings, defaults and backup files still work.

  • The README is shorter and sticks to installing and using the script. The switches are grouped by section instead of one long list, and the testing notes that used to sit between the sections are gone (the changelog keeps those).

  • There's a Chrome extension now, built from the same code as the userscript, so you don't need a userscript manager or Chrome's Allow User Scripts switch. It works in Chrome, Edge, Brave and other Chromium browsers from version 120, and older ones won't load it. Load the unzipped hushfacebook-web-extension.zip with Load unpacked on the extensions page (the README has the steps). Settings live in the extension's own storage, photos and videos save through the browser's downloads under their readable names, and the toolbar button opens the settings, or opens Facebook with them up from any other tab. Settings that decide where Facebook opens wait the few milliseconds the extension's storage takes to arrive, so Marketplace only, Open on a chosen tab and Following feed on Home still act on the first page. Tried live in Chromium. Signed out, the extension started in the page, kept settings both ways, opened the panel from its button and sent Home to Marketplace when that was saved on. Signed in, it kept the account's settings under that account and saved a photo from a post on Home under the post's readable name.

  • The extension tells you when a new release is out, since a loaded-unpacked extension can't update itself. Once a day it asks GitHub's release API. A newer release puts NEW on the toolbar button and a one-time note on Facebook, and General in the settings says how to update and links to the release. Offline or rate limited, it tries again the next day. Tried live: against GitHub it found 0.0.2 and stayed quiet, and with a newer release seeded the badge lit, the note came up once, and How to update opened General with the notice.

  • Settings that change from outside the panel now show at once while it's open, like a feature that stopped working.

  • Settings can be searched. Find a setting, above the section list, shows every switch whose name, description or options hold the words you type, and the switches work right there. Each result says which section it's in, and that link opens the section with the switch in view. Choosing a section clears the search. Tried live on Facebook at desktop size and 400 pixels wide. The README screenshots now show the search box.

  • Typing in the settings panel no longer sets off Facebook's keyboard shortcuts. Facebook's single-letter shortcuts (like with l, comment with c, share with s, start a post with p) were picking up keys typed in the panel's text boxes, so a word typed into a filter could act on a post behind the panel. Tried live: "speed" typed into the panel used to come out "seed" because Facebook took the p, and now it types as written. Escape and Tab work as before.

  • New Expand long posts switch, under News feed, off by default. Long posts and comments open in full as you scroll to them, so you don't have to click "See more" on each one. It finds the button by where it sits after the cut-off text, so it works in any language. Tried live: three long posts on Home opened in place as they came near, and the page stayed put.

  • New Hide Follow and Join buttons switch, under News feed, off by default. Posts from people, pages and groups you don't follow lose the "· Follow" or "· Join" after the name, so the header just says who wrote it. It goes by the button's label holding a name the post shows, so it works in any language. Tried live: three posts on Home had a Follow button and all three read as just the name.

  • New Remember your volume switch, under Playback, off by default (asked for in issue #1). Set a level with a video's volume slider, or turn the sound on or off, and every video and reel after it starts the same way, even after a reload. Facebook's player keeps writing its own mute and 100% to each reel, so the script steers those writes to your values and turns sound on with the player's own button, which keeps the button honest. Pausing, playing or skipping a reel doesn't count as a change. Browsers only allow sound once you've clicked or typed on the page, so until then videos stay muted at your level, and your first click gives the playing one sound. Tried live: a fresh reel played at 35% with sound, Mute and Unmute carried to the next reels, and 20% set on a feed video's slider carried to Reels.

  • Keep your place in the feed no longer leaves the feed stuck on gray loading placeholders when another extension or script also hooks the way Facebook loads its code. The two hooks ended up calling each other until the browser gave up ("Maximum call stack size exceeded"). Tried live with a stand-in for such an extension: the old build left Home on placeholders after a couple of seconds, and the fixed one loads and scrolls with both hooks working.

  • Show comments as written covers posts too. An automatically translated post keeps Facebook's layout, and the words it draws are the ones the post was written in, taken from the post itself.

  • Show full post dates leaves posts a week old or more alone. Facebook already writes their date out ("September 29 at 5:13 PM") instead of "6 days ago", so the script's date said the same thing twice. The cutoff is the one Facebook's own code uses.

  • Hide tab badges now hides the Messenger button's unread count. Facebook tucks a line for screen readers ("1 Unread Chats") inside the red pill, so the pill's text wasn't the count alone and the script passed it by. Live, the count was gone and the title had no "(1)", and the button still tells a screen reader how many chats are unread.

  • Restoring a full backup now restores defaults too. Backups from another app, unsupported formats and files over 1 MB are rejected before changes are applied. Older plain settings files still work as partial imports.

  • Settings actions show when they're working, ignore repeated clicks and report failures. Restore and report copying return to their usual state when they finish.

  • v0.0.4 adds an experimental Block Instant Games ads switch. It uses the game's no-ad response, stays off by default and follows changes from Facebook through manager storage. Games that require an ad for a reward won't give that reward. Live game acceptance is still open.

  • Hide reel rows in the feed now removes the items from a captured reel row in Facebook's data before it's drawn. Friends' reel posts and other kinds of showcase stay intact. The page-side fallback still needs a live row to check.

  • Settings screenshots and the README banner now show the current panel.

  • All 18 settings sections get a new dark layout with a lavender accent, clearer headings and flat rows. Long labels and options wrap in narrow windows, and the power and close buttons stay within reach. Settings open as a native modal, so the page behind them stays inactive. Closing returns focus to the control that opened the panel, and Reset's Undo stays reachable inside it.

  • Download and Pop out now match the settings panel. They also follow the photo or video when the window resizes, without waiting for the pointer to move.

  • Keep your place in the feed no longer leaves Home stuck on Facebook's loading screen in Tampermonkey. It showed up with Following feed on, since Home then opens on Feeds. The script asked Facebook for its feed refresh limits before the page had a value those limits read as they load, so they failed, and the feed went down with them. Now the script waits for Facebook's own code to load the limits and holds them right after, without ever asking for them. Tried live in Tampermonkey with twenty switches on: Home and Feeds load and scroll, and the limits read back as held. Turned on during a visit, the switch takes effect from the next page load.

  • Show full post dates puts the date in the same row as the time now. On Feeds and the groups feed it used to drop under the time, and Facebook's dot and audience icon sat on top of it. Live on Feeds, Home and the groups feed, each date reads on one line, like "5 hours ago · Oct 11, 2026, 6:26 PM", with the icon after it.

  • New Open Messenger as a full page switch, under Opening Facebook, off by default. The Messenger button in the top bar goes straight to the Messages page instead of opening the list of chats over Facebook. Hold Ctrl, Cmd or Shift, or use the middle button, to open it in a new tab. Tried live: with the switch on a click went to Messages, and with it off the usual list opened. It works without the script running in the page too.

  • New Trim the share menu switch, under Links, off by default. It takes the share targets you pick out of Facebook's share menu, and Copy link always stays. WhatsApp, Your story and X go by default, and Messenger, Group, a friend's profile and the row of Messenger contacts each have their own choice. WhatsApp and X are found in any language, the rest by their English names for now. Tried live: the chosen targets were gone, the rest stayed, and with every choice on only Copy link was left. It works without the script running in the page too.

  • Tag suggestions only after @ now says it covers new posts as well as comments. The box for a new post loads the same lists, and live a friend's name typed there without @ brought up no one with the switch on, against four suggestions without it.

  • New Clean up Reels switch, under Reels, off by default. It takes the Follow button off reels and keeps a reel's name and caption off the video until you point at the reel, and each part has its own choice. Tried live: the caption block came back as soon as the pointer was over the reel, the Follow button was gone, and the next reel came up the same way. It works without the script running in the page too.

  • Tap to play no longer freezes Reels. With it on, the first reel after opening Reels from Facebook's menu sat on its first frame, and so did every reel the Next arrow moved to. Facebook draws no play button or caption for a reel it couldn't start, so the page looked broken. In Reels and stories, the reel or story you open or skip to (with the arrows, the arrow keys or the wheel) now plays, and one that would start with nobody touching anything, like a reel picking up again when you come back to the tab, still waits. Videos in the feed still wait for a click on the video. Tried live in Tampermonkey and in the extension with Tap to play on: Reels opened from the menu played, so did each of three skips, a reload, and the skips after it.

  • Force dark mode keeps the selected chip readable on Reels' library page. Facebook draws its own dark area there with the selected chip white and its word in a light theme island, and the script was turning that island dark too, so "Saved" came out white on white. Light islands inside an area Facebook darkened itself now stay as Facebook drew them. Tried live: "Saved" reads dark on its white chip, and the menus and popups the script darkened before still go dark.

  • For anyone building it: the release preflight can run the tests under a memory and time cap. CONTRIBUTING.md has the one setting it needs.

  • Issue reports this release changes something for: #1 asked for the volume switch, #2 was Facebook stuck on gray placeholders in Edge next to another script, and #3 was Home stuck on Facebook's loading screen with Keep your place on in Tampermonkey.