PRODUCT NOTE / PRD
続けたくなる、習慣トラッカー。
この文書は「何ができるか」ではなく、なぜ・誰のために・どんな判断で作ってきたかを記録した開発ノートです。
| ステータス | Shipped / Active(v2 リリース済み・継続開発中) |
|---|---|
| 現行バージョン | v2.1.4 build 32(Android / iOS とも配布中) |
| プラットフォーム | iOS(App Store)/ Android(APK 直配布)/ Web |
| 対象ユーザー | 運動・学習などの習慣を続けたい個人 |
| 最終更新 | 2026-08-25 |
| 関連リンク | App Store ・ Android APK ・ 変更履歴(Changelog) |
DayGrid は、毎日の習慣を開いて 1 タップで記録するための習慣トラッカーです。100% オフラインで動作します。
v1 は「予定」と「達成」を ToDo × 日付のグリッドで見せる方向で作りましたが、画面が複雑になり肝心の記録操作が重くなりました。v2 では「今日やることに 1 タップでチェックを入れる」一点に絞って作り直しました。v2 リリース済み
「習慣を続けたい」を支える記録には、次の壁があった。
DayGrid では、予定と達成を同じグリッドに並べ、積み重ねた量がそのまま目に入るようにした。
ランニング・読書・筋トレ・瞑想・学習などの日課を定着させたい個人。「真面目な管理ツール」より、気軽に毎日開けるものを求める人。
v2 では上の多くを削り、今日の一覧・1 タップ完了・履歴(連続日数と達成率)に絞った。グリッド表示・統計グラフ・ヒートマップ・キャラテーマ・単発 ToDo は持たない。
「積み重ねが続く」状態になっているかを、次の指標で見る。数値は目標仮置き
各アップデートの裏にある「なぜ」を、決定・仮説・結果の 3 点で残す。理由は変更内容から再構成
振り返りの対象週を月曜から開けっぱなしにし、閉じそこねた先週は水曜 0 時まで上に残す形にした。週の中に 1 日ずつの欄を置き、過ぎた日は 4 択の感想、まだ来ていない日は 3 択の自信度を選べるようにした。
自由記述は「その他」を選んだときと、日ごとの任意のひとことだけに限る。
それまで対象週は日曜だけが今週で、月曜になると先週へ切り替わっていた。既定の通知が日曜 20:00 なので、その日のうちに閉じられるように、という理屈だった。
だが結果としてその週に触れる機会が日曜の 1 日しか無く、 水曜の手ごたえは週末には残っていない。
v2.2 で日のメモを廃止したときの本当の理由は「日と週のどちらに書くか毎日問われる」ことで、 粒度が 2 つあること自体ではなかった。
それなら、日ごとは選ぶのが主にして 入力の重さを変えれば、問いが重ならない。
書く場所は増えたが、既定で出ている自由記述欄は週メモ 1 つのまま(日ごとは選択肢、「その他」は選んだときだけ)。できなかった側だけを聞いていたのもやめ、できた側にも「時間を決めていた/準備しておいた/小さくやった」を置いた。
崩れた原因は週ごとに違うが、続いた形は再現できる。
「決め方は 3 つまで」を守ってきたのは、v1 が種別を増やすたびに隠れた既定値 (週 2 回を選ぶと暗黙に月・木が入る)と分母の定義できない予定を持ち込んだから。
第◯曜日はそのどちらでもない。日付だけで予定日が決まるので
isScheduledOn が答えられ、達成率・ヒートマップ・棒グラフの分母にそのまま入る。
制約の本体は「3 つ」という数ではなく、分母を答えられるかどうかだった。
「エリアの境界線が分かりにくい」という申告。線を濃くすれば直るが、 画面が表になって「静かに読む場所」という性格から外れる。
境目は「線の濃さ」ではなく「面の切れ目」でも伝わる。
同じ指摘で「できなかった習慣にだけ件数が付いている」ことも判明し、 週の合計・できた・できなかったの 3 つとも件数で言う形に揃えた。
片方だけに件数があると、数えているものが違うように見える。
「最初違和感がある」という申告を受けて、実際の挙動をフレーム単位で測った。
押した次のフレームにはもう入れ替わっており(アニメーションは挟まらない)、 3 枚並べて 1 枚目を押すと、2 枚目が 1 枚目の居た座標にぴったり乗る。
つまり同じ場所を続けて 2 回叩くと別の習慣が記録される。
これは v1 の敗因(34px の丸・カード本体・︙ が同居し、数 px の差で挙動が変わった)と 同じ種類の事故で、標的が指の下で動くぶん質が悪い。
単発の ToDo アプリが完了項目を下げる/消すのは、その項目が二度と一覧に戻らないから。ここが扱うのは繰り返す習慣だけで、明日も同じ顔ぶれが同じ順で出る。
「まだ残っているのはどれか」はリングが数字で答え、済んだカードは地の色で見分けられるので、 下げなくても困らない。
区画(未完了/完了)をまたがせない並べ替えの分岐も丸ごと消えた。押した座標に同じカードが残ることをテストで固定した。
達成率のリングが答えるのは「今どれだけ進んだか」だけで、 先週より良いのか悪いのかを言わない。
同じ理由で詳細画面はリングをやめて 推移グラフにしてある。とはいえホームに図を並べると要素が増え、v1 の形に戻る。
円は下ほど細るので裾の両脇が空いており、そこは元々使っていなかった。
棒はリングより先に描く(弧の上に重ねると達成率の線が途切れて見える。 小さいリングを円に食い込ませるのをやめたのと同じ理由)。
数え方は達成率と同じ関数に そろえたので、今週 7 本の合計は週リングの分子・分母と一致する。
画面の高さは差し引き 8dp しか増えていない。
足したときの理屈は「週メモは日曜に 1 回書くものなので、水曜に起きたことは月曜に思い出せない」。
実際に使ってみると、埋まらない穴はそこではなく、入力欄が 2 つあること自体が 「どちらに書くのか」を毎日問い直させていた。
書く場所は 1 つでよい。代わりに要るのは「いつ書くのか」の合図で、その週を閉じられるのは日曜のうちだけ (月曜になると対象が先週へ移る)。
平常時と同じ見た目では、その日限りだと画面から読めない。
画面は消したが day_notes テーブルと同期は残した。消すと、まだ旧版が入っている
端末から空の行が pull されて過去のメモが消える。
光らせる色はゴールド(attention)で、赤は取り返しのつかない操作のために取ってある。色だけで伝えないよう 1 行添える。
通知は一瞬で消えるし、既定ではそもそも鳴らない。画面の側でも言えないと、 時刻を決めたことが一覧に出ない。
候補は「枠の色」と「時刻の文字」の 2 つだったが、 枠にはもう空きが無い —「これからやる/済んだ/予定外」で使い切っており、 4 つ目の意味を乗せると状態が掛け算で増える(v1 が 18 状態に膨らんだ形)。
面積が大きいぶん圧も強く、朝 7 時を過ぎた瞬間に並んだ枠が全部変わると画面が警告板になる。期限超過が既に枠に触らずラベルの文字だけをゴールドにしていて、前例もあった。
このカードでは「ゴールド=時間の話」に揃った。これからやる 1 枚にしか出さない (済んだものに「もう時間だ」は用が無い)。
分ごとに刻まず、次の予定時刻ちょうどに 1 回だけタイマーを張る。
Apple ログインの資格情報を Firebase に渡す口を、汎用の
OAuthProvider('apple.com') から Apple 専用 API に変えた。
あわせて、ログインの失敗を「同期できませんでした」と呼ぶのをやめ、 失敗の識別子をそのまま画面に出すことにした。
ログイン済みの行には アカウントのアイコンとアドレス、最終同期の時刻を出す。
きっかけは App Review が build 26 と build 29 を続けて却下したこと。
添付されたのは「同期できませんでした」というスクリーンショット 1 枚で、 ログインで落ちたのか同期で落ちたのかすら読み取れなかった。
entitlement・Firebase のプロバイダ設定・シートの提示先を順に疑って、すべて シロだった。
実機(iPad / iPadOS 26)で追うと、Apple のシートは正常に出て トークンも正しく(audience も nonce も一致)、落ちていたのは Firebase に渡す 1 行だった。
汎用 OAuth の口は Apple には存在しない access_token を付けて送る — Dart の見た目は同じ 2 行なのに、通るネイティブ API が別物だった。
手元で再現できない相手(審査・利用者の報告)から返ってくるのは画面の写真だけで、 そこに識別子が 1 語あるかどうかで原因の絞り込みが変わる、と考えた。
修正後、iPad で Apple ログインから Firestore 同期まで到達を確認。
原因の切り分けに 2 回のリリースサイクルを使ったので、 シロだと確認済みの容疑をコードのコメントに残した (同じ疑いを最初からやり直さないため)。
「押したあと何が起きたのか分からない」という声も同じ根で、 状態名(「同期中」)より誰としてログインしているかを 行の主役に置き換えた。
その日のことを書けるメモを足した。ただし 1 日につき 1 件で、 習慣ごとの自由記述は持たせない。
書く画面は 1 つだけにして、 ホーム(見ている日)・週の振り返り・履歴のどこから開いても同じ画面に送る。
ホームには入力欄を置かず、1 行の入口だけにした。
週のメモは日曜に 1 回書くものなので、水曜に起きたことは月曜には思い出せない。
かといって習慣ごとに書かせると、入力欄が習慣の数だけ増える — v1 の振り返りが壊れたのは大量に入力させたうえ何も保存しなかった ことなので、入力の量が増える方向は選べない。
日に 1 件が最小の単位だと考えた。ホームに入力欄を埋めなかったのは、キーボードが立ち上がるたびにカードの位置が 動くから。
ホームに来る目的はカードを押すことで、書くのはその次にある。
保存ボタンを押さずに戻っても消えないようにした(同じ書き込み口を通す)。削除ボタンは置かず、全部消して保存=消すに一本化している (2 つの操作が同じ結果を作らないため)。
行は tombstone として残すので、 他の端末の古いメモが同期で復活することもない。
繰り返しの決め方を 3 つにした(曜日で決める/週に何回/間隔で決める)。v2 は曜日集合ひとつに畳んでいたが、そこへ「回数」と「間隔」を戻す。
ただし 回数ベースに曜日を一切持たせないことと、 頻度は編集画面にしか出さないことを条件にした (追加フロー・オンボーディング・一括設定は曜日のまま、既定は毎日)。
曜日集合は 1 週間で一巡するので、「週 2 回・曜日は決めない」と 「隔週」「月一回」がどうやっても表せない。
一方 v1 が壊れた原因は 頻度という概念そのものではなく、「週 2 回」を選ぶと暗黙に月・木が入る という隠れた既定値と、それを追加フローに出したことだった。
壊れた原因のほうを禁止すれば、概念は戻せるはずだと考えた。
間隔ベースの次の期限は記録から逆算せず Habit.nextDueDate に持たせた。
逆算すると、記録の窓が 7 日しかない振り返り画面で「一度もやっていない」に落ちて 期限が開始日まで飛ぶ。
列に持てば判定は日付の比較だけで済む。
週 N 回と間隔ベースは達成率の分母に入れない。ただし 「今日」だけは画面のカードそのものを分母にする。
日と週で分母の作り方が違うことになるが、そちらを採った。
週 2 回の習慣を曜日 [1..7] のまま日ごとに数えると、
全曜日で最大 29%(2/7)にしかならない — v1 で実際に起きたバグと同じ形。
だから期間の集計からは外した。ところが実機で確かめたら カードが 1 枚残っているのにリングが 100% と出た。
期間の一貫性より、同じ画面の中で数字と一覧が食い違うことのほうが 直接効くと判断した。
週・月は過去の期限を復元できない(nextDueDate は「今」の値しか持たない)ので
曜日ベースだけを数えたまま。
非対称は残るが、意図した非対称としてコードに書いた。
ホームの円グラフを、大きいもの 1 つ+小さいもの 3 つ(今日・今週・今月)にした。3 つの位置は固定で、選択中だけ 1.25 倍になる。
「今年」は廃止した。
もとは「日 週 月 年」の押せる文字 1 行で、押してみるまで中身が分からなかった。そこで数字を小さい円に出したが、最初は「選択中のものは大きい円に居るので 小さいほうには出さない」形にした。
これが分かりにくいと指摘された — 押すたびに 3 つの中身が入れ替わり、どれを押したのかを動きで復元するしかない。
位置を止めて大きさだけ変えれば、動くのは押したものだけになる。
帯の色に「どの期間か」を持たせた(弧の色は達成率が使い切っているため)。大きい円の帯だけ薄くしてある — 原色のままだと 0% のときに濃い線が一周し、 満ちているように見えた。
「今年」は 1 月なら必ず低く 12 月なら必ず落ち着くだけで、 日々の判断が変わらないので落とした。
詳細画面の「今日」を、状態(1 つだけ・アイコンと大きめの文字)/その状態の意味と操作の場所を書いた 1 行/幅いっぱいの枠付きボタン、の 3 段に分けた。
曜日・リマインダー・目標・計測開始日は 1 枚のカードにまとめ、カード全体を編集画面への入口にして、ヘッダーの鉛筆アイコンは外した。
あわせてリマインダーの通知に習慣名と予定時刻を載せ、タップ先をその習慣の詳細画面にした。計測開始日は編集画面から変えられるようにした(未来は選ばせない)。
「できた/できないのボタンが分かりにくい」という申告を調べたところ、ボタンは 1 つしか無かった。並んでいたのは 状態表示の「できた」 と ボタンの「今日はやらない」 で、同じ行に横並び・違いは文字色だけ。
2 択ボタンに読め、押しても反応しない左半分が壊れて見えていた。設定項目も同じ形で、読むだけの面なのに触っても何も起きないので、壊れているのと区別がつかない。
完了トグルを詳細画面に置かないのは v2 の決めごと(速い経路が隠れるのを防ぐ)だが、置かないと決めたものほど、どこに在るのかを書かないと辿り着けない。
通知も同じで、見出しが習慣名だけ・本文が全習慣共通の 1 行だったため、2 件並ぶとどちらがどの時刻の分か読めなかった。
状態と操作が別の要素になり、状態ごとに「どこで記録するか」が画面に出るようになった。編集への入口は設定カード 1 つに絞れた(同じ行き先の標的が 2 つあると毎回どちらか考えることになる)。
高さを詰めた結果、390×844 以上の端末では日本語・英語・ドイツ語・ポルトガル語のいずれもスクロールなしで最後まで見える(テストで固定)。
4.7 インチではまだ 35〜119dp 残る。通知は「ランニング の時間です/07:30 の予定です」となり、タップでその習慣に着く。
予定時刻はホームの一覧にも出したので、鳴った通知と目の前のカードが結びつく。ついでに 320dp 幅で曜日の丸が 6px、イタリア語の目標ラベルが 17px 溢れていたのを直した(10 言語の溢れ検査に編集・詳細画面を追加して発見)。
ホームのカードを長押しでつかんで上下に運べるようにし、並び順を保存して端末間でも保つようにした。長押しを並べ替えに割り当てたぶん、詳細画面への入口は各カードの ︙ 一本に統一。
地の色は朝・昼・夕・夜でうっすら移ろわせる。アプリアイコンのバッジは、その習慣のリマインダー時刻(未設定なら 18 時)を過ぎた未記録だけを数えるように変えた。
「今日どれから手を付けるか」は本人にしか決められないのに、並びを作成順に固定していたのはアプリ側が段取りを決めている状態だった。
ただし並べ替えのために上下ボタンを足すと 1 行のタップ標的が 3 つになり、v1 が壊れた「数 px の差で挙動が変わる」形に戻る。
長押しは詳細画面へ行く経路だったが、同じ行き先の ︙ が隣に在って経路が 2 本重複していたので、余っている側を並べ替えに回せば標的を増やさずに済むと考えた。
バッジは日付が変わった瞬間に今日の予定ぶんが全部乗る作りで、朝いちばんに最大値が付いて 1 日じゅう減らなかった——まだ誰も何も落としていない時点で「溜まっている」と言う装置になっていた。
並べ替えた順序は日をまたいでも別の端末でも保たれ、追加した習慣は末尾に入る。カード 1 行のタップ標的は記録と ︙ の 2 つのままで増えていない。
バッジは朝は 0 のままで、締切を過ぎたぶんだけ増える形になった。
地の色は 1 日 4 回しか変わらず、動かすのは地だけなので「これからやる 1 枚がいちばん強い」というカードの強弱と、「過去の日を見ているときは暖色」という合図はそのまま保たれている。
v1 の実装を全削除し、繰り返す習慣だけを扱うアプリとして再構築した。完了は 5 段階評価をやめてチェックのみに。
ホーム画面は 1 画面・タブなし・完了経路にモーダルなしとし、行のどこをタップしても 1 タップで完了する形にした。単発 ToDo(やること)と外部 API 連携は廃止。
「毎日確認して完了するアプリなのに、ワンプッシュで完了できないのが苦痛」という申告を調べたところ、ワンタップ記録は v1.4.0 で実装済みだった。
使えなかったのは、ヒット領域が約 34px と推奨の 44/48dp を下回り、別のタップ標的の内側にあって数 px 外すとモーダルが開き、押せると分かる手がかりが無かったため。
つまり機能不足ではなく、同じ動作を書く経路が 5 つに増え、ホーム画面が 18 状態を持ち、手書き UI の約 30% が到達不能なコードになっていた——「何のアプリか」が定まらないまま積層した結果だと判断した。
個別の修正では解けないと考え、作り直しを選んだ。
習慣 3 件の完了が 3〜9+ タップから 3 タップへ。完了経路は 1 つ、ホーム画面の状態は 1 つ、初回体験は 6 画面・約 50 入力から 1 画面に。
手書きコードは 19,896 行から 5,029 行(UI 層は 16,752 → 1,540 行)。達成率の分母を経過日数から予定日に直し、週 2 回の習慣が最大 29% にしかならないバグも解消した。
あわせて、ログインで記録をクラウド保存し機種変更で引き継げる任意のクラウド同期も実装した(未ログインでも全機能そのまま使える)。v2.0.0 で正式リリース
習慣の詳細画面に「週ごと」「曜日別」の達成率グラフを追加し、詳細は閲覧専用・編集は右上へ分離した。ホーム中央の円には曜日と今日の残り時間を表示し、前日を見ているときは「昨日/◯日前」ラベルと横スライドで“いつを見ているか”を明示。
週の振り返りが未了のあいだはホームに振り返りへの入口を出すようにした。
振り返りを月曜から毎日書ける形に(日ごとの感想・自信度・できた要因)/履歴に棒グラフと期間・単位の絞り込み/カードを左へ払うとスキップと詳細
リングの背後に先週・今週の棒グラフ/完了しても並びが動かないように/予定時刻が来たら時刻を強調/毎日のメモを廃止し書く場所を週 1 つに
Apple でログインが通らなかった原因を特定して修正/ログインの失敗を同期の失敗と区別して理由を表示/設定にアカウントのアイコンと最終同期時刻
週N回・隔週・月一回の繰り返し/日ごとのメモを振り返り・履歴で読み返せる形に/円グラフを3つ並べて見比べる形へ
詳細画面の状態と操作を分離/通知に習慣名と予定時刻/計測開始日を変更可能に
長押しで並べ替え/時間帯で変わる地の色/バッジを締切ベースに
曜日・今日の残り時間表示/前日ラベル・スライド遷移/週の振り返り入口
週ごと・曜日別の達成率グラフ/詳細画面を閲覧専用に整理
ゼロベースで再構築(習慣のみ・1 タップ完了・1 画面)/任意クラウド同期
10 言語対応/寒色ナチュラルへ配色刷新(切替式)
やさしいトーンへデザイン刷新/ワンタップ記録
通知・リマインダー修復/リマインダー既定 ON 化
ストリーク・ヒートマップ・達成演出/Web 版公開
容量 45% 軽量化(WebP 化)
初回リリース(3 ビュー・今日の設定・統計・レベルテーマ・通知)
v2 で掲げた残り 3 点——端末間同期・10 言語対応・App Store / APK 公開——はいずれも v2.0.0 で達成した。
ここからは作り足す方向ではなく、決めた形(習慣のみ・1 タップ・1 画面)を守りながら「続ける」を支える改善を重ねる。
やらないと決めたこと:統計の深掘り、グリッド表示の拡張、単発 ToDo。いずれも v1 で複雑さの原因になった側なので、v2 では戻さない。