On-device Android notification manager: block, silence or allow notification categories across all apps, with a private log.
Kotlin
2
2 commits
updated Sep 26, 2026
Sort your notifications by what they’re about.
Control notifications by what they're about, across all your apps at once. Silence every app's promotions in one tap, see a history of everything that arrived, and review what was blocked.
No root, no account, no internet permission: everything stays on your device.
Android doesn't let regular apps change other apps' notification settings. Sift uses the same APIs that smartwatch companion apps use, unlocked by two things you grant during setup:
Things to know:
Android 13 or newer.
Download the APK from Releases and open it on your phone. Your browser or file manager may ask for permission to install apps.
Android may block notification access for apps installed this way. If the switch is greyed out, open App info → ⋮ → Allow restricted settings, then try again.
Each release includes SHA256SUMS.txt:
sha256sum -c SHA256SUMS.txt
All releases are signed with the same key. Android refuses to update Sift with an APK signed by a different key, which protects you from tampered builds.
| Permission | Why |
|---|---|
| Notification access | Read incoming notifications, and read and change other apps' notification channels |
QUERY_ALL_PACKAGES | List your installed apps and their channels |
REQUEST_COMPANION_RUN_IN_BACKGROUND | Keep the companion pairing active in the background |
Requires JDK 17 and the Android SDK.
./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk
./gradlew testDebugUnitTest lintDebug
Debug builds use the application ID app.sift.debug, so they install alongside a release build.
Emulators have no nearby devices to pair with, so grant both permissions with adb:
adb shell cmd notification allow_listener app.sift.debug/app.sift.service.NotifListener
adb shell cmd companiondevice associate 0 app.sift.debug 02:00:00:00:00:01
Releases are built and signed by GitHub Actions (release.yml):
versionCode and versionName in app/build.gradle.kts.git tag v0.1.0 && git push origin v0.1.0).versionName, runs tests and lint, builds and signs the APK, and creates a draft release with checksums.The signing key is provided through these repository secrets:
| Secret | Value |
|---|---|
SIFT_KEYSTORE_BASE64 | The keystore file, base64 encoded |
SIFT_KEYSTORE_PASSWORD | Keystore password |
SIFT_KEY_ALIAS | Key alias |
SIFT_KEY_PASSWORD | Key password |
Copyright © 2026 semi-column
Sift is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation.
It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Sift bundles the Inter typeface, © The Inter Project Authors, under the SIL Open Font License 1.1.
2 commits
Kotlin
100.0%
On-device Android notification manager: block, silence or allow notification categories across all apps, with a private log.
Kotlin
2
2 commits
updated Sep 26, 2026
Sort your notifications by what they’re about.
Control notifications by what they're about, across all your apps at once. Silence every app's promotions in one tap, see a history of everything that arrived, and review what was blocked.
No root, no account, no internet permission: everything stays on your device.
Android doesn't let regular apps change other apps' notification settings. Sift uses the same APIs that smartwatch companion apps use, unlocked by two things you grant during setup:
Things to know:
Android 13 or newer.
Download the APK from Releases and open it on your phone. Your browser or file manager may ask for permission to install apps.
Android may block notification access for apps installed this way. If the switch is greyed out, open App info → ⋮ → Allow restricted settings, then try again.
Each release includes SHA256SUMS.txt:
sha256sum -c SHA256SUMS.txt
All releases are signed with the same key. Android refuses to update Sift with an APK signed by a different key, which protects you from tampered builds.
| Permission | Why |
|---|---|
| Notification access | Read incoming notifications, and read and change other apps' notification channels |
QUERY_ALL_PACKAGES | List your installed apps and their channels |
REQUEST_COMPANION_RUN_IN_BACKGROUND | Keep the companion pairing active in the background |
Requires JDK 17 and the Android SDK.
./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk
./gradlew testDebugUnitTest lintDebug
Debug builds use the application ID app.sift.debug, so they install alongside a release build.
Emulators have no nearby devices to pair with, so grant both permissions with adb:
adb shell cmd notification allow_listener app.sift.debug/app.sift.service.NotifListener
adb shell cmd companiondevice associate 0 app.sift.debug 02:00:00:00:00:01
Releases are built and signed by GitHub Actions (release.yml):
versionCode and versionName in app/build.gradle.kts.git tag v0.1.0 && git push origin v0.1.0).versionName, runs tests and lint, builds and signs the APK, and creates a draft release with checksums.The signing key is provided through these repository secrets:
| Secret | Value |
|---|---|
SIFT_KEYSTORE_BASE64 | The keystore file, base64 encoded |
SIFT_KEYSTORE_PASSWORD | Keystore password |
SIFT_KEY_ALIAS | Key alias |
SIFT_KEY_PASSWORD | Key password |
Copyright © 2026 semi-column
Sift is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation.
It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Sift bundles the Inter typeface, © The Inter Project Authors, under the SIL Open Font License 1.1.
2 commits
Kotlin
100.0%