Local Notifications
Reminders the user schedules on their own device, no server involved.
A local notification is a reminder the user schedules on their own device, no server involved, no FCM. Example: "remind me to drink water at 9am every day."
Only works on native (iOS and Android). Not available on web.
Implementation
Via MCP: ask your assistant "add local_reminders to my project". It runs add_feature for you. See Kasy MCP.
-
Run:
kasy add local_reminders -
Done. The settings screen, persisted state, and translations already come ready (see what's included in Information).
-
To change the reminder text (and the Home → Features demo notification), without hand-editing an i18n file:
kasy notifications textVia MCP: ask "change the reminder text to X" and the assistant runs
set_notification_textsfor you. See Kasy MCP.
Information
The four texts and where they show up
| Text | Where it appears |
|---|---|
| Demo, title | Card on Home → Features and the title of the instant test notification |
| Demo, description | Card subtitle and the body of the test notification |
| Reminder, title | Title of the scheduled notification (Settings → Reminders) |
| Reminder, body | Body of the scheduled notification |
Time, day and frequency stay with the end user on the Reminders screen. Through the CLI you set the message only.
To skip the prompts, pass everything as flags:
kasy notifications text \
--demo-title "Local notification test" \
--demo-body "An alert on this device only." \
--reminder-title "Reminder" \
--reminder-body "Time to drink some water."| Option | Description |
|---|---|
--locale pt|en|es|all | Which i18n files to update (default all, same text in all three) |
--demo-title | Demo title on Home → Features |
--demo-body | Demo description and body |
--reminder-title | Scheduled reminder title |
--reminder-body | Scheduled reminder body |
Use --locale once per language when the app is genuinely multilingual:
kasy notifications text --locale en --reminder-title "Reminder" --reminder-body "Time to drink some water."
kasy notifications text --locale pt --reminder-title "Lembrete" --reminder-body "Está na hora de beber água."--locale is separate from the CLI's -l/--lang, which only changes the language of the terminal prompts. The command updates lib/i18n/{pt,en,es}.i18n.json and runs dart run slang at the end. If you'd rather edit by hand, the keys are home.cards.notification_title, home.cards.notification_description and dailyReminder.title / dailyReminder.body.
Which language the reminder arrives in
The app doesn't pick the text by notification type: it uses the app's active language. If the user picked a language in Settings, that wins; otherwise it follows the device or browser language; and if that isn't pt, en or es, it falls back to the base locale in slang.yaml. A scheduled reminder stores its title and body in whatever language was active when the user saved it.
What comes ready
- Settings screen (
ReminderPage) accessible from onboarding and settings- On/off toggle
- Type: Daily, Weekly, or Specific date
- Hour and minute picker
- For weekly: day-of-week selector
- For a specific date: DatePicker + TimePicker
- State persisted in
SharedPreferencesviaReminderNotifier - Translations in PT, EN, and ES
Available methods
On LocalNotifier:
| Method | Use |
|---|---|
scheduleDailyAt(hour, minute) | Every day at the same time |
scheduleWeekly(dayOfWeek, hour, minute) | Same day of the week, same time |
scheduleAt(date) | Exact date and time (one-off) |
cancel(notificationId) | Cancel by ID |
cancelAll() | Cancel all |
listPendingNotifications() | See pending schedules |
Difference from Push
| Push Notification | Local Notification | |
|---|---|---|
| Who triggers it | Server | The device itself |
| Needs internet | Yes | No |
| Works with the app closed | Yes | Yes |
| Personalized per user | No (except deep link) | Yes (the user picks the time) |
| Web | No | No |
Last updated on 08/23/2026

