A Nokia 3310-inspired minimal launcher for Android. Turn your smartphone into a dumb phone -- on demand.
- Retro aesthetic -- black background, monochrome text, monospace font
- Customisable colour -- choose from 10 colour presets for the clock and UI
- Configurable app whitelist -- choose exactly which apps appear in your menu
- Adjustable icon sizes -- Small, Medium, Large, or Extra Large app icons
- Swipe-up app drawer -- swipe up or tap MENU to open your apps
- Clock tap -- tap the clock to open your alarms
- Optional weather widget -- shows current weather on the home screen (requires internet and location)
- Greyscale mode -- system-wide greyscale toggle via Accessibility or Bedtime Mode
- Do Not Disturb -- auto-enable DND when on the home screen
- Wallpaper override -- temporarily sets wallpaper to black while the launcher is active
- No distractions -- only whitelisted apps are accessible
- Security hardened -- ProGuard/R8 obfuscation, backup disabled, cleartext blocked
- Android 8.0+ (API 26+)
- Any Android device
- JDK 17+
- Android SDK (API 35)
- Download the latest
app-debug.apk(or signed release APK) from the Releases page - Transfer the APK to your phone
- Open the APK on your phone -- you may need to enable Install from unknown sources in your device settings
- Once installed, press the Home button
- Android will ask which launcher to use -- select DumbPhone and choose Always
- You're now in dumb mode!
- Clone this repository
- Open the
dumbphone-launcherfolder in Android Studio - Connect your phone via USB (with USB debugging enabled) or start an emulator
- Click Run (green play button)
- Open this project in Android Studio
- Click Build > Build Bundle(s) / APK(s) > Build APK(s)
- Find the APK in
app/build/outputs/apk/debug/
# macOS / Linux
chmod +x gradlew
./gradlew assembleDebug
# Windows
gradlew.bat assembleDebugThe APK will be at app/build/outputs/apk/debug/app-debug.apk.
Note: If the
gradle-wrapper.jaris missing, open the project in Android Studio first (it will generate it automatically), or rungradle wrapper --gradle-version 8.9if you have Gradle installed globally.
- Push this repo to GitHub
- Go to Actions tab > Build DumbPhone APK > Run workflow
- Download the APK from the workflow artifacts
| Action | What it does |
|---|---|
| Tap MENU | Opens your whitelisted apps |
| Tap SETTINGS | Opens the settings screen |
| Tap the clock | Opens your alarm/clock app |
| Swipe up | Opens your whitelisted apps |
- Display -- clock colour, show seconds, 24-hour clock, greyscale mode, icon size, app labels
- Allowed apps -- check/uncheck any installed app to control what appears in the menu
- Weather widget -- toggle weather display on the home screen (needs location permission)
- Do Not Disturb -- auto-enable DND when on the home screen
- Wallpaper override -- set wallpaper to black while the launcher is active (restores original when disabled)
- Exit Dumb Mode -- opens Android settings to switch back to your normal launcher
- Open SETTINGS > scroll to EXIT DUMB MODE at the bottom
- Or manually: Android Settings > Apps > Default Apps > Home App > select your normal launcher
The default clock colour is classic green (#7FBF3F). Users can change this at any time from Settings > Clock colour. To change the default for new installations, edit the DEFAULT_CLOCK_COLOUR constant in PrefsManager.kt.
Edit the DEFAULT_APPS set in PrefsManager.kt with the package names you want enabled by default on first run.
To test on a Nothing Phone 2a emulator profile:
# Windows
scripts\setup-nothing-phone-2a-avd.bat
# macOS / Linux
chmod +x scripts/setup-nothing-phone-2a-avd.sh
./scripts/setup-nothing-phone-2a-avd.sh- Open Tools > Device Manager
- Click Create Virtual Device
- New Hardware Profile with:
- Screen size: 6.7"
- Resolution: 1080 x 2412
- Density: 420 dpi
- Select Android 15 (API 35) system image
- Name it
NothingPhone2aand finish
emulator -avd NothingPhone2a- No data collection -- zero analytics, crash reporting, or telemetry
- Network security config -- all cleartext traffic explicitly blocked as defence-in-depth
- Backup disabled --
allowBackup=falseprevents data extraction via ADB - ProGuard/R8 enabled -- release builds are obfuscated and optimised
- Exported components locked -- only the home launcher activity is exported
- SharedPreferences in MODE_PRIVATE -- app data is not accessible to other apps
| Permission | Required | Purpose |
|---|---|---|
QUERY_ALL_PACKAGES |
Yes | List installed apps for whitelist |
INTERNET |
No | Weather widget (Open-Meteo API, no API key) |
ACCESS_COARSE_LOCATION |
No | Weather widget (approximate location) |
ACCESS_NOTIFICATION_POLICY |
No | Do Not Disturb toggle |
SET_WALLPAPER |
No | Wallpaper override feature |
WRITE_SECURE_SETTINGS |
No | Direct greyscale toggle (ADB-granted; falls back to Accessibility Settings if not granted) |
Note:
WRITE_SECURE_SETTINGSis a signature-level permission that can only be granted via ADB. If not granted, the greyscale toggle guides the user to system Accessibility settings instead. This permission may cause review flags on the Play Store -- consider removing it for store-distributed builds.
To sign release APKs, set these environment variables before building:
export KEYSTORE_FILE=/path/to/your.keystore
export KEYSTORE_PASSWORD=your_store_password
export KEY_ALIAS=your_key_alias
export KEY_PASSWORD=your_key_passwordTo generate a keystore:
keytool -genkey -v \
-keystore dumbphone-release.keystore \
-alias dumbphone \
-keyalg RSA \
-keysize 4096 \
-validity 10000Never commit keystore files to version control. They are excluded via
.gitignore.
- Language: Kotlin 2.0.21
- Target SDK: 35 (Android 15)
- Min SDK: 26 (Android 8.0)
- Build: Gradle 8.9 / AGP 8.7.3
- Dependencies: AndroidX Core, AppCompat, Material, RecyclerView, ConstraintLayout, Preference
app/src/main/
java/com/dumbphone/launcher/
MainActivity.kt -- Home screen (clock, date, weather, gestures)
AppDrawerActivity.kt -- App drawer grid (whitelisted apps)
SettingsActivity.kt -- Settings menu (features, wallpaper, DND)
DisplaySettingsActivity.kt -- Display settings (colour, clock, icons, greyscale)
AppsSettingsActivity.kt -- App whitelist manager with search
PrefsManager.kt -- SharedPreferences wrapper
WeatherUtil.kt -- Open-Meteo weather API client
res/layout/
activity_main.xml -- Home screen layout
activity_app_drawer.xml -- App drawer layout
activity_settings.xml -- Settings layout
activity_display_settings.xml -- Display settings layout
activity_apps_settings.xml -- Apps settings layout
item_app.xml -- App grid item (icon + label)
item_app_toggle.xml -- App toggle item (icon + label + checkbox)
MIT -- do whatever you want with it.