Skip to content

Repository files navigation

Numa

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.


Screenshots

Home Focus mode Weekly history
Home Focus mode History

Download

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.


Highlights

  • 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 via WorkManager, 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.

Tech stack

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.


Architecture

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.

The schedule day

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.


Fonts

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.


Building the debug APK

Android Studio

Open the project (Ladybug or newer) and let it sync. Run the app configuration, or Build → Build Bundle(s) / APK(s) → Build APK(s).

Command line

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 assembleDebug

Or build directly with a matching Gradle (no wrapper needed):

gradle assembleDebug

The APK is written to:

app/build/outputs/apk/debug/Numa.apk

Tests

gradle testDebugUnitTest          # pure engine / util unit tests
gradle connectedDebugAndroidTest  # Compose UI + Room tests (device/emulator)

Continuous integration

.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.


Permissions

  • 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.


Accessibility

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.


License

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.

About

A calm, adaptive daily-routine, focus, and accountability companion for Android. Native Kotlin + Jetpack Compose + Room, with an adaptive schedule engine, gentle check-ins, a home-screen widget, and a live current-block notification.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages