Back to Blog
App Dev Study

宿題を制する
Shukudaist

3年生になってから、課題の量が急増した。 量子力学、統計力学、電磁気学、解析力学——それぞれに問題集とレポートが課され、 中国語の予習まで加わると、「今週何が締め切りだっけ」という状態になりがちだ。

Notionに書いていた時期もある。Todoistも試した。でも、どれも大学の時間割と課題の関係を うまく表現できなかった。授業単位で課題を管理したい。 ポモドーロタイマーも一緒に使いたい。所要時間の実績から予測も出してほしい。 そういう欲張りな要件を全部満たしてくれるアプリは存在しなかったので、作ることにした。

名前は Shukudaist。宿題(Shukudai)+ ist。課題主義者、みたいなニュアンスで。

Shukudaist を使ってみる

時間割を起点にする

多くの課題管理アプリは「タスクのリスト」から始まる。 でも大学生の課題は本質的に「授業」に紐づいている。 だから Shukudaist は 時間割グリッドを中心 に設計した。

時間割画面 — 各コマに未完了課題数のバッジが表示される

セルをタップすると授業名・教室・教員名を登録できる。 登録済みのコマには未完了課題数がバッジで表示され、 期限が3日以内に迫ると赤くなる仕組みだ。 時間割を見ながら「この授業、やばいな」と一目でわかる。

課題一覧と予測所要時間

課題一覧画面では、期限が近い順に未完了課題を並べる。 難易度(やさしい・ふつう・むずかしい)と見積もり時間を一緒に登録できるので、 「今日の残り2時間で何に手をつけるか」の判断がしやすい。

課題一覧画面 — 期限・難易度・予測所要時間が一覧表示される

面白いのが 予測所要時間 の機能だ。 過去の同じ授業×課題種類(例:統計力学の問題集)の作業実績を蓄積し、 直近6件の加重平均から次回の所要時間を自動計算する。 新しい記録ほど重みが大きくなる設計にしたので、 徐々に精度が上がっていく。

「統計力学の問題集、毎回60分で見積もっているのに実際は70分かかっている」 ——そういう自分の癖を数字で直視させてくれる。

タイマー3モード

勉強中のツールとして、タイマーは欠かせない。 Shukudaist のタイマーは3つのモードを持つ。

🍅 ポモドーロ

25分作業→5分休憩を繰り返す。4セット後に長休憩。作業時間・休憩時間はカスタマイズ可能。

⏱ カウントダウン

「あと1時間でこの問題集を終わらせる」という使い方。1〜180分で自由に設定できる。

⏲ ストップウォッチ

実際にかかった時間をそのまま計測。完了ボタンを押すと作業記録として自動保存される。

📋 課題連携

タイマーを起動するときに課題を選択。完了と同時に作業時間が履歴に積み上がる。

タイマー画面 — ポモドーロ・カウントダウン・ストップウォッチを切り替えられる

カレンダーと統計

課題の期限はカレンダーにも表示される。月表示・週表示を切り替えられ、 期限が近い課題は色分けされたチップで視覚的に把握できる。 「来週のどこかで集中して終わらせる」という計画が立てやすい。

カレンダー画面 カレンダー
統計画面 統計

統計画面では累計学習時間・完了課題数に加え、 見積もり精度(平均誤差率)を科目別に確認できる。 「自分は統計力学の問題集をいつも17%オーバーしている」という事実は、 市販のアプリには出てこないパーソナルなデータだ。

その他の細かいこだわり

データは Supabase に保存しているので、PCでもスマホでも同じ課題リストが見られる。 どの端末からアクセスしても続きから使えるのは、実際に使ってみると思っていた以上に快適だった。 スマートフォンでの片手操作を考慮し、タップターゲットはすべて44px以上を確保した。

「統計力学 / 問題集 / 第N回」のような 連番課題テンプレート も実装した。 毎週出る問題集を登録するとき、「第5回」を自動で補完してくれる地味だが便利な機能だ。

課題一覧をそのままマークダウンでコピーできる機能もある。 Obsidian に貼り付けると、週次レビューが少しだけラクになった。

技術スタック

React 19 TypeScript Vite Tailwind CSS v4 Zustand React Router v7 date-fns Supabase

データの永続化には Supabase を使った。 PostgreSQLベースのデータベースをホスティングしてくれるサービスで、 フロントエンドから直接クエリを発行できる。 サーバーのコードを書かずに複数端末間の同期が実現できるのが大きい。

状態管理はZustandで統一した。課題・時間割・履歴・タイマー・設定、それぞれに Storeを分離し、Supabaseとの非同期同期を整理している。 フロントエンドはVercelにデプロイしているので、インフラの運用コストはほぼゼロだ。

これから

今の v1 でも十分に使えているが、いくつか追加したい機能はある。 JSONエクスポートによるデータバックアップ、毎週繰り返す課題の自動生成、PWA対応——。 ただ、機能を増やすより今の使い勝手を磨く方が先だとも思っている。

自分のために作ったアプリは、毎日使うことで育つ。 しばらく自分が最初のユーザーとして使い倒していくつもりだ。

Shukudaist を使ってみる
Back to Blog