From 621f727e59a3db4ea2d46d473bda4d3de6cf67d9 Mon Sep 17 00:00:00 2001
From: Claude
Date: Tue, 30 Dec 2025 15:04:39 +0000
Subject: [PATCH 1/2] Make project open source with easier installation
- Add MIT LICENSE file
- Add CONTRIBUTING.md with contribution guidelines
- Add CODE_OF_CONDUCT.md
- Add F-Droid metadata (fastlane format) for app store distribution
- Add GitHub Actions workflows for CI builds and releases
- Update README with:
- Badges (license, release, build status, Android version)
- Clear installation options (APK download, build from source, Android Studio)
- Contributing and License sections
---
.github/workflows/build.yml | 36 ++++++
.github/workflows/release.yml | 39 ++++++
CODE_OF_CONDUCT.md | 45 +++++++
CONTRIBUTING.md | 119 ++++++++++++++++++
LICENSE | 21 ++++
README.md | 74 +++++++----
.../metadata/android/en-US/changelogs/1.txt | 8 ++
.../android/en-US/full_description.txt | 37 ++++++
.../android/en-US/short_description.txt | 1 +
fastlane/metadata/android/en-US/title.txt | 1 +
10 files changed, 357 insertions(+), 24 deletions(-)
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/release.yml
create mode 100644 CODE_OF_CONDUCT.md
create mode 100644 CONTRIBUTING.md
create mode 100644 LICENSE
create mode 100644 fastlane/metadata/android/en-US/changelogs/1.txt
create mode 100644 fastlane/metadata/android/en-US/full_description.txt
create mode 100644 fastlane/metadata/android/en-US/short_description.txt
create mode 100644 fastlane/metadata/android/en-US/title.txt
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..0e12c67
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,36 @@
+name: Build
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: gradle
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Build with Gradle
+ run: ./gradlew build
+
+ - name: Build Debug APK
+ run: ./gradlew assembleDebug
+
+ - name: Upload Debug APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: snub-debug
+ path: app/build/outputs/apk/debug/app-debug.apk
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..33fb42d
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,39 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - 'v*'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ cache: gradle
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Build Release APK
+ run: ./gradlew assembleRelease
+
+ - name: Rename APK
+ run: |
+ VERSION=${GITHUB_REF#refs/tags/v}
+ mv app/build/outputs/apk/release/app-release-unsigned.apk snub-${VERSION}.apk
+
+ - name: Create Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: snub-*.apk
+ generate_release_notes: true
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..d93df19
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,45 @@
+# Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment:
+
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior:
+
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information without their explicit permission
+* Other conduct which could reasonably be considered inappropriate
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the project maintainers. All complaints will be reviewed and
+investigated promptly and fairly.
+
+Project maintainers have the right and responsibility to remove, edit, or reject
+comments, commits, code, issues, and other contributions that are not aligned
+with this Code of Conduct.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
+version 2.0.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..a3ad3d9
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,119 @@
+# Contributing to Snub
+
+Thank you for your interest in contributing to Snub! This document provides guidelines for contributing to the project.
+
+## Getting Started
+
+### Prerequisites
+
+- Android Studio (latest stable version recommended)
+- JDK 17 or higher
+- Android SDK with API 35
+- An Android device or emulator running Android 10 (API 29) or higher
+
+### Setting Up the Development Environment
+
+1. Fork the repository on GitHub
+2. Clone your fork:
+ ```bash
+ git clone https://github.com/YOUR_USERNAME/Snub.git
+ cd Snub
+ ```
+3. Open the project in Android Studio
+4. Let Gradle sync complete
+5. Build and run on your device/emulator
+
+## How to Contribute
+
+### Reporting Bugs
+
+If you find a bug, please open an issue with:
+- A clear, descriptive title
+- Steps to reproduce the issue
+- Expected behavior vs actual behavior
+- Device info (manufacturer, model, Android version)
+- Screenshots if applicable
+
+### Suggesting Features
+
+Feature requests are welcome! Please open an issue with:
+- A clear description of the feature
+- Why this feature would be useful
+- Any implementation ideas you have
+
+### Submitting Code Changes
+
+1. **Create a branch** for your changes:
+ ```bash
+ git checkout -b feature/your-feature-name
+ # or
+ git checkout -b fix/issue-description
+ ```
+
+2. **Make your changes** following the code style guidelines below
+
+3. **Test your changes** thoroughly:
+ - Run the app on a real device if possible
+ - Test on different Android versions (10-15)
+ - Ensure call blocking still works correctly
+
+4. **Commit your changes** with clear commit messages:
+ ```bash
+ git commit -m "Add feature: description of what you added"
+ ```
+
+5. **Push to your fork** and create a Pull Request
+
+### Pull Request Guidelines
+
+- Keep PRs focused on a single feature or fix
+- Update documentation if needed
+- Add screenshots for UI changes
+- Ensure the app builds without errors
+- Describe what your PR does and why
+
+## Code Style Guidelines
+
+### Kotlin
+
+- Follow [Kotlin coding conventions](https://kotlinlang.org/docs/coding-conventions.html)
+- Use meaningful variable and function names
+- Keep functions small and focused
+- Use Kotlin idioms (null safety, extension functions, etc.)
+
+### Architecture
+
+This project follows MVVM architecture:
+- **UI Layer**: Jetpack Compose screens and ViewModels
+- **Domain Layer**: Use cases for business logic
+- **Data Layer**: Repositories and Room database
+
+When adding new features:
+- Put UI components in `ui/screens/` or `ui/components/`
+- Put ViewModels in `ui/viewmodel/`
+- Put database entities in `data/database/`
+- Put repositories in `data/repository/`
+
+### Compose
+
+- Follow [Compose guidelines](https://developer.android.com/develop/ui/compose/documentation)
+- Use Material 3 components
+- Keep composables small and reusable
+- Use proper state hoisting
+
+## Testing
+
+While the project doesn't have extensive tests yet, we encourage:
+- Manual testing on real devices
+- Testing on multiple Android versions
+- Testing with different permission states
+
+## Questions?
+
+If you have questions, feel free to:
+- Open an issue for discussion
+- Comment on existing issues or PRs
+
+## License
+
+By contributing to Snub, you agree that your contributions will be licensed under the MIT License.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..15a908b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Snub Contributors
+
+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.
diff --git a/README.md b/README.md
index 887ace3..02a29c6 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,46 @@
-Android app for blocking unwanted calls. No ads.
+
+
+
+
+
+
+
+
+ Open source Android app for blocking unwanted calls. No ads. No tracking. Fully offline.
+
+
+---
+
+## Installation
+
+### Option 1: Download APK (Easiest)
+
+1. Go to [Releases](https://github.com/mebarlew/Snub/releases)
+2. Download the latest `snub-x.x.x.apk`
+3. Enable "Install from unknown sources" if prompted
+4. Install the APK
+
+### Option 2: Build from Source
+
+```bash
+# 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
+```
+
+### Option 3: Android Studio
+
+1. Clone the repository
+2. Open in Android Studio
+3. Click Run or Build > Build Bundle(s) / APK(s) > Build APK(s)
## Features
@@ -125,17 +164,6 @@ Uses Android's `CallScreeningService` API to:
| DI | Hilt |
| Async | Kotlin Coroutines |
-## Building
-
-1. Clone the repo
-2. Open in Android Studio
-3. Sync Gradle
-4. Build & run
-
-```bash
-./gradlew assembleDebug
-```
-
## Limitations
- **Device compatibility** - some Samsung devices or custom Android ROMs may have manufacturer-specific call handling that interferes with CallScreeningService
@@ -151,18 +179,16 @@ Uses Android's `CallScreeningService` API to:
- No ads
- No data collection
+## Contributing
+
+Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
+
+Before contributing, please read our [Code of Conduct](CODE_OF_CONDUCT.md).
+
+## License
+
+This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
+
## Status
Active Development - Core features complete, UI polished, testing in progress
-
-### Recent Updates
-- iOS-style floating bottom navigation bar
-- Configurable quick dial with 3 contact slots
-- Grouped call log (Recent, Last Week, Last Month) with collapsible sections
-- Allow repeated calls feature for urgent callers
-- Enhanced permissions screen with permission priming
-- Improved settings with protection level indicator
-- System call log integration with two-tab interface
-- Quick prefix suggestions for common spam numbers
-- Haptic feedback throughout the app
-- Better empty states with call-to-action buttons
diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt
new file mode 100644
index 0000000..f182960
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/1.txt
@@ -0,0 +1,8 @@
+Initial release:
+• Prefix-based call blocking
+• Block All Mode and Block Unknown Callers
+• Time-based blocking profiles
+• Quick dial with 3 contact slots
+• System call log integration
+• Material 3 design with dark/light theme
+• Haptic feedback throughout the app
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000..da6b84f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1,37 @@
+Snub is a privacy-focused call blocking app for Android. Block unwanted calls silently without ads, tracking, or data collection.
+
+Features:
+
+Call Blocking
+• Prefix-based blocking - block all numbers starting with specific prefixes (country codes, area codes, toll-free spam)
+• 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 - blocked calls never ring
+
+Call Log Integration
+• View your complete call history in-app
+• Grouped by time - Recent, Last Week, Last Month
+• Separate view for blocked call history
+• Tap to call back, long-press for options
+
+Quick Dial
+• 3 configurable quick dial slots
+• Large iOS-style contact cards
+• Tap to call instantly
+
+Time-Based Profiles
+• Schedule blocking for specific times
+• Different blocking modes per profile
+• Automatic activation based on schedule
+
+Privacy First
+• All data stored locally on device
+• No network calls - works completely offline
+• No analytics or tracking
+• No ads
+• No data collection
+• Open source
+
+Requires Android 10 or higher.
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000..96396de
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1 @@
+Block unwanted calls silently. No ads, no tracking, fully offline.
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
new file mode 100644
index 0000000..c21cdd8
--- /dev/null
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -0,0 +1 @@
+Snub - Call Blocker
\ No newline at end of file
From 04f11002346e8873090de42cde2d428f70cacbf0 Mon Sep 17 00:00:00 2001
From: Claude
Date: Tue, 30 Dec 2025 15:10:02 +0000
Subject: [PATCH 2/2] Fix LICENSE year and release workflow
- Update LICENSE copyright year to 2025
- Use debug APK in release workflow (unsigned release APKs can't be installed directly)
---
.github/workflows/release.yml | 6 +++---
LICENSE | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 33fb42d..32884f7 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -22,13 +22,13 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- - name: Build Release APK
- run: ./gradlew assembleRelease
+ - name: Build APK
+ run: ./gradlew assembleDebug
- name: Rename APK
run: |
VERSION=${GITHUB_REF#refs/tags/v}
- mv app/build/outputs/apk/release/app-release-unsigned.apk snub-${VERSION}.apk
+ mv app/build/outputs/apk/debug/app-debug.apk snub-${VERSION}.apk
- name: Create Release
uses: softprops/action-gh-release@v1
diff --git a/LICENSE b/LICENSE
index 15a908b..03802ec 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2024 Snub Contributors
+Copyright (c) 2025 Snub Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal