A local, offline notification archive for Android. Chronics keeps the full
text of every notification in its own database and in Downloads/Chronics, so a
message stays readable after it has been deleted from the chat or wiped from the
shade.
No account, no cloud, no network access.
Chat apps delete messages, notifications disappear, and the text you needed is gone. Chronics is a paper archive with a pulse: it captures notifications the moment they arrive and keeps a searchable, exportable copy on your own device.
| Area | What it does |
|---|---|
| Notification listener | Title, text, bigText, subText, conversation, channel, group, priority, actions, attached photos from EXTRA_PICTURE and EXTRA_PICTURE_ICON, and MessagingStyle messages with senders and timestamps. Avatars are not saved. |
| Accessibility service | Fallback source: reads notification event text and, optionally, the open System UI shade. |
| Shizuku | Grants notification-listener and accessibility access through shell and imports the current shade via dumpsys notification --noredact. |
| Downloads export | One JSON and one TXT per notification, images under media/, full archive backup under backup/. MediaStore on Android 10+, direct shared-folder writes on Android 8–9. |
| Filters | App blocklist/allowlist, stop words, required words, ignore ongoing and silent notifications, duplicate merging. |
| Privacy | Masking of OTP codes, phone numbers, e-mail addresses and card numbers. |
| Journal | Day-by-day timeline, search, pinning, archive, and a detail screen with messages, attachments, raw extras and text copying. |
| Pulse | Statistics by hour and day, top apps, capture sources, archive fill. |
| Languages | Full interface in English, Russian, Kazakh, Spanish, Chinese and Portuguese, switchable in Settings. |
| Adaptive sizing | Paddings, cards, hero panel and dock scale from the real screen size and density, with a fine-tuning slider and centered content on wide screens. |
The latest beta is published in Releases:
- Open the latest v1.0.0-beta01 release and download
app-release.apk. - Install it. Android will ask to allow installs from your browser or file manager the first time.
Every successful main build is also available as the chronics-release-apk
artifact on the Actions tab, kept for 30 days.
Every APK is signed with the same key, so later builds install as an update over the previous one — no uninstall, no lost data.
One-time note: builds published before the stable key was introduced were signed with a throwaway debug key. If you installed one of those, uninstall it once; every build after that updates in place.
- Allow notifications (Android 13+).
- Open onboarding and grant notification access — this is the main source.
- Optionally enable the accessibility service and Shizuku.
- Tap Send test notification and check that the entry appears in the journal.
| Permission | Why |
|---|---|
| Notification listener access | Reads the full text of notifications. Can be revoked at any time in system settings. |
| Accessibility service (optional) | Catches text when a notification disappears before the listener reads it. |
POST_NOTIFICATIONS |
Shows the test notification and the service status. |
QUERY_ALL_PACKAGES |
Resolves app names and icons for the filter picker. No data leaves the device. |
| Storage (Android 8–9 only) | Writes exports directly to the shared Downloads folder. Android 10+ uses MediaStore. |
| Shizuku (optional) | Grants the two accesses above without opening system settings. |
| Data | Location |
|---|---|
| Journal | App-private SQLite database |
| Exports | Downloads/Chronics/ |
| Images | Downloads/Chronics/media/ |
| Full backup | Downloads/Chronics/backup/ |
Nothing is uploaded anywhere. The app declares no internet permission.
No local Android SDK is required — CI builds every push to main and every tag:
./gradlew testDebugUnitTest— unit tests for text parsing, fingerprints, time formatting and the string catalogs../gradlew assembleDebug— signed debug APK../gradlew assembleRelease— signed release APK onmainand on tags.- Both APKs are published as artifacts (kept for 30 days); a
v*tag also creates a GitHub release withapp-release.apkattached. - The run summary prints the signing certificate fingerprints so you can confirm they never change.
Local build (optional): JDK 17, Android SDK with platform android-37.0 and
build-tools 36.0.0, then ./gradlew assembleDebug or
./gradlew assembleRelease.
- Bump
versionCodeandversionNameinapp/build.gradle.kts. - Add
docs/release-notes/v<version>.md. - Commit, push
main, then tag and push:git tag v1.0.0-beta01 && git push origin v1.0.0-beta01. - The release job verifies the APK signature and publishes a prerelease with the APK attached.
CI restores a PKCS12 keystore from repository secrets and passes it to Gradle:
| Secret | Meaning |
|---|---|
CHRONICS_KEYSTORE_BASE64 |
Base64 of the keystore |
CHRONICS_STORE_PASSWORD |
Keystore password |
CHRONICS_KEY_ALIAS |
Key alias |
CHRONICS_KEY_PASSWORD |
Key password |
Without those secrets the build still succeeds, but it falls back to the default debug key and the resulting APK will not install over a previous one. See CONTRIBUTING.md for local signing.
Stack: Kotlin 2.2 (AGP built-in compiler), AGP 9.5.0, Gradle 9.8.2, Compose Material 3 1.5.0-beta02 (Expressive), minSdk 26, compileSdk/targetSdk 37, JDK 17.
app/src/main/java/com/hmndev/chronika/
data/ SQLite, repository, settings, models
i18n/ string catalogs for six languages and the runtime resolver
service/ notification listener, accessibility, capture engine
shizuku/ permissions, shell, dumpsys import
util/ notification parser, export, time, masking
ui/ Compose screens, components, theme, adaptive sizing
app/src/main/res/
values*/ launcher and service labels per language
drawable/ launcher foreground, monochrome icon, status icon
Issues and pull requests are welcome. Please read CONTRIBUTING.md and the Code of Conduct first.
Setup, permissions, privacy and troubleshooting are documented in the Wiki.
- Bug reports use the issue template and include app version, Android version and device.
- Never paste real notification contents, phone numbers or OTP codes into an issue.
- Security problems go through SECURITY.md, not the public tracker.
Chronics handles sensitive message text. The threat model, supported versions and the private reporting channel are described in SECURITY.md.
Released under the GNU General Public License v3.0. You may redistribute, modify and build upon the code as long as your derivative work stays under GPL-3.0 as well.