WorkTime is a compact, offline Android timesheet for tracking shifts, worked hours and expected income from a calendar.
No account, no cloud sync, no analytics and no ads. Data stays on the device unless you explicitly export it.
Download the latest APK · Changelog · Privacy · License · Documentation
Monthly calendar · Year summary
- Calendar-first shift entry: tap a day, enter duration and hourly rate, save.
- Shows worked duration and income directly in calendar cells.
- Monthly summary with work days, total hours, income, bonuses and averages.
- Read-only yearly summary with per-month totals.
- Optional bonus and penalty amounts for individual entries.
- Default hourly rate plus bulk rate changes for a selected period.
- JSON export/import and CSV export through the Android system file picker.
- System, light and dark themes.
- Optional home-screen widget with the current month summary.
- Local-first operation with no account or network requirement.
WorkTime is intentionally ruble-focused: monetary values are displayed in ₽; currency conversion and multi-currency accounting are outside the current scope.
WorkTime is distributed directly through GitHub Releases as a signed, optimized APK.
- Open the latest release.
- Download
WorkTime-<version>.apk. - If Android asks, allow your browser or file manager to install apps from that source.
- Install the APK. Future releases signed with the same WorkTime certificate can be installed over the existing app without removing its data.
The project currently targets Android 8.0+ (minSdk 26). Every release also includes SHA256SUMS.txt; the pinned production signing-certificate fingerprint is stored in release/production-signing-cert-sha256.txt.
WorkTime is designed to work entirely on-device:
- entries are stored locally with Room;
- preferences are stored locally with DataStore;
- the app does not request the Android
INTERNETpermission; - there are no analytics or advertising SDKs;
- automatic Android backup/device transfer is disabled;
- data leaves the app only through user-directed JSON/CSV export.
See docs/PRIVACY.md for the full data-handling description.
- One aggregate entry per date.
- Worked time is limited to
0..24:00. - Worked time requires a positive hourly rate.
- Bonus/penalty-only entries are valid but do not count as work days.
- A saved entry keeps its hourly-rate snapshot; changing the default rate does not rewrite history.
- Bulk rate changes affect only entries inside the selected period and leave the default rate unchanged.
Calculation model
ratePayMicros = roundHalfUp(workedMinutes × hourlyRateMicros / 60)
entryTotalMicros = ratePayMicros + bonusMicros - penaltyMicros
monthTotalMicros = sum(entryTotalMicros)
workDays = count(entries where workedMinutes > 0)
Amounts use integer micros in domain/data code. Persisted monetary calculations do not use Float or Double.
- Kotlin 2.4.x
- Jetpack Compose + Material 3
- AGP 9.3.2 / Gradle Wrapper 9.7.1 / Java 17
- Room 2.8.4
- DataStore 1.2.1
- coroutines and
StateFlow - JUnit 6 and AndroidX Test
Use the repository Gradle Wrapper. The preferred local verification command is:
./scripts/verify.shIt runs the repository static audit, JVM tests, debug/release lint and Android build verification. GitHub Actions also runs managed-device instrumentation tests and exercises the release-signing path with a disposable CI-only key.
Repository modernization/refactoring is complete; the remaining release gates require physical-device verification. The exact audit boundary is recorded in docs/MODERNIZATION_STATUS.md.
For release signing and the GitHub Releases workflow, see docs/RELEASE_SIGNING.md and docs/RELEASE_CHECKLIST.md.
- Product
- UX
- UI system
- Architecture
- Build and CI
- Testing
- Modernization status
- Android QA
- Roadmap
- Backlog
- Privacy
WorkTime is open-source software released under the MIT License.
Copyright (c) 2026 arttvad9r.
