Skip to content

Repository files navigation

Feedea

CI Release

A self-hosted RSS feed aggregator with a built-in web UI.

Single Rust binary, embedded React frontend, SQLite storage. Built on the news-flash engine.

Features

  • Feed management: add, discover, import/export OPML, per-feed refresh
  • Articles: list, search, save with notes and tags, mark read/unread
  • Categories and unread badges
  • Privacy-friendly image proxy (private-network proxying off by default)
  • PWA: installable, works offline after first load

Screenshots

Desktop

Overview
Overview
Feeds
Feeds
Reader
Reader
Sources
Sources

Mobile

Overview
Overview
Feeds
Feeds
Reader
Reader
Sources
Sources

Requirements

  • Rust toolchain (stable) + cargo
  • bun for the frontend (used for both dev and build)

Build dependencies (system libraries)

The build links against a few system libraries (via the news-flash engine and reqwest). You need these installed before cargo build:

  • pkg-config — build-time dependency probe
  • OpenSSL headers (libssl-dev) — Linux/macOS only (Windows uses SChannel)
  • libxml2 headers (libxml2-dev) — from the libxml crate (news-flash's article scraper)
  • libclang (libclang-dev) — required by bindgen, which the libxml crate runs at build time

Install per platform:

# Debian / Ubuntu
sudo apt-get install -y pkg-config libssl-dev libxml2-dev libclang-dev

# macOS (Homebrew)
brew install pkg-config openssl libxml2
# libclang is provided by the Xcode Command Line Tools (xcode-select --install)

# Windows (vcpkg) — then set the env vars below
vcpkg install libxml2 --triplet x64-windows-static-md
set VCPKGRS_TRIPLET=x64-windows-static-md
set LIBCLANG_PATH=C:\Program Files\LLVM\bin
set VCPKG_ROOT=C:\vcpkg

On macOS, brew's libxml2 is keg-only, so also export its pkg-config path before building:

export PKG_CONFIG_PATH="$(brew --prefix libxml2)/lib/pkgconfig"

If bun is not on your PATH (e.g. installed via the bun installer into

~/.bun/bin), add it:

export PATH="$HOME/.bun/bin:$PATH"

Quick start (production binary)

make build        # builds frontend then cargo build --release
./target/release/feedea --data-dir /path/to/data

On first run feedea prints a generated password to stderr. Log in at the web UI and change it in Settings.

Default data dir (when --data-dir is omitted): $HOME/.local/share/feedea (or FEEDEA_DATA_DIR).

Development

Run backend and frontend together:

make dev
  • backend: cargo run on port 3000
  • frontend: bun run dev (Vite) on port 5173, proxying /api and /img to the backend

Or run them in two terminals:

# terminal 1 — backend
make backend-dev

# terminal 2 — frontend
make frontend-dev

Then open http://localhost:5173.

Tests

make test     # cargo test + frontend typecheck/lint

Other targets

target purpose
make build bun run build then cargo build --release
make run cargo run --release (single binary)
make dev backend + Vite concurrently
make test cargo tests + frontend typecheck/lint
make clean remove target/, frontend/dist, frontend/node_modules

Configuration

The binary accepts these flags; each can also be set as an environment variable:

flag env default description
--data-dir FEEDEA_DATA_DIR ~/.local/share/feedea data directory
--host FEEDEA_HOST 0.0.0.0 listen address
--port FEEDEA_PORT 3000 listen port
--allow-private-proxy FEEDEA_ALLOW_PRIVATE_PROXY false allow proxying images from private networks

Example:

FEEDEA_PORT=8080 FEEDEA_ALLOW_PRIVATE_PROXY=1 ./target/release/feedea

Data directory layout

<data_dir>/
  feedea.sqlite              # feedea settings, sessions
  feedea.sqlite-wal, -shm    # SQLite WAL files
  engine/
    config/                 # news-flash config
    data/
      database.sqlite       # news-flash feed/article database

Back up the whole <data_dir> for a full snapshot.

Self-hosting

See docs/selfhosting.md for the systemd unit, deployment notes, and troubleshooting.

CI & releases

Every push and pull request runs the full test suite (fmt, clippy, cargo tests, frontend typecheck/lint) via GitHub Actions.

Pushing a tag like v0.1.0 builds release binaries for Linux (x64, arm64), Windows x64, and macOS (arm64, x64) on native runners, runs the end-to-end smoke test on Linux, and attaches them to a draft GitHub Release.

The CI jobs install the build dependencies listed above (libxml2, OpenSSL, libclang) per runner; on Windows the vcpkg libxml2 port is built with the x64-windows-static-md triplet.

License

feedea links against news-flash, which is licensed GPL-3.0-or-later. The combined binary is therefore distributed under GPL-3.0-or-later — provide the corresponding source if you distribute the binary. See Cargo.lock for the full dependency tree and licenses.

About

A lightweight self-hosted RSS feed aggregator with a built-in web UI

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages