aboutsummaryrefslogtreecommitdiffhomepage
AgeCommit message (Collapse)Author
2026-02-05feat: bump version to 0.4.4v0.4.4nsfisis
2026-02-05feat(study): add undo support for card reviewsnsfisis
Defer API submission of reviews by storing them as pending. The previous pending review is flushed when the next card is rated, and on unmount via fire-and-forget. Undo discards the pending review and returns to the previous card without any API call. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05Merge pull request #12 from nsfisis/claude/fix-build-errors-Lqijlnsfisis
Include shared source directory in Docker builds
2026-02-04fix(docker): add missing src/shared directory to build contextsClaude
Both server and client code import from src/shared/date, but the Dockerfiles only copied their respective src/server or src/client directories, causing the build to fail with missing module errors. https://claude.ai/code/session_01FCGM9USwv6qmWQ7ACk9PEG
2026-02-04chore: bump version to v0.4.3v0.4.3nsfisis
2026-02-04refactor(db): remove unused findNewCards from localCardRepositorynsfisis
Co-Authored-By: Claude Opus 4.5 <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-04fix(study): apply 3 AM boundary to study API card queriesnsfisis
findDueNewCardsForStudy and findDueReviewCardsForStudy were still using lte(cards.due, now) while findDueCards and countDueCards had been updated to use the study day boundary in d4489f2. This caused inconsistency between the displayed due count and actual cards returned by the study API. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04chore(deps): update dependencies and pin JWT algorithmnsfisis
Update all dependencies to latest patch/minor versions. Explicitly specify HS256 algorithm in JWT verify to prevent algorithm confusion attacks. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04feat(deps): migrate atomFamily from jotai/utils to jotai-familynsfisis
Replace built-in jotai atomFamily with jotai-family package for better parameter-based atom family support. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04feat(study): enforce newCardsPerDay limit in study APInsfisis
Split due card fetching into new cards and review cards, applying the deck's newCardsPerDay limit to new cards while leaving review cards unrestricted. New cards are placed before review cards in the response. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04refactor(ui): remove card count from note group headernsfisis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04refactor(ui): replace LoadingSpinner with skeleton fallbacks in Suspensensfisis
Reduce layout shift during data loading by using content-shaped skeleton placeholders instead of generic spinners in DeckDetailPage, DeckCardsPage, and StudyPage. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02Merge pull request #11 from nsfisis/claude/investigate-learning-schedule-plOdQnsfisis
Implement study day boundary at 3:00 AM for due card logic
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
2026-02-01feat: bump version to 0.4.2v0.4.2nsfisis
2026-02-01fix(pwa): fix broken testsnsfisis
2026-02-01feat(pwa): add iconsnsfisis
2026-02-01feat(study): enable FSRS fuzz for due date variationnsfisis
Prevent cards with similar intervals from always appearing on the same day by enabling ts-fsrs built-in fuzz factor. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01feat(study): add Space key as Good rating shortcut when card is flippednsfisis
Allow continuous study flow by pressing Space repeatedly - first to flip the card, then to rate as Good (3). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01refactor(atoms): migrate to jotai-tanstack-query from custom reloadable atomsnsfisis
Replace custom createReloadableAtom/createReloadableAtomFamily with atomWithSuspenseQuery from jotai-tanstack-query, leveraging TanStack Query's built-in caching, invalidation, and Suspense support. - Add @tanstack/query-core and jotai-tanstack-query dependencies - Create shared QueryClient instance (src/client/queryClient.ts) - Migrate all data atoms (decks, cards, study, noteTypes) to atomWithSuspenseQuery - Update page components to use .data destructuring and queryClient.invalidateQueries() - Update all test files to use QueryClient for data hydration - Remove src/client/atoms/utils.ts (no longer needed) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31feat(cards): add search filtering to deck cards pagensfisis
Add a debounced (500ms) search input using use-debounce that filters note groups by matching card front/back content (case-insensitive). Pagination resets to page 1 when the search query changes. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31feat(cards): add pagination to deck cards page (50 cards per page)nsfisis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26feat: bump version to 0.4.1v0.4.1nsfisis
2026-01-20Merge pull request #10 from nsfisis/claude/separate-deck-learning-view-jb2rVnsfisis
Separate deck detail and card learning pages
2026-01-20feat(deck): separate card list from deck detail pageClaude
Separate the card list view from the deck learning page to prevent users from seeing cards they are about to study. The deck detail page now shows only study statistics with a "Study Now" button and a "View Cards" link. - Add new DeckCardsPage component at /decks/:deckId/cards for managing cards - Simplify DeckDetailPage to show deck stats and navigation buttons - Update routing in App.tsx with proper route ordering - Add comprehensive tests for both pages
2026-01-12Merge pull request #9 from nsfisis/claude/show-daily-card-count-6dJ6tnsfisis
Display daily card count on deck list page
2026-01-12chore: remove package-lock.json (project uses pnpm)Claude
2026-01-12chore: add package-lock.jsonClaude
2026-01-12feat(deck): show due card count on deck list pageClaude
Display a badge with the number of cards due for study today next to each deck name on the home page. The count is fetched along with deck data from the API to minimize additional network requests.
2026-01-04refactor(client): migrate state management from React Context to Jotainsfisis
Replace AuthProvider and SyncProvider with Jotai atoms for more granular state management and better performance. This migration: - Creates atoms for auth, sync, decks, cards, noteTypes, and study state - Uses atomFamily for parameterized state (e.g., cards by deckId) - Introduces StoreInitializer component for subscription initialization - Updates all components and pages to use useAtomValue/useSetAtom - Updates all tests to use Jotai Provider with createStore pattern 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03feat: bump version to 0.4.0v0.4.0nsfisis
2026-01-03feat(study): shuffle cards when starting study sessionnsfisis
Cards are now randomized using Fisher-Yates algorithm to improve learning by preventing users from memorizing card order. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03feat(import): display expected CSV format dynamically per note typensfisis
Show actual note types and their fields in the expected format section instead of a hardcoded example. Fields are sorted by order. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02feat(import): simplify CSV format by removing deck columnnsfisis
Since import is initiated from deck context, the deck is already known via props. Simplifies CSV format to: note_type,Field1,Field2,... BREAKING CHANGE: CSV format changed from deck,note_type,... to note_type,... 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01refactor(client): migrate API calls to typed RPC clientnsfisis
Replace raw fetch() calls with apiClient.rpc typed client across all modal and page components. This provides better type safety and eliminates manual auth header handling. - Make handleResponse public for component usage - Update all component tests to mock RPC methods instead of fetch - Change POSTGRES_HOST default to kioku-db for Docker compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01docs: add CSV import documentationnsfisis
Document the CSV import feature including format specification, examples, and troubleshooting guide. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01feat: bump version to 0.3.0v0.3.0nsfisis
2026-01-01feat(import): add CSV bulk import for notesnsfisis
Add client-side CSV parsing and bulk import API endpoint for importing notes from CSV files. Supports quoted fields, newlines in values, and escaped quotes. - New POST /api/decks/{deckId}/notes/import endpoint for bulk creation - CSV parser with RFC 4180 compliance - Multi-phase import modal (upload → validate → preview → import) - Client-side validation with per-row error reporting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(ui): allow line-breaks in card templatesnsfisis
Change template input fields from single-line <input> to <textarea> elements to support multiline content in front/back templates. Fixes #5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(auth): redirect to login when session expiresnsfisis
When the refresh token fails (session expired), the ApiClient now notifies the AuthProvider via a callback. This triggers a logout and React state update, causing ProtectedRoute to redirect to /login. Closes #7 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(auth): add automatic token refresh on 401 responsesnsfisis
The client session was too short because access tokens (15 min) weren't being automatically refreshed using the refresh token (7 days). Now the ApiClient intercepts 401 responses, attempts token refresh, and retries the original request. This extends effective session duration to 7 days. Closes #6 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31chore: update READMEnsfisis
2025-12-31feat(db): add ORDER BY to repository SELECT queriesnsfisis
Ensures deterministic ordering for all multi-row SELECT queries: - deck/note/noteType findByUserId/findByDeckId: order by createdAt - card findByNoteId: order by isReversed (normal card first) - note field values: order by noteFieldTypeId - sync pull queries: order by id This guarantees consistent UI display and sync results regardless of PostgreSQL's internal row ordering. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31chore(docs): update roadmapnsfisis
2025-12-31refactor(client): remove duplicate create buttons from empty statesnsfisis
The empty state sections already have create buttons in the page header, making these inline buttons redundant. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(client): use Hono InferResponseType for API response typesnsfisis
Replace manually defined AuthResponse and User types with Hono's InferResponseType to automatically derive types from server definitions. This ensures client types stay in sync with server responses. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31fix(client): parse nested error object in API responsesnsfisis
Server returns `{ error: { message, code } }` but client expected `{ error: string, code }`, causing "[object Object]" to display on login failure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(db): replace DATABASE_URL with individual POSTGRES_* env varsnsfisis
Eliminates duplicate configuration by building the connection URL from POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, POSTGRES_HOST, and POSTGRES_PORT instead of requiring a separate DATABASE_URL. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat: update dependenciesv0.2.0nsfisis