JRSS is a local-first desktop RSS reader and podcast player built with Tauri, SvelteKit, and Rust. It pulls RSS and Atom feeds into a local SQLite database, gives articles a focused reader mode, and handles podcast playback with queueing, history, and session restore.
JRSS combines feed reading and podcast listening in one desktop app.
- Subscribe using a feed URL, Apple Podcasts URL, or Apple Podcasts ID
- Sync RSS and Atom feeds into a local SQLite database
- Read feed content directly or open extracted reader-mode article content
- Play podcast episodes with queue controls, history, and resume support
- Organize podcasts into stations for grouped playback
- Run background auto-refresh and manage local audio cache settings
- Local-first: feeds, items, playback progress, and settings are stored on your machine
- One workflow for articles and podcasts instead of separate apps
- Reader mode improves long-form reading by extracting clean article content
- Podcast playback is stateful, with persistent queue and playback session restore
- Desktop-first UX includes a mini-player window and keyboard shortcuts
- Bun
- Rust 1.87+ and Cargo
- Tauri system dependencies for your OS: Tauri prerequisites
JRSS uses bun.lock; use Bun for dependency installation and scripts.
bun installbun run tauri:devThis is the main development flow. Tauri starts the frontend for you at http://127.0.0.1:1420.
bun run devUse this only for UI work. Backend-backed features are unavailable outside Tauri, and some services intentionally return empty/default data in that mode.
bun run check
bun run lint
bun run build
cargo check --manifest-path src-tauri/Cargo.toml
cargo test --manifest-path src-tauri/Cargo.tomlTypical frontend validation order in this repo is:
bun run check && bun run lint && bun run build- Start JRSS with
bun run tauri:dev. - Add a feed using a direct RSS/Atom URL or an Apple Podcasts link/ID.
- Open an item in feed view or reader view.
- Queue a podcast episode or create a station from selected feeds.
src/: SvelteKit frontend, UI components, state modules, and Tauri service wrapperssrc-tauri/: Rust backend, SQLite access layer, feed ingestion, reader extraction, and audio playbackimg/: screenshots and project imagery.github/CODEOWNERS: repository ownership
Adding a new user setting requires coordination across TypeScript types, Rust models, and the database schema:
- Add the field to
AppSettingsinsrc/lib/types/rss.ts - Add the field to
AppSettingsRecordinsrc-tauri/src/models.rs - Add a migration in
src-tauri/src/db/schema.rs - Add a
SettingEntrytoAPP_SETTINGSinsrc/lib/config/settings.ts
See AGENTS.md for detailed instructions on adding new setting kinds (custom input types).
High-level data flow:
Svelte state/actions -> feedService.ts -> tauriClient.ts -> Tauri commands -> SQLite/audio services
JRSS stores feeds, items, stations, playback state, playback session, and app settings in a local SQLite database named jrss.sqlite3 in the Tauri app-data directory.
The app defines desktop shortcuts for common actions, including:
CmdOrCtrl+N: add feedCmdOrCtrl+Shift+N: create stationCmdOrCtrl+R: refresh feedCmdOrCtrl+F: search feedCmdOrCtrl+L: go to feedSpace: play/pauseCmdOrCtrl+Shift+Left/CmdOrCtrl+Shift+Right: skip backward/forward
- Open a bug report or feature request: https://github.com/jascha030/JRSS/issues
- Read contribution notes: CONTRIBUTING.md
- Tauri docs: https://v2.tauri.app/
- SvelteKit docs: https://svelte.dev/docs/kit
JRSS is maintained by Jascha van Aalst. Repository ownership is currently defined in .github/CODEOWNERS as @jascha030.
Contributions are welcome. For setup, validation, and change expectations, see CONTRIBUTING.md.
JRSS is published under the MIT license.
