Twitter Hide Ads

Verified safeOpen sourceExclusive
—
No reviews reviews
13
downloads
8.0
android

AI summary

An Xposed module that removes promoted posts from X (Twitter) before they are rendered. It uses an ahead-of-time compiled Brainfuck policy for fast, native-code decision making. Version 3.0.0 rewrites the filtering policy for faster performance, introduces an adaptive vector launcher icon, and implements a fail-open policy to keep content if classification fails.

Generated by AI. May contain inaccuracies.

About this app

An Xposed module that removes promoted posts from X, with its ad policy written in Brainfuck.

Promoted posts are stopped before X draws them, not hidden after.

Note

X renames its obfuscated classes with almost every update. The module finds its targets again by shape, caches them per X version and APK, and rescans after an update. When it cannot be sure it installs nothing rather than guess.

Why Brainfuck?

The real idea is to keep every decision about X out of the Android code. Whether an entry identifier is promoted, how evidence ranks, which entries may go, and when a rebuilt batch is safe — that is the part that has to change when X changes.

Brainfuck enforces that boundary, because it literally cannot call Android, Xposed, DexKit, or JNI. It reads bytes and writes bytes. Java reduces what it read to a handful of flags, roles, and character codes, sends them in one request, and does exactly what the answer says. Android and Xposed integration remain in Java and native code.

It is not slow either. The three programs are hand-written plain Brainfuck, compiled ahead of time to C and then to native code with the NDK. There is no interpreter in the APK, and a post is classified in about 2 microseconds.

Features

- Stopped before render: promoted posts are declined at the Compose render boundary, so there is no blank gap and no flash of an ad. - Every surface: Home, post detail, search, and anything else that renders posts through the same boundaries. The Video Tab is filtered at its data layer. - Survives renames: DexKit finds the render boundaries by structure, cached per X version and APK fingerprint. An X update triggers a rescan. - Policy in Brainfuck, compiled: every decision is hand-written Brainfuck, compiled ahead of time to native code. One native call per post, no allocations. - Fails open: anything the module cannot classify is left alone. A failed policy request keeps the post. - Proven identical: the old Java policy is kept as a test oracle, and hundreds of thousands of comparisons per run check that old and new answers match.

What it removes

A promoted post is recognised by its URT entry identifier, matched whole against a strict grammar, or by a promoted-metadata model among its fields.

Look-alikes never count. A model with no recognisable identifier falls back to a bounded walk for the promoted post actions. Organic posts, replies, and paging or control entries are never touched.

Requirements

- Android 8.0 (API 26) or newer - X (com.twitter.android) - Vector or another libxposed API 101+ framework, or LSPatch - Root required by Vector. The module itself asks for none.

Installation

With Vector:

1. Install the APK. 2. Enable Twitter Hide Ads in Vector. 3. Force-stop X once, then open it.

The module declares a static scope, X only, so there is nothing to pick.

Without root using LSPatch:

1. Install the LSPatch manager (JingMatrix fork; the archived LSPosed/LSPatch predates the modern API). 2. Patch X with Twitter Hide Ads as an embedded module, base APK together with all splits. 3. Uninstall the store copy of X, then install the patched APKs as a set.

Known limits

- Search: no promoted search entry was served during the most recent test session. Search uses the same render boundaries and identifier grammar, and tests cover it, but it has not been observed on a device. - LSPatch needs a build that loads libxposed API 102 modules. Not yet tried under it. - 32-bit and x86 devices ship the native library but have not been run. - A batch with more than 255 items or a model with more than 255 text fields is left alone.

License

GNU General Public License v3.0

What's new

v3.0.0Sep 26, 2026
  • Changed
  • The filtering and decision policy has been rewritten in hand-written Brainfuck programs, compiled ahead of time to native code. There is no interpreter in the APK. - Hooks, discovery, caching, and Kotlin list rebuilding remain in Java. - Faster on a Pixel 8 Pro: an organic post is classified in 2.4 µs (was 14.9 µs), a promoted post in 1.1 µs (was 6.1 µs), and a 20-item Video Tab batch in 6.8 µs (was 275 µs). - Any policy failure now fails open: the content is kept. - New adaptive vector launcher icon with a themed monochrome layer. - CI split into test, build, and release jobs, with signing secrets only in the release job.
  • Also in this release
  • Timeline models are now classified as promoted, organic, or unknown. A confident organic identifier skips the reflective action-graph walk, and the walk result is cached per model. - Entry identifiers must match the whole-value grammar, so partial matches no longer count. - Adaptive boundaries are unwatched after 12 invocations without a post-like model. - Release-build logs redact entry identifiers.
  • Verified
  • Parity with the previous Java policy across 411,162 comparisons per run, on JVM and arm64. - On a Pixel 8 Pro, Android 17, X 12.28.0: promoted posts blocked before render, organic posts untouched, Video Tab batches filtered with paging intact, and no policy failures, crashes, or ANRs.

About this version

Version
3.0.0 (34)
Size
2.44 MB
Requires Android
8.0
Target SDK
26
Architecture
x86, x86_64, arm64-v8a, armeabi-v7a
Downloads
13
Updated
Sep 26, 2026
Package
io.github.mrxsin.twitterhideads

Similar apps

Ratings & reviews

—
0 ratings
  • 5
    0
  • 4
    0
  • 3
    0
  • 2
    0
  • 1
    0

Write a review

Tap a star to rate this app