Skip to content

ajagatobby/Groot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Groot Logo

Groot

πŸ›‘οΈ Your Personal Spam Call Guardian

An open-source iOS spam call blocker that puts you in control of who can reach you.
Built with privacy in mind β€” runs entirely on-device with zero data collection.

Features β€’ Screenshots β€’ Requirements β€’ Installation β€’ Architecture β€’ Contributing β€’ License

iOS 17.0+ Swift 5.9 SwiftUI 5.0 SwiftData MIT License


🎯 Why Groot?

Tired of robocalls, telemarketers, and scam attempts interrupting your day? Groot silently filters them out so you only receive calls that matter.

Unlike other call blockers that harvest your data or require expensive subscriptions, Groot is:

  • 100% Free β€” No subscriptions, no premium tiers, no ads
  • 100% Private β€” All processing happens on your device
  • 100% Open Source β€” Audit the code yourself, contribute, or fork it

✨ Features

πŸ“΅ Manual Number Blocking

Add specific phone numbers to your block list with a single tap. Perfect for persistent callers, ex-contacts, or any number you never want to hear from again.

🌍 Country-Based Blocking

Block calls originating from entire countries or regions. Ideal for users who receive international spam calls or don't expect legitimate calls from certain areas.

πŸ“‹ Blocked Call Log

Review a complete history of all blocked calls. See who tried to reach you, when they called, and how many times β€” giving you visibility without the interruption.

βœ… Whitelist Protection

Create an allow list of trusted contacts that will always get through, regardless of other blocking rules. Ensures important calls from family, work, or emergency contacts are never accidentally blocked.

πŸ”’ Pattern Blocking

Block numbers matching specific patterns like area codes, prefixes, or number sequences. Useful for blocking entire ranges of spam numbers that share common characteristics.


πŸ“± Screenshots

Home - Auto Block Spam Calls Β Β  Pattern Rule Blocking Β Β  Block Calls by Country

Block a Number Β Β  Customizable Settings

Left to right: Dashboard with blocked call stats β€’ Pattern-based blocking β€’ Country blocking β€’ Add number to block list β€’ Customizable settings


πŸ“‹ Requirements

Requirement Version
iOS 17.0+
Xcode 15.0+
Swift 5.9+

Note: Groot uses CallKit's Call Directory Extension, which has been available since iOS 10. However, SwiftData requires iOS 17+.


πŸš€ Installation

Clone the Repository

git clone https://github.com/ajagatobby/Groot.git
cd groot

Open in Xcode

open Groot.xcodeproj

Configure App Groups

  1. Select the Groot target in Xcode
  2. Go to Signing & Capabilities
  3. Ensure App Groups is configured with your group identifier
  4. Repeat for the GrootCallDirectory extension target

Build and Run

  1. Select your target device or simulator
  2. Press Cmd + R to build and run
  3. On first launch, grant the necessary permissions when prompted

Enable Call Blocking

After installation, you need to enable Groot in iOS Settings:

  1. Open Settings β†’ Phone β†’ Call Blocking & Identification
  2. Enable Groot
  3. Return to the app and tap "Refresh" to sync your block list

πŸ—οΈ Architecture

Groot follows a clean, modular architecture using modern Swift concurrency and SwiftUI best practices.

Groot/
β”œβ”€β”€ App/
β”‚   β”œβ”€β”€ GrootApp.swift          # App entry point
β”‚   └── RootView.swift          # Root navigation
β”‚
β”œβ”€β”€ Core/
β”‚   β”œβ”€β”€ Config/
β”‚   β”‚   β”œβ”€β”€ AppGroupContainer.swift    # Shared data container
β”‚   β”‚   └── AppSettings.swift          # User preferences
β”‚   β”‚
β”‚   └── Managers/
β”‚       β”œβ”€β”€ CallBlockingService.swift  # Core blocking logic
β”‚       β”œβ”€β”€ ContactService.swift       # Contact access
β”‚       β”œβ”€β”€ CountryDataService.swift   # Country code database
β”‚       └── PhoneNumberService.swift   # Number validation
β”‚
β”œβ”€β”€ Features/
β”‚   β”œβ”€β”€ Home/                   # Dashboard & stats
β”‚   β”œβ”€β”€ Blocked/                # Blocked numbers management
β”‚   β”œβ”€β”€ Countries/              # Country blocking
β”‚   β”œβ”€β”€ Patterns/               # Pattern-based blocking
β”‚   β”œβ”€β”€ Whitelist/              # Allowed contacts
β”‚   β”œβ”€β”€ Permissions/            # Onboarding permissions
β”‚   β”œβ”€β”€ Settings/               # App settings
β”‚   └── Welcome/                # First-time user experience
β”‚
β”œβ”€β”€ Models/
β”‚   β”œβ”€β”€ BlockedNumber.swift     # Blocked number model
β”‚   β”œβ”€β”€ BlockedCountry.swift    # Blocked country model
β”‚   β”œβ”€β”€ BlockPattern.swift      # Blocking pattern model
β”‚   └── WhitelistContact.swift  # Whitelisted contact model
β”‚
β”œβ”€β”€ Shared/
β”‚   β”œβ”€β”€ Animations/             # Custom animations
β”‚   β”œβ”€β”€ Colors/                 # Color definitions
β”‚   β”œβ”€β”€ Components/             # Reusable UI components
β”‚   β”œβ”€β”€ Shaders/                # Metal shaders
β”‚   └── Typography/             # Font definitions
β”‚
└── Resources/
    └── Assets.xcassets/        # Images & colors

GrootCallDirectory/
β”œβ”€β”€ CallDirectoryHandler.swift  # CallKit extension
β”œβ”€β”€ SharedModels.swift          # Shared data models
└── Info.plist                  # Extension configuration

Key Technologies

Technology Purpose
SwiftUI Declarative UI framework
SwiftData Persistent data storage
CallKit Call blocking & identification
App Groups Data sharing between app and extension
Metal GPU-accelerated visual effects

Data Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Groot App                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   SwiftUI   │───▢│  SwiftData  │───▢│  App Group      β”‚  β”‚
β”‚  β”‚    Views    β”‚    β”‚   Models    β”‚    β”‚  Container      β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚  Shared SQLite Store    β”‚
                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  GrootCallDirectory Extension   β”‚           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   CallKit   │◀───│ Directory   │◀───│  Read-Only      β”‚  β”‚
β”‚  β”‚   System    β”‚    β”‚  Handler    β”‚    β”‚  SwiftData      β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🀝 Contributing

We love contributions! Whether it's fixing bugs, adding features, improving documentation, or spreading the word β€” every bit helps.

Getting Started

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Contribution Guidelines

  • Follow Swift's API Design Guidelines
  • Write clean, documented code
  • Add tests for new features
  • Update documentation as needed
  • Be respectful and constructive in discussions

Areas We Need Help

  • Localization β€” Help translate Groot to more languages
  • Testing β€” Improve test coverage
  • Documentation β€” Write guides and tutorials
  • Design β€” Create app icons and promotional assets
  • Features β€” Check our Issues for ideas

πŸ”’ Privacy

Groot is built with privacy as a core principle:

  • No Analytics β€” We don't track you
  • No Network Requests β€” The app works 100% offline
  • No Data Collection β€” Your phone numbers stay on your device
  • No Third-Party SDKs β€” Just pure Apple frameworks
  • Open Source β€” Verify everything yourself

πŸ“„ License

Groot is released under the MIT License. See LICENSE for details.

MIT License

Copyright (c) 2026 Abdulbasit Ajaga

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

πŸ™ Acknowledgments

  • Apple β€” For SwiftUI, SwiftData, and CallKit
  • The open-source community β€” For inspiration and support
  • You β€” For using and supporting Groot!

πŸ’Ό Hire Me

Available for Hire

I'm a passionate iOS developer specializing in SwiftUI, Swift, and building beautiful, performant mobile experiences. If you're looking for someone to bring your app idea to life or need help with an existing project, I'd love to hear from you!

Services I offer:

  • πŸ“± iOS App Development (SwiftUI / UIKit)
  • 🎨 UI/UX Implementation
  • πŸ”§ App Maintenance & Optimization
  • πŸš€ App Store Launch Support

Email Me


Made with ❀️ by Abdulbasit Ajaga

Email β€’ Twitter β€’ GitHub

If Groot helped you, consider giving it a ⭐️

About

Auto block spam calls

Resources

License

Stars

Watchers

Forks

Packages

No packages published