Releases: SysAdminDoc/hushfeed
Release list
v0.30.0
Hushfeed v0.30.0 targets global TikTok 46.2.3 (com.zhiliaoapp.musically).
This one is mostly repair. Fit the video to the screen now works on the For You feed, and it leaves a video alone when there is nothing to fit. Several patches used to name TikTok's internal classes the way 46.2.3 spells them, which is right on 46.2.3 and wrong on anything newer. Resume videos after scrolling, Comment tools and Custom offline videos limit now read those names off TikTok's own code, so they apply to TikTok 46.7.3 and 46.8.3 as well. A settings journal that couldn't be read no longer blocks every later settings change, and a hand-edited backup with thousands of Feature Gate Lab rules is refused instead of breaking Restore. The Lab also says why it turned down a loaded-values file, and messages that still came out in English on a translated phone go through the translation table now. The changelog has the rest.
Validation: 1019 runtime tests passed locally, plus 110 in the patches module. The bundle carries 71 patches and applied cleanly to the vendor APK. On newer builds, 69 of the 71 apply to TikTok 46.7.3 and 68 to 46.8.3. Every instruction the patches inject was held to the register count of the method it landed in. Needs Morphe Manager 1.29.0 or newer.
The downloadable .mpp is the patch bundle. Patch on the device with Morphe Manager and keep its existing signing key.
v0.29.0
Hushfeed v0.29.0 targets global TikTok 46.2.3 (com.zhiliaoapp.musically).
New here: a switch that empties the menu TikTok puts under its own icon on your home screen. Press and hold the icon and you normally get a short list of shortcuts into the app. TikTok builds that list while it runs rather than declaring it anywhere, and it only rewrites the list when it notices a difference, so the switch takes away what is already published as well as answering the handover that would publish more. Turn it off and TikTok is asked to build the list again. Tapping the icon still opens the app, and a shortcut you pinned to a home screen yourself stays where you put it.
The rest of this went into checking things rather than changing them, and one check turned up something worth saying out loud. The v0.28.0 download was built a couple of commits before the release it went out as, so the build stamp inside it named the wrong commit and nobody could rebuild that file and arrive at the published checksum. The patches inside were the right ones, entry for entry. It was replaced on 2026-09-10 and that release says so.
Validation: 1009 runtime tests passed locally, plus fifty-one in the patches module. The bundle carries 71 patches and applied cleanly to the vendor APK. Every instruction the patches inject was held to the register count of the method it landed in, and the result went through the Android runtime's own verifier on a phone, where it raised nothing the unpatched app does not raise by itself. Needs Morphe Manager 1.29.0 or newer.
The downloadable .mpp is the patch bundle. Patch on the device with Morphe Manager and keep its existing signing key.
v0.28.0
Hushfeed v0.28.0 targets global TikTok 46.2.3 (com.zhiliaoapp.musically).
The headline is that automatic video advance actually works now. With it switched on, a fresh start of TikTok did nothing at all, because TikTok only builds the piece that does the scrolling once somebody opens the video panel and asks for it by hand, and everything here hangs off that piece. It gets built at launch now. A second problem sat behind it: the check for whether the feed was on screen asked TikTok's auto scroll indicator about itself, and TikTok keeps that hidden until scrolling is already running, so the answer was always no. Changing the session limit starts a fresh count instead of carrying the old one along.
Settings had a bad habit of needing a visit. Patches you selected now switch themselves on when the app launches, so search controls you use before ever opening Hushfeed settings work. Leaving an old settings page open no longer undoes a newer choice, and changing your font size or navigation mode keeps you on the page you were using. On a phone in dark mode with TikTok in its light theme, the settings screen used to leave a black band where the clock and battery live. It reads TikTok's theme first now.
Daily holds got most of the attention this time. A hold pauses the video underneath it and resumes only the one it paused, and only while that feed is still on screen. If another app owns the sound when the hold ends, the video waits for the sound to come back rather than resuming into silence. Holds survive a trip to settings and an activity restart, and the panel's lower edge follows TikTok's own tab row so Home and messages stay tappable.
Long presses were doing less than the settings claimed. The two copy choices were wired to double tap, whose settings never offered them, so nobody could reach them. Custom long-press actions now take precedence over TikTok's own 2x edge hold, and they run from the newer coordinate callback as well as the older gesture listener. Edge seeking was converting positions to the wrong scale, and the fixtures that should have caught it were using the same wrong conversion.
Saving got better at picking the right thing. Profile pictures try TikTok's largest image first, where before a 1080-pixel original could come down as a 300-pixel copy. A story long press reaches the story that's actually showing rather than the collection around it. Saving a video without its sound keeps the rotation, and on Android 6 through 9 a save refused for want of storage permission says so instead of failing quietly.
Comment search cleans up after itself. Turning it off takes the box out of a sheet that's already open and puts back the rows and reply controls it hid, and turning it back on works with the comments already loaded.
Also here: follow diagnostics reads the modern profile response and keeps each relationship with the account it belongs to. Hiding search suggestions now covers cached recommendations and returns to the search page. The block and Not interested buttons attach to the creator you're on as soon as you switch them on. Inbox options that are off leave TikTok's own decisions alone, and a Feature Gate Lab override no longer empties an array it was meant to keep.
Validation: 995 runtime tests passed locally, plus forty-five in the patches module. The bundle carries 70 patches and applied cleanly to the vendor APK. It is byte reproducible: two builds of this commit produce the same file. Needs Morphe Manager 1.29.0 or newer.
The downloadable .mpp is the patch bundle. Patch on the device with Morphe Manager and keep its existing signing key.
Note, 2026-09-10: the .mpp and SHA256SUMS.txt on this release were replaced a few hours after it went out. The patches inside are identical, entry for entry. What was wrong is the build stamp in the bundle manifest, which records the commit the file was built from so anyone can rebuild it and get the same checksum. The first upload was built a couple of commits early, so it carried the wrong one and a rebuild from this tag produced a different hash. The file here now is built from the tagged commit. If you downloaded before the replacement and your checksum no longer matches, that is why, and downloading again will settle it.
v0.27.0
-
The settings screens are done being half English. Around eighty strings still went out in English whatever your phone was set to, nearly all of them in the Feature Gate Lab: the gate details page top to bottom, both override switches and the sentences under them, the overflow menu, the filter, the three buttons that reset or force a selection, and nineteen of its messages. The close button on the Lab's search box and the three buttons under the tab picker went with them. All of it is in the four tables now.
-
Two of the Lab's lines count things, and they were built from a verb, a number and a couple of tails. No table row can hold half a sentence, and the plural rule of the language never got a say. Those are whole sentences now with the counts as placeholders, and so are the export count and the four-part import summary.
-
The list under the diagnostics picker reads correctly in every language. It was "Includes downloads, errors events.", lower-cased from labels that every table capitalises, which suits English and nothing else. The list comes after a colon now: "Includes these events: Downloads, Errors".
-
An undo of a settings backup says it's an undo. If the copy it put back held Feature Gate Lab rules for another TikTok build, the line on screen said your settings had been restored, and that's a different thing.
-
Thirteen wrong translations. Brazilian Portuguese said to restart TikTok "para valer", which means for real rather than to take effect. German and Indonesian pointed at two settings by names those settings don't carry, and both called a video's caption a subtitle. Spanish and Portuguese write maximum as "máx.", and ten rows had lost the period that belongs to the word.
-
The README named two patches by names they lost in 0.26.0, so looking either one up in Morphe Manager found nothing. The 0.26.0 notes also said seven patches were renamed when ten were, and gave the wrong number for how long a caption problem goes unreported.
-
Four of the checks meant to catch all of this were letting it through themselves, and each now has its own failing case pinned in front of it, because a check that has only ever seen code it passes proves nothing. A patch-time helper that overrides the result of a call reads what an instruction writes more carefully too: five comparison opcodes were in no write set at all, and a conversion away from a long was read as though its answer took two registers.
v0.26.0
See CHANGELOG.md for the full list. Twelve roadmap items since v0.25.0, plus four adversarial review rounds. 819 runtime tests pass, both lint gates are clean, the bundle carries 70 patches, all 70 apply to the vendor 46.2.3 APK, and two builds of this commit produce the same file byte for byte. Needs Morphe Manager 1.29.0 or newer.
v0.25.0
Twelve fixes since v0.24.0, most of them about surviving the next TikTok build.
Fixed
- Turning clear display on no longer looks to TikTok like you asked for it. Two of the three events the patch stops had not matched anything in this version for some time, and were looked up in a way that gave no sign they were missing, so the patch reported success and sent them anyway.
- A video reached through TikTok's translated video path now gets the same download treatment as any other. The hook was installed on one of the two ways out of that method.
- A Feature Gate Lab change that fails halfway no longer erases the record of which gates had actually fired.
- An override profile written somewhere other than the Lab now applies on a Turkish phone.
- A gate override whose type the catalogue disagrees with is refused rather than handed to TikTok, where it crashed in the app's own code.
Faster
- Comment translation stops doing reflection and taking a lock for batches it never asked for, which it did on TikTok's own thread for every batch in the app.
- A gate override that replaces a whole configuration object is worked out once rather than parsed from scratch on every read.
Sturdier
- Forty injected calls named registers or instruction positions that were right on 46.2.3 and said nothing about any other version. They read them off the instructions they belong to now.
- Fourteen checks that failed with no message say what they were looking for, and a patch that cannot find its anchor fails the build rather than reporting that it applied.
Validation: 716 runtime tests pass, both lint gates are clean, the bundle carries 70 patches and passes checks for all three DEX payloads, all 70 apply to the vendor 46.2.3 APK, and two builds of this commit produce the same file byte for byte.
Needs Morphe Manager 1.29.0 or newer. Patch on the device with Morphe Manager and keep its existing signing key.
v0.24.0
Hushfeed v0.24.0 targets global TikTok 46.2.3 (com.zhiliaoapp.musically).
New here: the daily hold works with a screen reader. It used to stop touches and nothing else, so it went up without being announced, its way out was read as ordinary text rather than as a button, and the feed behind it could still be swiped to. Translators can work in Weblate now, and the Save button on a sticker is in your language rather than always in English.
Fixed here: saving an animated sticker can be given up on, where a stalled encode used to hold one of the three background workers until the app was killed, and two more stickers after that stopped saving altogether with nothing said. A sticker save no longer keeps the screen it started from in memory. The Feature Gate Lab does its saving in the background, so turning overrides on, or saving a gate, no longer freezes the screen behind a settings restore. Comment translation stops rebuilding one of TikTok's own services for every comment in view. Every row in a settings dialog list keeps its check mark, including the ones you scroll to.
Also here: the patches keep applying when TikTok's own methods grow. Thirty five injected calls could only name sixteen registers, which a large enough method pushes its arguments past, and the failure said nothing about registers.
Validation: 706 runtime tests passed locally. The bundle carries 70 patches, passed checks for all three DEX payloads, and applied cleanly to the vendor APK. It is byte reproducible: two builds of this commit produce the same file. Needs Morphe Manager 1.29.0 or newer.
The downloadable .mpp is the patch bundle. Patch on the device with Morphe Manager and keep its existing signing key.
v0.23.0
Hushfeed v0.23.0 for global TikTok 46.2.3 (com.zhiliaoapp.musically).
Needs Morphe Manager 1.29.0 or newer. Manager refuses a bundle built against a patcher newer than its own, and this one is built against patcher 1.12.0.
New here
- A switch that turns the daily budget into a commitment: no way out of the hold and no editing the budget until the day starts over.
- The blocked word lists take two operators as well as plain phrases. "cat" & "dog" hides only what has both, "cat" !& "dog" hides the first without the second.
- Start today over can be taken back by tapping again, and the rows that do something no longer wear the chevron that means a row opens a page.
- The settings screen pads itself by the system bars and the display cutout.
Fixed here
- A settings restore from a backup made for another TikTok version is no longer undone at the next launch, and a backup that only half downloaded says so.
- Comment translation notices every batch finishing rather than half of them, backs off instead of asking again on every scroll, and asks again for the comments that came back untranslated.
- Turning the comment block off now takes effect on comment sheets you already opened.
- A very wide animated sticker is refused rather than saved as a black video.
Validation
- 692 runtime tests pass, both lint gates clean.
- All 70 patches apply to the vendor APK with morphe-desktop 1.15.0 on JDK 21.
- The bundle is byte reproducible: two builds of this commit produce the same file. Its SHA-256 is in SHA256SUMS.txt.
Hushfeed v0.22.0
Hushfeed 0.22.0 for global TikTok 46.2.3 (com.zhiliaoapp.musically). 68 patches.
Install: add the source in Morphe Manager, or download patches-0.22.0.mpp below and load it as a local bundle. Keep the manager existing signing key.
What changed
-
The block button, the sound and Not interested buttons, the undo banner and the daily budget hold come back after TikTok rebuilds its main screen. The extension kept the first activity it was handed for the life of the process, so anything drawn over the feed went to a window that was no longer on screen, and nothing noticed because a rebuilt screen is destroyed rather than finishing.
-
An AAC sound is saved as AAC. It shares its frame sync with MP3, so the reader that tells containers apart called it an MP3, which left a file the gallery would not play. The two layer bits separate them.
-
Saving the original sound on Android 6 to 9 says what is wrong. Those versions write a real file, and without storage permission the save failed only after the sound had already been fetched, with nothing to act on. It is asked before anything is downloaded now, the way every other save here asks it.
-
The original sound and animated stickers are fetched over TLS only. Both read their addresses straight out of a server response and took whatever scheme was in them, while every other saver here already required https. A cleartext mirror is a body anyone on the network can choose, and the sticker one is handed to a decoder written in C.
-
Leaving the Feature Gate Lab while a reset, an undo or an import is still running no longer breaks it. The change finishes on the main thread and put the switch back without checking the screen was still there, so it crashed, and because that happened before the busy flag was released, every later Lab change was refused with a message about one already running until TikTok was restarted.
-
A settings backup can no longer take the app down when it is restored. A Lab rule holds its structured value as a string, and the depth check on the file around it said nothing about what that string contained, so a deeply nested one overflowed the stack. That is an Error rather than an exception, so it walked past every catch on the restore path and killed the process. The value now goes through the same bounded reader the rest of the file does and is refused as invalid instead.
-
Saving the original sound works at all. The fetch only ever accepted an MP4 container, and TikTok hands back an MP3 for many sound addresses, so every one of those was refused as an unsupported format and the long press said the sound could not be saved. What arrived is now read from its own header, and the file is named and typed to match, so an MP3 lands as .mp3 and plays. Ogg, WAV and FLAC are recognised too.
Checksum
sha256 of patches-0.22.0.mpp is in SHA256SUMS.txt beside it.
Hushfeed v0.21.0
Hushfeed 0.21.0 for global TikTok 46.2.3 (com.zhiliaoapp.musically). 68 patches.
Install: add the source in Morphe Manager, or download patches-0.21.0.mpp below and load it as a local bundle. Keep the manager existing signing key.
What changed
-
Long press can save the original sound. That is a different file from the video's own track, which is the finished mix cut to the length of the post: the sound entry is the whole thing, as it appears on its own page. It is named after the sound rather than the post, so the same song saved from two videos is one file, and it goes to Music beside your other sounds. A video with no sound entry says so instead of doing nothing.
-
The hold on the feed stops above the row of tabs. It covered the whole screen, which took the tab bar with it, so messages and search were not reachable after all. It measures the bar rather than guessing at it, and covers everything on a build where it cannot find one.
-
A short animated sticker with a single frame saves as a GIF again. Whether a WebP moves is settled by the flag in the file rather than by counting its frames, which cannot tell a still from a one-frame animation.
-
Playback has a Start today over row, for a budget you set and immediately regret. It clears what has been counted today and ends any hold, and leaves the budgets themselves alone.
-
Saving a sticker tells you where it went, not where it asked to go. The gallery renames a duplicate, so saving the same sticker twice used to report a path with nothing at it.
-
The daily feed budget no longer costs anything when it is switched off, which is how it ships. It counted and wrote to storage on every player report whether or not a budget was set, several times a second. Nothing is counted now until a number goes in, the record is written on a background thread, and the watched time is committed in steps rather than on every report.
-
Moving the hour the day starts at, or crossing a timezone, no longer hands back a budget that has been spent. Raising a budget now also lifts a hold that was running under the old one, and a hold no longer charges you for the videos playing behind it.
-
The way out of a hold is on the hold itself. It was on a banner drawn underneath it, which meant it could be neither seen nor tapped.
-
The budget settings only appear where the hook that feeds them was applied. They used to show on any build with a Playback patch, take a number and count nothing.
-
The settings screens are checked at twice the text size and in a mirrored layout, on every page a reader opens rather than one of them, in both themes.
-
The five feed count filters take a number the way the feed writes it. Type 20K, 1.5M or 2B instead of counting zeroes, and the row reads the range back in the same form. Nothing is rounded: 1.234M is exactly 1234000, and anything the field cannot read is refused with a message rather than saved as a number nobody meant.
-
A download can no longer come out as name_2 when nothing of that name was in the folder it was saved to. The check that produced the suffix was looking in TikTok's private staging directory, which has nothing to do with where the file ends up, so it could only ever be wrong. The gallery settles a name that is already taken, and it does that without a race.
-
Saving a still sticker as a GIF is refused rather than written out as a one-frame animation. The model calls anything whose type merely contains "webp" animated, and the decoder reports a still picture as one frame, so between them a plain picture could reach the animation path. The bytes now decide it, and the converter refuses anything with fewer than two frames.
-
The Hook status row names the surfaces that are missing something instead of saying only that something is. It reads correctly when one surface has reported, its report is redacted and cleared along with the rest of the diagnostic data, and it follows the "Included diagnostics" choice like every other section. A surface that has stopped counting says so. None of this costs the feed anything: a lookup whose answer is already known no longer takes a lock while you scroll.
-
A comment without a thumbs down no longer makes Diagnostics report the whole build as broken.
-
There is a daily budget for the feed, off unless you set one. Give it a number of videos or a number of minutes and it says so once when the day is used up. Give it a hold as well and the feed goes behind a countdown for that long, while messages, profiles and search carry on working and nothing in the feed is thrown away. The day starts at four in the morning by default, and you can move that. Both counts and any running hold survive the app being killed. This is separate from the auto-advance limit, which only ever counted videos Hushfeed itself advanced past.
-
The converter behind "save an animated sticker as a GIF" is covered by tests for the first time. It now has checks that the frame count and every frame delay survive the conversion, that a patch which replaces what is under it really clears that area first, that a frame asking to be cleared afterwards is, and that a still picture is refused rather than written out as a one-frame animation.
-
Diagnostics has a Hook status row. Patches attach to code TikTok renames on every release, and until now a hook that lost its anchor failed quietly while the switch above it still read on. The row shows one line per surface: how many of the things it looks for are in this build, how many are not, and the first one that went missing. The exported diagnostic report carries the same table.
-
Two settings-backup messages are translated again. Their wording gained a full stop at some point and the tables kept the older version, so a failed backup or restore spoke English on a German or Indonesian phone.
-
The shared payload is 18,032 bytes smaller. It carried an About screen that nothing ever opened, which came with a browser view that ran scripts and loaded a page over the network, and two keep rules for libraries this project does not use.
-
Undo on the seen video history now answers even when a newer clear has taken over, instead of leaving the row waiting on a reply that was never coming, and it says so. Watching videos also stops running a whole-table cleanup after every single one.
-
Thirty-three translations for wording the app no longer uses have been removed, and the backup screen's undo row is translated again after its wording changed and left its translation behind.
-
A caption file that is nested unreasonably deeply is now refused with a reason instead of killing the download in progress, and saving a video whose frames are unusually large no longer fails on Android 8 and older. Ordinary captions and downloads are unchanged.
-
Settings search no longer treats an accent typed on its own as a match for everything, and it folds each setting's words once when the page opens rather than on every letter you type. Diagnostics also stop filling with a line for every page of search results when logging is off, which was pushing out the events around a crash.
-
Choosing a download folder now sticks. The folder picker is its own screen, so Android often rebuilds the settings screen behind it, and the rebuilt one had forgotten which setting was waiting. It took the folder you chose and did nothing, without saying so. The waiting setting is now remembered by name across the rebuild, and a folder that arrives with nothing waiting says so instead of vanishing.
-
The player's block, hide and Not interested buttons now say what they are in your own language. They are drawn as glyphs, so their spoken labels are all a reader using TalkBack gets, and those three still read English on a German or Indonesian phone. A build check now covers every spoken label the way it already covered messages.
-
A saved subtitle no longer takes the whole download down with it. The gallery decides the video's filename and can hand back one with no extension, and cutting that name at its dot threw, which the download path reports as the save having failed even though the video was already on disk. The subtitle now keeps the whole name.
-
A diagnostic report no longer carries the videos and comments you were looking at. Reports already hid addresses and credentials, but the id of a video, comment or message went through untouched, and each of those opens a post anybody can read. Both the named ids and the bare lists the feed probe prints are now removed before a report is copied or saved. The counts and timings that make a report worth reading are kept.
-
The thumbs down on a comment blocks only the account you pressed. Where a press started was kept on a single object shared by every comment on screen, so a second finger, or the list reusing a row between the press and the release, could let a release act on a comment it never belonged to. Each control now keeps its own press, and a release with no press behind it does nothing.
-
Saving a slideshow posted by an account with a very long name no longer stalls. Each photo's name is cut down to fit the filesystem, and the counter that tells one photo from the next was the part being cut, so every photo after the first landed on a name that was already taken and the search for a free one never moved on. A shortened name now carries its counter on the end, and the search gives up and keeps the original name rather than counting upwards forever.
Checksum
sha256 of patches-0.21.0.mpp is in SHA256SUMS.txt beside it.