Skip to content

angristan/larafeed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Larafeed

Larafeed is a simple feed reader.

Features

  • 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
  • Read and starred entries
  • AI-generated summary of entries
  • Favicon display (proxified through imgproxy)
  • 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/reader and Fever API at /api/fever, both with username+password
  • Telegram notications on user registration and login failures
  • Estimated reading time for each entry

Screenshots & demo

Reader view

Demo of the LLM summary generation

llm-summary-demo.mp4.mp4

Demo of the feed refreshing UX

CleanShot.2025-02-18.at.13.35.49.mp4

Technical overview

  • Backend build with Laravel 11
  • 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
  • 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
  • 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

Database schema

erDiagram
    users {
        int8 id PK
        varchar name
        varchar email
        timestamp email_verified_at
        varchar password
        timestamp created_at
        timestamp updated_at
    }

    feeds {
        int8 id PK
        varchar name
        varchar feed_url
        varchar site_url
        varchar favicon_url
        timestamp last_successful_refresh_at
        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_subscriptions {
        int8 user_id FK
        int8 feed_id FK
        int8 category_id FK
        varchar custom_feed_name
        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 FK
        int8 entry_id FK
        timestamp read_at
        timestamp starred_at
        timestamp archived_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"
    entries ||--o{ entry_interactions : "has"
    subscription_categories ||--o{ feed_subscriptions : "organizes"
Loading

Deployment

The project is currently deployed on Railway:

The web server is powered by Laravel Octane, FrankenPHP and Caddy. ⚡️

Docker-compose

You can run Larafeed for yourself with Docker Compose. The docker-compose.yml file is provided in the repository. By default it will use the Docker image from the GitHub Container Registry that is built on every push.

Make sure to update the .env.compose file with your own values.

  • For APP_KEY:
    • docker-compose exec -it queue bash -c "php artisan key:generate --show"
  • For IMGPRPOXY_SALT and IMGPROXY_KEY:
    • echo $(xxd -g 2 -l 64 -p /dev/random | tr -d '\n')

Development

Run locally

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 dev

A quick login link is available on the login form, which will create a user and log you in.

License

Larafeed is licensed under the MIT license.