neiam
/feedpug
feedpub
public · Issues · Pulls · Labels · Forks · Compare · Actions success · Badges · Packages
Log in to mark this repository.
| .forgejo | |||
| .github | |||
| android | |||
| assets | |||
| config | |||
| lib | |||
| priv | |||
| rel | |||
| scripts | |||
| test | |||
| .credo.exs | 1.2 KiB | ||
| .dockerignore | 1.3 KiB | ||
| .formatter.exs | 225 B | ||
| .gitignore | 1.2 KiB | ||
| .gitlab-ci.yml | 1.3 KiB | ||
| AGENTS.md | 25.6 KiB | ||
| compose.yml | 1.2 KiB | ||
| Dockerfile | 2.7 KiB | ||
| LICENSE.md | 33.5 KiB | ||
| mix.exs | 3.3 KiB | ||
| mix.lock | 23.0 KiB | ||
| README.md | 3.1 KiB |
FeedPug
A self-hosted RSS/Atom feed reader. Subscribe to feeds, organize them into groups, react to items, and read from the web UI or a JSON API. Feeds are globally deduped and fetched once no matter how many people follow them. Phoenix LiveView on top of PostgreSQL, with background fetching via Oban.
Features
- Newsfeed — a unified reading view at
/(Phoenix LiveView) with read / unread tracking. - Shared, deduped feeds — feeds are canonical and deduped by URL, items
by
{feed_id, guid}, so a feed followed by many people is fetched and stored exactly once. - Groups — organize your subscriptions into groups (
/groups). - Discover & follow — find and follow new feeds at
/discover. - Reactions — react to individual items.
- OPML — import and export your subscriptions (
/opml/export). - JSON API —
/api/*for timelines, items, sources, groups, follows, and reactions — handy for companion apps and devices (/devices). - Background fetching — Oban workers keep feeds up to date.
- Accounts — magic-link login by default, password optional, with
invite-gated registration (
/users/invites). - Themes — pick a daisyUI theme; the choice persists.
Quick start
# 1. Bring up Postgres (see compose.yml)
podman compose up -d # or: docker compose up -d
# 2. Install deps, create + migrate the dev DB, build assets
mix setup
# 3. Start the dev server
mix phx.server
Then open http://localhost:4000.
Container images
CI publishes a multi-registry image on every push to master:
ghcr.io/neiam/feedpugdocker.io/neiam/feedpugquay.io/neiam/feedpug
Tags: latest (default branch), vX.Y.Z + X.Y (git tags), the branch name,
and the commit SHA.
docker pull ghcr.io/neiam/feedpug:latest
docker run --rm -p 4000:4000 \
-e PHX_SERVER=true \
-e SECRET_KEY_BASE="$(openssl rand -base64 48)" \
-e PHX_HOST=localhost \
-e POSTGRES_HOST=host.containers.internal \
-e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=feed_pug \
ghcr.io/neiam/feedpug:latest
Or set DATABASE_URL=ecto://user:pass@host/db instead of the discrete
POSTGRES_* variables.
Tests
mix test
mix precommit # compile --warnings-as-errors, deps.unlock --unused, format, test
mix precommit is what CI runs and what every change should pass.