Distraction-Free Instagram
An open source Instagram app for Android without distractions.
I built this project for myself as an alternative to DFInstagram which hasn't been maintained for a long time and was difficult to update. I'm sharing it so others can do the same for themselves.
This project is entirely free and open-source. Feel free to fork, copy, enhance, or submit pull requests - do whatever you want with it!
There will be a story on the official FeurStagram account every time there is an update:
Just follow this account and you will get a new story on each release.
Join the Discord server to get support, follow updates, and discuss development:
You have two options:
- Ready-to-install APK - Grab the latest patched APK from the Releases page and install it directly
- DIY Patching - Use the toolkit below to patch any Instagram version yourself
All content blocks are individual runtime toggles β long-press the Home tab at the bottom-left of the main tab bar to open the FeurStagram settings dialog and check/uncheck what you want blocked. A single APK covers every combination.
| Feature | Default | Toggleable | How |
|---|---|---|---|
| Home Feed | Blocked | Yes | Network-level blocking |
| Explore | Blocked | Yes | Network-level blocking |
| Reels | Blocked | Yes | Network-level blocking |
| Stories | Visible | Yes | Network-level blocking |
| Analytics & telemetry | Blocked | No | Always blocked |
| Shopping / commerce preloads | Blocked | No | Always blocked |
| Feature | Status |
|---|---|
| Direct Messages | Works |
| Profile | Works |
| Reels in DMs | Works |
| Search | Works |
| Notifications | Works |
Long-press the Home tab (the house icon at the bottom-left of Instagram's
main tab bar). A dialog lists the four content toggles; changes persist
across restarts (stored in SharedPreferences feurstagram_prefs).
sudo apt install apktool android-sdk-build-tools openjdk-17-jdk python3brew install apktool android-commandlinetools openjdk python3
sdkmanager "build-tools;34.0.0"-
Download an Instagram APK from APKMirror (arm64-v8a recommended)
-
Run the patcher:
./patch.sh instagram.apk
Use
--cloneto install FeurStagram alongside a stock Instagram (different package ID, separate data, both apps on the same device):./patch.sh --clone instagram.apk # or specify the cloned package ID explicitly: ./patch.sh --clone com.instagram.android.feurstagram instagram.apkWithout
--clone, the patched APK keeps Instagram's original package ID and installs as a replacement. -
Install the patched APK:
adb install -r artifacts/feurstagram_patched_<instagram_apk_name>.apk
-
Cleanup build artifacts:
./cleanup.sh
Feurstagram/
βββ patch.sh # Main patching script
βββ cleanup.sh # Removes build artifacts
βββ apply_network_patch.py # Network hook patch logic
βββ apply_longpress_patch.py # Injects the long-press hook on the Home tab
βββ apply_clone_patch.py # Rewrites binary AndroidManifest.xml for --clone
βββ artifacts/ # Patched APK output directory
βββ patches/
βββ FeurConfig.smali # SharedPreferences-backed toggles
βββ FeurHooks.smali # Network blocking hooks
βββ FeurSettings.smali # Settings dialog entry point
βββ FeurHomeTabWatcher.smali # Finds feed_tab in the tab_bar
βββ FeurSettingsLongClick.smali # View.OnLongClickListener shim
The patched APK needs to be signed before installation. The patcher uses a keystore file for signing.
Create a local keystore (do not commit it), then run patch.sh with env vars:
FEURSTAGRAM_KEYSTORE=./feurstagram.keystore \
FEURSTAGRAM_KEYSTORE_PASS=your_store_password \
FEURSTAGRAM_KEY_ALIAS=feurstagram \
./patch.sh instagram.apkIf feurstagram.keystore doesn't exist yet, create one:
keytool -genkey -v -keystore feurstagram.keystore -alias feurstagram \
-keyalg RSA -keysize 2048 -validity 10000 \
-storepass android -keypass android \
-dname "CN=Feurstagram, OU=Feurstagram, O=Feurstagram, L=Unknown, ST=Unknown, C=XX"| Property | Value |
|---|---|
| Filename | feurstagram.keystore |
| Alias | feurstagram |
| Algorithm | RSA 2048-bit |
| Validity | 10,000 days |
Note: If you reinstall the app, you must use the same keystore to preserve your data. Signing with a different keystore requires uninstalling the previous version first.
View logs to see what's being blocked:
adb logcat -s "Feurstagram:D"Everything is network-based β there is no UI-level tab redirection. Reels, Explore, Feed and Stories are all blocked the same way (by refusing their backend fetches), and each one is individually toggleable at runtime through the settings dialog.
The patcher injects a watcher on the main tab bar binder (LX/4jG, the class
that stores the tab_bar ViewGroup in field A0F). The watcher resolves the
feed_tab resource id dynamically via Resources.getIdentifier(...), grabs
the Home tab FrameLayout once it's laid out, and installs a long-press
listener on it. Long-pressing it opens a custom Material 3-styled dark dialog
with four SwitchCompat toggles backed by SharedPreferences
(feurstagram_prefs).
Hooks into TigonServiceLayer (a named, non-obfuscated class). Before each
request, FeurHooks.throwIfBlocked() runs on the request URI; blocked calls
fail with an IOException so the stack unwinds cleanly.
| Path / pattern | Purpose | Toggleable |
|---|---|---|
/feed/timeline/ |
Home feed posts | Yes |
/feed/reels_tray |
Stories tray | Yes |
/discover/topical_explore |
Explore tab content | Yes |
/clips/home/, /clips/discover |
Reels feed + discovery | Yes |
/logging/ |
Client event logging | No |
/async_ads_privacy/ |
Ad-related tracking | No |
/async_critical_notices/ |
Engagement nudge analytics | No |
/api/v1/media/.../seen/ (path contains /api/v1/media/ and /seen) |
Post βseenβ tracking | No |
/api/v1/fbupload/ |
Telemetry upload | No |
/api/v1/stats/ |
Performance / usage stats | No |
/api/v1/commerce/, /api/v1/shopping/, /api/v1/sellable_items/ |
Shopping / commerce preloads | No |
Note: despite the name, /feed/reels_tray is the stories tray endpoint in Instagram internals.
Matching uses String.contains() on the URI path. Instagram changes URL shapes over time; adjust patches/FeurHooks.smali if a block stops matching.
I'll update this project to support new Instagram versions as they are released. When a new version comes out, I'll apply the necessary patches and release an updated APK.
-
TigonServiceLayer is a named class (doesn't change).
-
Apply the same patches.
This is a personal project I'm sharing with the community. Contributions are welcome!
- π΄ Fork it - Make your own version
- π§ Pull requests - Improvements and fixes are appreciated
- π Copy it - Use the code however you want
- β¨ Enhance it - Build something even better
This project is released under the GNU General Public License v3.0. See LICENSE for details.

