feedbinctl
Index compact metadata from Feedbin into SQLite, search it locally, and fetch complete entries on demand.
Disclaimer: This project is an exercise with Codex.
Install
For development, replace feedbinctl in the examples below with cargo run --.
Both builds use the same operating-system keyring entry.
Authenticate
auth validates your Feedbin username and password before storing them in the
operating-system keyring. For non-interactive environments, FEEDBIN_TOKEN
may instead contain username:password.
Maintain the index
The first run downloads the complete entry history. Later runs use the exact
created_at timestamp from the last completed run as Feedbin's since cursor.
This makes the command suitable for cron:
*/15 * * * * /usr/local/bin/feedbinctl index
Entries are fetched and committed one API page at a time. The cursor advances only after all pages succeed, so an interrupted run can safely be repeated. Upserts make repeated pages harmless.
To build a complete replacement database while leaving the current database in place until the download succeeds:
The default database is in the platform data directory:
- macOS:
~/Library/Application Support/feedbinctl/feedbin.sqlite - Linux:
$XDG_DATA_HOME/feedbinctl/feedbin.sqlite, falling back to~/.local/share/feedbinctl/feedbin.sqlite - Windows: the per-user application data directory
Use --database PATH on index, entries, or search to override it.
Browse recent entries
entries reads SQLite and never contacts Feedbin. Results are ordered by
created_at and then entry ID, newest first. For the next stable page, pass the
last result's ID:
This keyset pagination remains stable when a later index run inserts newer
entries.
Search
search is local and uses SQLite FTS5 syntax over title, URL, author, and feed
title. Both entries and search print JSON arrays containing compact metadata:
Fetch full content
Search results intentionally omit article bodies. Fetch the selected entry from Feedbin by ID:
entry contacts Feedbin and prints the complete current object, including
summary, content, and extracted_content_url.
Every command documents its behavior and examples through Clap: