Repository navigation
HushThreads v0.0.13 has 19 patches for Threads 450.0.0.51.78 (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.
Two patches are new, Hide the Instagram button and Hide ghost post bubbles. Morphe Manager's default selection now holds every patch but three, and Threads' push process no longer piles up threads when you come back to the app.
Your reports in this release
- #7 asked to hide the Instagram button on profiles. The new
Hide the Instagram buttonpatch takes it off your profile and everyone else's. Its switch is in HushThreads settings under More settings > Appearance, and it starts off. - Hushfeed #122 asked about the thought bubbles on Threads profile pictures. The new
Hide ghost post bubblespatch takes them off. Its switch is on the same Appearance page and starts off too. - #6 found thousands of threads in Threads' push process. 0.0.12 fixed the main cause. This release also closes the push process every time Android stops its service, so the next start is a fresh one, and the process closes itself if it ever runs past 600 threads. Both fixes come with every build. I tried it on my phone by coming back to Threads six times, two minutes apart, and each time the push process started fresh and closed again. It's also the most likely cause of the battery drain someone mentioned on Reddit.
- #5 asked for a pure black (AMOLED) theme.
Pure black dark modeworks on Threads 450 and is in Manager's default selection now, so you don't need Expert mode for it. Turn it on under More settings > Appearance. - #4 asked to keep your place when you come back to Threads.
Block background-return feed refreshis in the default selection now as well (its switch is Keep feed position on return, under Feed), and the release check makes sure all four of its hooks land in Threads 450.
I'll keep each of these open until whoever reported it tells me it's working for them.
Threads
- This release patches Threads 450.0.0.51.78 only, the newest stable version. 449.0.0.54.82 and 448.0.0.54.85 aren't offered any more, so if you're still on one of them, update Threads to 450 before you patch. From here on each release moves to the newest stable Threads and drops the one before.
- New
Hide the Instagram buttonpatch takes the Instagram button off the top of profiles, yours and other people's, and leaves the other buttons where they are. Its switch is on the Appearance page under More settings and starts off. Restart Threads after you change it. - New
Hide ghost post bubblespatch takes the little thought bubbles off profile pictures, the one on a profile and the row of them at the top of your feed. The pictures and the ghost posts themselves stay, and tapping a picture works as before. Its switch is next to Hide the Instagram button on the Appearance page and starts off. Restart Threads after you change it. Hide suggested usersnow keeps the Suggested for you accounts off profiles too, yours and other people's, and leaves the rest of the profile alone. It's the same switch under Feed, still on by default, and Search and Activity keep their suggestions. A profile that's already open keeps what it showed until Threads draws it again.Disable video autoplaynow also holds an Instagram video shown inside a post, trend previews and the videos in ad cards, so they wait for a tap the way feed videos do. It's the same Tap to play videos switch under Feed, and the full-screen viewer still plays and pauses them as before. This passes fixture checks on Threads 450 but hasn't been tried on a device yet.- The 0.0.12 fix for threads piling up in Threads' push process now comes with every build. It used to ride on
Restore screens on re-signed builds, so a build made in Expert mode without that patch went without it. Without it, the push process on a re-signed build can stop and restart itself in a loop that piles up thousands of threads in under a minute. It's now part ofHushThreads settings, which every other patch needs, and has no entry of its own in the patch list. - Threads' push process still gained about seven threads every time you came back to Threads after more than a minute away. Android stops the push service when Threads has been in the background for about a minute but keeps its process, and each restart left the stopped service's threads running. Now the push process closes once its service has stopped, and the next start gets a fresh one, the same as after Android frees memory. It also keeps count of its own threads while it runs and closes itself past 600 (it normally runs about 60), so a runaway like the thousands in one report can't keep growing. Like the fix above, it comes with every build.
- Morphe Manager's default selection now holds every patch but three, so you don't need Expert mode to get
Disable video autoplay,Pure black dark mode,Max image quality,Disable screenshot detectionorBlock background-return feed refresh. Those five start with their switches off, and a fresh patch looks like the Threads you know until you turn things on in HushThreads settings.Change version codestays out because it changes the version Android sees, so going back to stock Threads means uninstalling.Remove share targetsandTrust user-added certificatesstay out because they change Threads when you patch and there's no switch to undo them. Turn on Expert mode to pick those three. - If you'd picked one of those five patches before and never changed its switch, the switch starts off after you update. HushThreads keeps no record of the build you came from, so it can't tell you meant it on. Look these over in HushThreads settings and turn back on the ones you want. Under Feed that's Keep feed position on return, Tap to play videos and Full size photos. Under Privacy it's Hide screenshots from Threads, and under Appearance, in More settings, it's Pure black dark mode. A switch you'd already turned off stays off.
Save photos and videosmoves from Feed to a Downloads group in Expert mode's patch list, the same name its page has in HushThreads settings.- Every patch description says what the patch does, where its switch is in HushThreads settings and how that switch starts, so Manager's list tells you what you're getting before you patch.
- Patch descriptions in Morphe Manager are rewritten in plain English. Each one says what the patch changes, why you might want it, and ends with where its switch is and whether it starts on or off.
- Setting rows in HushThreads settings are reworded in plain English, with a restart reminder on Pure black dark mode. Translations for German, Spanish, Indonesian, Brazilian Portuguese and Turkish are updated to match.
- A few messages are clearer about what happened and what to do next: a failed download, the cancel hint while saving, an unreadable reply from GitHub, and the status line on the overview. Translations are updated to match.
- The settings home page ends with Support HushThreads, which opens the Ko-fi page in your browser. If nothing on your phone can open it, a tip shows the address and Threads keeps running.
Docs
- The README's Trust user-added certificates section now says which connections your certificates reach. Android's standard check honors the patched file, but Threads' own network stack still wants one of Meta's built-in keys on the connections it pins, so a debugging proxy can't read that traffic.
- Added a Threads APK reference and app audit covering feed ads, tracking identifiers, analytics patch boundaries, and customization opportunities. Added patch authoring guidance and corrected the install example to use the primary 450 target.
- Added a stock 450 walkthrough with settings screenshots, measured network and background observations, and explicit battery-measurement limits. Confirmed the profile Instagram button and separate profile suggestions, and expanded the patch guide's registration and coverage checks.
Tooling
- Settings and Turkish translation tests now match the wording shipped in HushThreads.
- The desktop CLI runs, bundle merges and the resource, register, signing and fingerprint checks now wait for a slot of the machine's build queue when
BUILD_QUEUE_SCRIPTnames one, and run straight away when it doesn't. Before, they started beside whatever builds were running and the queue never saw them. - The device scripts no longer cut a longer device lease down to 20 minutes when they renew it, so a lease taken for a long check can't lapse in the middle of it and hand the device to someone else. They also read a lease's end time in UTC under PowerShell 7. A lease written with a
Zused to read back as local time, which west of UTC kept an expired lease looking valid for hours. - The patch tests that read the Threads fixtures run as their own Gradle task,
:patches:fixtureTest, with each fixture's path and SHA-256 as its inputs. A change to the fixtures reruns only those tests, and a fixture swapped for another of the same size and date still counts as a change. Each build's dex is now read and parsed once per test run rather than on every lookup.:patches:teststill runs every test, and refuses a run where a fixture test skipped with the fixture folder set. - The pre-push gate runs Gradle twice. Everything but the fixture tests goes first, so a failing quick test or lint stops the push in minutes, and the full run with the fixture tests comes second.
scripts/release/release.ps1 -Stage preflightruns the quick checks a release needs in about five minutes: the advisory comparator, the script contracts, that same quick patch run, the translation and release-check tests, both lints and the release facts. - A release can patch each Threads fixture once instead of twice.
verify-all-patches.ps1 -KeepIn <folder>keeps a passing run with a stamp naming the bundle, APK, patch list and CLI by SHA-256, andbuild-release-receipt.ps1 -AppliedDirreads a kept run whose stamp still matches and runs every check on it. Any other fixture is patched as before. - The release check accepts
* **Docs:**bullets in the section being released, the way it accepts* **Tooling:**ones. Morphe Manager shows neither, and neither counts as a Threads change. Before, a release whose section held a Docs bullet was refused. - A release now runs in five stages from
scripts/release/release.ps1, one command each, in the orderprepare,preflight,build,publishandindex. Prepare makes the version and changelog edits for you to review and commit. Preflight now runs the release text tests too, then pushes the prep commit through the gate. Build patches each fixture once for the receipt and tags the commit only after everything passed. Publish checks every hosted asset against the built one before it changes the repository description, and index writes the index commit and pushes it. A stage won't run before the one it follows, and one that stopped part way can be run again. - Release preflight clears the test results its filtered extension run leaves behind. Gradle keeps only the classes a run touched, and the push right after read that partial set for the commit it carried and stopped there, so preflight's own push failed every time before the gate ran a test. Build still reruns every test before anything is counted.
- The register check accepts the version code
Change version codewrites.verify-all-patches.ps1applies every patch, that one included, and the check refused the build because its version code no longer matched stock. With the patch selected, the patched build now has to carry exactly the raised code, and without it the codes still have to match. - The final APK check now holds
Block background-return feed refreshto its own contract, the way it already holdsHide adsand five other patches. It finds Threads' four return checks in the stock build by what they log and how they decide, and the patched build has to ask the extension once at each: first thing in the hot-start decision, right before the reset to main feed returns, right before the warm-start check stores its answer, and where For you's swap joins its two answers. Left out, the patch has to leave those four methods as Threads wrote them. Before, a hook that still landed but no longer saw the answer it's there to change would've passed. - The final APK check now holds
Disable video autoplayto its own contract too. It finds PostVideo and its playback effect in the stock build by the notes Compose leaves in them and works out which of PostVideo's booleans decides whether its video plays (the fourth on 450). The patched build has to ask the extension about that flag right before every call a single post or a carousel makes to PostVideo, with any branch to the call landing on the question, and PostVideo and the effect have to stay as Threads wrote them, so the full-screen viewer plays as it always has. Left out, nothing may ask and those methods stay stock. Before, a build that dropped the hook or put it on the wrong flag passed this check, and only the fixture tests would've caught it. - That
Disable video autoplaycontract now covers the calls an Instagram post, a trend preview and an ad card make to PostVideo as well. It reads which bit of PostVideo's default mask stands for the play flag. Where a call sets that bit (the trend preview and the ad card on 450), PostVideo ignores the flag it's handed, so the hook has to clear the bit and load the default into the flag before it asks, and nothing may read either register after the call. The full-screen viewer has to stay as Threads wrote it. The register check gains test builds that skip the Instagram post, ask without clearing the bit, load the wrong default, change the viewer or read the mask again after the call, and only this contract refuses each one. - The final APK check now holds
Pure black dark modeto its own contract as well. It finds Threads' theme in the stock build by the note Compose leaves in it, along with the helpers the theme builds its colors in (on 450 the #101010 gray is loaded in one of those, not in the theme), and it finds the dark and light color schemes the theme reads by their colors. Every #101010 load there has to hand the gray to the extension right after, on its own register, and each of the dark scheme's #101010 backgrounds (two on 450) has to ask right before the scheme is built. The light scheme keeps its own #101010 untouched, so light mode looks as it always has. Left out, nothing may ask and those methods stay stock. Before, a build that dropped a load hook or the dark scheme's background hooks passed this check, and only the fixture tests would've caught it. - The final APK check now holds the HushThreads row in Threads' own settings to a contract too. It finds Threads' settings list, its settings row and the row it draws Accounts Center with in the stock build by the notes Compose leaves in them, and it reads which case of the list draws More settings from the entry names Threads keeps. The patched build has to ask the extension for the HushThreads row once, right where that case ends, on the composer the case draws with. The extension's row has to call Threads' Accounts Center row with its own title, subtitle, icon and click, and the click has to be a kind Threads' row can take. Every other patch depends on
HushThreads settings, so the check expects the row in any build with a patch selected. Before, a build that dropped the row or drew it in the wrong place passed this check, and only the fixture tests would've caught it. - The final APK check now proves the spare registers
Sanitize sharing linksborrows are really free. Each of its link hooks puts the post's code and its author's name in registers of its own, and the hooks in Copy link and the resumed shares load the post into one as well. The check walks the stock method from the spot each hook goes in, down every branch and into the catch blocks around it, and refuses a build whose hook writes a register Threads still reads there. Before, it only checked that those registers didn't clash with each other, so a hook that wiped out a value Threads still needed passed, and only the fixture tests would've caught it. - The final APK check now makes sure
Restore screens on re-signed buildsonly borrows registers that are really spare. The patch writes three registers at the top of Threads' signature wrapper before the stock code runs, and the check requires all three to be locals of that method, below the registerthissits in. Before, a build whose wrapper had fewer registers than the patch assumes could have the patch overwritethis, and it passed because the check only compared the register numbers to the ones the patch expects. Only the fixture tests would've caught it.
Update
- You need Morphe Manager 1.34.0 or newer. If HushThreads is already one of your patch sources, Manager shows 0.0.13 once it refreshes. If it isn't, add it: https://morphe.software/add-source?github=SysAdminDoc%2FHushThreads
- Patch the arm64-v8a bundle of Threads 450.0.0.51.78 (version code 512008342). 449 and 448 aren't offered any more, so if you're on one of them, update Threads to 450 first. v0.0.12 is the last release that patches them.
- Manager's default selection has every patch except
Change version code,Remove share targetsandTrust user-added certificates. Turn on Expert mode if you want any of those. - Five patches joined the default selection with their switches off: Block background-return feed refresh, Disable video autoplay, Pure black dark mode, Max image quality and Disable screenshot detection. If you'd picked one of them before, look over its switch in HushThreads settings after you update.
- 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. Coming from the stock Threads, uninstall it first.
- Sign in with your Instagram username and password. If you patch Instagram with HushGram using the same signing key, you can tap your Instagram account on Threads' login screen instead.
The .mpp download is a patch bundle, not a Threads APK. Installation instructions.
Validation
832 runtime tests and 245 patch tests passed locally, along with both Android lints and the release script checks. All 19 patches applied without forcing to Threads 450.0.0.51.78, and the release receipt records the run. The dependency advisory check passed.