semi-column/sift

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

See the code

See what people are saying

SourceMessageScoreDate

Built Sift - An Open-source Notification Manager (r/SideProject)

I was looking for a notification manager where I can manage it by categories, so I don't have to search through each app or disable one by one whenever a promotional notification comes in. I found none, so I built it myself! It's an open-source notification manager where not only you can turn off…

1

Sep 27, 2026

README

Sift icon

Sift

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.

Features

  • Categories across apps: channels from every installed app are grouped into categories like Promotions, Social activity, Messages and Security. Block, silence or allow a whole category in one go, or select individual apps.
  • Notification history: every notification is kept for 7 days in Logs, with blocked ones clearly marked. Filter by app, category, or shown/blocked.
  • Blocking with a record: blocked notifications are hidden as they arrive and saved in Logs, so you can check what you missed and allow a category again.
  • New channels handled automatically: choose what happens when an app adds a channel to a category.
  • Keyword rules: remove individual notifications whose text matches words you choose, for apps that mix promotions into normal channels.
  • Exclude apps from Logs: keep private apps (e.g. messengers) out of the history.
  • Undo: every change can be undone from the change history.

How it works, and its limits

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:

  1. Notification access, to read incoming notifications and see other apps' notification channels.
  2. A companion device pairing. Pick any nearby Bluetooth device or Wi-Fi network. Nothing is sent to it; it only unlocks Android's channel controls.

Things to know:

  • Categories are a best guess. Android has no category field for channels, so Sift infers one from channel names, descriptions and the categories apps attach to notifications. You can change any channel's category by hand.
  • Blocking hides notifications as they arrive. A blocked category is set to Minimized (no sound, pop-up or status-bar icon), and Sift removes each notification the moment it arrives and logs it. It can appear silently in the shade for a split second.
  • Categories already off in Android Settings are taken over so they're logged too. Notifications from before Sift was set up can't be recovered.
  • Apps with their main notification switch off can't be logged or managed. Android drops everything from them before any app can see it. Turn the switch on and block their categories in Sift instead.
  • Keyword rules act after a notification arrives, so a matching one may appear for a moment.
  • If you uninstall Sift, categories it blocked stay Minimized and will start appearing silently. Allow them in Sift first, or re-block them in Android Settings.

Requirements

Android 13 or newer.

Install

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.

Verify the download

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.

Privacy

  • No internet permission. Sift can't send anything anywhere.
  • Notification history is stored only in the app's private storage, kept for 7 days, and excluded from Android backups and device transfers.
  • Clearing history, excluding an app, or uninstalling deletes the stored notifications.

Permissions

PermissionWhy
Notification accessRead incoming notifications, and read and change other apps' notification channels
QUERY_ALL_PACKAGESList your installed apps and their channels
REQUEST_COMPANION_RUN_IN_BACKGROUNDKeep the companion pairing active in the background

Building

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.

Testing on an emulator

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

Releasing

Releases are built and signed by GitHub Actions (release.yml):

  1. Update versionCode and versionName in app/build.gradle.kts.
  2. Tag the commit with the same version (git tag v0.1.0 && git push origin v0.1.0).
  3. The workflow checks the tag matches versionName, runs tests and lint, builds and signs the APK, and creates a draft release with checksums.
  4. Review the draft, edit the notes, and publish it.

The signing key is provided through these repository secrets:

SecretValue
SIFT_KEYSTORE_BASE64The keystore file, base64 encoded
SIFT_KEYSTORE_PASSWORDKeystore password
SIFT_KEY_ALIASKey alias
SIFT_KEY_PASSWORDKey password

License

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.

Contributors

semi-column

2 commits

semi-column/sift

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

See the code

See what people are saying

SourceMessageScoreDate

Built Sift - An Open-source Notification Manager (r/SideProject)

I was looking for a notification manager where I can manage it by categories, so I don't have to search through each app or disable one by one whenever a promotional notification comes in. I found none, so I built it myself! It's an open-source notification manager where not only you can turn off…

1

Sep 27, 2026

README

Sift icon

Sift

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.

Features

  • Categories across apps: channels from every installed app are grouped into categories like Promotions, Social activity, Messages and Security. Block, silence or allow a whole category in one go, or select individual apps.
  • Notification history: every notification is kept for 7 days in Logs, with blocked ones clearly marked. Filter by app, category, or shown/blocked.
  • Blocking with a record: blocked notifications are hidden as they arrive and saved in Logs, so you can check what you missed and allow a category again.
  • New channels handled automatically: choose what happens when an app adds a channel to a category.
  • Keyword rules: remove individual notifications whose text matches words you choose, for apps that mix promotions into normal channels.
  • Exclude apps from Logs: keep private apps (e.g. messengers) out of the history.
  • Undo: every change can be undone from the change history.

How it works, and its limits

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:

  1. Notification access, to read incoming notifications and see other apps' notification channels.
  2. A companion device pairing. Pick any nearby Bluetooth device or Wi-Fi network. Nothing is sent to it; it only unlocks Android's channel controls.

Things to know:

  • Categories are a best guess. Android has no category field for channels, so Sift infers one from channel names, descriptions and the categories apps attach to notifications. You can change any channel's category by hand.
  • Blocking hides notifications as they arrive. A blocked category is set to Minimized (no sound, pop-up or status-bar icon), and Sift removes each notification the moment it arrives and logs it. It can appear silently in the shade for a split second.
  • Categories already off in Android Settings are taken over so they're logged too. Notifications from before Sift was set up can't be recovered.
  • Apps with their main notification switch off can't be logged or managed. Android drops everything from them before any app can see it. Turn the switch on and block their categories in Sift instead.
  • Keyword rules act after a notification arrives, so a matching one may appear for a moment.
  • If you uninstall Sift, categories it blocked stay Minimized and will start appearing silently. Allow them in Sift first, or re-block them in Android Settings.

Requirements

Android 13 or newer.

Install

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.

Verify the download

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.

Privacy

  • No internet permission. Sift can't send anything anywhere.
  • Notification history is stored only in the app's private storage, kept for 7 days, and excluded from Android backups and device transfers.
  • Clearing history, excluding an app, or uninstalling deletes the stored notifications.

Permissions

PermissionWhy
Notification accessRead incoming notifications, and read and change other apps' notification channels
QUERY_ALL_PACKAGESList your installed apps and their channels
REQUEST_COMPANION_RUN_IN_BACKGROUNDKeep the companion pairing active in the background

Building

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.

Testing on an emulator

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

Releasing

Releases are built and signed by GitHub Actions (release.yml):

  1. Update versionCode and versionName in app/build.gradle.kts.
  2. Tag the commit with the same version (git tag v0.1.0 && git push origin v0.1.0).
  3. The workflow checks the tag matches versionName, runs tests and lint, builds and signs the APK, and creates a draft release with checksums.
  4. Review the draft, edit the notes, and publish it.

The signing key is provided through these repository secrets:

SecretValue
SIFT_KEYSTORE_BASE64The keystore file, base64 encoded
SIFT_KEYSTORE_PASSWORDKeystore password
SIFT_KEY_ALIASKey alias
SIFT_KEY_PASSWORDKey password

License

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.

Contributors

semi-column

2 commits

Languages

Kotlin

100.0%