Skip to content
GitSumitoPublic

About

SM-2 間隔反復フラッシュカードアプリ(Next.js 15 / Prisma / PostgreSQL)。キーボードだけで学習できる

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Kioku

SM-2 アルゴリズムによる間隔反復フラッシュカードアプリ。キーボードだけで、めくる → 評価する → 次のカード、を素早く回せます。

Kioku のダッシュボードと学習画面(ライト・ダーク)

使用感

ダッシュボードから学習を始め、Space でめくって 1〜4 で評価する様子

学習はキーボードだけで完結します(デモ画像は、ローカルのデモデータで実際のアプリを操作したものです)。

キー 動作
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

ローカル開発手順

前提条件

  • Bun がインストール済み
  • Docker がインストール済み
  • Google Cloud Console でのOAuthアプリ設定
  • Cloudinary アカウント

1. リポジトリのクローン

git clone https://github.com/GitSumito/kioku-oss.git
cd kioku-oss

2. 環境変数の設定

cp .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シークレット

3. Google OAuth 設定

  1. Google Cloud Console を開く
  2. 新しいプロジェクトを作成(または既存を選択)
  3. APIとサービス → 認証情報 → 認証情報を作成 → OAuth クライアント ID
  4. アプリケーションの種類: ウェブアプリケーション
  5. 承認済みの JavaScript 生成元: http://localhost:3000
  6. 承認済みのリダイレクト URI: http://localhost:3000/api/auth/callback/google
  7. クライアントIDとシークレットを .env.local に設定

4. 依存関係のインストール

bun install

5a. Docker でデータベースのみ起動(推奨)

docker compose up -d db

マイグレーションを実行:

bun db:migrate

サンプルデータを投入(任意):

bun db:seed

注意: サンプルデータは demo@example.com というデモユーザーのものです。ログインは Google 認証のみなので、そのままでは画面に表示されません。自分のアカウントで確認したい場合は、いちど Google でログインしてユーザーを作成してから、prisma/seed.ts の email を自分のメールアドレスに書き換えて bun db:seed を実行してください。

開発サーバーを起動:

bun dev

ブラウザで http://localhost:3000 を開く。

5b. 全スタックを Docker で起動

docker compose up

※ この場合、コンテナ内でマイグレーションを手動実行する必要があります:

docker compose exec app bun db:migrate

開発コマンド

bun dev          # 開発サーバー起動 (Turbopack)
bun build        # 本番ビルド
bun test         # テスト実行
bun test:watch   # テストをウォッチモードで実行
bun db:migrate   # DBマイグレーション
bun db:seed      # サンプルデータ投入
bun db:studio    # Prisma Studio を開く
bun lint         # ESLint

SM-2 アルゴリズム

評価ごとの次回の復習時期(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 run

SM-2、連続学習、統計、学習セッションの状態遷移、キーボード操作のマッピング、Server Actions などを検証します。日付の集計はローカルの日付で行うため、テストは UTC でも日本時間でも通ります(過去に、UTC+9 で日別集計が 1 日ずれる不具合があり、修正済みです)。

Vercel デプロイ

# 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を使用してください。

ライセンス

MIT

About

SM-2 間隔反復フラッシュカードアプリ(Next.js 15 / Prisma / PostgreSQL)。キーボードだけで学習できる

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages