Skip to content

v0.0.15

Latest

Choose a tag to compare

@SysAdminDoc SysAdminDoc released this 18 Oct 16:36
· 2 commits to main since this release

HushThreads v0.0.15 has 19 patches for Threads 451.0.0.51.80 (com.instagram.barcelona), and it patches that version only. It's built on Morphe patcher 1.15.1, so you need Morphe Manager 1.34.0 or newer.

Copy text is back on opened posts, and Open links in browser now catches ad links and lead form links too. Settings got Quick setups for changing several switches in one tap, a Report a problem row that fills in your versions for you, and they stay open now when Threads redraws itself. Saving photos and videos got a lot of fixes, the biggest one for phones with smaller screens, where Save photo saved nothing.

Your reports in this release

  • #9 found that Copy text didn't do anything on an opened post. Pressing and holding the post's text brings up Copy text again, and the new Copy text on long press switch under Posts turns it on or off.
  • HushFacebook#146 asked for a way to keep HushThreads settings out of the menu you get by holding Threads' icon. The new Settings shortcut on the app icon switch on the Pause, backup and diagnostics page does that, and the Threads logo still opens settings with a long press.

Threads

  • Don't want HushThreads settings in the menu you get by holding Threads' icon? Turn off the new Settings shortcut on the app icon switch on the Pause, backup and diagnostics page and it leaves that menu right away, while Threads' own shortcuts stay. A long press on the Threads logo and the HushThreads row in Threads' settings still open the settings, and Pause leaves the switch as you set it.
  • Pressing and holding the text of an opened post brings up Copy text again, the same as in your feed, so you get the whole post with its links. It had stopped doing anything on 451. A new Copy text on long press switch under Posts in HushThreads settings turns this on or off. It starts on and comes with every build.
  • Open links in browser now also covers the places on 451 that used to skip it. An ad's link button and a swipe up on an ad in the media viewer send the ad's web link to your browser the same way post links go, and so do the privacy policy and disclaimer links on a lead form. Meta's own pages still open in Threads.
  • Search's Follow suggestions row is gone too. It has its own switch, Hide follow suggestions in Search, right under Hide suggested users on the Feed page, and it starts on. Nothing takes the row's place, and search results and topics stay as they are. Turn the switch off, or pause HushThreads, and Search looks the way Threads draws it.
  • Save photo and Save all work on phones with smaller screens again. On a 720 px wide screen Threads only keeps a photo at up to 750 px, and HushThreads took every one of those for a thumbnail and saved nothing. It now saves the largest copy there is, still prefers a full size one when Threads has it, and still never saves an avatar-sized copy.
  • Disable video autoplay now also tells Threads' video prefetcher to hold off. The switch only held a feed video at its cover frame, so Threads could still start downloading a held video ahead of time. The patch now answers the prefetcher's autoplay-off question itself, only where the prefetcher asks it, so Instagram's older autoplay checker is left alone. With the switch off, paused or in safe mode, Threads' own answer goes back as before. Checked on a Galaxy S22 with Threads 451. The prefetcher got the hold answer with the switch on and Threads' own with it off, and a tapped video still played full screen.
  • The HushThreads settings home page has two new rows. Quick setups changes a set of switches in one tap: Quiet hides ads and suggested accounts, Privacy stops most usage reports, takes tracking off shared links and hides your screenshots from Threads, and Back to defaults puts every feature switch back. A toast says how many changed. Report a problem opens a new GitHub bug report with your HushThreads and Threads versions, your phone and the switches you have on already filled in.
  • More settings is now a heading on the HushThreads settings home page, with Appearance, Links, Updates, Set when you patched, Pause, backup and diagnostics and About listed under it. Every page is one tap from home and Back always goes home. Report a problem and Support HushThreads are still the last two rows, and the patch descriptions and bug report form point to the shorter paths.
  • Don't use Quick setups? Press and hold its row on the settings home page and it's gone, and its help line says so. To bring it back, tap the Quick setups row on the Pause, backup and diagnostics page. Screen readers get the same press and hold on that row, and no other row offers one.
  • HushThreads settings stay open when Threads redraws itself, after you change the font size or switch dark theme from the quick settings, or when Android closes Threads in the background and you come back. They used to close. They now come back on the page you were on. That holds with the settings open over two Threads screens and one of them closed, and on Android 9 in split screen when the Threads side sits for more than 30 seconds before you tap back into it.
  • A settings file you pick for Import or Export isn't lost anymore when Threads redraws itself while the file picker is open, after a font size or dark theme change, or when Android closes Threads in the background to make room. The settings came back as if you hadn't picked anything. The file picker now opens through a small invisible screen of HushThreads' own, which keeps your pick until the settings are back. Access to the file ends once it's read or written. If Android closes Threads before that, it ends the next time Threads starts. Two quick taps on Import or Export open one picker, not two.
  • After an export or import, the Export settings or Import settings row says how it went, in full, until you run another. That message used to show only in a pop-up, and newer Android versions cut those off after two lines, so a refusal like a damaged file lost its "Nothing was changed."
  • Save's messages are short enough to read whole on Android 12 and later, which cut a message after two lines. On an S22 the proxy message stopped mid-word, and the slow-download one was just as long. A carousel's result now shows each line as its own message, so a line under the counts, like a proxy asking for a password, isn't lost. The German, Spanish, Indonesian, Portuguese and Turkish wording was shortened to fit too.
  • A download that only trickles in now stops after ten minutes per file and says it was too slow, instead of holding one of the three save slots for as long as the server likes. A host lookup that never answers gives up after 20 seconds, and Cancel now ends a save that's still waiting on one.
  • Cancel and the download time limit now end a save even when the phone's proxy service stops answering. Waiting proxy calls share the fixed limit on background network checks, so repeated attempts can't keep creating threads.
  • A save's download now has a connection of its own that never asks Threads' cookie store or sign-in prompts for anything, so it can't send a cookie or a password, and it drops every cookie a server or a redirect sets. It still goes through the proxy your Wi-Fi or phone settings name and checks the server's certificate the same way. If that proxy asks for a password, the save stops and tells you, since it never sends one.
  • On Android 9, a save without Threads' Storage permission now stops before it downloads anything and tells you where to turn the permission on. A carousel stops fetching its remaining pages if the permission is taken away partway through.
  • Joining the picture and sound of a VP9 save (or AV1 before Android 14) now stops before it would take more than 24 MB of memory, and the save falls back to the single file. A file built from millions of tiny parts can't run Threads out of memory that way anymore. Cancel is also noticed while the join is still reading the tracks.
  • When a save finds no picture or video it can keep, the diagnostics report now lists the kind and size of every address it looked at, so a bug report shows why. It never includes the addresses themselves.
  • When the regular Instagram app from Meta sits beside your patched Threads, the Links page in HushThreads settings says Instagram won't open Threads posts or profiles here. That's Instagram's own check, and it's why Instagram says it couldn't load the website.
  • When the settings list can't be put on the HushThreads screen at all, the screen shows Retry and Back instead of staying blank. Retry opens the page you were headed to, with your switches as you left them.
  • When Threads rebuilds its screen with the settings open (after a text size change, say, or when Android closed Threads in the background), a settings page that fails to come back now gives way to a fresh page. Before, that failure would have crashed Threads, since it happens where the settings' own Retry and Back can't catch it.
  • TalkBack now reads the Threads logo at the top of the feed as "Threads". Before, it stopped on the refresh spinner inside the logo and said "Progress bar". The README also says the logo ignores taps and holds while the feed loads or refreshes.
  • TalkBack no longer stops on the HushThreads settings list as a whole to offer a long press that does nothing there. Quick setups, the one row with a long press, still offers it.
  • HushThreads now keeps a note of how each switch starts in the build you patched. When a later build changes how a switch starts, one you never changed keeps the setting it had. Earlier builds left no such note, so this starts working with the update after this one.
  • Settings file access stays tracked when a disk write or Android's permission service fails. Cleanup retries after a restart, and retrying the same file can't keep lasting access without a saved cleanup record.
  • Morphe Manager lists every change of the release your Threads was patched with, not just a short summary. For that one release Manager shows the patch bundle's description instead of the changelog, and the description was a paragraph while every older release listed its changes. It now goes on with the release's Threads bullets after the summary. You'll see it from the next release on.

Tooling

  • A GitHub description that names no release, patch count or Threads build now passes the release facts check and stays as written when a release publishes. Both used to refuse it, though a description like that has nothing a release can leave out of date. One that names any of those is still held to this release's and rewritten as before.
  • The release cut now moves the release check test's User-Agent from whatever version it names. The v0.0.14 prep left that test on 0.0.13, so the next cut found nothing to move and stopped.
  • The file picker behind Export settings and Import settings now has its own entry in the source ledger. Its two classes never had one, so the provenance test failed on every full run since they were added.
  • When the final APK check catches the direct browser hook overwriting something Threads still needs, it now says which case it found. The register can be past the method's own locals, or Threads reads it right where the hook goes in, or Threads reads it once the link has opened. Each test build has to fail for its own reason, so one that trips the wrong part of the check doesn't pass anymore.
  • Save's contract tests now cover the two other ways into Copy link's row call that would skip the Save row, a switch case and an exception handler aimed straight at it. The patch and the final APK check already refused both, but only a plain jump had a test, so losing either refusal would have gone unnoticed.
  • The final APK check now holds Disable video autoplay's prefetch hold to its contract. Where Threads' prefetcher asks Instagram's autoplay-off question, the answer has to go through the extension right after it's read and come back in the same register, and every jump to the test that reads it has to pass through that call too. Nothing else may make the call. The question itself, its Olympus twin, Instagram's older autoplay checker and the prefetch dispatcher have to stay as Threads wrote them, and a build without the patch leaves every one of them alone. Each rule has a test build that only it refuses.
  • The final APK check's browser guard has a test build only its completion half can catch: a link hook on a register that's free where the hook goes in but read again once the link has opened. No test build failed that half alone before, so losing it would have gone unnoticed.
  • Save's final APK contract got stricter. A branch inside the post menu's Copy link case that jumps straight to the row call would skip the Save row, so the patch and the check both refuse one now. Share's jump onto Copy link's row still works. Every static method on the media bridge class has to be a bridge the patch writes, and written, so one left empty or one the patch doesn't know fails. A build without Save has every bridge and the activity reader checked as shipped, and a changed menu is reported at the first instruction that differs.
  • The final APK check now holds Save photos and videos to its own contract. The post menu's Copy link path has to carry exactly one Save row, drawn with the calls Copy link's own row is built from and handed the menu and its composer, while every other menu item still reaches Copy link as before. The row's readers, its click and all fifteen media bridges have to point where the patch found them. A build without Save has to leave the menu and every stub as they shipped, and a bundle from before Save had a status reads as leaving it out.
  • The build classpath inventory refuses to write when a project's buildscript graph is missing, instead of quietly leaving it out. That happens when a build doesn't evaluate every project, as under configure-on-demand, and the refusal names each one. Its Guava probe also stopped failing every Gradle command when it can't find one of the two plugins. It records no jar for that plugin now, and only the inventory refuses. A refused run also deletes the previous inventory, so nothing reads an old one as this run's.
  • The same classpath now resolves commons-lang3 3.18.0 instead of the 3.16.0 the Morphe plugin asks for, which is inside GHSA-j288-q9x7-2f5v (CVE-2025-48924, 3.0 to 3.17.0). That was the last advisory OSV reported for the build's 114 plugin components, and the build advisory gate now finds none. It's a floor too, so it goes quiet once the plugin asks for 3.18.0 or later.
  • The classpath the build plugins run from now resolves Guava 33.7.2-jre instead of 33.5.0-jre, which is inside GHSA-xxph-c9ww-hj94 (CVE-2026-102554, 4.0 to 33.7.1). It's a floor, so a plugin that later asks for a newer Guava still gets it. The build classpath inventory also records which jar the Morphe and Android Gradle plugins really load the advisory's three classes from, and it refuses to write when that isn't the Guava the classpath resolved. The bundle build and the focused registry tests pass with it.
  • The source census now waits out a rate limit for as long as the answer says. GitLab throttles unauthenticated reads and answers 429 with the time its limit resets, and the census used to wait a flat 61 seconds, so a long reset used up its three tries and failed the run. It waits until the reset that Retry-After (seconds or a date), RateLimit-Reset or X-RateLimit-Reset names, plus a second, capped at 15 minutes by -MaxRateLimitWaitSeconds. An answer that names no reset still waits -RateLimitWaitSeconds, and a fourth limit in a row still fails the source. The run log also says whether GitLab was read with a token, since a token raises the limit.
  • The source census reads the Morphe Patch Tracker again. Its list now carries a couple of bundles twice under keys that differ only in case (immortalzeus:dev and ImmortalZeus:dev), and the census refused the whole file as unreadable JSON. It reads those keys as they are now and counts each repository once, in PowerShell 7 and Windows PowerShell 5.1 alike.
  • The final APK check now holds Hide suggested users on profiles to its own contract. It finds both places from the clean DEX alone: the profile screen's suggested accounts carousel, which has to hand its list to the extension right before Threads' own null check and cast the answer back, and the header row, which has to ask first thing on its path and leave by its check's other side through a local nothing reads. A build without the patch has to leave both as Threads wrote them, with no call to the extension anywhere.
  • The final APK check now holds Copy text on long press to its own contract whenever Settings is selected. Every override check in the post row has to carry the patch's hook, which hands the override and its own action to the extension in a free local and casts the answer back, and PostText has to ask about its selection switch first thing. A build without Settings has to leave both exactly as Threads wrote them.
  • The build classpath inventory now records a SHA-256 of settings.gradle.kts, patches/build.gradle.kts, gradle/libs.versions.toml and gradle/verification-metadata.xml, and the release receipt refuses an inventory whose hash for any of them differs from the checkout, naming the file. Before, only the settings script was checked, so a changed plugin version or dependency pin could leave an old inventory standing for the new build. Each hash is the lowercase hex SHA-256 of the file's raw bytes.
  • The source census reads Jman's Patch Bundle Registry now, through its registration file and the paged Threads list, because the old bundle files there answer 404. It follows the list's own total across short pages within a request and row budget, reads renamed repositories under their current names, and counts a repository as a Threads bundle only for a current release with verified metadata. History, unverified entries and a bare registration are reported but not promoted, and a list it can't finish reading fails the census. The source ledger points its Jman entry at the registry too, with HushThreads' registration there as the listing's evidence.
  • Updated the build wrapper to Gradle 9.8.1, which fixes three high security advisories. The build advisory check now checks the recorded Gradle distribution separately from component libraries and refuses missing or unreadable version evidence, including when online component checks are skipped.
  • A fixture test checks on 451 that both of the post row's long press override checks and PostText's selection flag go through the extension, and that a jump straight to an override check or a selection flag written over before PostText copies it stops the patch.
  • The release receipt now asks OSV about the plugin classpath that builds and signs the bundle too, from an inventory settings.gradle.kts writes after each bundle build, and reports it apart from what the bundle carries, with its own exception list. A version that was only asked for and resolved to another is listed as a request, and a missing inventory or a dependency that didn't resolve stops the release instead of reading as clean.
  • The bundle build holds the Android Gradle plugin's jose4j at 0.9.6 and jdom2 at 2.0.6.1, the patch releases that fix their high advisories, so the plugin classpath has none left.

Update

  1. You need Morphe Manager 1.34.0 or newer. If HushThreads is already one of your patch sources, Manager shows 0.0.15 once it refreshes. If it isn't, add it: https://morphe.software/add-source?github=SysAdminDoc%2FHushThreads
  2. Patch the arm64-v8a bundle of Threads 451.0.0.51.80 (version code 512108444), the same Threads build as v0.0.14.
  3. Manager's default selection has every patch except Change version code, Remove share targets and Trust user-added certificates. Turn on Expert mode if you want any of those.
  4. Patch with the Morphe Manager signing key you used last time. That's what lets the update install over your patched Threads and keep your data and your login. Coming from the stock Threads, uninstall it first.
  5. On a fresh install, sign in with your Instagram username and password.

The .mpp download is a patch bundle, not a Threads APK. Installation instructions.

Validation

994 runtime tests and 281 patch tests passed locally, along with both Android lints and the release script checks. All 19 patches applied without forcing to Threads 451.0.0.51.80, and the release receipt records the run. The dependency advisory check passed.