MMSP-native from the ground up, with full compatibility for every major feed format you already use.
Parses MFEED (MMSP JSON format) natively. Enforces MMSP/1.0 User-Agent, conditional GET (ETag / Last-Modified) and the 300 s poll floor per the spec. Read the spec →
Search new feeds by topic via feedsearch.dev. 46 category autocomplete, result cap selector (10 to 200) and bulk subscribe with a confirmation dialog.
Per-feed MMSP Appendix A ABNF filters. The filter dialog surfaces existing terms as toggleable rows - no syntax knowledge required for common cases.
Conditional GET with ETag and Last-Modified. Rate-limit backoff, 300 s poll floor. Async asyncio scheduler - zero CPU when no feeds are due.
Mocha (dark) and Latte (light) with a single toggle. Theme preference persists across restarts. Amber focus ring on every focusable control.
content:encoded preferred over description so full article HTML is shown where available. Media player for podcast and video items built in.
Every control reachable without a mouse. Tab wraps cleanly end-to-end. Enter, Space, Left, Right all wired. Escape closes drawers and dialogs.
Full subscription round-trip via JSON. A curated feeds_export.json ships with the repo so you can bootstrap a reading list in seconds.
Select-all checkboxes, bulk remove, per-feed filter, edit and delete from the subscription manager. In-place list removal preserves scroll position.
No account, no cloud, no server. Your subscriptions and read state stay on your machine. JSON export/import moves them between machines - the migration path, not live sync.
A reference client has to be exemplary or the spec it implements loses authority. So MMSP polling semantics sit behind a pure domain, inside a four-layer architecture, UI to Application to Domain with Infrastructure implementing inward. AST tests and 100% branch coverage run on every build, so the behaviour the spec mandates is behaviour the code cannot structurally violate.