Tideo Auto Brightness
1.12.0 · GitHub
More about this app
Glass-box adaptive-brightness replacement with explainable decisions and circadian support.
Tideo Auto Brightness

A glass-box replacement for Android's adaptive brightness. You taught Android your brightness preferences and it is still wrong. Tideo replaces the opaque on-device machine learning with deterministic, inspectable math: a tunable lux-to-brightness curve you can see and shape, smooth animated transitions, circadian (time-of-day) scaling, per-context overrides, and an optional privileged super dimming mode that allows the screen to go below the system minimum.
Tideo is a ground-up Kotlin/Compose rebuild of the Advanced Auto Brightness (AAB) Tasker project, ported to a native app with exact behavioural parity. The math and decision logic are golden-tested against a transcription of the original Tasker engine.
The Tasker project Advanced Auto Brightness is the upstream source of truth. Feature discussion, bug triage, and most contributions happen there. Please read Contributing.
Features
- Three-zone perceptual brightness curve with a live, editable graph (low-light √, mid-range ∛-ish, high-light asymptotic tail. The curve is C0-continuous).
- Automatic curve fitting when override detection is enabled on the Reactivity screen, adjusting brightness manually pauses the service and logs a data point. After >8 points across varied lighting conditions the wizard suggests a fitted curve.
- Reactivity control sets sensor dead zones (dark / dim / bright) that allow balancing jitter with reactivity.
- Smooth animated transitions with customization for animation duration and steps.
- Circadian scaling shifts the whole curve brighter/dimmer based on local solar events (GPS, manual latitude/longitude or IP-geolocation fallback).
- Super dimming (requires WRITE_SECURE_SETTINGS) can set brightness below the hardware floor and a PWM-flicker-aware software-dimming mode (locks hardware brightness to a user defined point and dims using Android's Extra Dim functionality).
- Privileged display toggles (requires WRITE_SECURE_SETTINGS): Night Light with color temperature, grayscale / color correction, color inversion, always-on display, stay-awake while charging, and Disable HDR (experimental) on Android 14+. The HDR control changes stored format preferences rather than invoking Android’s Force-SDR service API; applying or clearing it may require a reboot, and display-mode changes may briefly blank the screen. Night Light and always-on display are shown only when Android reports those features available. Like super dimming, these are profile settings: loading a profile applies them, and returning to your baseline restores its values.
- Profiles are stored settings. Tideo ships with five built-in presets.
- Context automation can automatically load profiles based on: foreground app, time window, location, charging state, Wi-Fi SSID, or day of week, with priority-based conflict resolution.
- Live Debug scene: a glass-box that shows relevant inputs and outputs.
- Emergency recovery, a safety feature for when the screen is too dark, flip the phone upside-down and shake to force brightness to maximum. It also resets all supported privileged display toggles to their defaults.
- Automation control (optional, off by default): an opt-in broadcast surface so apps like Tasker or MacroDroid can turn Tideo on/off, pause, reset, or load a profile, and react to its state changes. See Automation.
The Dashboard: applied brightness (55/255), the raw and smoothed ambient lux feeding it, the
current circadian multiplier (1.15×), the active profile and context, and the master service
toggle.
How it works
- Three-zone model. Screen brightness is determined by a C0-continuous piecewise function. Each zone has its own formula and exposed settings. The graph below is live and and shows the curve based on the current setting, the reference, and the recorded overrides.
- Curve fitting. With override detection on, your manual overrides become training points; the wizard under Tools fits the three-part function and reports extensive quality metrics.
The Curve & Brightness editor: the teal line is the current lux-to-brightness curve, the dashed line is the static reference, and the red cross-hairs mark the live point (after scaling is applied): 416 lux mapping to brightness 86. The fields below are user definied zone scaling factors and zone boundaries.
- Event-driven runtime. The app reacts to state changes (a light change beyond the sensor dead zone or rule-based, e.g. an app switch, a battery change, a location change). The event-driven architecture aims to minimize battery impact.
- Context precedence. When multiple context rules match at once, highest priority wins. If priorities are equal the most specific rule wins.
- Circadian scaling. A time-of-day multiplier follows your local sunrise/sunset (GPS, manual latitude/longitude, or IP fallback).
Circadian scaling across the day: the plateau shows the daytime scale, tapering toward dawn and
dusk (the red line is now and the x-axis is in UTC). The settings below control shape of this graph. The
location panel can be used to track a certain date and/or location.
Install
- Disable the system's stock Adaptive/Auto Brightness (Settings → Display).
- Install from F-Droid (recommended — automatic updates), or grab the APK directly
from Releases. Both are the same APK: F-Droid rebuilds each tagged release from
this repo's source, verifies it byte-for-byte against the published release APK, and distributes
that binary with its original developer signature (a reproducible build —
Binaries:+AllowedAPKSigningKeysin the F-Droid recipe). So the two sources are interchangeable: you can switch either way, or update from whichever is faster, with no uninstall and no loss of settings. - Launch Tideo, complete onboarding (grant notifications + Modify system settings), and toggle the main service on from the Dashboard.
minSdk 31 (Android 12) · target/compile SDK 36.
Once installed and permissions are granted, everything can be accessed from the home Menu.
Privilege tiers
Tideo uses two privilege tiers. The core functionalities only require BASIC privilege.
| Tier | Permission | Unlocks |
|---|---|---|
| BASIC | WRITE_SETTINGS (user-grantable, in-app) |
Curve, animation, reactivity, circadian, contexts |
| ELEVATED | WRITE_SECURE_SETTINGS (one-time pm grant) |
Super dimming (Reduce Bright Colors below the floor) + supported Privileged Display profile toggles (Night Light, color correction/inversion, AOD, stay-awake) |
Granting ELEVATED privilege
- ADB:
adb shell pm grant com.tideo.autobrightness android.permission.WRITE_SECURE_SETTINGS
- Shizuku: start the Shizuku app, then use the one-tap grant in Tideo's onboarding (Elevated step).
- Root: Tideo can run the same
pm grantviasufrom the onboarding screen.
After the grant, Tideo writes the secure setting directly (no Shizuku binder needed for dimming). The grant is detected the next time the screen turns on or when the app is opened.
Three runtime uses of Shizuku. Beyond the one-time grant, Shizuku is used at runtime in exactly three optional places, all through Shizuku's shell (with a root fallback): the no-Location Wi-Fi SSID context runs
cmd wifi statusso Wi-Fi-based context rules can read the SSID without the Location permission, the global force-dark toggle sets thedebug.hwui.force_darksystem property (which isn't reachable through secure settings), and the Night Light temperature is also sent to the display service on devices (such as OxygenOS) that ignore the temperature setting — only once Tideo has seen the device ignore it.
Troubleshooting
- Stuck on a black/too-dark screen? Flip the phone upside-down (charging port up) and shake it. The phone will emit an SOS vibration, force brightness to maximum, and reset supported privileged display toggles to defaults.
- Service stops adapting after a while. Aggressive OEM battery management may kill the foreground service. Exempt Tideo from battery optimization. Please see dontkillmyapp.com for device-specific steps.
- Super dimming doesn't visibly darken on some OEMs. A few vendors rename or relocate the
reduce_bright_colorssecure keys. That is not a Tideo bug. Enable Live Debug (debug level: Super Dimming Info) to see when it's on. - A Settings key is not proof that a display feature is supported. Tideo reproduces Android's framework capability gates before exposing or writing Night Light and always-on display. Some supported OEM implementations can still ignore Night Light temperature changes.
- Brightness range looks off. Tideo normalizes the device's brightness range to a 0–255 scale. Some OEMs use different scales. The mapping is detected from
config_screenBrightnessSettingMaximum. - Context rules not firing. For per-app rules, grant Usage Access when prompted; for location/Wi-Fi rules, grant and enable Location (unless you run Shizuku). Live Debug (set to Context Automation) shows the active context and any priority conflicts. Please note that this requires the Global Flashes to be enabled.
Privacy
Tideo is local first and has no analytics, ads, or accounts. It makes one outbound network request, and only as a last resort:
- IP-geolocation fallback (optional, off by default, HTTPS). Circadian scaling needs an approximate location to compute local sunrise/sunset. Tideo tries, in order: a fixed latitude/longitude you pin → the device's
last-known location → a fresh GPS/network fix. Only if all of those are unavailable does it fall
back to a single
GET https://ipwho.is/(HTTPS), disclosing your public IP to that third party so it can estimate your city. You can turn it off under Circadian → Date & location → "IP-based location fallback", and it is off until you opt in. When it is off, Tideo never contacts ipwho.is. Automatic acquisition is attempted at most once per day; successful approximate coordinates are stored only in the app's on-device preferences so circadian state survives a restart. The same opt-in fallback also backs the Circadian "Use current location" button when no on-device fix is available; each user tap can make one additional request.
Everything else runs entirely on-device.
Automation (Tasker / MacroDroid)
Tideo can be driven by automation apps through an opt-in broadcast surface: commands to turn the service on/off, pause/resume, reapply, reset, or load a profile, plus outbound state-change events so your macros can react to Tideo. It is off until you enable it under Tools → Automation control (there is no password, so any app can send commands while it is on).
See docs/AUTOMATION.md for the full list of actions, the profile-name
extra, the outbound STATE_CHANGED event, and adb/Tasker/MacroDroid examples.
Module layout
A 3-module Gradle build:
:domain: pure JVM/Kotlin. All brightness math and decision logic (smoothing, curve mapping, thresholds, animation, circadian scale, context resolution). No Android dependencies.:platform: Android library. Real system adapters behind small interfaces: light sensor, brightness writer (OEM-range normalization), secure-dimming writer, tiered privilege manager, brightness-override observer, and battery/Wi-Fi/location/foreground-app readers.:app: Compose Material 3 UI, DataStore settings, the foreground monitoring service, a Quick Settings tile, a home-screen widget, a boot receiver, and interactive notification.
Building
Requires JDK 21+ (the toolchain targets 21) and the Android SDK (local.properties with sdk.dir,
or run scripts/setup-android-sdk.sh).
./gradlew :domain:test # pure-JVM engine + golden parity tests
./gradlew :platform:test # Robolectric adapter tests
./gradlew :app:testDebugUnitTest # app unit + Robolectric tests
./gradlew :app:assembleDebug # debug APK → app/build/outputs/apk/debug/
./gradlew build # everything: all modules, all tests, lint
Project docs
The rebuild is complete. Maintenance is driven by these documents:
AGENTS.md— the constitution for any coding agent (CLAUDE.mdpoints here).docs/HARNESS_LOCAL.md— how this repo extends the upstream Agentic Maintenance Harness, and every local delta.docs/STATE.md— current project state and session memory.docs/RUNBOOK.md— maintenance playbook (change-type guides).docs/rebuild/PARITY_CHECKLIST.md— every Tasker artifact tracked to a disposition.docs/LEDGER.md— permanent append-only registry of numbered deviations (D-001…); consult to avoid repeating solved mistakes.docs/rebuild/DEVICE_TEST_SCRIPT.md— the on-device acceptance script.docs/AUTOMATION.md— the external automation (Tasker / MacroDroid) reference.docs/history/— frozen record of the migration (segment briefs, gate findings).
Contributing
Tideo is the build artifact; the Advanced Auto Brightness Tasker project is where the brightness math and feature direction live.
- App-layer / Android-Kotlin bug fixes are welcome here as pull requests, e.g. crashes, OEM brightness/secure-key quirks, battery-saver kills, Compose/UI leaks, packaging.
- Translations are welcome here — the UI is fully localizable. Human translations only (no
machine/AI). See
CONTRIBUTING.mdfor how to add avalues-<lang>/strings.xml. - Features and brightness-logic changes go to AAB: Please open an issue there first.
See CONTRIBUTING.md and the Bug report issue template.
Credits
- Tasker developed by João Dias (AAB was built in Tasker and was ported over into Tideo. Tideo is not affiliated with Tasker).
License
MIT © 2026 /u/v_uurtjevragen.
How Shizuku is used
Can unlock elevated display features and use Wi-Fi rules plus force-dark and Night Light control via Shizuku with `pm grant`, `cmd wifi status` and color display service
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
Tideo uses Shizuku for one time elevated access and for privileged reads and writes that support brightness automation and display tools.
- Unlock elevated display features: grants its own
WRITE_SECURE_SETTINGSpermission with thepm grantshell command through Shizuku, which unlocks super dimming below the hardware brightness floor and privileged display profile toggles such as Night Light, color correction and inversion, always-on display and stay-awake while charging. - Use Wi-Fi in brightness rules: reads the connected Wi-Fi network name without requiring Location permission with the
cmd wifi statusshell command through Shizuku, used to match per-Wi-Fi context rules for automatic brightness profiles. - Control force-dark rendering: reads the system force-dark flag with
getpropand turns system-wide forced dark rendering on or off withsetpropthrough Shizuku, available as a tools toggle that darkens apps without their own dark theme and is reapplied after reboot. - Adjust Night Light temperature: reads and sets the Night Light color temperature in Kelvin through Shizuku using the system color display service, used for circadian and profile based Night Light control.
Android APIs or commands used
pm grantcmd wifi statusgetpropsetpropIColorDisplayManager.getNightDisplayColorTemperatureIColorDisplayManager.setNightDisplayColorTemperature
Notable details
The same elevated access can be granted without Shizuku with the shown ADB pm grant command. Wi-Fi name detection and force-dark control also try non-Shizuku methods when Shizuku is unavailable.
Changelog
What's new for version 1.12.0
What's new
The manual-override notification has a Discard button: if you moved the brightness slider by accident, tap it to forget that adjustment and resume, without touching your other curve points. While it is offered, Discard takes the place of Reset. Brightness curve values beyond the old limits, such as those from Curve Suggestion, are no longer reset when you save a profile or the app restarts.
What's Changed
- 1.12.0: discard a manual override from its notification (#134); persist curve inputs unclamped (#133) by @faded-penguin021 in https://github.com/faded-penguin021/Tideo-Auto-Brightness/pull/135
Full Changelog: https://github.com/faded-penguin021/Tideo-Auto-Brightness/compare/v1.11.0...v1.12.0
Permissions
17 permissions requested
