Back to All Projects
PWA · Android TWA · Offline-First · 2026

Reminder Me

A personal “companion agent” for daily life as a student — habits, focus sessions, tasks, exams, prayer times, health, and journalling, all in one offline-first app. Built as an installable PWA and wrapped as a real Android APK via a Trusted Web Activity. No backend, no account, no cloud — everything lives on the device.

React 18 Vite PWA Service Worker Android TWA Capacitor localStorage
Status
Working
Year
2026
Role
Solo Developer
Platform
PWA + Android APK
Data
On-device only
01 Project Overview

Pendamping (Indonesian for “companion”) is one place that knows my day: habits, a focus/Pomodoro timer, tasks and deadlines, a calendar, exam countdowns, streaks, a health log, a journal, and prayer times. The home screen then surfaces the one or two things that deserve attention right now.

It's built around my life: the app runs on Malaysia time (Asia/Kuala_Lumpur) regardless of the device clock, the copy is Indonesian, and the defaults reflect a student's day. The home tab reads the time-of-day phase — morning, afternoon, evening, late night — and reorders its nudges accordingly.

No backend, on purpose. There is no server, no account, and no cloud sync. Every habit tick, task, journal entry, and Pomodoro count is stored in the browser's localStorage on the device. That makes it private by default, instant to load, and fully usable offline — and it's the constraint that made the offline-first and packaging work the interesting part.
02 What's Inside

The app is organized into tabs, with the five most-used pinned to a bottom bar and the rest tucked under a “More” menu — phone-shaped navigation, not desktop.

Hari ini (Today) — the dashboard: today's habits with a streak counter, a rotating motivational line, and a smart “focus list” that bubbles up overdue tasks and near exams.
Fokus (Focus) — a Pomodoro timer with a distraction-free focus mode; completed sessions feed straight into progress.
Tugas (Tasks) — to-dos with priority and deadlines; late and due-soon items get flagged.
Kalender (Calendar) — events alongside exam dates.
Ujian (Exams) — courses and exams with a live days-until countdown that drives the home-screen nudges.
Progress — current and best streak, weekly habit completion, and Pomodoro totals.
Kesehatan (Health) & Jurnal (Journal) — water/sleep style logging and short daily notes.
Atur (Settings) — edit prayer times, the daily schedule template, and export all data to JSON.
03 The Smart Focus List

Rather than dumping everything, the home screen scores each candidate nudge by urgency (high/medium/low) and current phase, then shows the most important first. An exam two days out outranks an unchecked habit; an overdue task outranks an exam a week away.

01Home-Screen Priority Logic
HIGH    overdue tasks            -> "do or reschedule now"
HIGH    exam in <= 2 days        -> "review key points, no cramming"
MEDIUM  tasks due <= 2 days      -> "chip away today"
MEDIUM  exam in 3..7 days        -> "start studying gradually"
MEDIUM  high-priority tasks      -> "N priority tasks waiting"
LOW     habits left (daytime)    -> "N habits not checked yet"
LOW     weekly target (morning)  -> surface this week's goal

Sorted HIGH -> MEDIUM -> LOW, then shown top-first.
Phase (morning / afternoon / evening / late) gates the LOW nudges
so it won't nag about habits at midnight.

Each rule produces a nudge tagged with a level and the tab it links to, so tapping a nudge jumps straight to the relevant screen. Time-of-day is computed in Malaysia time, not the device's, so the phase logic is stable no matter where the phone thinks it is. The low-priority nudges are gated by phase — an unchecked-habit reminder only appears during the day, never in the late-night window — which keeps the home screen calm instead of guilt-tripping. The whole thing is deterministic and rule-based: no model, no scoring black box, just a small ordered list of if conditions that's easy to reason about and tweak.

# Tuesday, 09:40 MYT (phase = "pagi"/morning)
state:  1 task overdue
        Computer Architecture exam in 2 days
        3 of 5 habits still unchecked

builds:  HIGH   "1 task past deadline — do or reschedule now"   -> Tugas
         HIGH   "Computer Architecture in 2 days — review now"  -> Ujian
         LOW    "3 habits not checked yet today"                -> Hari ini

home shows the two HIGH nudges first; the habit reminder
sits below. At 23:30 (phase = "larut"/late) the habit
nudge is suppressed entirely.
04 Offline-First & Packaging

Getting one React app to install cleanly on a phone — both as a browser PWA and as a real APK from a single codebase — was the part that taught me the most.

Installable PWA
A web manifest plus a service worker (via vite-plugin-pwa / Workbox) makes it installable to the home screen, launchable standalone in portrait, and fully usable offline once cached.
Real Android APK via TWA
Wrapped as a Trusted Web Activity — a signed, installable APK that runs the same web app full-screen with no browser chrome, verified against the live domain through Digital Asset Links.
Smart install banner
An in-app banner offers the APK download only to Android users who haven't already installed it — it checks the user agent and standalone display-mode, and remembers a dismissal for the session.
MYT everywhere, ID copy
All date keys, clocks, and phase logic are pinned to Asia/Kuala_Lumpur, so streaks and “today” never drift with the device clock. The interface is fully in Indonesian.
05 Data Ownership

Because there's no server, the user owns their data outright — and I made that explicit rather than implicit.

Everything is local, everything is exportable. Habits, logs, tasks, exams, courses, events, journal entries, and Pomodoro totals all persist in localStorage. Settings includes a one-tap “Export all data (JSON)” — so the data is portable and backup-able even with no cloud behind it. Nothing is collected, nothing leaves the device unless the user chooses to export it.

The tradeoff is honest: no cross-device sync, and clearing browser storage clears the data. For a private, single-user companion app that's the right call — zero infrastructure, zero cost, instant load, and complete privacy.

06 Use Cases
Daily Habit Streaks
Check off habits each day and watch the streak build — the simplest, stickiest reason to open the app every morning.
Exam Crunch Planning
Add an exam and the countdown drives escalating home-screen nudges — from “start gradually” at a week out to “review now” at two days.
Focused Study Sessions
Run a Pomodoro in distraction-free focus mode; finished sessions roll into the weekly progress view.
A Private Pocket Companion
Installed to the home screen, working offline, holding everything from prayer times to a journal — with data that never leaves the phone.
Tech Stack
React 18 Vite lucide-react vite-plugin-pwa Workbox Service Worker Web App Manifest Android TWA Capacitor Gradle localStorage
The companion app I wanted — private, offline, and on my own time.
Habits, focus, tasks, exams, prayer times and a journal in one offline-first app, shipping as both a PWA and a signed Android APK from a single codebase — with every byte of data staying on the device.
View on GitHub