Larafeed is a simple feed reader.
- A pleasant and snappy UI
- Prefetching is leveraged to make the app feel snappy
- Entry is marked as read when you view it
- Entry content is modified so that links open in a new tab
- RSS and Atom feed support
- Background feed updates
- Failures are stored and displayed in the UI
- Custom feed names and categories
- Entry filtering per subscription (hide entries matching patterns by title, content, or author)
- Read and starred entries
- AI-generated summary of entries
- Favicon display (proxified through imgproxy, with automatic dark mode background for dark favicons)
- Spotlight-like go to feed
- OPML import/export
- Support for Google Reader API and Fever API
- Support is partial, but works with Reeder classic at least
- Google Reader API is available at
/api/readerand Fever API at/api/fever, both with username+password
- Telegram notications on user registration and login failures
- Estimated reading time for each entry
llm-summary-demo.mp4.mp4
CleanShot.2025-02-18.at.13.35.49.mp4
CleanShot.2025-02-23.at.15.02.32.mp4
- Backend build with Laravel 12
- Architectured around Actions
- React for the frontend with the amazing Mantine components and hooks
- Inertia.js that does the magic glue between Laravel and React
- Prefetching is leveraged to make the app feel snappy
- Feed parsing is powered by SimplePie
- Through willvincent/feeds
- Polite to publishers: uses ETag/Last-Modified headers to avoid re-downloading unchanged feeds
- Summary generation is powered by Gemini through echolabsdev/prism
- Background jobs are powered by Laravel queues
- Favicon fetching is powered by ash-jc-allen/favicon-fetcher
- They are proxified through imgproxy
- Images from articles are also proxified and optimized through
imgproxy, for better privacy and performance - Google Reader API and Fever API are implemented from scratch
- I relied heavily on the implementations of FreshRSS and Miniflux
- And in practice, using Reeder classic as a client with Miniflux as a backend, I inspected the API calls with mitmproxy to, in a way, reverse-engineer the API
erDiagram
users {
int8 id PK
varchar name
varchar email UK
timestamp email_verified_at
varchar password
varchar remember_token
text fever_api_key
timestamp created_at
timestamp updated_at
}
feeds {
int8 id PK
varchar name
varchar feed_url UK
varchar site_url
varchar favicon_url
boolean favicon_is_dark
timestamp favicon_updated_at
timestamp last_successful_refresh_at
timestamp last_failed_refresh_at
varchar last_error_message
timestamp created_at
timestamp updated_at
}
entries {
int8 id PK
varchar title
varchar url
varchar author
text content
timestamp published_at
int8 feed_id FK
timestamp created_at
timestamp updated_at
}
feed_refreshes {
int8 id PK
int8 feed_id FK
timestamp refreshed_at
boolean was_successful
int4 entries_created
text error_message
timestamp created_at
timestamp updated_at
}
feed_subscriptions {
int8 user_id PK,FK
int8 feed_id PK,FK
int8 category_id FK
varchar custom_feed_name
json filter_rules
timestamp created_at
timestamp updated_at
}
subscription_categories {
int8 id PK
int8 user_id FK
varchar name
timestamp created_at
timestamp updated_at
}
entry_interactions {
int8 user_id PK,FK
int8 entry_id PK,FK
timestamp read_at
timestamp starred_at
timestamp archived_at
timestamp filtered_at
timestamp created_at
timestamp updated_at
}
users ||--o{ feed_subscriptions : "subscribes"
users ||--o{ entry_interactions : "interacts"
users ||--o{ subscription_categories : "has"
feeds ||--o{ entries : "contains"
feeds ||--o{ feed_subscriptions : "has"
feeds ||--o{ feed_refreshes : "refreshes"
entries ||--o{ entry_interactions : "has"
subscription_categories ||--o{ feed_subscriptions : "organizes"
The project is currently deployed on Railway:
The web server is powered by Laravel Octane, FrankenPHP and Caddy.
See docs/self-hosting.md for Docker Compose setup instructions.
Larafeed is built with Laravel Sail, so you can run it locally with Docker.
cp .env.example .env # and adjust the values
composer update
php artisan migrate --seed
npm install
composer devA quick login link is available on the login form, which will create a user and log you in.
Larafeed is licensed under the MIT license.