なぜ作ったのか
タスク管理、ポモドーロ、日記、目標管理——それぞれに良いアプリはある。でも全部バラバラだった。
アプリをいくつも行き来しながら、管理すること自体が目的になっていく。そんな状態を解決するために、「目標→実行→振り返り」のサイクルが1つに繋がったエコシステムを作ることにした。
それが ENSO(円相) だ。禅の「円」を由来に、終わりのない成長サイクルをコンセプトにしている。
プロダクト概要
ensolife.app — 4つのアプリが連携して動くプロダクティビティエコシステム。
| アプリ | 機能 | |--------|------| | ENSO TIMER | 人生の残り時間を可視化。目標をカウントダウンで管理 | | ENSO TASK | 目標 → マイルストーン → タスクに分解。AI自動分解機能付き | | ENSO FOCUS | ポモドーロタイマー。環境音・タスク連携・フルスクリーン集中モード | | ENSO JOURNAL | 集中記録・完了タスクが自動で日記に。AI日記生成・3年日記機能 |
アプリ間の連携が核心で、TASKで選んだタスクをそのままFOCUSで集中開始でき、終わったセッションはJOURNALに自動記録される。
技術スタック
Framework: Next.js 16 (App Router)
Language: TypeScript
Styling: Tailwind CSS 4
Auth: Supabase Auth (Google OAuth)
Database: Supabase Postgres
Realtime: Supabase Realtime
AI: Claude API (Anthropic)
Hosting: Vercel
i18n: 4言語対応(ja / en / zh / ko)
ストレージ設計
オフラインファーストのデュアルライト構成を採用した。
- 未ログイン時:localStorageのみで完全動作
- ログイン時:localStorage + Supabase にデュアルライト
- タブ間・デバイス間はSupabase Realtimeでリアルタイム同期
この設計により「アカウント登録なしで今すぐ使える」を実現しつつ、ログインすれば全デバイスで同期できる体験を両立させた。
AI機能
Claude APIを2箇所で活用している。
- TASK — AI目標分解:目標テキストを入力するとマイルストーン+タスクを自動生成
- JOURNAL — AI日記生成:その日のアクティビティログを元に日記文章を自動作成
こだわった設計
タイマー中は設定を開けない
FOCUSでタイマー実行中は設定画面を開くとタイマーがリセットされる。これは意図的な仕様で、「集中を途切れさせない」ための設計だ。
環境音の種類変更はタイマー中でもアイコンタップで切り替えられる専用UIを用意した。
ナビゲーションはすべてSPA遷移
<a href="..."> による絶対URLでのページ遷移は禁止し、すべてNext.jsの <Link> コンポーネントを使用している。フルリロードによるログアウト状態の表示を防ぐためだ。
デザイン:絵文字NG・SVGアイコン統一
UIに絵文字を使わず、すべてインラインSVGアイコン(カラー付き)で統一している。OSやブラウザによって絵文字の見た目が変わるため、ブランドの一貫性を保てないからだ。
開発して学んだこと
「繋がり」こそがプロダクトの価値になる。
個々のアプリの機能は他にも優れたものがある。ENSOが差別化できるのは、アプリ間の連携によって生まれる「流れ」だ。TASKからFOCUSへ、FOCUSからJOURNALへ——この導線が自然になるほど、ユーザーは意識せずにサイクルを回せるようになる。
機能を足すより、繋ぎ方を設計することの方が難しく、面白い。
使ってみてください
アカウント登録不要、完全無料。Googleでログインすると全デバイスに同期されます。
フィードバックがあればXで声をかけてもらえると嬉しいです。