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.
- 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
![]() Overview |
![]() Feeds |
![]() Reader |
![]() Sources |
![]() Overview |
![]() Feeds |
![]() Reader |
![]() Sources |
- Rust toolchain (stable) +
cargo - bun for the frontend (used for both dev and build)
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 thelibxmlcrate (news-flash's article scraper) - libclang (
libclang-dev) — required bybindgen, which thelibxmlcrate 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:\vcpkgOn 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"make build # builds frontend then cargo build --release
./target/release/feedea --data-dir /path/to/dataOn 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).
Run backend and frontend together:
make dev- backend:
cargo runon port 3000 - frontend:
bun run dev(Vite) on port 5173, proxying/apiand/imgto the backend
Or run them in two terminals:
# terminal 1 — backend
make backend-dev
# terminal 2 — frontend
make frontend-devThen open http://localhost:5173.
make test # cargo test + frontend typecheck/lint| 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 |
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_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.
See docs/selfhosting.md for the systemd unit, deployment notes, and troubleshooting.
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.
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.







