Scrolliosis is an open-source Android app that helps you reclaim focus by blocking distracting apps behind a knowledge gate. Instead of scrolling mindlessly, you must answer a question from your personal Knowledge Vault before any blocked app is allowed to open - for a limited time window only.
- App blocking — select any installed app to block via an Accessibility Service
- Knowledge Vault — store your own questions & answers; one must be answered correctly to unlock a blocked app for 5 minutes
- Overlay enforcement — a full-screen overlay immediately appears when a blocked app is launched
- GateKeeper mode — configure blocking schedules and rules
- System Purge — quickly clear all entries from the vault
- Onboarding — guided step-by-step permission setup (Overlay, Accessibility, battery optimisation)
- Boot persistence — the service restores itself after a device reboot
- Manufacturer workarounds — auto-detects OEM battery-saver restrictions (Xiaomi, Huawei, Samsung, etc.) and prompts the correct settings screen
| Min Android | 8.0 (API 26) |
| Target Android | 15 (API 35) |
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 |
app/src/main/java/com/saltatoryimpulse/scrolliosis/
├── data/ # Repository pattern (IKnowledgeRepository / KnowledgeRepository)
├── di/ # Koin dependency injection module
├── overlay/ # Overlay controller & config
├── ui/
│ ├── components/ # Reusable Compose components
│ ├── screens/ # HomeScreen, GateKeeperScreen, KnowledgeVaultScreen,
│ │ # AppSelectionScreen, OnboardingScreen, SystemPurgeScreen
│ └── theme/ # ScrolliosisTheme, colour tokens
├── AppViewModel.kt # Shared ViewModel
├── ScrolliosisApplication.kt # Koin initialisation
├── BootReceiver.kt # Restart service on boot
├── Constants.kt # App-wide constants
├── GateService.kt # Accessibility service — core blocking logic
├── KnowledgeHistory.kt # Room entities, DAO, and AppDatabase
├── MainActivity.kt # Single activity, Compose NavHost
├── ManufacturerUtils.kt # OEM-specific battery settings helpers
└── PermissionsUtils.kt # Runtime permission helpers
Key libraries: Room · Koin · Navigation Compose · Lifecycle · Robolectric (tests)
- JDK 11 (e.g. Eclipse Temurin)
- Android SDK with API 35 platform installed
git clone https://github.com/<your-username>/Scrolliosis.git
cd Scrolliosis
./gradlew :app:assembleDebug # Linux / macOS
gradlew.bat :app:assembleDebug # WindowsThe debug APK lands at app/build/outputs/apk/debug/app-debug.apk.
./gradlew test # JVM unit tests (Robolectric)
./gradlew connectedAndroidTest # Instrumented tests (requires device / emulator)Signing credentials are never stored in the repository. For local release builds, add the following to local.properties (gitignored):
# Path is relative to the project root directory
SIGNING_STORE_FILE=../key/key
SIGNING_STORE_PASSWORD=<your-store-password>
SIGNING_KEY_ALIAS=<your-key-alias>
SIGNING_KEY_PASSWORD=<your-key-password>The store file path can be absolute or relative to the project root. The file itself must stay outside the repository directory.
CI uses GitHub Actions secrets — see .github/workflows/release.yml.
See CONTRIBUTING.md.