Release notes
Changes and improvements to the application. Dates in YYYY-MM-DD.
0.20.1 — 2026-05-16
- Full English-translation pass across the source tree: docstrings,
inline comments, log messages and the few remaining hardcoded Dutch
strings (
extensions.login_message, forgot() flash) are now in English.
User-facing strings already wrapped in _() are unchanged — Babel keeps
serving the localised versions from the .po files.
- DEPLOY.md rewritten in English and renamed every reference from the
old
rss-app system user / rss-ai service / rss_ai.sqlite3 paths to
the new openreadr naming. Upgrade-paths for existing deployments are
unaffected because .env already overrides anything that defaults.
pyproject.toml — package name set to openreadr, author set to
Compunext, description updated.
0.20.0 — 2026-05-15
- Renamed to OpenReadr. The app name is now env-driven via
APP_NAME
(default "OpenReadr"). The App name field on /admin/settings is gone
— admins still upload the logo and favicon there.
- Footer config via env:
FOOTER_COPYRIGHT_NAME (clickable name),
FOOTER_COPYRIGHT_URL (opens in a new tab), APP_TAGLINE (optional
subtitle). The version number now sits on the right of the footer with
the links neatly centered between them.
- Operator info via env (
OPERATOR_NAME, OPERATOR_EMAIL_*,
OPERATOR_GITHUB_URL). Empty defaults — a fresh fork doesn't expose
someone else's contact details. security.txt returns 404 when
OPERATOR_EMAIL_SECURITY is unset.
- Channel-edit fully translated: provider names, descriptions, field
labels and hints now flow through a
_() mapping in the template. No
English residue when adding Pushover/Slack/etc.
- TOTP issuer in QR codes now picks up
APP_NAME from env (was
hardcoded RSS-AI). Existing TOTP tokens keep working — the issuer label
is purely visual in the authenticator app.
- Default DB path changed to
instance/openreadr.sqlite3 for fresh
installs. Existing deployments with DATABASE_URL or the old
rss_ai.sqlite3 file keep working.
GitHub prep
- README.md rewritten from scratch for public publication: feature
overview, install/quickstart, configuration table, CLI overview,
architecture, security standards, translation process, contributing.
.gitignore extended: BACKLOG.md excluded from git plus
IDE/OS junk and backup files.
- Secrets audit swept all .py/.html/.md/.cfg/.txt files: no API keys,
no personal email addresses, no
/Users/... paths left in public files.
- DEPLOY.md rsync example made generic.
0.19.1 — 2026-05-15
- Alerts en auto-labels slaan AI-feed-artikelen over.
new_matches_since
kreeg een exclude_ai_feed-flag (default False voor backward-compat,
True voor de evaluator + backfill-prediction). Auto-labeling-service
joined eveneens op feeds.kind != 'ai'. Voorkomt dat een AI-cluster
over "Apple AND iOS" een bestaande Apple-alert opnieuw triggert
(feedback loop) of dat AI-content een tag krijgt opgeplakt.
- Tag-form opgeschoond. Op /tags maak je alleen nog handmatige tags;
het FTS5-query-veld is weg. Auto-labels ontstaan via de "to-label"
magic-wand-knop op een alert, en de query wordt vanaf daar beheerd.
Op de auto-label-edit-pagina toont de query nog wel als read-only
context (met link terug naar de gekoppelde alert).
0.19.0 — 2026-05-15
- Admin user-management uitgebreid met vier nieuwe acties op
/admin/users:
- Mark as verified — handmatig email_verified=True zetten zonder
dat de gebruiker zelf op de link hoeft te klikken
- Resend verification email — opnieuw versturen van de
bevestigingsmail
- Send password reset email — link wordt nu óók automatisch
gemaild naar de user (was alleen tonen in flash)
- Change email… — admin wijzigt email-adres via een prompt;
email_verified reset automatisch naar False
- Onverified accounts krijgen een oranje "Unverified"-pill in de UI
- Alert backfill is nu rate-limited — aanvinken van "ook bestaande
artikelen mee laten vuren" maakt een
BackfillJob aan en de evaluator
verwerkt max 20 matches per cyclus met 0,5s pauze tussen mails. Geen
spike meer naar je SMTP-provider bij een nieuwe alert met 1000+ matches.
- Live progress-banner op /alerts polled elke 5s een status-endpoint
en toont een progress-bar per actieve backfill, met cancel-knop.
- Premium channel-integraties: Pushover, Slack, Discord, Telegram en
Custom webhook, met een visuele tile-kiezer en per-integratie eigen
formuliervelden. Onder de motorkap zit een
Provider-systeem in
app/services/channel_providers.py waar nieuwe integraties met ~20
regels code bij te zetten zijn.
- Bestaande "ruwe" webhook-channels blijven werken — wie geen provider
heeft gekozen krijgt het oude raw-POST-gedrag.
Migration notes: automatische lichtgewicht-migratie voegt
alert_channels.provider toe + maakt de nieuwe backfill_jobs-tabel.
Geen handmatige actie nodig.
0.18.4 — 2026-05-15
- Timezone-correcte titels voor AI-content. De digest-titels en
nieuwsbrief-onderwerpen toonden UTC ("Daily digest — 18:30") terwijl
Sonny op CEST 20:30 zat. Nu rendert
_local_strftime() in de
geconfigureerde BABEL_DEFAULT_TIMEZONE. DB-velden blijven onveranderd
in UTC (correcte praktijk — alleen weergave is gelokaliseerd).
.env.example documenteert nu de DEFAULT_LOCALE en
DEFAULT_TIMEZONE env-vars; Europe/Amsterdam als default-suggestie
voor NL-installs.
0.18.3 — 2026-05-15
- AI-feed cleanup respecteert nu het ingevulde aantal dagen — de
knop had een hardcoded
value="30" in een verborgen input zonder echt
veld in de UI. Nu een echte cleanup-strook met dagen-input + "keep
favorites"-toggle.
- "Verwijder alles"-knop op de AI-feed én in de cleanup-sectie van
iedere reguliere feed (
/feeds/<id>/edit). Wist alle artikelen,
favorieten blijven default behouden.
- Grid-labels in de rechterbovenhoek als overlay over de afbeelding
— voorheen onder de tile-meta wat de hoogte van kaartjes met/zonder
labels uit elkaar trok. Nu uniforme tile-uitlijning, met
backdrop-blur op de label-pills voor leesbaarheid over elke afbeelding.
0.18.2 — 2026-05-15
- AI-clustering veel strenger — false positives kostten tokens en
vervuilden de AI-feed:
- Min cluster-grootte van 3 → 4 artikelen
- Max clusters per user per dag van 5 → 3
- Per-user cooldown van 12u zodat dev-restarts of een te-snel-
draaiende scheduler niet binnen één etmaal opnieuw clusteren
- Overlap-dedup (≥50%): als een nieuwe cluster substantieel overlapt
met een eerder gegenereerde, sla 'm over — voorkomt dat een growing
news-story elke dag een nieuw cluster-artikel oplevert
- Strengere LLM-prompt met voorbeelden van wel/niet-clusters; "false
positives are worse than missing real clusters"
- AI-output respecteert nu de juiste taal:
- Locale-codes (
nl, de, …) worden vertaald naar volledige namen
(Dutch, German) in alle prompts — LLMs negeren 2-letter-codes
soms en outputten dan toch Engels
- Cluster-prompt benadrukt expliciet dat headline én body in de
doeltaal moeten zijn, zelfs als de bronnen in een andere taal zijn
- Fallback-keten verbeterd:
user.locale → BABEL_DEFAULT_LOCALE → "en"
- Templating:
- "Samenvatten met AI"-knop verborgen op AI-content (digest/cluster
zijn al een samenvatting — dubbel werk)
- "Translate to my language"-knop weer zichtbaar op AI-content als
noodoptie wanneer de output toch in een andere taal terugkomt
0.18.1 — 2026-05-15
- AI newsletters in main nav — link op de desktop topbar (was alleen
in de mobile drawer). Alleen zichtbaar als je AI hebt aanstaan.
- Newsletter-runs nemen de nieuwsbrief-naam mee in het AI-feed-archief
(was generiek "Daily digest — date"). Nu bv. "Security wrap-up — 2026-05-15 20:30".
- Geen "[nl]"-suffix meer op AI-feed artikel-titels — overbodig want
artikel staat sowieso in jouw UI-taal.
- "Translate to my language"-knop verbergt zichzelf als de feed-taal
matcht met je UI-taal. Vereist
Feed.language (auto-ingevuld bij fetch
vanuit RSS/Atom <language>-tag). Onbekende feed-taal = knop blijft
zichtbaar (fail-open).
- AI-content (digests, clusters) toont sowieso geen translate-knop —
staat al in user-locale.
0.18.0 — 2026-05-15
- Topic clustering — daily scheduler-job groepeert artikelen die over
hetzelfde nieuwsfeit gaan (op basis van LLM-batch-clustering — geen
embeddings/sentence-transformers nodig) en publiceert één geconsolideerd
AI-artikel per cluster. Cost-cap op 5 clusters per user per dag, alleen
voor users met
ai_enabled=True. Dedup op cluster-ID-set zodat dezelfde
cluster niet elke dag opnieuw wordt gegenereerd.
- Source-attribution in cluster-artikelen: onderaan staat een lijst
met links naar de oorspronkelijke artikelen.
- Disclaimer-banner op alle AI-gegenereerde artikelen ("Dit is door AI
gegenereerd, verifieer belangrijke details bij de bron").
0.17.0 — 2026-05-15
- AI feed — nieuwe system-feed per gebruiker, automatisch aangemaakt
bij eerste AI-gebruik. Verschijnt apart in de articles-sidebar onder
Favorieten (✨ icoon) en op /feeds als eigen kaart bovenaan. Bevat
AI-gegenereerde digests en (vanaf 0.18.0) topic-clusters.
- AI-feed beheer op /feeds: enable/disable, retention (default 30
dagen, instelbaar), handmatige cleanup. Geen URL-bewerken want geen
externe URL.
- Daily digests gaan automatisch in de AI-feed — elke "Wat speelt er
vandaag?"-klik én elke nieuwsbrief-run archiveert het resultaat als
Article zodat je het later kunt teruglezen.
- AI-nieuwsbrieven — nieuwe pagina /newsletters met CRUD voor
periodieke AI-digests. Per nieuwsbrief: feeds-selectie (of alle),
category-filter, frequentie (dagelijks/wekelijks), schedule-uur,
bezorging via profiel-mail én/of alert-kanalen én/of -groepen. Run-now
knop voor on-demand testen. Scheduler draait elk uur om te checken wat
er moet vuren.
- Markdown-rendering voor AI-content op artikel-detailpagina's —
cluster-artikelen en gearchiveerde digests komen nu netjes als
geformatteerde tekst i.p.v. raw HTML.
Migration notes: automatische lichtgewicht-migratie voegt
feeds.kind, articles.source_article_ids, articles.ai_kind toe en
maakt de nieuwe ai_newsletters-tabel. Geen handmatige actie nodig.
0.16.0 — 2026-05-15
- AI features per user — admin kan via Admin · Users per account de
AI-knoppen aan- of uitzetten. Bestaande accounts krijgen AI standaard
aan, nieuwe registranten standaard uit. Voorbereiding voor toekomstige
abonnement-tiers waar AI per plan inbegrepen is. Gates lopen door
templates (knoppen verbergen), endpoints (412-achtige flash) en de
smart-search-fallback.
- AI translation — nieuwe knop "Translate to my language" op artikel-
pagina's. Vertaalt titel + body naar je UI-taal, rendered onder de
samenvatting in een eigen inklapbaar paneel. Gecached per (artikel,
doeltaal); andere taal kiezen = regenereer.
- Alerts-pagina opgeschoond — alle action-knoppen op rules, groups en
channels gebruiken nu uniforme 32×32 icon-buttons in plaats van een
mengelmoes van text-buttons en icons. De label-koppeling bij een alert
is verplaatst naar een badge in de info-kolom (was: brede knop in de
toolbar). Aparte CSS-klassen voor alert-row en aside-row zodat een
toekomstige aanpassing niet weer ontspoord raakt.
Coming next: AI-nieuwsbrieven met eigen scheduler, multi-bezorging
(profiel-mail + kanalen + groepen), per-nieuwsbrief feed-selectie en
frequentie. Eigen release voor gericht testen.
0.15.0 — 2026-05-15
- AI article summary — "Summarise with AI" button on every article detail
page. Result is cached per article + locale so re-opening the article is
free; clicking the button again forces a regenerate.
- Daily digest — "What's happening today?" button on the dashboard
summarises the last 24h of new articles into 5-7 bullet points. Cached for
6 hours per user.
- Smart search — toggle "Smart search (AI)" on
/search and type a
natural-language question. The LLM converts it to a real FTS5 expression
which is shown above the results so you also learn the syntax.
- All three features run through the existing pluggable LLM layer, so they
work with whichever provider you've set (Anthropic, OpenAI, OpenRouter).
Falls back gracefully to a no-op when nothing is configured.
0.14.1 — 2026-05-15
- Fix 500 on email-verification link — and on password-reset link, and on
account-lockout login. SQLite doesn't preserve timezone info even when the
column is declared
DateTime(timezone=True), so reading expires_at back
returned a tz-naive datetime that crashed when compared to
datetime.now(timezone.utc). All three call-sites now defensively lift to
aware-UTC before comparing.
0.14.0 — 2026-05-15
- Mail moved to its own admin page (
/admin/mail) with a new menu item,
separate from App settings. The page shows a "Current setup"-block with
the active backend, server (or sendmail-path), TLS-style and From-header
so you can see at a glance what's effective.
- Sendmail is now a UI option (default for new installs) — no more
needing
MAIL_BACKEND=sendmail in .env. The sendmail-binary-path is
also configurable via the admin form.
- Split sender into From-name (display, e.g. "RSS-AI") and From-email
(e.g. noreply@example.com) — useful for hosts like Fastmail that require
the From-address to match your authenticated username.
- Form binding fix: saved settings now actually display in the form
after saving (the previous form had field names without the
mail_
prefix so obj=settings didn't populate anything — including the
"Mail enabled" checkbox).
- Conditional form fields: pick "Sendmail" and SMTP/relay fields hide;
pick "Relay" and the credential fields hide. Less clutter, fewer
surprises.
- Export/import now includes per-feed
category and retention_days.
Older exports remain valid (missing fields default to None / unlimited).
0.13.0 — 2026-05-15
- Three mail backends — SMTP (auth), Relay (plain SMTP, no auth, e.g. local
Postfix), and Sendmail (shell out to
/usr/sbin/sendmail). Switch via
MAIL_BACKEND in .env or pick SMTP/Relay live in App settings.
- Admin UI for mail config in App settings — enable/disable, choose
backend, host/port/TLS/SSL, credentials, default sender. SMTP passwords
are Fernet-encrypted at rest in the DB (key derived from
MAIL_SECRET_KEY or fallback to SECRET_KEY).
- "Send test mail" button that uses your saved config and reports the
actual SMTP/sendmail error — much easier troubleshooting than diving into
the logs.
- iOS PWA — install to home screen via Safari's "Add to Home Screen".
Fullscreen launch with the app's logo, custom status-bar style, and proper
safe-area handling for notch / dynamic island / home-indicator.
- OpenRouter as 4th LLM provider — one API key, hundreds of models
(Claude, GPT, Llama, Mistral, Gemini, …). Set
LLM_PROVIDER=openrouter and
OPENROUTER_MODEL=anthropic/claude-sonnet-4 (or any other).
- Several mobile layout fixes: notifications, articles list view, audit log,
scheduler, cookie usage — long URLs and tables no longer push the page
beyond the viewport.
- Mobile drawer language switcher now shows full names + flags for all six
locales (was missing for DE/FR/IT/ES due to a stale template branch).
0.12.0 — 2026-05-15
- Front-end assets fully vendored for offline operation — Bootstrap 5.3.3,
Bootstrap Icons 1.11.3, zxcvbn-ts 3.0.4 and the three Google Fonts (Inter,
Source Serif 4, JetBrains Mono) are now served from
/static/vendor/.
No more external requests to cdn.jsdelivr.net or fonts.googleapis.com
at runtime — better Lighthouse scores and works behind firewalls.
One-off setup: python scripts/vendor_assets.py.
- Channels & groups on alerts are now rendered as a list of checkboxes
instead of a
<select multiple>. You can finally combine freely — only a
group, only channels, both, or nothing — without Cmd-click gymnastics.
- Dashboard "Recently arrived" now respects publication date when
multiple articles arrive in the same fetch batch (was: parse-order).
- Alert FTS preview now lists matches by publication date (newest first)
instead of BM25 relevance — gives a realistic picture of how often the
rule would fire.
- 2FA reminder on every sign-in until two-factor authentication is
enabled, with a direct link to the setup page.
- Mail / forwarding flash messages now respect your language setting —
they were hard-coded Dutch.
0.11.0 — 2026-05-15
- Four more languages: Deutsch, Français, Italiano, Español — all 500+
UI strings translated. Switch via your avatar dropdown or the mobile
drawer. Browser
Accept-Language is auto-detected for new visitors.
- Category filter on the Feeds page — click a category chip to scope
the list; an "Uncategorized" chip groups feeds without a category.
- Sidebar groups feeds by category on the Articles page, with
collapsible groups whose state is remembered in localStorage.
- Category autocomplete when adding or editing a feed, suggesting your
existing categories.
- Translated all blueprint flash messages — the long tail that still
appeared in Dutch despite an English locale.
0.10.0 — 2026-05-14
- Privacy policy, cookies and about pages in the footer, all publicly accessible
- Self-service account deletion from your profile (GDPR right to be forgotten)
- Email verification required for new registrations
- Rate-limiting on login, register and password-reset endpoints
- Failed-login lockout — 5 wrong tries triggers a 15-minute cooldown
- Notification email when a sign-in happens from a new IP or browser
- Welcome email after the first email verification
- Password strength indicator on register, reset, and change-password pages
- MIT license added; project is now open source
- robots.txt and /.well-known/security.txt (RFC 9116) for crawlers and security researchers
0.9.0 — 2026-05-14
- Multilingual UI with English as the source language and Dutch as the
first translation. Switch language via your avatar dropdown or the mobile
drawer.
- Browser language (
Accept-Language) is auto-detected for new visitors.
- Per-user preference stored in your profile.
- Open for community translations — see
CONTRIBUTING.md for adding a new
language.
0.8.0 — 2026-05-14
- Fancy grid view for the article list with thumbnails — toggle via a
switch and your preference is remembered in your profile
- Thumbnails are automatically extracted from new articles
(
media:thumbnail, media:content, enclosures, or the first image in the
body)
- Per feed visible: article count, stored text payload, and the retention
setting — plus a total at the bottom
- CLI command for manual thumbnail backfill of older articles
0.7.0 — 2026-05-14
- Alerts and channels can now be paused or resumed without deleting them
- New channel groups: bundle multiple channels under one name and link
them to an alert — changes to the group automatically apply to every alert
using it
- Manually forward articles from the reading view to a channel, a group,
or a free email address with an optional note
- Retention per feed: choose from 1 week up to 24 months or unlimited;
favorites are always kept. Plus a manual cleanup action per feed.
- Version number visible in the footer
0.6.0 — 2026-05-14
- Footer with copyright, GitHub link, and a direct link to release notes
- Admins can change the app name, logo, and favicon via App settings
- Release notes publicly readable via the footer
0.5.0 — 2026-05-14
- Better feedback for long-running actions: spinner on buttons and a top
progress bar
- Article list refreshes immediately after reading an article (no manual
refresh needed)
- Mobile rendering of the dashboard fixed
- Admin user-management consolidated into a clean per-account action menu
0.4.0 — 2026-05-14
- Full multi-user support with strict per-account data isolation
- Two-factor authentication (TOTP) per user
- Password reset via email
- Profile page with avatar upload (Gravatar fallback)
- Export and import of your own settings (feeds, labels, alerts) as JSON
- Admin: disable, delete, reset password, or disable 2FA per user
- Audit log for security and admin actions
0.3.0 — 2026-05-14
- Auto-labels: tag articles automatically based on a search query
- Linked alerts and labels — changes sync both ways
- Mark all as read button per filter
- Mobile-first improvements: hamburger menu and drawer navigation
- Theme coherence restored on buttons (no leftover framework styles)
0.2.0 — 2026-05-13
- Per-feed refresh interval (default 5 minutes)
- Smarter search input: automatically recognizes FTS5 syntax in the search bar
- Example suggestions on the search page
- Live preview of alert queries before saving
- Alerts only fire on new articles by default — historical backfill is opt-in
0.1.0 — 2026-05-13
- First working version: manage, read and label feeds
- Full-text search via SQLite FTS5
- Alerting via in-app, email or webhook (incl. Pushover)
- Background scheduler for automatic feed fetching
- Dark theme with serif typography for the reading view