Rebuilt on Hilt
The March 2026 update moved the app onto Hilt dependency injection, for stability.
One good thought a day. That is it.
A calm quote app that delivers a daily dose of inspiration at the time you choose. It works offline and keeps your quotes on your phone. Free with ads, and one purchase removes them.
The problem
Most quote apps are loud: endless feeds and fifteen notifications a day. They end up being one more thing competing for your attention. Companion AI does the opposite. One good quote, at a time you pick, and it works even when you are offline.
Before
With Companion AI
A daily notification that arrives exactly once, at your time, through Doze, battery savers and reboots.
How it works
From opening the app to the thing you came for.








Under the hood
An offline-first app that serves quotes from a Room database, so one is ready the moment you open it. WorkManager refreshes the cache in the background on Wi‑Fi, and a daily notification is rescheduled after every reboot.
A batch of quotes
Quotes come in batches, so the app isn’t online for each one.
Every quote served from the phone
Every quote is served from Room on the phone, so it works offline, with no feed.
Tops up the cache, schedules the day’s quote
Unique periodic work tops up the cache and schedules the day’s quote, its first run delayed to the time you chose.
Once, at the time you choose
One notification a day, at your time, through Doze, battery savers and reboots.
The March 2026 update moved the app onto Hilt dependency injection, for stability.
Quote cards round their corners as you drag them, so every swipe feels physical.
Any quote can be shared as an image card, drawn on the phone.
private fun scheduleDailyNotifications(replaceExisting: Boolean) {
val hour = preferencesHelper.getNotificationHour()
val minute = preferencesHelper.getNotificationMinute()
val currentTime = Calendar.getInstance()
val scheduledTime = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
}
// If the scheduled time has passed today, schedule for tomorrow
if (scheduledTime.timeInMillis <= currentTime.timeInMillis) {
scheduledTime.add(Calendar.DAY_OF_MONTH, 1)
}
val delay = scheduledTime.timeInMillis - currentTime.timeInMillis
Log.d(TAG, "Scheduling daily notification for ${scheduledTime.time} (delay: ${delay}ms)")
val dailyWorkRequest = PeriodicWorkRequestBuilder<DailyQuoteWorker>(1, TimeUnit.DAYS)
.setInitialDelay(delay, TimeUnit.MILLISECONDS)
.addTag(DAILY_WORK_NAME)
.build()
workManager.enqueueUniquePeriodicWork(
DAILY_WORK_NAME,
if (replaceExisting) ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE else ExistingPeriodicWorkPolicy.KEEP,
dailyWorkRequest
)
}Decisions
Each decision lists the reason for it and what it gave up.
Why
It handles Doze, battery optimisation and reboots on its own.
Trade-off
Periodic work runs at most every 15 minutes, which is fine for a once-a-day app.
Why
The app should never show a spinner for a quote.
Trade-off
A first launch with no internet has nothing to show yet.
A bug worth telling
ExistingPeriodicWorkPolicy.KEEP: if the job is already there, it’s left alone.What I tried first
What I learned
Screens
Features
Beautiful cards with smooth, minimal animations and light and dark themes.
Quotes are stored on the device, so there is no waiting and no internet needed.
One quote at the time you choose, scheduled to survive restarts.
Write your own and organise them with tags.
Every action is one swipe away.
One purchase through Google Play turns every ad off. No subscription.
Your data
Your quotes, favourites and settings stay on your phone, with no account. Ads come from Google AdMob, which asks for consent where the law requires it, and a one-time Remove ads purchase turns them off.
No. Quotes are stored on your device, so they load instantly and work offline.
Once, at the time you choose. You can have your quote daily or weekly, and the schedule survives restarts.
Yes, since October 2026. Companion AI is free and supported by ads from Google AdMob. A one-time Remove ads purchase turns them all off, and a short optional video gives you some ad-free time.
Yes. Write your own quotes, organise them with tags and keep them alongside your saved favourites.
Milestones
One quote a day at the time you choose, favourites, your own quotes, and any quote shared as an image.
Quote cards round their corners as you drag them, with new icons, a redesigned menu, and the app rebuilt on Hilt.
AdMob ads, a one-time Remove ads purchase and rewarded ad-free time, set in Google Sans and targeting Android 16.
The quote app now shows ads, and a one-time purchase through Google Play turns them all off.
A softer, calmer look, with cards that respond to your finger.
One thoughtful quote a day, at the time you choose. No feed, no noise.
For businesses
Websites, Shopify stores, Chrome extensions and Android apps, designed and engineered with the same care as my own products.
Booking new projects
I read every message myself and reply within a day or two with honest next steps.
Your message is on its way. I’ll reply to within a day or two.