Skip to content

JamesDavid/InReader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

103 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“š InReader

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.

✨ Key Features

🎯 Core Features

  • 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

πŸ”„ Technical Features

Feed System

  • Parallel feed refresh with stalled entry detection
  • Smart duplicate entry detection
  • Automatic metadata extraction
  • Unread count tracking with visual indicators

Article Management

  • 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

AI & TTS Integration

  • 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

Interest Tagging & Recommendations

  • 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

OPML Import & Export

  • 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 .opml file for backup or migration to another reader.
  • Access both via the folder icon in the Subscriptions sidebar header.

Data & Search

  • IndexedDB storage with automatic migrations
  • Efficient batch operations and caching
  • Full-text search with history tracking
  • Result count and recency tracking

⌨️ Keyboard Shortcuts

Navigation

  • j - Move down one item
  • k - Move up one item
  • h - Return to feed list/sidebar
  • l - Open selected article/move to article list or open chat with current article
  • / - Focus search bar
  • Escape - Clear search/Close modals
  • Space - Scroll article / expand article content

Article Management

  • m - Toggle read/unread status
  • i - Toggle star status
  • o - Open article in new tab
  • 0 - Open article in reusable window
  • u - Refresh current article content and summary
  • ' - Copy article to clipboard
  • - - Email article
  • r - Refresh all feeds
  • a - Add new feed

Text-to-Speech & AI Features

  • [ - 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/pause
  • p - Pop to currently playing article

πŸ“± Mobile Touch Gestures

  • 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.

🎨 Visual Indicators

Feed Badge Colors

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.

πŸš€ Getting Started

Prerequisites

  • Node.js (for development)
  • Docker (for production deployment)
  • AI provider (optional): Ollama (local), an OpenAI API key, or an Anthropic API key

Quick Start - Development

# Clone the repository
git clone [repository-url]

# Install dependencies
npm install

# Start the development server (frontend + backend)
npm run dev

Vercel Deployment (Recommended)

Deploy with Vercel

Or deploy manually:

npm i -g vercel
vercel

Docker Deployment (Self-hosted)

# 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 down

Note: Docker uses a self-signed SSL certificate. Accept the browser warning on first access.

AI Configuration

Click the lightning bolt icon in InReader to choose a provider and configure models.

Ollama (local / LAN β€” fully private)

  1. Install Ollama on your machine or a server on your LAN
  2. Pull a model: ollama pull llama3.2 (or any preferred model)
  3. For LAN access, start Ollama with: OLLAMA_HOST=0.0.0.0 ollama serve
  4. Enter your Ollama server URL:
    • Local: http://localhost:11434
    • LAN: http://192.168.x.x:11434 (your server's IP)

Note: For Vercel deployments, your Ollama server must be publicly accessible. For Docker/self-hosted, LAN servers work via the built-in proxy.

OpenAI

  1. Enter your OpenAI API key
  2. Select models for summaries and chat (e.g., gpt-4o-mini, gpt-4o)

Anthropic Claude

  1. Enter your Anthropic API key
  2. 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.

Tech Stack

  • 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

Development & Quality

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 build

CI (.github/workflows/ci.yml) runs lint, tests, the typecheck+build, and a backend syntax check on every push and pull request.

Project Structure

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

πŸ”„ License

This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).

What this means:

  • βœ… 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

About

A modern, keyboard-driven RSS feed reader that brings back the magic of Google Reader with AI! πŸš€

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages