Nebula is a mobile application designed to help users verify the credibility of news articles and text content. In an era of widespread misinformation, Nebula empowers users to make informed decisions by providing tools to check the reliability of information they encounter online.
The app offers an intuitive interface for submitting text for analysis, managing verification requests, and accessing educational resources about identifying misinformation.
- Text Verification: Submit text content for credibility analysis
- Image Analysis: Upload screenshots containing text for verification
- Dashboard: View and manage all your verification requests
- Detailed Results: Access comprehensive analysis results with confidence scores
- Educational Resources: Learn how to identify fake news and misinformation
- Fact-Checking Tools: Access curated list of international fact-checking organizations
- Tutorial: Interactive onboarding to guide new users
- Settings: Customize app behavior and manage preferences
- Offline Support: View previously checked content without internet connection
- Language: Kotlin 2.1.0
- UI Framework: Jetpack Compose with Material Design 3
- Minimum SDK: Android 8.0 (API 26)
- Target SDK: Android 15 (API 35)
- Build System: Gradle with Kotlin DSL
- Compose BOM: 2025.01.00
- Navigation: Jetpack Navigation Compose
- Dependency Injection: Koin 4.0.1
- Image Loading: Coil 2.4.0
- Animations: Lottie 6.6.2
- Networking: Shared module (nebula-shared)
- Error Tracking: Sentry Android 7.16.0
- Serialization: Kotlinx Serialization 1.8.0
- Pattern: MVVM (Model-View-ViewModel)
- State Management: Compose State with ViewModels
- Navigation: Type-safe Jetpack Navigation
- Modular Design: Shared business logic via Git submodule
Before you begin, ensure you have the following installed:
- Android Studio: Hedgehog (2023.1.1) or newer
- JDK: Java 17 or higher
- Git: For cloning the repository and managing submodules
- Android SDK: API Level 26-35
git clone https://github.com/nanogiants/nebula-android.git
cd nebula-androidThis project uses a shared module as a Git submodule. Initialize it with:
git submodule init
git submodule update --recursiveAlternatively, clone with submodules in one step:
git clone --recursive https://github.com/nanogiants/nebula-android.git- Launch Android Studio
- Select File → Open
- Navigate to the cloned repository directory
- Click OK
- Wait for Gradle sync to complete
The project includes two build flavors:
- develop: Development build with debug features (default)
- Application ID:
de.unisiegen.nebula.develop - Suitable for testing and development
- Application ID:
- production: Production-ready build
- Application ID:
de.unisiegen.nebula - Optimized with ProGuard/R8
- Application ID:
Select your preferred variant via Build → Select Build Variant in Android Studio.
- Connect an Android device or start an emulator
- Select the develop build variant (default)
- Click the Run button (
▶️ ) or pressShift + F10 - Select your target device
- Wait for the app to build and install
Generate a debug APK:
./gradlew assembleDevelopDebugThe APK will be located at:
app/build/outputs/apk/develop/debug/nebula-android-{version}.apk
For production builds (requires keystore configuration):
./gradlew assembleProductionReleaseNote: Release builds require signing configuration. Set up the following environment variables:
BITRISEIO_ANDROID_KEYSTORE_PASSWORDBITRISEIO_ANDROID_KEYSTORE_ALIASBITRISEIO_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD
And place your nebulaRelease.keystore file in the project root.
unisiegen-nebula-app-android/
├── app/ # Main application module
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/de/unisiegen/nebula/
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── NebulaApplication.kt
│ │ │ │ ├── di/ # Dependency injection modules
│ │ │ │ ├── navigation/ # Navigation graph and destinations
│ │ │ │ └── ui/
│ │ │ │ ├── screens/ # Feature screens
│ │ │ │ │ ├── start/ # Main dashboard
│ │ │ │ │ ├── checkRequestsList/ # Verification history
│ │ │ │ │ ├── checkDetails/ # Result details
│ │ │ │ │ ├── fakeNewsDetection/ # Educational content
│ │ │ │ │ ├── faq/ # FAQ screen
│ │ │ │ │ └── tutorial/ # Onboarding
│ │ │ │ ├── settings/ # App settings
│ │ │ │ ├── theme/ # Material theme
│ │ │ │ └── components/ # Reusable UI components
│ │ │ └── res/ # Resources (layouts, strings, drawables)
│ │ └── test/ # Unit tests
│ └── build.gradle.kts
├── neb-shared/ # Shared business logic submodule
├── art/ # Screenshots and promotional images
├── gradle/ # Gradle wrapper and version catalogs
├── build.gradle.kts # Root build configuration
└── settings.gradle.kts
This project uses Detekt for static code analysis and formatting. The configuration is located in:
neb-shared/detekt-config.yml
Run Detekt:
./gradlew detekt- Version Code: Auto-generated from Git commit count
- Version Name: Defaults to
0.1.0(override viaOVERRIDE_VERSION_NAMEenv var)
Current version can be checked in app/build.gradle.kts.
Dependencies are managed via Gradle Version Catalogs:
- App dependencies:
gradle/libs.versions.toml - Shared dependencies:
neb-shared/gradle/shared.libs.versions.toml
Example:
[libraries]
your-library = { group = "com.example", name = "library", version = "1.0.0" }Then reference in app/build.gradle.kts:
implementation(libs.your.library)To update the shared submodule:
cd neb-shared
git pull origin main
cd ..
git add neb-shared
git commit -m "Update shared module"./gradlew test./gradlew connectedAndroidTestGenerate coverage reports:
./gradlew testDevelopDebugUnitTestReports will be available in app/build/reports/tests/.
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run code analysis (
./gradlew detekt) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
feat:New featurefix:Bug fixdocs:Documentation changesstyle:Code style changes (formatting, etc.)refactor:Code refactoringtest:Adding or updating testschore:Maintenance tasks
MIT License Copyright (c) 2022-2026 NanoGiants GmbH
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
(including the next paragraph) 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.
Note: This is an Android-only implementation. For the iOS version, please refer to the separate iOS repository.





