Managing feeds¶
Commands¶
uv run python manage.py add_feed https://example.org/feed.xml # add + fetch
uv run python manage.py import_opml subscriptions.opml --fetch # bulk import
uv run python manage.py update_feeds # fetch all feeds now
uv run python manage.py update_content # extract new and edited articles
uv run python manage.py refresh_search_terms # rebuild spelling word list
uv run python manage.py db_stats # database and table sizes
In the Docker development stack, run them with make manage cmd="..."; in
production, with docker compose -f compose.prod.yaml exec web python manage.py ....
In the admin¶
Feeds can be imported from OPML and fetched on demand with the "Fetch new
entries" action; fetch errors are shown per feed. Readers' feed suggestions
show up there too: approving one adds and fetches the feed. The public list
of feeds is at /feeds/ and can be downloaded as OPML.
Failing and stale feeds¶
Failing feeds back off exponentially (30 min, 1 h, 2 h … up to 24 h, or longer
if the server sends Retry-After), and a 410 Gone deactivates the feed.
Staff can see failing and stale feeds at /feeds/health/, along with the
database's size.
Keeping the database small¶
Articles are kept forever. To keep the database from growing without limit,
set ARTICLE_TEXT_DAYS to drop the extracted text of older articles (daily,
off by default). Their titles and summaries stay searchable, bookmarked
articles keep their text, and dropped text isn't fetched again.
Demo data and benchmarks¶
No feeds handy, or want to see how search holds up at scale? Generate an offline English/Swedish dataset and time the search paths:
uv run python manage.py seed_demo --entries 20000 # --clear removes earlier demo data
uv run python manage.py benchmark_search
Demo feeds use .invalid hosts and are never fetched.