ShizuStore

Nothing Modes

Dvorinka

0.19.7 · GitHub

Download APK
Automation Android 9+ 2 days ago GPL-3.0
126 ShizuStore
414 GitHub
4 Stars
57 MB Size

More about this app

Automation app for Nothing phones (modes, routines, Glyph) that also runs on other Android devices with optional Shizuku

Nothing Modes

nothing-modes.vercel.app

Open-source Android automation for Nothing phones — and every other Android device.

Built like a premium system app: OLED-black surfaces, monoline iconography, dot-matrix hero type, and a single red accent. The engine is pure Kotlin; the UI is Jetpack Compose. Shizuku and Nothing Glyph are supported, not required.

Nothing Modes

Automation list Mode detail Mode builder Action catalog

What it does

  • Modes — persistent or event-based automations (Sleep, Work, Gaming, or event triggers) with optional conditions, actions, and automatic state restoration.
  • WHEN / ONLY IF / THEN builder — explicit, no confusion about what runs when.
  • Nothing Glyph / Glyph Matrix — light stripe and matrix on supported devices.
  • Shizuku — optional, graceful degradation everywhere else.
  • Capability detection — the app asks what the device can do instead of guessing.
  • Priority + cooldown + conflict resolution — deterministic ordering, overlap suppression, and fire cooldown.
  • Import / export / share — JSON bundles with schema versioning.
  • Privacy-first diagnostics — no analytics SDKs; crash reports are opt-in, and after a crash the app shows the error and asks before anything is sent.

Glyph support

Device Glyph Stripe Glyph Matrix Glyph Toy
Nothing Phone (1) Yes No No
Nothing Phone (2) Yes No No
Nothing Phone (2a) / (2a)+ Yes No No
Nothing Phone (3a) / (3a) Pro Yes No No
Nothing Phone (3) Yes Yes (25x25) Yes
Nothing Phone (4a) Yes No No
Nothing Phone (4a) Pro Yes Yes (13x13) Yes
Nothing Phone (4b) Yes No No
Non-Nothing devices No No No

How Glyph output works — read this first

Nothing OS hands the Glyph interface to one selected toy at a time. Whoever owns the current Glyph Toy slot (or the Always-on toy slot) is the only app whose frames reach the lights. There is no API to switch that selection programmatically — Nothing controls it.

What this means in practice:

  • To see Nothing Modes output, select Nothing Modes in Settings → Glyph Interface → Glyph Toys (or as the Always-on toy). The Glyph Preview screen in the app has shortcut buttons to both pickers and shows a live "Matrix owner" status.
  • We cannot trigger other apps' Glyph Toys. Toy apps can be bound and sent lifecycle messages, but their frames never reach the lights while another toy owns the slot — we verified this on-device. Nothing Modes renders its own equivalents (battery ring, progress, text, marquee, icons) instead.
  • If another toy is selected, Glyph actions fail honestly with "matrix owned by another toy" instead of pretending to render. Check the "Matrix owner" row in Settings → Glyph Preview — it always shows who currently controls the lights.

This exclusivity is Nothing's platform rule, not a limitation we chose. If Nothing ever exposes a public toy-switching API, we will use it.

Build

./gradlew assembleDebug
./gradlew :engine-core:test
./gradlew :ui:lintDebug

Requires JDK 17+ and Android SDK API 36.

Architecture

app
├── ui                 — Compose screens, theme, design primitives
├── automation-android — services, receivers, scheduler
│   ├── engine-core    — pure Kotlin engine
│   ├── data           — Room stores
│   ├── capabilities   — action executors, capability resolver
│   ├── core-shizuku   — Shizuku gateway
│   ├── device-tools   — shell-based state readers
│   └── nothing-integrations — Glyph SDK wrapper

The engine resolves each action through: Public Android API → Nothing API → Shizuku → settings panel fallback.

Modules

Module Role
engine-core Pure Kotlin automation engine
device-tools Shell-based device state readers
automation-android Android lifecycle, services, receivers
ui Jetpack Compose screens and design system
core-shizuku Shizuku privileged shell transport
capabilities Action executors and resolver
nothing-integrations Nothing Glyph SDK wrapper
data Room persistence
app Entry point and nav host

Quick start

  1. Install on Android 9+.
  2. Follow the in-app onboarding for restricted settings and optional Shizuku.
  3. Create a mode from the builder, a template, or a shared JSON link.
  4. Automations fire on triggers, check conditions, then execute actions in order.

Templates and sharing

Community templates live in templates/ — browse them in-app via the grid icon on the Modes screen. To contribute one, see templates/README.md.

Share any mode from the detail screen as a JSON bundle. Bundles carry schemaVersion, appVersion, and requiredCapabilities, so imports across users and app versions show compatibility warnings before anything is written.

Shizuku

Optional. Without it, every action still resolves — silent where the platform allows, a jump to the right settings panel where it doesn't. Shizuku turns the panel fallback into a silent toggle.

Verified on Nothing Phone 3, Nothing OS 4.1, Android 16:

Action Without Shizuku With Shizuku
Wi-Fi, mobile data, hotspot connectivity panel silent toggle
Airplane mode airplane settings silent toggle (cmd connectivity)
Battery saver, data saver, auto-sync settings panel silent toggle
Always-On Display, extra dim display settings silent toggle
Location mode, refresh rate settings panel silent toggle (secure table)
Arbitrary WriteSetting permission-required silent toggle
NFC NFC panel NFC panel — svc nfc is killed on Nothing OS 4.1 even for shell; platform limitation
Screenshot per-capture consent (MediaProjection) same
Everything else — Glyph, volume, ringer, DND, brightness, dark mode, rotation, flashlight, notifications, media, clipboard, app/URL launch, lock screen, SMS runtime permissions only unchanged

Get Shizuku from GitHub or the Play Store, then grant it inside the app's settings sheet.

Testing

./gradlew :engine-core:test
./gradlew connectedCheck

Documentation

License

GPL-3.0


Authored By: TDvorak [email protected]

Close

How Shizuku is used

Can toggle radios, system settings, privacy sensors, Glyph switch, refresh rate and screenshots via Shizuku shell with `svc`, `settings put`, `cmd` and `screencap`.

This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.

How this app uses Shizuku

Shizuku provides a privileged shell that lets automation modes and routines change protected system state directly on the device.

  • Toggle WiFi and Bluetooth: turn WiFi and Bluetooth on or off in modes and routines with the svc wifi and svc bluetooth shell commands through Shizuku.
  • Toggle mobile data and NFC: switch mobile data and NFC from automations with the svc data and svc nfc shell commands through Shizuku.
  • Switch airplane mode: enable or disable airplane mode in routines with the cmd connectivity airplane-mode command through Shizuku.
  • Control power savers: turn battery saver, data saver, hotspot, auto sync and stay awake while charging on or off with settings put writes to global settings through Shizuku.
  • Edit any system setting: write a chosen system, secure or global setting key and value with the settings put command through Shizuku, used for custom setting actions.
  • Adjust display and privacy: change refresh rate, always on display, extra dim, font scale, Night Light, color inversion, color correction, one handed mode and location mode with settings put writes through Shizuku.
  • Block mic and camera: mute or unmute microphone and camera sensors in modes with the cmd sensor_privacy command through Shizuku.
  • Control Glyph lights: turn the Nothing Glyph interface master switch on or off device wide with a global settings put write through Shizuku.
  • Take screenshots: capture the screen for screenshot actions with the screencap command through Shizuku.

Android APIs or commands used

  • svc wifi enable/disable
  • svc bluetooth enable/disable
  • svc data enable/disable
  • svc nfc enable/disable
  • settings put
  • cmd connectivity airplane-mode
  • cmd sensor_privacy
  • sh -c
  • screencap -p

Notable details

Many toggles try a normal Android API first and open the matching system settings page when Shizuku is unavailable, so the action can be finished manually. Custom setting writes accept any system, secure or global key that passes shape checks, with no fixed allowlist.

Close

Changelog

What's new for version 0.19.7

What's Changed

Full Changelog: https://github.com/Dvorinka/Nothing_Modes/compare/v0.19.6...v0.19.7

Close

Permissions

39 permissions requested

  • android.permission.REQUEST_INSTALL_PACKAGES
  • android.permission.RECEIVE_BOOT_COMPLETED
  • android.permission.SCHEDULE_EXACT_ALARM
  • com.android.alarm.permission.SET_ALARM
  • android.permission.FOREGROUND_SERVICE
  • android.permission.FOREGROUND_SERVICE_SPECIAL_USE
  • android.permission.POST_NOTIFICATIONS
  • android.permission.WRITE_SETTINGS
  • android.permission.ACCESS_NOTIFICATION_POLICY
  • android.permission.CAMERA
  • android.permission.READ_CALENDAR
  • android.permission.READ_CONTACTS
  • android.permission.VIBRATE
  • android.permission.WAKE_LOCK
  • android.permission.SET_WALLPAPER
  • android.permission.SYSTEM_ALERT_WINDOW
  • android.permission.INTERNET
  • android.permission.RECORD_AUDIO
  • android.permission.MODIFY_AUDIO_SETTINGS
  • com.nothing.ketchum.permission.QUERY_GLYPH_STATE
  • com.nothing.ketchum.permission.CONTROL_GLYPH
  • com.nothing.ketchum.permission.ENABLE
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION
  • android.permission.USE_FULL_SCREEN_INTENT
  • android.permission.READ_PHONE_STATE
  • android.permission.READ_CALL_LOG
  • android.permission.RECEIVE_SMS
  • android.permission.ACCESS_WIFI_STATE
  • android.permission.BLUETOOTH
  • android.permission.BLUETOOTH_CONNECT
  • android.permission.BLUETOOTH_SCAN
  • android.permission.PACKAGE_USAGE_STATS
  • android.permission.ACCESS_BACKGROUND_LOCATION
  • android.permission.SEND_SMS
  • moe.shizuku.manager.permission.API_V23
  • com.tdvorak.nothingmodes.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
Close