OpenReadr

Release notes

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
Terug naar inloggen