A modern, keyboard-driven RSS feed reader that brings back the magic of Google Reader with AI! π
InReader combines the beloved simplicity of Google Reader with modern features like AI-powered summaries, chat capabilities, and a beautiful dark mode. Perfect for power users who love keyboard shortcuts and AI enthusiasts who want to chat with their articles!
All data is stored locally in your browser. Feeds, articles, read/star state, AI summaries, chat history, and your interest profile all live in IndexedDB β nothing is sent to a remote server. Your reading data stays on your device.
- Smart Feed Management - Subscribe, organize, and refresh feeds with automatic content extraction
- Feed Organization - Folder support with drag-and-drop organization
- OPML Import/Export - Import feeds from other readers or export your subscriptions as standard OPML files
- Visual Feed Status - Color-coded unread badges to track content freshness
- Full Article Extraction - Automatic fetching of complete article content
- AI-Powered Summaries - LLM summaries via Ollama (local/LAN), OpenAI, or Anthropic Claude
- AI Interest Tagging & Recommendations - Articles are automatically tagged by the AI during summarization. Star or listen to articles to build an interest profile, and discover new content in the Recommended view
- Chat with Articles - Interactive AI discussions about article content
- Keyboard-First Design - Vim-style navigation and comprehensive shortcuts
- Mobile Touch Gestures - Swipe left to mark read & advance, swipe right for quick actions, long press for all actions
- Mobile-Responsive UI - Collapsible sidebar with hamburger menu, gesture-driven entry management
- Dark Mode - Modern, eye-friendly dark theme
- Text-to-Speech - Queue-based article playback with progress tracking
- Smart Navigation - URL-synced navigation with keyboard and mouse support
- Local-First Storage - All data stored in IndexedDB in your browser; nothing leaves your device
- Search - Full-text search with saved search history
- Parallel feed refresh with stalled entry detection
- Smart duplicate entry detection
- Automatic metadata extraction
- Unread count tracking with visual indicators
- Full article content extraction with RSS preview fallback
- Read/unread and star/favorite system
- Multiple viewing options (inline, new tab, reusable window)
- Processing status indicators with error handling
- Three AI providers β Ollama (local/LAN), OpenAI, or Anthropic Claude
- Ollama runs entirely on your own hardware for full privacy; supports LAN servers (e.g.,
http://192.168.x.x:11434) - OpenAI / Claude require an API key and send article content to external APIs for processing
- Configurable models per task (separate models for summaries and chat)
- Streaming chat responses with history tracking
- Queue-based TTS playback with progress tracking
- Automatic duplicate detection in TTS queue
- AI summaries automatically extract topic tags from each article (3β8 tags per article)
- Starring or listening to an article adds its tags to your interest profile
- All tagged articles are scored against your profile β higher overlap means a higher score
- The Recommended sidebar view surfaces unread articles ranked by interest score
- Manage your interest profile in the AI Configuration β Recommendations tab: view collected tags with counts, delete individual tags, re-score entries, or clear the entire profile
- Import β Load subscriptions from any standard OPML file exported by another feed reader. Feeds are mapped to folders based on the OPML outline structure, and duplicates are skipped automatically.
- Export β Download all your current subscriptions as an
.opmlfile for backup or migration to another reader. - Access both via the folder icon in the Subscriptions sidebar header.
- IndexedDB storage with automatic migrations
- Efficient batch operations and caching
- Full-text search with history tracking
- Result count and recency tracking
j- Move down one itemk- Move up one itemh- Return to feed list/sidebarl- Open selected article/move to article list or open chat with current article/- Focus search barEscape- Clear search/Close modalsSpace- Scroll article / expand article content
m- Toggle read/unread statusi- Toggle star statuso- Open article in new tab0- Open article in reusable windowu- Refresh current article content and summary'- Copy article to clipboard-- Email articler- Refresh all feedsa- Add new feed
[- Add current article to TTS queue (when in article list)[- Add 5 most recent unread items to TTS queue (when in feed list)]- Skip to next TTS item\- Toggle TTS play/pausep- Pop to currently playing article
- Swipe Left - Mark entry as read and advance to next
- Swipe Right - Reveal quick-action strip (Star, Chat, Listen)
- Long Press - Open bottom sheet with all actions (read/unread, star, chat, listen, copy, email, refresh, open in browser)
- Tap - Select entry
- Tap outside strip - Close revealed action strip
Tap the "InReader" title on mobile to see the gesture guide.
The unread count badge for each feed changes color based on the most recent unread entry:
- Dark Purple - Content from the last hour
- Dark Blue - Content from the last 24 hours
- Light Blue - Content from the last week
- Gray - Older content
This color-coding system helps you quickly identify feeds with fresh content and prioritize your reading.
- Node.js (for development)
- Docker (for production deployment)
- AI provider (optional): Ollama (local), an OpenAI API key, or an Anthropic API key
# Clone the repository
git clone [repository-url]
# Install dependencies
npm install
# Start the development server (frontend + backend)
npm run devOr deploy manually:
npm i -g vercel
vercel# Build and run with HTTPS (self-signed certificate)
docker-compose up --build
# Access at https://localhost:8443
# For network access: https://YOUR_IP:8443
# Use a custom port
PORT=9443 docker-compose up --build
# Run in background
docker-compose up -d
# Stop
docker-compose downNote: Docker uses a self-signed SSL certificate. Accept the browser warning on first access.
Click the lightning bolt icon in InReader to choose a provider and configure models.
- Install Ollama on your machine or a server on your LAN
- Pull a model:
ollama pull llama3.2(or any preferred model) - For LAN access, start Ollama with:
OLLAMA_HOST=0.0.0.0 ollama serve - Enter your Ollama server URL:
- Local:
http://localhost:11434 - LAN:
http://192.168.x.x:11434(your server's IP)
- Local:
Note: For Vercel deployments, your Ollama server must be publicly accessible. For Docker/self-hosted, LAN servers work via the built-in proxy.
- Enter your OpenAI API key
- Select models for summaries and chat (e.g.,
gpt-4o-mini,gpt-4o)
- Enter your Anthropic API key
- Select models for summaries and chat (e.g.,
claude-sonnet-4-20250514)
Privacy note: Ollama keeps all processing on your own hardware. OpenAI and Claude send article content to external APIs. All other data (feeds, read state, stars, interest profile) is always stored locally regardless of AI provider.
- React 18
- TypeScript (strict)
- Tailwind CSS
- Dexie.js (IndexedDB)
- Vite
- Express.js (backend API) β the feed/article/AI-proxy endpoints validate and resolve outbound URLs to prevent SSRF, with request timeouts and response size caps
- Vitest (unit tests), ESLint (flat config), GitHub Actions CI
- Docker + nginx
- HTTPS with self-signed certificates
npm run dev # frontend (Vite, :5173) + backend (Express, :3000)
npm run lint # ESLint (flat config), zero-warnings
npm test # Vitest unit tests
npm run build # tsc typecheck + production Vite buildCI (.github/workflows/ci.yml) runs lint, tests, the typecheck+build, and a
backend syntax check on every push and pull request.
src/
βββ components/
β βββ Layout.tsx # Main layout with modal management
β βββ Sidebar.tsx # Feed navigation and selection management
β βββ FeedList.tsx # Entry display and interaction
β βββ FeedListEntry.tsx # Individual entry orchestration
β βββ Toast.tsx # Toast notification component
β βββ entry/ # Entry sub-components
β β βββ EntryHeader.tsx # Status badges, title, action buttons
β β βββ EntryContent.tsx # AI summary, markdown, action bar
β β βββ EntryMobileActions.tsx # Swipe-revealed action strip
β βββ SearchResults.tsx # Search functionality
β βββ Header.tsx # Search and dark mode
β βββ ChatModal.tsx # Article chat interface
β βββ AIConfigModal.tsx # AI provider and recommendation config
β βββ FeedManagementModal.tsx # OPML import/export and feed management
β βββ ErrorBoundary.tsx # App-level error fallback (recoverable, no blank screen)
βββ hooks/
β βββ useKeyboardNavigation.ts # All keyboard shortcut handling
β βββ useFeedEntries.ts # FeedList entry loading, pagination, pull-to-refresh
β βββ useSidebarData.ts # Sidebar feed/folder data, refresh, CRUD
β βββ useEntryState.ts # Entry state sync with events and DB
β βββ useEntryScroll.ts # Entry scroll behavior management
β βββ useInfiniteScroll.ts # IntersectionObserver-based infinite scroll
β βββ useMobileDetection.ts # Mobile viewport detection
β βββ useSwipeGesture.ts # Touch swipe gesture handling
β βββ usePullToRefresh.ts # Pull-to-refresh gesture
βββ utils/
β βββ dateFormatters.ts # Date formatting utilities
β βββ contentFormatters.ts # Content formatting for sharing
β βββ ttsHelpers.ts # TTS queue item helpers
β βββ eventDispatcher.ts # Type-safe custom event utilities
βββ types/
β βββ events.ts # Custom event type definitions
βββ services/
β βββ db.ts # Database schema, operations, and queries
β βββ aiService.ts # AI provider integration (Ollama, OpenAI, Anthropic)
β βββ interestService.ts # Tag extraction, interest profile, and scoring
β βββ feedParser.ts # Feed parsing, entry processing, and summarization
β βββ articleService.ts # Full article content extraction
β βββ ttsService.ts # Text-to-speech queue management
β βββ requestQueueService.ts # Concurrency-limited request queue (p-queue)
β βββ opmlService.ts # OPML import and export
β βββ paginationService.ts # Pagination management
βββ App.tsx # Root component and routes
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).
- β You can freely use, modify, and distribute this software for non-commercial purposes
- β You must give appropriate credit and indicate if changes were made
- β You cannot use this software for commercial purposes without permission
- βΉοΈ The original author retains all rights for commercial use
For more information, see the full license text.
Made with β€οΈ for RSS enthusiasts and AI explorers