Skip to content
HmnDev-TechPublic

About

Chronics — a local Android notification archive with full-text capture, filters, and Downloads export

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Chronics

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.

Build Platform Version Kotlin Compose


Why

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.

Features

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.

Install

The latest beta is published in Releases:

  1. Open the latest v1.0.0-beta01 release and download app-release.apk.
  2. 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.

First run

  1. Allow notifications (Android 13+).
  2. Open onboarding and grant notification access — this is the main source.
  3. Optionally enable the accessibility service and Shizuku.
  4. Tap Send test notification and check that the entry appears in the journal.

Permissions

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.

Where the data lives

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.

Build

No local Android SDK is required — CI builds every push to main and every tag:

  1. ./gradlew testDebugUnitTest — unit tests for text parsing, fingerprints, time formatting and the string catalogs.
  2. ./gradlew assembleDebug — signed debug APK.
  3. ./gradlew assembleRelease — signed release APK on main and on tags.
  4. Both APKs are published as artifacts (kept for 30 days); a v* tag also creates a GitHub release with app-release.apk attached.
  5. 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.

Releasing

  1. Bump versionCode and versionName in app/build.gradle.kts.
  2. Add docs/release-notes/v<version>.md.
  3. Commit, push main, then tag and push: git tag v1.0.0-beta01 && git push origin v1.0.0-beta01.
  4. The release job verifies the APK signature and publishes a prerelease with the APK attached.

Signing

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.

Project structure

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

Contributing

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.

Security

Chronics handles sensitive message text. The threat model, supported versions and the private reporting channel are described in SECURITY.md.

License

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.

About

Chronics — a local Android notification archive with full-text capture, filters, and Downloads export

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages