Skip to content

Releases: naimulnashid/screen-time-tracker

Screen Time Tracker 1.6.0

Choose a tag to compare

@naimulnashid naimulnashid released this 14 Oct 20:04

The phone app now sends each sync once, and Sync now on the dashboard can collect a phone's upload from the cloud inbox straight away. This release also adds a project site. See CHANGELOG.md for the full list.

Highlights

  • Screen Time Reporter 1.3.2 sends each sync once. Pressing Sync now on the phone re-registered the background job, and Android treats a newly registered periodic job as due at once, so a second sync ran beside the button's own. A fifth of phone syncs were such repeats. Nothing was double-counted, but each one was a full extra upload. The job is now re-registered only when its interval or network setting changes, and only one sync runs at a time.
  • Sync now is on the phone pages too when the cloud inbox is configured. It already emptied the inbox; now a phone's page has the button, so an upload lands at once instead of at the next hourly ingest. Without an inbox the button stays on the laptop's pages.
  • A project site, live at https://screen-time-tracker-site.vercel.app/: what the project is for, how both collectors work, every chart type drawn live on invented data with a laptop / phone switch and Time / Opens toggles, and every feature. Shared links unfurl with a preview image.
  • Light-theme screenshots. npm run demo:shots takes every page in the dark theme and again in the light one, from one seeded demo, and keeps its scratch copy on the repo's drive, so it no longer fails when TEMP is on another drive.

Upgrading

Pull, run npm install, then restart the dashboard: npm run dashboard:stop, then npm run autostart -- -RunNow (it rebuilds because package.json changed). The database schema is unchanged.

On each phone, install ScreenTimeReporter-1.3.2.apk over any earlier release: settings, token and device id are kept.

Phone app: ScreenTimeReporter-1.3.2.apk

Signed release build of the v1.6.0 app sources (versionName 1.3.2, versionCode 7). Requires Android 8.1 or newer.

Verify the download

  • File SHA-256: 382217ca936a2f6cba652beeae13ccc5b713f9056a9b671be0631aab89cdaa92
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as every release)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.3.2.apk)

Screen Time Tracker 1.5.1

Choose a tag to compare

@naimulnashid naimulnashid released this 14 Oct 09:24

The phone app's icon is now Android Green. See CHANGELOG.md.

Changed

  • Screen Time Reporter 1.3.1: an Android Green icon. The clock's ring is Android Green on a dark green ground, matching the accent the dashboard gives a phone; it was violet. The shape is unchanged, so it still differs from the sibling Data Usage Reporter's bars in an app drawer.

Upgrading

The dashboard is unchanged apart from the version number; git pull is enough.

On each phone, install ScreenTimeReporter-1.3.1.apk over any earlier release: settings, token and device id are kept. Everything from 1.5.0 (the cloud inbox, the redesigned screen) is included.

Phone app: ScreenTimeReporter-1.3.1.apk

Signed release build of the v1.5.1 app sources (versionName 1.3.1, versionCode 6). Requires Android 8.1 or newer.

Verify the download

  • File SHA-256: ab666537bd9f15a4b217bb20406ba65d7e3cdc779eda733b70ddec340c9a2f19
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as every release)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.3.1.apk)

Screen Time Tracker 1.5.0

Choose a tag to compare

@naimulnashid naimulnashid released this 14 Oct 09:15

Phones can now report from any network, even while the PC is off, through an optional encrypted cloud inbox. The phone app also has a redesigned screen. See CHANGELOG.md for the full list.

Highlights

  • A cloud inbox, so a phone can report from anywhere. On its own, the phone posts straight to the dashboard, so it must be on the PC's network, the PC must be on, and the address changes whenever the router hands the PC a new one. With the inbox, the app posts to a fixed https:// address on any network, and the PC collects whatever is waiting on its hourly ingest and on Sync now. With only about ten days of history on a phone, this matters. It is optional and off unless inbox is set in config/collector.json.
  • The inbox cannot read what it holds. The app encrypts each upload to a key only the PC has (P-256 ECDH, HKDF-SHA256, AES-256-GCM), with your ingest token mixed into the key derivation, so the inbox cannot forge an upload either. It sees an upload's size, its time and the phone's random device id.
  • It runs on Supabase's free tier: one Edge Function and two tables, in supabase/. The same function also serves the sibling Data Usage Tracker, each app as its own mailbox with its own tokens, so one free project covers both. Setup is in the README, under Optional: a cloud inbox.
  • A redesigned phone app. A status card at the top answers "is it working?": green when synced, amber after three days, red with the reason when a sync fails or unsent history is about to be lost. Below it: when the data runs to, where it is sent, the interval Android actually accepted, and how many days the phone keeps. Permissions appear only while one is missing. Turning the inbox off and re-sending everything ask first.
  • Fixed: the app showed the ingest token in plain text. Every earlier build made the token field single-line after making it a password field, which silently removed the masking. It is masked now, with Show / Hide. If anyone has seen the app's screen, consider changing the token.

Upgrading

Pull, run npm install, then restart the dashboard: npm run dashboard:stop, then npm run autostart -- -RunNow (it rebuilds because package.json changed). The database schema is unchanged.

Without an inbox configured, nothing changes: the app keeps posting to the dashboard address.

Phone app: ScreenTimeReporter-1.3.apk

Signed release build of the v1.5.0 app sources (versionName 1.3, versionCode 5). Requires Android 8.1 or newer.

On 1.0 to 1.2.1? Install it over the top: your settings, token and device id are kept. To use the cloud inbox, tap Set up from the dashboard once while the phone is on the PC's network.

Switching from a self-built debug copy? Uninstall it first, because the signatures differ. If the install then still fails with INSTALL_FAILED_UPDATE_INCOMPATIBLE, run adb uninstall com.naimul.screentime to clear the leftover record, and merge the phone's old entry after its first sync with npm run android:merge.

Verify the download

  • File SHA-256: 5630c39b392f10468ecd757a536c95630488be8f559ab481a5d7baf54f6dabf1
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as every release)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.3.apk)

Screen Time Tracker 1.4.1

Choose a tag to compare

@naimulnashid naimulnashid released this 08 Oct 09:42

Security updates for the dashboard, plus a fix and a repair tool for phones whose app was reinstalled. See CHANGELOG.md for the full list.

Highlights

  • Security: Next.js 16.3.8. This fixes server-side request forgery in image optimisation, cache poisoning of statically generated pages, and information disclosure through metadata image routes, the development server and draft mode. Also sharp 0.35.5 (a librsvg vulnerability) and source-map-js 1.2.2 (a denial of service). npm audit reports none outstanding.
  • npm run android:merge: one phone, one entry. Reinstalling the phone app, for example to switch from a self-built APK to a released one, gives it a new device id. Its next sync then appears as a second phone holding only recent days, while the older history stays under the first entry. This script moves the old entry's history into the new one and gives it back its old address. It reports what it would do and compares the overlapping days first, and writes only with --apply, after taking a backup.
  • Fixed: a freshly installed phone app could appear as two phones. The app created its device id without a lock, so the first background sync and Sync now could each create one. Screen Time Reporter 1.2.1 creates it once.

Upgrading

Pull, run npm install, then restart the dashboard: npm run dashboard:stop, then npm run autostart -- -RunNow (it rebuilds because package.json changed). The database schema is unchanged.

If a reinstalled phone shows up twice in the sidebar, run npm run android:merge -- --from <old-slug> --into <new-slug>, read the report, then add --apply.

Phone app: ScreenTimeReporter-1.2.1.apk

Signed release build of the v1.4.1 app sources (versionName 1.2.1, versionCode 4). Requires Android 8.1 or newer. It includes the sync warning added in 1.2.

Already on 1.2? The fix only matters on a fresh install, so updating is optional. If you do, install it over the top: your settings, token and device id are kept.

Updating from 1.1 or 1.0? Install it over the top, then open the app once so it can ask for notification permission.

Switching from a self-built debug copy? Uninstall it first, because the signatures differ. If the install then still fails with INSTALL_FAILED_UPDATE_INCOMPATIBLE (which can happen on phones with a second profile, such as a private space or dual apps), run adb uninstall com.naimul.screentime to clear the leftover record. After the first sync, merge the phone's old entry with npm run android:merge.

Verify the download

  • File SHA-256: 05d48fbd79ec38d4e3f1d559d932c5bd6875850e37300741e40e2d9c272fdca8
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as every release)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.2.1.apk)

Screen Time Tracker 1.4.0

Choose a tag to compare

@naimulnashid naimulnashid released this 08 Oct 09:12

The phone app now warns you before Android discards history the dashboard has not received yet. See CHANGELOG.md for the full list.

Highlights

  • A stalled sync is now reported on the phone. Android keeps only a limited window of usage history, and anything the dashboard has not received by then is lost for good. Screen Time Reporter 1.2 checks once a day, with or without a network, and posts a notification when the dashboard has not had the phone's history for 168 hours. On a phone that keeps less history, it warns sooner: the limit is that phone's own measured history reach minus 48 hours. The reach varies by phone: it was about 216 hours on two phones and 138 hours on an Android 8.1 phone. The notification goes away once a sync gets through.
  • Allow notifications when the app asks (Android 13 and up). If they are off, the app's status line says that a stalled sync will not be reported.

Upgrading

The dashboard is unchanged apart from its version number, so there is nothing to do on the PC. Update the phone app below.

Phone app: ScreenTimeReporter-1.2.apk

Signed release build of the v1.4.0 app sources (versionName 1.2, versionCode 3). Requires Android 8.1 or newer.

Updating from 1.1 or 1.0? Install it over the top. It is signed with the same key, so your settings and token are kept. Open the app once afterwards so it can ask for notification permission and start the daily check.

New install:

  1. Download the APK on the phone and install it. Android will ask you to allow installs from your browser or file manager. (On Xiaomi phones, adb install is refused unless Install via USB is on in Developer options, so install from the file manager instead.)
  2. In the app, allow notifications, then tap Grant usage access and enable Screen Time Reporter.
  3. Enter the dashboard address (http://<your-PC's-LAN-IP>:7844) and your ANDROID_INGEST_TOKEN, then tap Save and test connection.

Already running a self-built debug copy? Uninstall it first. The signatures differ, so Android will not install one over the other. Your dashboard history is unaffected, and the first sync backfills what Android still holds.

Verify the download

  • File SHA-256: d8fd3a9b0c5e8899f83f408111e90afd795e923c8134764cb630edaedafe559a
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as 1.0 and 1.1)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.2.apk)

Screen Time Tracker 1.3.0

Choose a tag to compare

@naimulnashid naimulnashid released this 02 Oct 19:44

Screen Time Native can now be the laptop's sampler, and the dashboard and the sampler restart themselves after a crash. See CHANGELOG.md for the full list.

Highlights

  • Screen Time Native as the laptop's sampler. If the laptop runs Screen Time Native, run only one sampler: set nativeDatabasePath and nativeFrom in config/collector.json, and the hourly ingest and Sync now copy the laptop's screen time from that app's database. Sync Status reads its heartbeat. nativeFrom is a local hour edge where one sampler hands over to the other, and earlier history stays as it was. install-sampler.ps1 -IngestOnly stops this project's sampler cleanly and keeps the ingest. Steps are in the README, under The Windows collector.
  • The dashboard and the sampler restart themselves after a crash, 60 s apart, at most 3 times. Before, a crashed sampler stayed down until the next sign-in, and that time could not be recorded later. A clean stop is never restarted.
  • The start .bat opens your browser as soon as the server is listening.
  • Both dashboard launchers share one build rule, and a change to package.json, next.config.mjs or tsconfig.json now triggers a rebuild too.
  • The expanded Activity page opens on the first recorded day, not on the 1st of that month.
  • CONTRIBUTING.md: how to report, what to run before a change, and the rules a change must keep.

Fixed

  • install-sampler.ps1 -RunNow always reported the sampler as running: its process check matched the install script itself.

Upgrading

Pull, then restart the dashboard: npm run dashboard:stop, then npm run autostart -- -RunNow (it rebuilds when the code is newer than the build). Re-run install-sampler.ps1 (or install-sampler.ps1 -IngestOnly if Screen Time Native records) so the ingest task gets its new retry setting. The database schema is unchanged.

The phone app is unchanged: keep Screen Time Reporter 1.1 from the v1.1.0 release.

Screen Time Tracker 1.2.0

Choose a tag to compare

@naimulnashid naimulnashid released this 01 Oct 02:37

A light theme, renaming and recolouring apps from the dashboard, the whole sync history, and loading screens that match the page. See CHANGELOG.md for the full list.

Highlights

  • Light theme. A Dark / Light / System menu in the top bar. Its own design rather than the dark one inverted, with every accent and grey measured for contrast on white. Dark stays the default, and nothing flashes the other theme on load.
  • Rename any app from its page or the By App table. The new name reaches every chart, legend and title, and the app keeps its logo and colour.
  • Choose any app's bar colour from the same pencil, with a colour picker or a hex code.
  • Page through the whole run history on both Sync pages, instead of only the newest 40 or 60 runs.
  • Install the dashboard as an app from Edge or Chrome on the PC.
  • Top apps by day and Most opened by day on every Overview.
  • Loading screens match the page at every window width.
  • The README shows every page in full, retaken with npm run demo:shots.

Fixed

  • A phone's run history could be crowded out by the other devices' runs.
  • The laptop's run history was missing its Backup column.

Upgrading

Pull, then restart the dashboard: npm run dashboard:stop, then npm run autostart -- -RunNow (it rebuilds when the code is newer than the build). The database gains two tables, app_renames and app_colours, on its next open; nothing existing changes.

The phone app is unchanged: keep Screen Time Reporter 1.1 from the v1.1.0 release.

Screen Time Tracker 1.1.0

Choose a tag to compare

@naimulnashid naimulnashid released this 23 Sep 16:59

Phones on Android 8.1 and 9 are now supported, alongside the Next.js 16 move and the fixes since 1.0.0. See CHANGELOG.md for the full list.

Highlights

  • Android 8.1 and up. The phone app now installs on Android 8.1 (API 27), down from 10. Android only records screen-on and unlock events from version 9, so an 8.x phone's pages show time in apps: the time any app or the home screen was in front, with overlaps counted once. The pages say so, leave unlocks out instead of showing zero, and explain why. Phones on 9 and up are unchanged.
  • Sidebar order. Phones are listed in the order they were added, so a new phone joins the end.
  • Next.js 16 and React 19.3. After pulling, run npm install and rebuild.
  • Fixes: a wrong address returns a real 404, the sign-in form is never cacheable, the daily trend is one continuous line, and the Windows sampler recovers from a logoff.

Phone app: ScreenTimeReporter-1.1.0.apk

Signed release build of the v1.1.0 app sources (versionName 1.1, versionCode 2). Requires Android 8.1 or newer.

Updating from 1.0.0? Install it over the top. It is signed with the same key, so your settings and token are kept.

New install:

  1. Download the APK on the phone and install it. Android will ask you to allow installs from your browser or file manager. (On Xiaomi phones, adb install is refused unless Install via USB is on in Developer options, so install from the file manager instead.)
  2. In the app, tap Grant usage access and enable Screen Time Reporter.
  3. Enter the dashboard address (http://<your-PC's-LAN-IP>:7844) and your ANDROID_INGEST_TOKEN, then tap Save and test connection.

Already running a self-built debug copy? Uninstall it first. The signatures differ, so Android will not install one over the other. Your dashboard history is unaffected, and the first sync backfills about 10 days.

Verify the download

  • File SHA-256: bfda25d2fe9820dd482e810e97ca78f90ab7972377ffa40f84163c83bae6caf2
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9 (the same key as 1.0.0)
    (check with apksigner verify --print-certs ScreenTimeReporter-1.1.0.apk)

Screen Time Tracker 1.0.0

Choose a tag to compare

@naimulnashid naimulnashid released this 23 Sep 13:09

First public release of Screen Time Tracker: a local-only dashboard of per-app screen time for a Windows laptop and Android phones. See the README to set it up, and CHANGELOG.md for the full list.

Highlights

  • Windows collector: an unelevated foreground-window sampler with lock detection. Window titles are never captured.
  • Android collector: Screen Time Reporter, a dependency-free app that reads UsageStatsManager events and pushes them to the dashboard over your LAN.
  • Dashboard (Next.js, port 7844): Overview, By App, Activity heat map and Sync Status for each device.
  • Reset survival: the database lives off the system drive, with npm run backup:kit and npm run drill to prove a restore works.

Phone app: ScreenTimeReporter-1.0.0.apk

Signed release build of the v1.0.0 app sources (versionName 1.0, versionCode 1). Requires Android 10 or newer.

  1. Download the APK on the phone and install it. Android will ask you to allow installs from your browser or file manager.
  2. In the app, tap Grant usage access and enable Screen Time Reporter.
  3. Enter the dashboard address (http://<your-PC's-LAN-IP>:7844) and your ANDROID_INGEST_TOKEN, then tap Save and test connection.

Already running a self-built debug copy? Uninstall it first. The signatures differ, so Android will not install one over the other. Your dashboard history is unaffected, and the first sync backfills about 10 days.

Verify the download

  • File SHA-256: 843810e053d2098cb4fc50baf6fd554df03cd2fc0f3a7e32e7d3ee69ae1c9ac8
  • Signing certificate SHA-256: 21:AD:60:8E:C0:CB:3F:54:EE:F3:49:15:DF:A7:2B:3F:15:80:E4:49:A3:F9:41:86:71:2B:0E:20:EC:96:FC:C9
    (check with apksigner verify --print-certs ScreenTimeReporter-1.0.0.apk)