Hydrame をつくる:しつこくならないスマートなリマインダー
リマインダーアプリは通知の良し悪しで生死が決まります。Hydrame の通知を、あなたをそっと後押しし、一日と戦うのではなく寄り添うようにどう設計したかをお話しします。
ほとんどのリマインダーアプリには、同じ致命的な欠陥があります。リマインダーそのものです。固定されたスケジュールで発火し、あなたが何をしているかを無視し、やがて読まずにスワイプして消す習慣を教え込んでしまいます。通知が一度ノイズになれば、アプリ全体がノイズになります。
Hydrame は水分記録アプリで、水分記録は まるごと リマインダーの問題です。後押しが良ければアプリは機能します。しつこければ、木曜日までにアンインストールされます。だから私は設計時間のほとんどを、たった一つの問いに費やしました。相手が嫌うものにならずに、水を飲むよう思い出させるにはどうすればいいのか?
固定スケジュールこそが敵
素朴なやり方は、2時間ごとのアラームです。作るのは簡単で、付き合うのは最悪です。会議中に鳴り、昼寝の最中に鳴り、たった今コップ一杯を飲んだ10分後に鳴ります。タイミングを外したリマインダーは、そのたびに少しずつ信頼を奪い、その信頼は戻ってきません。
Hydrame を形づくった気づきはこうです。リマインダーは、実際に行動できる瞬間に届いたときにだけ良いものになる。 それ以外はすべて、役立つ衣装をまとったノイズです。
一日に寄り添う
固定タイマーの代わりに、Hydrame は一日の目標を起きている時間に広げて配分し、本当に遅れていて かつ 前回の後押しから十分な時間が経ったときにだけ後押しします。一杯を記録すると、次のリマインダーは先送りされます。こまめに飲めば、何も言ってこないかもしれません——それこそが狙いです。
中核となるスケジューリングのロジックは、あえて小さく保っています。
interface ReminderContext {
now: Date;
wakeHour: number; // e.g. 8
sleepHour: number; // e.g. 23
goalMl: number; // daily target
consumedMl: number; // logged so far today
lastNudge: Date | null;
minGapMinutes: number; // breathing room between nudges
}
function shouldNudge(ctx: ReminderContext): boolean {
const hour = ctx.now.getHours();
// Never during sleeping hours.
if (hour < ctx.wakeHour || hour >= ctx.sleepHour) return false;
// Respect a minimum gap so we never feel pushy.
if (ctx.lastNudge) {
const gapMin = (ctx.now.getTime() - ctx.lastNudge.getTime()) / 60000;
if (gapMin < ctx.minGapMinutes) return false;
}
// How much *should* you have had by now, given the day's progress?
const dayLength = ctx.sleepHour - ctx.wakeHour;
const elapsed = Math.max(0, hour - ctx.wakeHour);
const expectedMl = ctx.goalMl * (elapsed / dayLength);
// Only nudge if you're meaningfully behind the curve.
return ctx.consumedMl < expectedMl * 0.85;
}
計算に気の利いたところは何もなく、それは意図的です。0.85 のしきい値は「遅れているが、罰するほどではない」を意味します。minGapMinutes のガードは、伴走者としつこい存在を分けるものです。作業の大半は、発火する理由を 足す ことではなく、取り除く ことでした。
通知の文面はタイミングと同じくらい重要
完璧なタイミングのリマインダーでも、言葉が間違っていれば嫌な気持ちにさせます。「目標に失敗しています!」は技術的には後押しです。同時に、誰かのロック画面に招き入れた小さな敵意でもあります。
Hydrame のリマインダーは、短く、温かく、決して罪悪感を煽りません。
- 「コップ一杯の水にちょうどいい頃合いです。」
- 「一日の折り返し——少し取り戻しませんか?」
注意を奪い合う感嘆符はありません。「途切れ」そうな連続記録もありません。トーンは、友人がふと口にする感じであって、コーチが叫びつける感じではありません。
既定は穏やかに、設定は選択で
既定値は、どんなアプリでも最も重要な設計判断です。なぜなら、ほとんどの人はそれを変えないからです。だから Hydrame は 静かに 届きます。控えめな回数の後押し、夜間はゼロ、そのどれもがさらに抑えやすい。
より厳しい目標や、より頻繁な確認が欲しければ、用意はあります。ただし、より多くへは 自分で選んで 入るのであって、より少なくから抜け出すのではありません。この一つの反転——穏やかさを天井ではなく床にすること——が、このアプリを敬意あるものに感じさせる大部分です。
目標は通知を最大化することでは決してありませんでした。一つひとつを勝ち取ることでした。
リマインダーアプリをつくる人へ伝えたいこと
- リマインダーを時計ではなく、行動できる瞬間に結びつける。 行動できない後押しはただのノイズです。
- 常に息をつく余白を残す。 アラート間の最低間隔は交渉の余地がありません。
- 文面を、指標ではなく人として書く。 温かさはタダで、多くの信頼を買います。
- 穏やかな選択肢を既定にする。 人はあなたの既定値の中で暮らします。
Hydrame は現在 Google Play で公開中で、通知は今も磨き続けている部分です。試してみたら、後押しがどう感じられたか 教えてください——そのフィードバックが次を形づくります。もちろん、静かに。
// 関連記事
ジャーナルの他の記事
意志力に頼らない水分補給ルーティン
水分補給のアドバイスの多くは「もっと水を飲め」に行き着き、あとは意志力任せになる。ここでは、合図とやさしいリマインドの上に築いたルーティンを紹介する。
Granynを作る: 銀行ログインなしの家計簿を、3つのテーブルで
Granynが銀行口座を一つも連携せずに、複数通貨での支出を追跡し、定期的な請求を検知する仕組み — その裏にあるRoomスキーマと、そこで生じるトレードオフ。
Androidの通知アクションを正しく作る:アプリを開かずに服用済みを記録する方法
Androidの通知アクションボタンの実践ガイド — PendingIntent、アクティビティ・トランポリン制限、goAsync()、そしてRoomの状態を安全に更新する方法。