SM-2 アルゴリズムによる間隔反復フラッシュカードアプリ。キーボードだけで、めくる → 評価する → 次のカード、を素早く回せます。
学習はキーボードだけで完結します(デモ画像は、ローカルのデモデータで実際のアプリを操作したものです)。
| キー | 動作 |
|---|---|
Space |
カードをめくる(タップでも可) |
1 2 3 4 |
Again / Hard / Good / Easy で評価(めくった後に有効) |
⌘Z / Ctrl+Z |
直前の評価を取り消す |
評価ボタンには、その評価を選んだ場合の次回の復習時期(「明日」「14日後」「1ヶ月後」など)が出るので、迷ったときの目安になります。復習が必要なカードは、ダッシュボードの「今日の復習」と、デッキごとのバッジで分かります。
![]() ダッシュボード 復習待ち・連続日数・7日間の復習予報・30日の学習記録 |
![]() デッキ一覧 デッキごとの復習待ち枚数 |
![]() 学習(表) 進捗バーつき |
![]() 学習(裏・評価) 次回の復習時期つき |
![]() デッキの詳細 カード一覧・エクスポート/インポート |
![]() 統計 定着率の推移・復習回数 |
![]() カードの追加 テキスト+画像(貼り付け可) |
![]() ダークモード システム設定に連動 |
スクリーンショットは、ローカルの空のデータベースにデモ用のデッキ(英単語・数学公式・日本史)と学習履歴を入れて撮影したものです。
- SM-2 による間隔反復: 評価に応じて、次回の復習時期を自動で決めます(詳細は下記)
- キーボード中心の学習セッション: めくる・評価・取り消しをすべてキー操作で。進捗バーつき
- ダッシュボード: 復習待ち枚数、今日の学習数、連続学習日数、1日の目標(初期値20枚。ブラウザに保存)、7日間の復習予報、30日の学習記録(ヒートマップ)
- デッキ・カード管理: 作成・編集・複製・削除。カードはテキストと画像(クリップボードから貼り付け可。画像は Cloudinary に保存)、タグ、参考URLつき
- CSV / TSV のエクスポート・インポート(Anki のタブ区切り形式にも対応)と、ヘッダーのカード検索
- 統計: 復習回数、平均評価、習得率、30日間の定着率の推移(7日移動平均つき)、カードごとの難易度ヒートマップ
- Google 認証(NextAuth.js v5)、ダークモード、モバイル・PC 両対応
- フレームワーク: Next.js 15 (App Router) + TypeScript
- スタイリング: Tailwind CSS v4 + shadcn/ui
- データベース: PostgreSQL + Prisma ORM
- 認証: NextAuth.js v5 (Auth.js) - Google OAuth
- 画像: Cloudinary
- テスト: Vitest(
lib/の純関数とactions/の Server Actions。UI コンポーネントは対象外) - コンテナ: Docker + docker-compose
git clone https://github.com/GitSumito/kioku-oss.git
cd kioku-osscp .env.local.example .env.local.env.local を編集して各値を設定:
| 変数名 | 説明 |
|---|---|
DATABASE_URL |
PostgreSQL接続URL(Docker使用時はデフォルト値でOK) |
AUTH_SECRET |
NextAuth用シークレット(openssl rand -base64 32 で生成) |
AUTH_GOOGLE_ID |
Google OAuth クライアントID |
AUTH_GOOGLE_SECRET |
Google OAuth クライアントシークレット |
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME |
Cloudinary クラウド名 |
CLOUDINARY_API_KEY |
Cloudinary APIキー |
CLOUDINARY_API_SECRET |
Cloudinary APIシークレット |
- Google Cloud Console を開く
- 新しいプロジェクトを作成(または既存を選択)
- APIとサービス → 認証情報 → 認証情報を作成 → OAuth クライアント ID
- アプリケーションの種類: ウェブアプリケーション
- 承認済みの JavaScript 生成元:
http://localhost:3000 - 承認済みのリダイレクト URI:
http://localhost:3000/api/auth/callback/google - クライアントIDとシークレットを
.env.localに設定
bun installdocker compose up -d dbマイグレーションを実行:
bun db:migrateサンプルデータを投入(任意):
bun db:seed注意: サンプルデータは
demo@example.comというデモユーザーのものです。ログインは Google 認証のみなので、そのままでは画面に表示されません。自分のアカウントで確認したい場合は、いちど Google でログインしてユーザーを作成してから、prisma/seed.tsのbun db:seedを実行してください。
開発サーバーを起動:
bun devブラウザで http://localhost:3000 を開く。
docker compose up※ この場合、コンテナ内でマイグレーションを手動実行する必要があります:
docker compose exec app bun db:migratebun dev # 開発サーバー起動 (Turbopack)
bun build # 本番ビルド
bun test # テスト実行
bun test:watch # テストをウォッチモードで実行
bun db:migrate # DBマイグレーション
bun db:seed # サンプルデータ投入
bun db:studio # Prisma Studio を開く
bun lint # ESLint評価ごとの次回の復習時期(lib/spaced-repetition.ts):
| 評価 | 動作 |
|---|---|
| Again (1) | 翌日にリセット(EF は変えない) |
| Hard (2) | EF を下げ、間隔は控えめに延ばす |
| Good (3) | 標準の EF・間隔で計算 |
| Easy (4) | EF を上げ、間隔を長めに延ばす(×1.3、最低4日) |
間隔は、新規カードは 1 日 → 次は 6 日 → 以降は「直前の間隔 × EF」です(EF の下限は 1.3)。
bun test # または npx vitest runSM-2、連続学習、統計、学習セッションの状態遷移、キーボード操作のマッピング、Server Actions などを検証します。日付の集計はローカルの日付で行うため、テストは UTC でも日本時間でも通ります(過去に、UTC+9 で日別集計が 1 日ずれる不具合があり、修正済みです)。
# Vercel CLI でデプロイ
bunx vercel
# 環境変数を設定
bunx vercel env add DATABASE_URL
bunx vercel env add AUTH_SECRET
bunx vercel env add AUTH_GOOGLE_ID
bunx vercel env add AUTH_GOOGLE_SECRET
bunx vercel env add NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME
bunx vercel env add CLOUDINARY_API_KEY
bunx vercel env add CLOUDINARY_API_SECRET
# 本番デプロイ
bunx vercel --prod注意: Vercelデプロイ時はPostgreSQLにNeon等のサーバーレスDBを使用してください。









