記事一覧に戻る
プロダクト開発2026年4月22日8分

プロダクティビティアプリ「ENSO」を個人開発した話

なぜ作ったのか

タスク管理、ポモドーロ、日記、目標管理——それぞれに良いアプリはある。でも全部バラバラだった。

アプリをいくつも行き来しながら、管理すること自体が目的になっていく。そんな状態を解決するために、「目標→実行→振り返り」のサイクルが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箇所で活用している。

  1. TASK — AI目標分解:目標テキストを入力するとマイルストーン+タスクを自動生成
  2. JOURNAL — AI日記生成:その日のアクティビティログを元に日記文章を自動作成

こだわった設計

タイマー中は設定を開けない

FOCUSでタイマー実行中は設定画面を開くとタイマーがリセットされる。これは意図的な仕様で、「集中を途切れさせない」ための設計だ。

環境音の種類変更はタイマー中でもアイコンタップで切り替えられる専用UIを用意した。

ナビゲーションはすべてSPA遷移

<a href="..."> による絶対URLでのページ遷移は禁止し、すべてNext.jsの <Link> コンポーネントを使用している。フルリロードによるログアウト状態の表示を防ぐためだ。

デザイン:絵文字NG・SVGアイコン統一

UIに絵文字を使わず、すべてインラインSVGアイコン(カラー付き)で統一している。OSやブラウザによって絵文字の見た目が変わるため、ブランドの一貫性を保てないからだ。


開発して学んだこと

「繋がり」こそがプロダクトの価値になる。

個々のアプリの機能は他にも優れたものがある。ENSOが差別化できるのは、アプリ間の連携によって生まれる「流れ」だ。TASKからFOCUSへ、FOCUSからJOURNALへ——この導線が自然になるほど、ユーザーは意識せずにサイクルを回せるようになる。

機能を足すより、繋ぎ方を設計することの方が難しく、面白い。


使ってみてください

ensolife.app

アカウント登録不要、完全無料。Googleでログインすると全デバイスに同期されます。

フィードバックがあればXで声をかけてもらえると嬉しいです。

他の記事も読む

記事一覧を見る