Open source Android app for blocking unwanted calls. No ads. No tracking. Fully offline.
- Go to Releases
- Download the latest
snub-x.x.x.apk - Enable "Install from unknown sources" if prompted
- Install the APK
# Clone the repository
git clone https://github.com/mebarlew/Snub.git
cd Snub
# Build debug APK
./gradlew assembleDebug
# APK will be at: app/build/outputs/apk/debug/app-debug.apk- Clone the repository
- Open in Android Studio
- Click Run or Build > Build Bundle(s) / APK(s) > Build APK(s)
- Prefix-based blocking - block all numbers starting with specific prefixes
- Country codes (e.g.,
+48blocks all Poland numbers) - Area codes (e.g.,
555blocks specific region) - Toll-free spam (e.g.,
+1-800,+1-888,+1-877) - Custom patterns
- Country codes (e.g.,
- Block All Mode - silence all incoming calls with one tap
- Block Unknown Callers - only allow calls from your contacts
- Block International - block calls from outside your country
- Allow Repeated Calls - let urgent callers through after multiple attempts
- Silent rejection of calls from your blocklist
- Blocked call logging with timestamps and block reason
- System call log - view your complete call history in-app
- Grouped by time - Recent (this week), Last Week, Last Month sections
- Collapsible sections - tap headers to expand/collapse with smooth animations
- Blocked calls tab - separate view for blocked call history
- Different icons for call types (incoming, outgoing, missed, blocked)
- Tap to call back, long-press for options (SMS, block prefix, copy number)
- 3 configurable quick dial slots - large iOS-style contact cards
- Tap empty slot to pick contact from phonebook
- Tap contact to call instantly
- Long-press to remove from quick dial
- Selections persist across app restarts
- Material 3 design with dynamic theming
- Dark/Light theme support
- iOS-style floating navigation - pill-shaped bottom nav with icons and labels
- Permission priming - explains why each permission is needed
- Protection level indicator - see your current protection status
- Hero headers with gradient backgrounds
- Tabbed interface (All Calls / Blocked)
- Swipe-to-delete on list items
- Bottom sheet with quick prefix suggestions
- Layered empty states with call-to-action buttons
- Haptic feedback throughout the app
| Contact Picker |
|---|
![]() |
| Search and select contacts for quick dial slots |
| Prefixes | Add Prefix | Whitelist | Add to Whitelist |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Manage blocked prefixes | Quick add common spam prefixes | Numbers always allowed through | Add by number or contact |
| Profiles List | New Profile |
|---|---|
![]() |
![]() |
| Time-based blocking profiles | Configure schedule, days, and blocking mode |
- Android 10 (API 29) or higher
- ~10MB storage
- Install the app
- Permissions screen guides you through each permission with clear explanations:
- Call Screening (required) - enables call blocking
- Phone State - detect incoming calls
- Call Log - view call history in-app
- Contacts - allow calls from people you know
- Make Calls - call back from the app
- Progress indicator shows setup completion
- Add prefixes to block, or use quick suggestions for common spam prefixes
Uses Android's CallScreeningService API to:
- Intercept incoming calls before they ring - system checks happen instantly
- Check blocking rules - matches against prefixes, Block All mode, Block Unknown, profiles, etc.
- Check contacts - if you have Block Unknown enabled, allows contacts through
- Check repeated calls - if enabled, allows urgent callers after multiple attempts
- Block or allow - responds to Android within 4.5 seconds
- Log blocked calls - saves to database for review in Blocked tab
With proper permissions granted:
- Blocked calls are completely silent - no ringing, no notification
- The phone never rings for blocked numbers
- All happens before the call reaches you
If phone rings before blocking:
- This means Call Screening permission is not properly granted
- Go to Settings → Permissions and ensure all permissions are enabled
- The app needs to be set as the default Call Screening app
| Component | Technology |
|---|---|
| Language | Kotlin |
| Min SDK | API 29 (Android 10) |
| Target SDK | API 35 (Android 15) |
| Architecture | MVVM |
| UI | Jetpack Compose + Material 3 |
| Database | Room (SQLite) |
| DI | Hilt |
| Async | Kotlin Coroutines |
- Device compatibility - some Samsung devices or custom Android ROMs may have manufacturer-specific call handling that interferes with CallScreeningService
- Permissions required - all permissions must be granted for silent blocking to work correctly
- Android 10+ only - older Android versions don't support CallScreeningService API
- VoIP calls - only blocks regular phone calls, not WhatsApp/Telegram/etc calls
- All data stored locally on device
- No network calls - everything works offline
- No analytics or tracking
- No ads
- No data collection
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Before contributing, please read our Code of Conduct.
This project is licensed under the MIT License - see the LICENSE file for details.
Active Development - Core features complete, UI polished, testing in progress











