kronos(1) kronos kronos(1)

kronos — offline timetable, task, and exam manager for Android

kronos

kronos is a private, offline-first Android application that keeps a class timetable, assignments, and exams in one place. There is no account, backend, or network permission; everything is stored in a local SQLite database on the device. The application id is ‘io.github.fauzymadani.kronos’. Debug builds append ‘.debug’ to the id and carry a ‘-debug’ version suffix, so a debug and a release build install side by side.

Devices must run Android 8.0 (API 26) or newer. The app compiles against API 36.1 and targets API 35, and uses flat native views rather than a declarative toolkit in order to stay responsive on low-end hardware.

Subjects are created once, with an optional code and color, and are referenced by timetable entries, tasks, and exams. Subject names are unique and compared case-insensitively after trimming.

Class sessions carry a subject, day of week, start and end time, room, teacher, and week number. The timetable repeats over a rotation cycle of one to four weeks, anchored to the semester start date, so an odd and an even week can hold different sessions in the same slot. Sessions can be created quickly from configured class periods, which are named start and end time pairs edited in Settings. Views are available per week, per day, and per month.

Tasks carry a title, due date, optional due time, priority, category, notes, lead time, and completion status. Completed tasks keep a completion timestamp rather than being deleted. Assignment type distinguishes homework from other work.

Exams carry a subject, date, start and end time, room, seat, and notes. They are shown in a month calendar with per-day cells, and optionally inside the timetable day view.

Class, task, and exam reminders are delivered through the Android ‘AlarmManager’ with notification channels, and require notification permission on the device. Only the next relevant boundary is scheduled; nothing polls in the background. Pending alarms are rebuilt after boot, a time change, or a timezone change.

A timetable widget shows the current or next classes. It never polls: the update period is zero, and it refreshes when data changes or when the next class boundary passes.

Backup writes a JSON file containing subjects, sessions, tasks, categories, exams, holidays, and settings, and restoring replaces local data from that file. The accent color is deliberately excluded, because a backup brought to another phone should not repaint that phone. Timetable data can also be exported as CSV for use elsewhere.

The interface supports light, dark, battery-saving automatic, and pure black modes, seven accent colors, twelve and twenty-four hour time formats, and a Monday or Sunday week start. The user interface is English and Indonesian.

Settings are kept in shared preferences and are reachable from the Settings screen, which has a back arrow returning to the previous screen.

One of ‘light’, ‘dark’, or ‘auto_battery’, the last following the system battery saver.
Use an absolute black background in dark mode, for OLED panels.
One of the built-in accent swatches; device-local and not exported.
‘24’ or ‘12’.
‘monday’ or ‘sunday’.
Rotation cycle in weeks, one to four.
Anchor date for week numbering.
Named period start and end times, used as presets in the class editor.
Default reminder lead time in minutes.
, task_reminders, exam_reminders
Per-category reminder switches.
, exam_hour_before
Optional early exam warnings.
Time of day at which the day-before exam warning fires.
Show exams inside the timetable day view.

, ANDROID_SDK_ROOT
Android SDK location. Either one takes precedence over local.properties.
Overrides the automatically detected build-tools version for ‘make apk-info’.
Emulator name for ‘make boot’; defaults to the first available emulator.
JDK 17, required to build.

/data/data/io.github.fauzymadani.kronos/databases/kronos.db
Room database, the single source of truth for application data. The schema is at version 10; versions 1 through 10 are upgraded by explicit migrations and there is no destructive fallback, so an older build cannot open a newer database.
/data/data/io.github.fauzymadani.kronos/shared_prefs/kronos_settings.xml
Preferences described under SETTINGS.
app/schemas
Exported Room schemas, committed so migrations can be reviewed and tested.
app/src/main/res/raw/license.txt
License text shown in the About dialog.
keystore.properties
Signing material for the release build. When absent, the release build falls back to the debug signing configuration. Never committed.
local.properties
Local SDK location, generated by the IDE and never committed. When ANDROID_HOME is unset, the Makefile reads the SDK path from this file.

Build and run a debug build, which includes LeakCanary and is not minified:

make build
make install
make logcat

Run the unit tests:

make test

Build a minified release and update an existing install in place. ‘adb install -r’ keeps application data, and the version code must not decrease:

make install-release

Confirm the version in the installed package and in the built artifact:

make version
make apk-info

Read this manual from the repository:

man -l kronos.1

Install it for ‘man kronos’:

install -m 644 kronos.1 /usr/local/share/man/man1/

‘make logcat’ follows logcat for the application process, and ‘make crash’ prints the crash buffer. ‘make version’ prints the installed version, and ‘make apk-info’ prints the version and signing certificate of the built release APK.

Debug builds include LeakCanary. Reports pointing at ‘DecorView’ or ‘InputMethodManager’ originate inside the library rather than in application code.

Android 8.0 (API 26) and newer, with the interface localised in English and Indonesian. Release builds are minified and resource-shrunk by R8; an update that behaves differently from a debug build points at app/proguard-rules.pro.

fauzy madani

Kronos on GitHub

Licensed under GPL-3.0; third-party libraries retain their own licenses, and the bundled notification sound is CC0 1.0 Universal.

There is no synchronisation between devices; transfer data with backup and restore. Data is only as safe as the backups you take, and exported backups contain personal timetable data in plain text. Reminder delivery depends on the device permitting alarms, so aggressive battery optimisation can delay or suppress notifications. Widget updates depend on the launcher honouring ‘RemoteViews’ refreshes and on data actually changing or a class boundary passing.

November 11, 2026 fauzymadani.github.io