| Age | Commit message (Collapse) | Author |
|
Show "All feeds" button immediately and load individual feeds
asynchronously via internal Suspense boundary, avoiding the
spinner-to-content shift that occurred with the outer Suspense wrapper.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
|
|
Move responsive styling from FeedSidebar to parent containers
|
|
The Suspense fallback (LoadingSpinner) was visible on mobile even though
FeedSidebar itself had `hidden md:block`. Move the responsive hiding
classes to a wrapper div so both the spinner and the sidebar are hidden
on mobile screens.
https://claude.ai/code/session_01Nfc9gnkDPgnXZwEWyGrb9U
|
|
Unread sidebar now only shows feeds with unread articles.
Read sidebar shows all feeds but hides the unread count badge.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Replace obsolete graphql schema copy with openapi spec, add type
generation step before frontend build, and use npm ci for reproducibility.
|
|
Add typespec dependency installation to CI workflow
|
|
Add a step to install typespec dependencies and include
typespec/package-lock.json in the Node.js npm cache config.
https://claude.ai/code/session_01B4MXDojJtKKnXC57YTJbt2
|
|
When an HTML page is provided instead of a direct feed URL, parse
<link rel="alternate"> tags to find RSS/Atom feeds. Atom is preferred
over RSS when both are present.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Replace React Context + manual useEffect data fetching with jotai atoms
for state management and jotai-tanstack-query for server state caching.
- Add jotai, jotai-tanstack-query, @tanstack/query-core dependencies
- Create atoms for auth (primitive + action), feeds (suspense query),
and articles (infinite query with cursor-based pagination)
- Wire up Provider, HydrateQueryClient, and StoreInitializer in main.tsx
- Migrate all components from useAuth() context to jotai atoms
- Replace manual fetch logic in FeedSidebar/FeedList with feedsAtom
- Replace usePaginatedArticles hook with articlesInfiniteAtom
- Add queryClient.invalidateQueries() after mutations for automatic
cache refresh
- Add ErrorBoundary and LoadingSpinner components for Suspense support
- Remove callback prop chains (onFeedAdded, onFeedChanged, etc.)
in favor of query invalidation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Replace the entire GraphQL stack (gqlgen, urql, graphql-codegen) with a
TypeSpec → OpenAPI 3.x pipeline using oapi-codegen for Go server stubs
and openapi-fetch + openapi-typescript for the frontend client.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Add a feed sidebar to /unread and /read pages for filtering articles by
feed, and replace the fixed 100-article limit with cursor-based
pagination using a "Load more" button.
Backend:
- Add PageInfo, ArticleConnection types and pagination args to GraphQL
- Replace GetUnreadArticles/GetReadArticles with parameterized queries
- Add GetFeedUnreadCounts query and composite index
- Add shared pagination helper in resolver
Frontend:
- Add FeedSidebar component with unread count badges
- Add usePaginatedArticles hook for cursor-based fetching
- Update ArticleList with Load more button and single-feed mode
- Use ?feed=<id> query parameter for feed filtering
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Add CLAUDE.md documentation for project setup and structure
|
|
https://claude.ai/code/session_011oeZCDaNFcsxnbRsWRju9t
|
|
|
|
Consolidate duplicated feed fetching and article syncing code from
AddFeed resolver and fetchOneFeed into reusable feed.Fetch and feed.Sync
functions. This unifies behavior (10s timeout, article updates) across
both call sites.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
|
Prevent duplicate feed items with same GUID
|
|
|
|
Change deduplication strategy from query-time (ROW_NUMBER window function)
to insertion-time (global guid check before insert).
Benefits:
- Simpler queries without CTE/window functions
- Consistent read state (no duplicate articles to manage)
- Better query performance (no per-query deduplication overhead)
Changes:
- Add CheckArticleExistsByGUID query for global guid lookup
- Add migration to remove existing duplicate articles
- Modify fetchOneFeed and AddFeed to skip duplicates on insert
- Revert GetUnreadArticles/GetReadArticles to simple queries
|
|
Use ROW_NUMBER() window function to filter out duplicate articles
with the same guid across different feeds. This ensures each guid
appears only once in unread/read article lists.
- Add idx_articles_guid index for PARTITION BY performance
- Modify GetUnreadArticles and GetReadArticles queries with CTE
|
|
Add AI collaboration note to project
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|