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 uses an XDG-style data directory and is separated by build profile:
- Installed binaries and
cargo run --release:${XDG_DATA_HOME:-~/.local/share}/feedbinctl/feedbin.sqlite - Debug builds such as
cargo run:${XDG_DATA_HOME:-~/.local/share}/feedbinctl/feedbin-dev.sqlite
This keeps development indexing separate from the index used by an installed
binary. Both profiles continue to use the same operating-system keyring entry.
XDG_DATA_HOME, when set, must be an absolute path.
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: