3385 文字
17 分
早起きして本を読もうと思ったのに読めない人向けに、目覚ましを「関所」にするアプリ「sekimori」を作って公開した
この記事について

Claude(Anthropic)との共同編集により作成されました。

要約
  • 朝いちばんに必ず通る動線=目覚ましを、やりたいことの第一関門にする Android アプリ「sekimori」を作って、Google Play で公開した
  • 早起きしても本を読めない理由は、「必要なこと」を先に片づけるか、SNSや動画でだらだらするかの二通り。正反対だが、やりたいことが最後に回る結果は同じ
  • 止めた瞬間にカウントが始まり、他アプリへ切り替えるとフルリセット。時間ぶん向き合ってはじめて「手形」が押せる
  • OS ブロックも、鳴り続ける強制も使っていない。禁止ではなく順番で解くアプリにした
  • 夜の関だけは手形を押さなくていい。押されなかったこと自体を通過の証拠として扱う
  • 紹介ページは /sekimori/。入手は Google Play から

朝、本を読もうと思って早起きしたはずなのに、気づいたら出かける時刻になっていた。そういう朝の話をする。

名前は sekimori(関守)。目覚ましなのに関所という、説明しづらいアプリを作って Google Play で公開した。


作った動機 — やりたいことが、いつも最後に回される#

作りながら気づいたのは、朝に辿り着けない理由が正反対の二通りあることだった。

ひとつは、「必要なこと」を先に片づけてしまう道。メールを返し、ニュースを読み、モーニングページを書く。どれも「やっておいたほうがいいこと」で、実際やると気分がいい。義務をひとつ消化した満足で放電して、本を開く前に燃料が尽きる。踏み台のつもりだった準備が、いつのまにか終着駅になっている。

もうひとつは、SNSや動画でだらだらしてしまう道。こちらは自覚もあるし、罪悪感もある。前者とは真逆の詰まり方に見える。

それでも、やりたいことが最後に回されて、そこまで燃料がもたないという結果は同じだった。だから解くべきは「自分がどちらのタイプか」ではなく、順番のほうだと考えた。片方は真面目さの副作用で、もう片方は意志の弱さに見えるけれど、置かれている位置は同じだ。

もうひとつ壊れていたのが、トリガーの選び方だった。やりたいことを「早起きできた朝」に紐づけていたので、早起きが外れた日は動線全体が発火しない。一方、目覚ましだけはほぼ確実に毎朝通っている。関所は、人が必ず通る道の上にしか置けない。だから習慣アプリではなく目覚ましアプリとして設計して、トリガー問題そのものを消した。


仕組み — 鳴る / 止める / カウント / 手形#

sekimori 手形画面 — 時間ぶん経ってようやく解放される五角形の手形ボタン

前夜に、時刻とやりたいことと所要時間を決めておく(例: 06:00 / 読書 / 25分)。あとは朝、これだけ。

  1. 設定時刻に一回だけ鳴る。スヌーズはない
  2. スワイプで止める。止めた瞬間にカウントが始まる
  3. カウント中に他アプリへ切り替えるとフルリセット。画面 OFF と伏せ置きは OK
  4. 25分と決めたら25分経つまで、手形ボタンはグレーで押せない
  5. 押すと、カレンダーに通行手形が1個増える

キモは 2 と 4 で、どちらも抜け道を潰すために置いている。止めて放置できると目覚ましに戻ってしまうし、いつでも押せる手形は記録として嘘になる。手形が安いと、カレンダーを見ても何も感じなくなる。

離脱判定は Android の AppStatebackground になった時に PowerManager.isInteractive() を見て決めている。false(画面 OFF)なら継続、true(画面は点いたままバックグラウンド=他アプリへ行った)ならリセット。カウントは実時計時間で進むので、画面を消して机に向かっても正しく減る。React Native(Expo)製で、アラーム本体だけは AlarmManager.setAlarmClock を叩くネイティブモジュールを自前で書いた。


採らなかった選択肢#

このアプリでいちばん時間を使ったのも、やはり足さない判断のほうだった。

OS レベルのアプリブロックは採っていない。 技術的にまず無理で、iOS は自アプリを Guided Access に入れられないし、Android の画面ピン留めも device-owner がなければ脱出できる。ただ、調べているうちに技術以前の話だと思うようになった。強制で解くと、それは自分の意志の記録ではなくなる。だから強制力は、「離脱したらやり直し」の一本に絞った。Forest と同じ考え方で、やり直しの痛みを罰の代わりに置いている。

鳴り続ける強制もしない。 サイレンが鳴っている横で本は読めないので、「音を止めること」と「今日の関を通ること」を分離した。音は自由に止めていい。でも今日の関は、手形を押すまで開かない。鳴るのは Ringing 状態のときだけで、カウントに入ったあとは何も鳴らない。

スヌーズも置かなかった。 朝の意志薄弱を救済しない、というより、スヌーズは関の入口を後ろへずらす仕組みなので関所と相性が悪い。代わりに入れたのが予備鈴で、これは本鈴の5分前に一度だけ鳴らす鈴。関の時刻は動かさずに手前へ1回足すだけなので、止めてもカウントは始まらず記録にも触れない。ドッグフーディングしていて「本鈴の瞬間はまだ覚醒しておらずカウントの立ち上がりが鈍い」と気づいて足した。


夜の関で、設計が一回ひっくり返った#

朝の関と夜の関 — 通すための関と、閉じるための関

夜の詰まり方は、朝と同じ形をしている。早く寝たほうがいいと分かっているのに、動画やSNSを見すぎるか、必要なことをやりすぎるかで、寝る時刻が後ろへずれていく。ここでも理由は正反対で、結果は同じだ。

同じ形なら同じ仕組みでいけるだろうと思って、朝の関をそのまま夜にも置いた。効かなかった。

朝の達成は「起きて、やった」という能動的な行為なので、手形の押下が記録として正しい。ところが夜に達成したいのはスマホを置くことで、何もしないことが成功になる。ここで押下を必須にすると転倒が起きる。

正しく通過した夜ほど、記録に残らない。

端末を置いて寝た人が失敗扱いになり、寝る前にアプリを開いた人が成功扱いになる。実際に自分で数日踏んで、朝の設計をそのまま夜に持ってきたのが間違いだったと分かった。

だから夜だけ、押されなかったこと自体を通過の証拠として扱うことにした。カウント完了後に手形を押さないまま1時間経てば、自動で手形が押される。判定に使うのは時間経過だけで、端末の使用実態は見にいかない。Ready 画面を見に来ただけで失格にするのは厳しすぎる。

実装は遅延評価にしている。1時間後にアプリが前面にいる保証はない(というか寝ている)ので、Ready に到達した時点で保留レコードを永続化しておいて、次の起動やフォアグラウンド復帰で遡って成立させる。翌朝アプリを開いた瞬間に前夜の手形が載っていればいい、という割り切りで、無音アラームで叩き起こす案は捨てた。

そこまで来ると、夜からもっと外すものが出てきた。想定より早く寝入って本鈴を止められない夜がある。鳴りっぱなしは就寝を破壊するが、その夜は実際にはスマホを使っていない=夜の関の達成条件を満たしている。なので夜だけ、止めなくても1分で自ら鳴り止み、その夜を通過扱いにするオプションを入れた。同じ理由で、再アラームも寝ぼけ防止の複雑な停止操作も夜からは撤去した。どれも「起こす」ための道具で、置いて離れて寝るのが正解の夜とは向きが逆だった

夜の関は結果として「起こさない目覚まし」になった。目覚ましの定義を半分捨てたことになるが、守りたかったのは目覚ましではなく朝と夜の境界のほうだったので、これでいいと思っている。


実装で踏んだ、思想と地続きのバグ#

夜のセッションは日を跨ぐのが常態だ。ここで一度、実機で気持ちの悪いことが起きた。

23:30 に鳴らして40分カウントすると、手形を押すのは翌 00:10 になる。押した時刻で日付を決めていたので、23:30 に始めた夜の手形が翌日のマスに載った。カレンダーを見ると、寝た夜が空欄で、翌朝に手形がある。

直し方は、手形の日付を押下時刻ではなく本鈴が鳴った時刻の日付に帰属させること。カウント完了時点で決めてもいけない(それでも日を跨ぐ)。通過率を出すときの分母(アラームが発火した日)も同じ日付で書いて、手形と分母が同じ日を指すようにした。

「4時を論理的な日の境界にする」案も検討して、捨てた。境界を入れるとカレンダーの日付と手形の日付が食い違う説明コストを永久に背負うのに対して、得られるのは深夜アラームの体感一致だけで割に合わない。


これまでのアプリとの関係#

tobarisoutenema はブラウザで完結する Web アプリ、tanzakuchigusa が Android ネイティブで、sekimori はネイティブの3本目になる。

今回いちばん降りたのはアラームの発火まわりだった。expo-notifications 単体だと USAGE_NOTIFICATION 固定でサイレントモードを貫通できないし、Doze 下の発火タイミングも setAlarmClock より弱い。目覚ましとして「セット時刻に確実に一回鳴る」が満たせないなら他が全部無駄になるので、そこだけは Kotlin に降りた。作り始める前に、実機で鳴るかどうかだけを検証するスパイクを書いた。

収益まわりは tanzaku / chigusa と揃えていない。バナーではなく、カウント開始時に一度だけ広告を出す構成にした。スマホを見ていない時間に出て、操作不要で数秒後に自ら閉じる。鳴動中に出すのは論外(止める操作を塞ぐ)だし、カウント中に出すと AppState が動いてリセットを誤発火させるので、置ける場所が実質そこしかなかった。プレミアム(月額 ¥150)で消えるのはその広告だけで、目覚ましとしての機能と手形の振り返りは全部無料。


おわりに#

「必要なこと」より先に、本当にやりたいことを通す。

sekimori はそれだけのアプリ。禁止するのではなく、順番を変える。何も禁じないかわりに、やりたいことを先に通す。通ったら手形が出て、カレンダーに残る。連続を崩したくない気持ちが、翌朝の燃料になる。

作りながら思ったのは、意志の弱さを補う道具はたくさんあるのに、やりたいことが最後に回されるという詰まり方そのものに効く道具はあまりないな、ということだった。原因が義務でも娯楽でも、置かれている位置は同じなので。朝でも夜でも、同じ詰まり方をしている人は試してみてほしい。

紹介ページは /sekimori/、入手は Google Play から。 不具合や要望は hiranorm.support@gmail.com まで。

早起きして本を読もうと思ったのに読めない人向けに、目覚ましを「関所」にするアプリ「sekimori」を作って公開した
https://yurudeep.com/posts/essay/2026/20260824/
作者
ひらノルム
公開日
2026-08-24
ライセンス
CC BY-NC-SA 4.0