aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shared
AgeCommit message (Collapse)Author
2026-05-02refactor(notes): extract card generation into shared modulensfisis
Pull pure card-generation logic (template rendering and the initial FSRS state for new cards) out of the server note repository into src/shared/card-generator.ts so both server and client can call it. The server's note.create / createMany now delegate the rendering work to the shared function and only insert the resulting payload, preserving the existing behavior. Groundwork for offline-first note CRUD on the client. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02feat(study): submit reviews offline via IndexedDBnsfisis
Move FSRS scheduling to a shared module so the client can compute next card state without contacting the server. StudyPage now writes the updated card and review log straight to IndexedDB and lets the existing sync engine push them on reconnect, instead of POSTing to /api/decks/:deckId/study/:cardId. Online sessions still trigger a sync immediately so server-side aggregates stay fresh; offline sessions accumulate in pendingCountAtom until the next online tick. The legacy study POST route is preserved for backwards compatibility. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-02-04fix(study): use 3 AM boundary for counting today's new card reviewsnsfisis
countTodayNewCardReviews was using midnight (0:00) as the start of day, inconsistent with the 3 AM study day boundary used elsewhere. Reviews between 0:00-3:00 AM were incorrectly counted as the next day's budget. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02fix(study): use date-based comparison with 3 AM boundary for due cardsClaude
Instead of comparing due timestamps exactly (card.due <= now), compare against the next 3 AM boundary so all cards due within the current study day appear at once. This prevents new cards from trickling in throughout the day when FSRS fuzz spreads due times. https://claude.ai/code/session_01FeDztLcyGofd6nxh8ct7a3