尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗日本語 · 한국어
ウェブと iOS で同じ単語帳がつながる、ミニマルな単語帳アプリ。
外国語の勉強が好きで、単語アプリをいくつも使ってきました。机ではウェブ、外ではスマホで使うのですが、 同じ単語帳がウェブとアプリの間でつながらないことがずっと不満でした。 そこで、ウェブと iOS で同じ単語帳をリアルタイムに同期し、街で見かけた単語を OCR でその場で保存できる、 自分専用の単語帳を作ることにしました。
地下鉄のように通信が不安定な場所でも学習が途切れないよう、モバイルはオフラインファーストで設計し、 接続が戻ったら差分だけを送ります。単語の登録から復習まで、自分が毎日使うことを前提に作っている進行中のプロジェクトです。
復習セッション。採点は「わからない / 覚えた」の二択だけ。単語帳の編集・全体統計・単語パックのダウンロードもウェブから。
(id, user_id) 複合主キーによるユーザー分離と、Firebase Auth 連携のトークン検証アプリはローカル DB に書いてから差分を push / pull し、ウェブはサーバーを原本として直接 CRUD する。 Firebase は認証だけを担い、データはすべて自前の Hub に置く。
通信量を抑える増分同期の設計:
毎回すべてを送受信する代わりに、ローカルの変更を SyncOutbox に貯めて 100 件単位で push し、
最後の cursor 以降の差分だけを pull する同期パイプラインを構築しました。
データの性質に応じた競合解決: オフライン端末どうしの同期で、通貨やクエストのような累積値が「更新時刻 (updated_at) が新しい方が勝つ」規則によって 消えてしまう問題を特定しました。通貨の計算とクエストの完了判定はサーバーだけが冪等 (idempotent) に行い、 アプリは結果を受け取るだけ、と役割を分けて解決しました。
マルチプラットフォームでのアルゴリズム (SM-2) の一致:
アプリ (Dart) とサーバー (Python) の両方で復習アルゴリズムを計算する際、言語標準の round() の丸め方の違いで
次回復習日がずれる問題を発見しました。丸め規則を統一し、同一のテストベクタを両者で共有することで差異をなくしました。
可用性を優先した意図的なトレードオフ: 同期トランザクション中に FK 違反が起きると cursor までロールバックされ、同じバッチを永久に再試行する膠着状態に陥ります。 これを避けるため FK を無効にし、アプリ側で整合性を保証する方針とその根拠を文書に残しました。
nyaki/
├── app/ Flutter アプリ
├── web/ Next.js ウェブ
├── api/ Sync Hub (FastAPI + Postgres)
└── docs/ アーキテクチャ · タスク · 企画
# サーバー — 環境変数の詳細は api/README.md
cd api && docker compose up --build # http://localhost:8000/docs
# ウェブ
cd web && npm install && npm run dev # http://localhost:3000
# アプリ
cd app && flutter pub get && flutter run
cd api && pytest # 同期 · SRS · ゲーミフィケーション · コンテンツ
cd app && flutter test # SM-2 の計算 · 進捗リポジトリ
| ドキュメント | 内容 |
|---|---|
| docs/API.md | API 仕様 · 書き込みルール · 同期 · 上限 (韓国語) |
| docs/archive/ | 保管文書 — アーキテクチャ · タスク · テスト · 過去の企画 (韓国語) |
| api/README.md | ローカル実行 · 環境変数 · デプロイ手順 |