A calm, warm, native Android companion for a permanent daily routine — focus, fitness, and gentle accountability. Numa shows you what you're doing now, how long is left, what's next, whether you're on schedule, how far the day has shifted, when you'll likely finish, and how much sleep remains before a fixed wake time. When you need more time, the day flexes; tomorrow still begins on time.
It is fully local. No account, no network, no internet permission.
| Home | Focus mode | Weekly history |
|---|---|---|
![]() |
![]() |
![]() |
Grab the latest signed APK from the Releases
page (Numa.apk). Android 8.0+ (API 26). As with any sideloaded app, allow
"install unknown apps" when prompted; a one-time Play Protect notice is normal.
- Adaptive schedule engine — extend a block and every unfinished later block shifts with it, while completed blocks keep their real timestamps. Projected bedtime and sleep update live; the wake target stays fixed (04:00–10:00).
- Editable routine — add, edit, reorder (by time), and remove the recurring blocks: title, description, start, duration, flexibility, check-in, skip.
- One-off events — drop a fixed appointment onto today; flexible blocks flow around it without touching the permanent routine.
- Accountability check-ins — five minutes after each block, a quiet notification asks "Did you complete …?" with Done / Need time / Open, plus a full check-in sheet (Completed now · Completed earlier · Need more time · Skip). A single recheck follows if unanswered — never a pile of duplicates.
- Rest days — pause a whole day: blocks suspend, reminders go quiet, and nothing is marked missed. Tomorrow still begins on time.
- Home-screen widgets — current block + countdown, a today timeline, and a sleep-before-wake countdown, with Done / +15 quick actions.
- Live notification — an ongoing, silent note showing the current block's countdown, with Done / +15 quick actions.
- Cozy, restrained design — ivory surfaces, thin progress ring, pill-shaped schedule rows, soft info cards, a serif display (Fraunces) + humanist sans (Nunito Sans), warm dark mode.
- Reliable background — exact alarms via
AlarmManager, non-exact maintenance viaWorkManager, and recovery after reboot, app update, and time / timezone / date changes. - Honest permission health — a screen that reports notifications, exact alarms, battery optimisation and the next scheduled alarm without pretending to bypass OS limits.
Kotlin · Jetpack Compose · Material 3 · MVVM + unidirectional flow · Room · Coroutines · StateFlow · Navigation Compose · DataStore Preferences · AlarmManager · WorkManager · notification channels · BroadcastReceivers · Java 17 · Gradle Kotlin DSL · min SDK 26 · target SDK 35.
app/
data/
local/ Room database, entities, DAOs, type converters
repository/ ScheduleRepository (single source of truth)
settings/ DataStore-backed SettingsRepository
mapper/ entity <-> domain mapping
domain/
model/ pure models + enums (no Android deps)
scheduler/ RoutineDefinition, ScheduleGenerator, AdaptiveScheduler, SleepProjection
notifications/ channels + notifier
alarms/ AlarmScheduler + alarm contract
receivers/ Alarm, CheckInAction, and System (boot/time) receivers
work/ ScheduleSync coordinator + RescheduleWorker
ui/
theme/ colours, semantic tokens, type, shape, spacing
components/ reusable composables (timer, pills, cards, sheets…)
onboarding/ home/ focus/ history/ settings/ permissions/
navigation/ routes + NavHost
util/ time formatting, schedule-day clock, backup serialiser
di/ tiny manual dependency container
The adaptive scheduling engine (domain/scheduler) is pure Kotlin and fully
unit tested — no Android on the classpath, deterministic, DST-aware at the
instant-conversion boundary.
Offsets are minutes from midnight of the schedule date. A day runs 03:00 →
03:00 the next morning, so after-midnight blocks (e.g. the 12:30 AM Applications
block on July 24) stay owned by the previous date (July 23). See
ScheduleDayClock.
The routine is seeded from RoutineDefinition starting July 23, 2026, time
zone America/New_York, wake target default 10:00 AM.
The design pairs a cozy serif display (Fraunces) with a warm humanist sans
(Nunito Sans), both bundled locally as OFL-licensed variable fonts in
app/src/main/res/font/. ui/theme/Type.kt drives their wght axis per weight,
so the type interpolates crisply and the app stays fully offline. Every text
style flows from NumaTypography, so that file is the single place to retune
the app's type. See THIRD_PARTY_NOTICES.md for licenses.
Open the project (Ladybug or newer) and let it sync. Run the app
configuration, or Build → Build Bundle(s) / APK(s) → Build APK(s).
This repo ships the Gradle wrapper scripts but not the binary
gradle-wrapper.jar (it can't be authored as text). Generate it once with a
local Gradle install, then use the wrapper as normal:
gradle wrapper --gradle-version 8.14.5
./gradlew assembleDebugOr build directly with a matching Gradle (no wrapper needed):
gradle assembleDebugThe APK is written to:
app/build/outputs/apk/debug/Numa.apk
gradle testDebugUnitTest # pure engine / util unit tests
gradle connectedDebugAndroidTest # Compose UI + Room tests (device/emulator).github/workflows/android.yml builds on every push / PR / manual dispatch. It
installs JDK 17 and Gradle 8.14.5, runs the unit tests, assembles the debug APK,
and uploads it as an artifact named Numa-Android-APK containing
Numa.apk. No Android Studio required.
POST_NOTIFICATIONS— reminders and check-ins (requested gracefully at runtime; the app degrades quietly if denied).USE_EXACT_ALARM/SCHEDULE_EXACT_ALARM— exact reminder times. Falls back to inexact alarms if the OS withholds exact scheduling.RECEIVE_BOOT_COMPLETED— reschedule alarms after reboot.
No internet permission is declared.
TalkBack descriptions on the timer, progress and status; status conveyed by icon + text as well as colour; 48 dp touch targets; dynamic type; and a reduce-motion setting honoured by every animation.
Copyright © 2026 Kalyan Gopalam. All rights reserved.
Numa is proprietary software. The source code, design, and assets are the exclusive property of Kalyan Gopalam and may not be used, copied, modified, or distributed without prior written permission. See LICENSE for the full terms. Bundled third-party fonts remain under their own licenses — see THIRD_PARTY_NOTICES.md.


